Zend-форма для multiheckbox удалить вход из меток

Я использую 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. Я просмотрел много страниц в Интернете о так называемых решениях, но ни одна из них не работает на мульти-чекбоксах, так как они нацелены только на окружающие ярлыки (то есть на те, которые в этом примере будут содержать темы), а не на действительные ярлыки параметров и входные данные.

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

Спасибо Пол

4 ответа

Решение

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

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

Изменить: Забыл сказать, что вам нужно будет зарегистрировать библиотеку плагинов либо через загрузчик или 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 внутри класса. Затем я изменил его с помощью кода, на который ссылается белка, таким образом класс 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 или флажок, вам нужно, чтобы они использовали нашу версию формы radio, так как эти элементы используют форму radio в качестве основы. Для этого мы создаем свои собственные версии в нашей библиотеке и заставляем их наследовать от нашей версии. Поэтому мы должны иметь для multiheckbox следующее:

библиотека> веб-сайт> просмотр> помощник> 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

Я надеюсь, что это помогает кому-то.

Декоратор 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 должно быть, или как вы должны загрузить его вместо Zend_View_Helper_FormMultiCheckbox, Ознакомьтесь с документацией по загрузке плагинов для некоторых советов.

Вот некоторая дополнительная информация о настройке рендеринга multiCheckBox

Я хотел, чтобы метки флажков добавлялись вместо добавления (это поведение по умолчанию жестко задано). Поскольку справочное руководство 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 и label вместе, как вам нужно

Другие вопросы по тегам