Zend-форма для multiheckbox удалить вход из меток - PullRequest
3 голосов
/ 03 июня 2011

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

4 голосов
/ 04 июня 2011

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

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

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

3 голосов
/ 05 октября 2012

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

Я хотел, чтобы метки флажков были prepend вместо 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 ...

3 голосов
/ 07 июня 2011

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

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

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

autoloaderNamespaces [] = "Веб-сайт _"

В любом месте под appnamespace

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

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

library> website> view> helper> 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

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

0 голосов
/ 03 июня 2011

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

...