К сожалению, более сложные проблемы пропускаются, потому что без реальной конкретной цели или цели очень сложно написать пример или практические рекомендации. Я потратил некоторое время на то, чтобы помочь другому разработчику в SO, который хотел изменить способ отображения скрытых элементов , но его случай был очень конкретным, поэтому было легче углубиться в детали.
Большинство более сложных задач действительно сводятся к расширению помощника по умолчанию для определенного типа поля. Например, у меня был проект, в котором я хотел применить класс «error» ко всем полям, которые не прошли проверку после отправки формы, вместо того, чтобы выписать текст ошибки проверки:
<label for="field">Label:</label>
<input type="text" name="field" id="field" class="error">
Это был довольно сложный процесс, потому что фактический элемент формы по умолчанию недоступен помощнику вида, поэтому помощник не может проверить, есть ли у элемента ошибка проверки. Итак, я пошел о следующем процессе:
- Мне нужно было создать помощника представления клиента для каждого типа поля, к которому я хотел применить класс «error». В нем я переопределил метод
formXXX()
и добавил проверку, чтобы убедиться, что в элементе произошла ошибка. Кроме того, я добавил метод setElement()
, который декоратор мог вызывать для установки экземпляра элемента, чтобы мой помощник мог проверять наличие ошибок.
- Далее мне пришлось переопределить значение по умолчанию
Zend_Form_Decorator_ViewHelper
. В нем я получил доступ к представлению, создал экземпляр помощника для типа элемента формы и проверил наличие метода setElement()
, который я создал в помощнике вида, установив его, если он существует. Делая это, я мог бы расширить некоторые типы элементов формы, а не другие, не разрушая весь скрипт.
- В моей функции init () для каждой формы мне пришлось добавить новый путь префикса элемента (
addElementPrefixPath('My_Form_Decorator'), 'path/to/decorator')
), который указывал на мой новый декоратор формы.
- Наконец, мне пришлось добавить вспомогательный путь к моему приложению, чтобы Zend Framework мог найти помощников, которых я создал в первом пункте:
addHelperPath('/path/to/helpers', 'My_View_Helper');
Вы можете понять, почему написание сложных обучающих программ действительно требует реальных проблем. Большая часть настройки таких помощников или сложных схем декораторов заключается в том, что, как бы это ни было раздражающе, это позволяет вам очень легко создавать множество форм, придерживающихся одной и той же схемы проектирования, и очень быстро изменять их выходные данные очень быстро, если изменения нужно сделать. Но если, с другой стороны, вы чувствуете, что тратите много времени на то, чтобы понять, как сделать то, что должно быть простым заданием для одной формы, я бы сказал, пропустите это!
Если вы хотели бы помочь чем-то более конкретным, я был бы более чем рад помочь. Просто задайте другой вопрос (или обновите этот), и я сделаю все возможное, чтобы помочь.