Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Modyfikacja ścieżki do dekoratorów dla wszystkich elementów
Forum PHP.pl > Forum > PHP > Frameworki
amii
Co chcę osiągnąć: dodać globalną ścieżkę przeszukania dla dekoratorów dla wszystkich elementów formularza


Mam formularz z metodą init:
class Application_Form_Kontakt extends Zend_Form
  1. {
  2. public function init()
  3. {
  4. $this->addElementPrefixPath('My_Decorator',
  5. 'My/Decorator/',
  6. 'decorator');
  7. //ustawiamy pojedynczy dekorator dla wszystkich elementow formularza oprócz submit
  8. $this->setElementDecorators(array('Validate'), array('wyslij'), false);
  9. }


Klasa z dekoratorem Validate jest umieszczona w library/My/Decorator/Validate.php
Nagłówek klasy: class My_Decorator_Validate extends Zend_Form_Decorator_Abstract

Kiedy uruchamiam stronę z formularzem dostaję komunikat:
Message: Plugin by name 'Validate' was not found in the registry; used paths: Zend_Form_Decorator_: Zend/Form/Decorator/

czyli wygląda to tak jakby ścieżka My/Decorator nie została dołączona a przecież jest w metodzie init formularza
k_@_m_i_l
Też ostatnio "wałkowałem" ten problem.
Spróbuj tak:
  1. $this->addElementPrefixPath('My_Form_Decorator',
  2. 'My/Form/Decorator/',
  3. 'decorator');
  4. $this->setElementDecorators(array('MyDecorator'));

i oczywiście klasę MyDecorator trzymasz w /library/My/Form/Decorator/MyDecorator.php



amii
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:

  1. $phone = $this->createElement('validator', 'txt_phone_NotCompulsory');
  2. $phone->addValidators(array(
  3. array('Regex', false, array('/^[0-9\-\+\,\/ \(\)]{8,40}$/')),
  4. ));
  5. $phone->setLabel('Telefon:');
  6. $this->addElement($phone);


Co chcę osiągnąć: mieć dostęp do właściwości wszystkich klas dziedziczących od Zend_Element_Form

Problem 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
  1. class My_Form_Element_Validator extends Zend_Form_Element {
  2.  
  3. public function init() {
  4. $prefix = substr($this->getName(), 0, 3);
  5.  
  6. switch ($prefix) {
  7. case 'txt':
  8. $this->addFilters(array(
  9. 'StringTrim', 'StripTags', 'StripNewLines')
  10. );
  11. break;
  12.  
  13. case 'pwd':
  14. $this->helper = 'formPassword';
  15. $this->addFilters(array(
  16. 'StringTrim', 'StripTags', 'StripNewLines')
  17. );
  18. break;
  19.  
  20. case 'rad':
  21. $this->helper = 'formRadio';
  22. break;
  23.  
  24. case 'cbo':
  25. $this->helper = 'formSelect';
  26. $this->addValidators(array(
  27. array('InArray',
  28. array('key' => 'value',
  29. 'otherkey' => 'othervalue')),
  30. ));
  31. var_dump($this);
  32. break;
  33.  
  34. case 'txa':
  35. $this->helper = 'formTextarea';
  36. $this->addFilters(array(
  37. 'StringTrim', 'StripTags')
  38. );
  39. break;
  40.  
  41. default:
  42. $this->addFilters(array(
  43. 'StringTrim', 'StripTags')
  44. );
  45. break;
  46. }
  47.  
  48. if (strpos($this->getName(), '_Compulsory')) {
  49. $this->setRequired();
  50. $this->addValidators(array(
  51. array('NotEmpty', false),
  52. ));
  53. }
  54. else if (strpos($this->getName(), '_NotCompulsory')) {
  55. //do nothing up to now, though we still want this option
  56. }
  57.  
  58. $this->buildValidatorMarker();
  59. }
  60.  
  61. public function buildValidatorMarker()
  62. {
  63. // txt{tutaj_nazwa}_compulsory_email
  64. $content = '';
  65.  
  66.  
  67. //metoda mapuje walidatory z elementu na fragment nazwy w niestandardowym parametrze validator formularza
  68. $mapper = array(
  69. '_email' => $this->getValidator('Zend_Validate_EmailAddress'),
  70. '_alphanumeric' => $this->getValidator('Zend_Validate_Alnum'),
  71. '_alphanumericnospace' => isset($this->getValidator('Zend_Validate_Alnum')->allowWhiteSpace) ? $this->getValidator('Zend_Validate_Alnum')->allowWhiteSpace : false,
  72. '_alphabetic' => $this->getValidator('Zend_Validate_Alpha'),
  73. '_numeric' => $this->getValidator('Zend_Validate_Digits'),
  74. '_integer' => $this->getValidator('Zend_Validate_Int'),
  75. '_floatingpoint' => $this->getValidator('Zend_Validate_Float'),
  76. '_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,
  77. '_telephone' => isset($this->getValidator('Zend_Validate_Regex')->pattern) ? $this->getValidator('Zend_Validate_Regex')->pattern == '/^[0-9\-\+\,\/ \(\)]{8,40}$/' : false,
  78. '_postcode' => $this->getValidator('Zend_Validate_PostCode'),
  79. '_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,
  80. '_pole' => $this->getValidator('Zend_Validate_NotEmpty')
  81. );
  82.  
  83. $name = $this->getName();
  84. $validator = array_search(true, $mapper);
  85. if (!$validator) $validator = '';
  86. $compulsory = preg_match('/([a-zA-Z]{3}_)(.*)(_Compulsory|_NotCompulsory)$/', $name, $matches) ? $matches[3] : '';
  87. if ($compulsory) {
  88. $new_name = str_replace(array($matches[3], $matches[1]), array('', ''), $name);
  89. $this->setName($new_name);
  90.  
  91. }
  92.  
  93. $content .= $matches[1].$new_name.$compulsory.$validator;
  94.  
  95. if ($content) $this->setAttrib('validator', $content);
  96. }
  97. }


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:

  1. $name = $this->createElement('text', 'name');
  2. $name->setRequired();
  3. $name->buildValidatorMarker('txtname_Compulsory');
  4. $this->addElement($name);


Jest to ciekawy problem z OOP bo zakładam, że nie zauważam jakiejś opcji
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.