Niestety nie zatrybiło ale to nieistotne bo przerzuciłem tą metodę do klasy dziedziczącej po Zend_Form_Element i mam inny problem.
Elementy formularza tworze teraz tak:
$phone = $this->createElement('validator', 'txt_phone_NotCompulsory');
$phone->addValidators(array( array('Regex', false, array('/^[0-9\-\+\,\/ \(\)]{8,40}$/')), ));
$phone->setLabel('Telefon:');
$this->addElement($phone);
Co chcę osiągnąć:
mieć dostęp do właściwości wszystkich klas dziedziczących od Zend_Element_FormProblem jest kiedy np. chcę utworzyć listę rozwijaną Zend_Form_Element_Select klasa Validator nie dziedziczy właściwości od klasy Zend_Form_Element_Select i nie mogę przekazać tablic multiOptions ani żadnej właściwości charakterystycznej dla klas dziedziczących od Zend_Form_Element.
Jedne taki problem z helperem rozwiązałem więc przypuszczalnie da się to zrobić, tylko nie znam metod a w dokumentacji ciężko wyszukać takie rzeczy.
Moja klasa ma za zadanie mapować validatory Zenda na odpowiednią uniwersalną walidację po stronie klienta robioną przez klasę JS.
Jeśli projekt ukończe nie omieszkam go udostępnić.
Poniżej klasa Validator
class My_Form_Element_Validator extends Zend_Form_Element {
public function init() {
$prefix = substr($this->getName(), 0
, 3
);
switch ($prefix) {
case 'txt':
'StringTrim', 'StripTags', 'StripNewLines')
);
break;
case 'pwd':
$this->helper = 'formPassword';
'StringTrim', 'StripTags', 'StripNewLines')
);
break;
case 'rad':
$this->helper = 'formRadio';
break;
case 'cbo':
$this->helper = 'formSelect';
$this->addValidators(array( 'otherkey' => 'othervalue')),
));
break;
case 'txa':
$this->helper = 'formTextarea';
'StringTrim', 'StripTags')
);
break;
default:
'StringTrim', 'StripTags')
);
break;
}
if (strpos($this->getName(), '_Compulsory')) { $this->setRequired();
$this->addValidators(array( array('NotEmpty', false), ));
}
else if (strpos($this->getName(), '_NotCompulsory')) { //do nothing up to now, though we still want this option
}
$this->buildValidatorMarker();
}
public function buildValidatorMarker()
{
// txt{tutaj_nazwa}_compulsory_email
$content = '';
//metoda mapuje walidatory z elementu na fragment nazwy w niestandardowym parametrze validator formularza
'_email' => $this->getValidator('Zend_Validate_EmailAddress'),
'_alphanumeric' => $this->getValidator('Zend_Validate_Alnum'),
'_alphanumericnospace' => isset($this->getValidator('Zend_Validate_Alnum')->allowWhiteSpace) ?
$this->getValidator('Zend_Validate_Alnum')->allowWhiteSpace : false, '_alphabetic' => $this->getValidator('Zend_Validate_Alpha'),
'_numeric' => $this->getValidator('Zend_Validate_Digits'),
'_integer' => $this->getValidator('Zend_Validate_Int'),
'_floatingpoint' => $this->getValidator('Zend_Validate_Float'),
'_age' => (isset($this->getValidator('Zend_Validate_Between')->min) && $this->getValidator('Zend_Validate_Between')->max) ?
($this->getValidator('Zend_Validate_Between')->min == 0
&& $this->getValidator('Zend_Validate_Between')->max == 140
) : false, '_telephone' => isset($this->getValidator('Zend_Validate_Regex')->pattern) ?
$this->getValidator('Zend_Validate_Regex')->pattern == '/^[0-9\-\+\,\/ \(\)]{8,40}$/' : false, '_postcode' => $this->getValidator('Zend_Validate_PostCode'),
'_password' => (isset($this->getValidator('Zend_Validate_StringLength')->min) && isset($this->getValidator('Zend_Validate_StringLength')->max)) ?
($this->getValidator('Zend_Validate_StringLength')->min == 6
&& $this->getValidator('Zend_Validate_StringLength')->max == 32
&& $this->getValidator('Zend_Validate_Alnum')) : false, '_pole' => $this->getValidator('Zend_Validate_NotEmpty')
);
$name = $this->getName();
if (!$validator) $validator = '';
$compulsory = preg_match('/([a-zA-Z]{3}_)(.*)(_Compulsory|_NotCompulsory)$/', $name, $matches) ?
$matches[3] : ''; if ($compulsory) {
$this->setName($new_name);
}
$content .= $matches[1].$new_name.$compulsory.$validator;
if ($content) $this->setAttrib('validator', $content);
}
}
OK problem rozwiązany ale musiałem dopisać metodę buildValidatorMarker do klasy Zend/Form/Element.php
trochę to nieestetyczne dopisywać się do natywnych klas Zenda, jednakże takie rozwiązanie zapewnia największą wygodę i elastyczność bo metodę
buildValidatorMarker mogę wywołać każdego elementu formularza. W ten sposób, bez znaczenie czy to jest text czy checkbox:
$name = $this->createElement('text', 'name');
$name->setRequired();
$name->buildValidatorMarker('txtname_Compulsory');
$this->addElement($name);
Jest to ciekawy problem z OOP bo zakładam, że nie zauważam jakiejś opcji