zend form для multicheckbox удалять входные данные из меток

Я использую zend_form (часть Zend Framwork) для создания формы и обнаруживаю, когда добавляю набор флажков с помощью элемента multicheckbox Zend_Form (Zend_Form_Element_MultiCheckbox) кода, который выводится следующим образом:

<label for="subjects-maths"> <input type="checkbox" value="maths" id="subjects-maths" name="subjects[]"> Maths </label> <label for="subjects-english"> <input type="checkbox" value="maths" id="subjects-english" name="subjects[]"> English </label> 

Т.е. вход находится внутри метки. В то время как код технически хорош, он против хорошей практики, насколько это видит W3c, и также не так, как я хочу, поскольку это упрощает стилизацию. Я хочу следующее:

 <div> <label for="subjects-maths"> Maths </label> <input type="checkbox" value="maths" id="subjects-maths" name="subjects[]"> </div> <div> <label for="subjects-english"> English </label> <input type="checkbox" value="maths" id="subjects-english" name="subjects[]"> </div> 

Поэтому как я могу перенести флажок, введенный вне метки, и как я могу окружать каждую опцию в div. Я просмотрел много страниц в Интернете так называемых решений, но никто не работает в многоэкранных ящиках, поскольку он ориентирован только на окружающие метки (т. Е. Те, которые будут указывать объекты в этом примере), а не фактические метки и входы параметров.

Пожалуйста помоги.

Спасибо, Пол

Zend_Form_Decorator_ViewHelper по умолчанию использует помощник представления Zend_View_Helper_FormMultiCheckbox для рендеринга вашего элемента multicheckbox. Этот помощник просмотра расширен из Zend_View_Helper_FormRadio который по какой-то причине жестко закодирован для размещения тегов <label> вокруг <input> .

Вам нужно будет написать свой собственный помощник вида, который копирует большую часть кода из Zend_View_Helper_FormRadio::formRadio() но записывает HTML без тегов <label> вокруг элемента. Вот фрагмент из другого ответа, который показывает модификацию, которую вы, возможно, захотите сделать.

Ваш пользовательский помощник должен быть назван Some_Prefix_Helper_FormMultiCheckbox но, не зная, как структурируется ваше приложение, сложно сказать, что Some_Prefix должно быть для этого Some_Prefix и как вы должны его загрузить, а не Zend_View_Helper_FormMultiCheckbox . Ознакомьтесь с документацией по загрузке плагинов для некоторых советов.

Кажется, лучшее решение основано на ответе выше на белку. Поскольку входной сигнал внутри метки жестко закодирован, лучшим решением является изменение этого поведения. Вы можете сделать это, изменив класс Zend_View_Helper_FormRadio или переопределив его собственным заголовком. Я бы порекомендовал настраиваемый параметр заголовка, так как изменение структуры zend было бы плохой идеей, так как при каждом обновлении фреймворка оно должно было обновляться каждый раз, что влияет на кого-либо или на какой-либо проект, используя эту копию фреймворка и т. Д. Используя собственный помощник, будет специфичным для проекта, и это не повлияет ни на что иное, и не будет затронуто обновление фреймворка (однако вы можете обнаружить, что вам нужно обновить помощника, если обновление структуры изменило некоторые виды поведения). То, что я делал, хорошо работает:

1 – Создал модель / модуль в библиотеке, я назвал мой сайт. Сначала это связано с созданием папки в библиотеке с тем же именем, что и модель. Таким образом, у меня есть библиотека> веб-сайт

Изменить: Забыл сказать, что вам нужно будет зарегистрировать библиотеку плагинов либо через bootstrap, либо в application.ini. Я считаю, что проще всего добавить:

autoloaderNamespaces [] = "Website_"

В любом месте ниже appnamespace

2 – Я создал соответствующие подпапки и файл для класса Website_View_Helper_FormRadio, который переопределит Zend_View_Helper_FormRadio. Таким образом, структура папок и файлов

веб-сайт> вид> помощник> FormRadio.php

3 – Затем я скопировал содержимое функции formRadio из Zend_View_Helper_FormRadio в Website_View_Helper_FormRadio внутри класса. Затем я модифицировал его с кодом, который squirrel ссылается таким образом на класс Website_View_Helper_FormRadio, который наследует от Zend_View_Helper_FormRadio так:

 class Website_View_Helper_FormRadio extends Zend_View_Helper_FormRadio { public function formRadio($name, $value = null, $attribs = null, $options = null, $listsep = "<br />\n") { // The code from the formRadio function in Zend_View_Helper_FormRadio with // the modification from the code squirrel referred to } } 

Затем это дает нам собственную копию класса с нашим модифицированным кодом, который наследуется от zend-версии элемента FormRadio.

Теперь вы можете просто использовать элемент Zend Form Radio, как обычно, и он будет использовать наши улучшения

Обратите внимание, что если вы хотите иметь такой же эффект на MultiCheckbox или флажке, вам нужно сделать так, чтобы они использовали нашу версию формы радио, так как эти элементы используют форму радио в качестве основы. Для этого мы создаем наши собственные версии в нашей библиотеке и заставляем их наследовать от нашей версии. Поэтому у нас было бы многозадачность:

библиотека> веб-сайт> вид> помощник> FormMultiCheckbox.php

Будет ли копия Zend_View_Helper_FormMultiCheckbox

Затем замените строку:

 class Zend_View_Helper_FormMultiCheckbox extends Zend_View_Helper_FormRadio 

с:

 class Website_View_Helper_FormMultiCheckbox extends Website_View_Helper_FormRadio 

Надеюсь, это поможет кому-то.

Вот некоторые дополнительные сведения о настройке рендеринга multiCheckBox

Я хотел, чтобы метки меток были добавлены вместо append (это поведение по умолчанию жестко запрограммировано). Поскольку справочник ZF не говорит об этом, я, наконец, попал в основной код, чтобы выяснить, как его настроить. Посмотрите на Zend_View_Helper_FormRadio::formRadio() для получения дополнительной информации.

Можно изменить декоратор флажков с помощью параметров multiCheckBox: добавление некоторых параметров с префиксом label_ .

Вот мой элемент формы:

 $this->addElement('multiCheckbox', 'stars_number', array( 'filters' => array('Int'), 'escape' => false, // to allow html in the labels 'separator' => '', // to keep everything inline 'label_placement' => 'prepend', 'label_class' => 'stars', // custom css needed 'decorators' => $decorator_chain, // decorators array defined upper, and passed to many elements of the form )); 

Я надеюсь, что это поможет некоторым пользователям сэкономить часы безуспешного сканирования Google …

Я думаю, вам нужно удалить декоратор Label и создать собственный декоратор, который будет работать как декоратор Label, но использовать теги div и метки вместе, как вам нужно