Как добавить атрибуты к метке, созданной с помощью Zend/Form в Zend framework 2

Я добавляю формы на свою страницу, используя Zend/Form.

Я добавляю элементы, определяя их следующим образом:

    $this->add(array(
            'name' => 'value',
            'attributes' => array(
                    'type'  => 'text',
                    'id' => 'value',
                    'autocomplete' => 'off',
                    'placeholder' => 'Cost',
            ),
            'options' => array(
                    'label' => 'Cost',
            ),
    ));

Как вы можете видеть, есть узел 'label' => 'cost', он сгенерировал метку для элемента ввода.

Как добавить классы, атрибуты к этой метке?


person El Dorado    schedule 07.02.2013    source источник


Ответы (4)


Пожалуйста, попробуйте это, я не тестировал и не использовал это, но, судя по источнику, он должен работать правильно:

$this->add(array(
    'name'       => 'value',
    'attributes' => array(),
    'options'    => array(
        'label_attributes' => array(
            'class'  => 'mycss classes'
        ),
        // more options
    ),        
));

Если это не работает, пожалуйста, оставьте мне комментарий. Если он не будет работать, использовать этот подход невозможно, поскольку FormLabel немного ограничивает validAttributes:

protected $validTagAttributes = array(
    'for'  => true,
    'form' => true,
);
person Sam    schedule 07.02.2013
comment
Привет, Сэм, я изменил элемент следующим образом: 'value', 'autocomplete' =› 'off', 'placeholder' =› 'Cost', ), 'options' =› array( 'label' =› 'Cost', ), 'label_attributes' =› array( ' class' =› 'css', ) )); Все равно не повезло. Однако он отображается как: ‹label for=value›Cost‹/label› Есть идеи по поводу for ? - person El Dorado; 07.02.2013
comment
Я должен буду проверить это позже, не могу ничего обещать, хотя структура указывает, что это сработает: $element->setLabelAttributes(array('class' => 'control-label')); Может быть, попробуйте добавить label_attributes в качестве подгруппы options — см. отредактированную версию. - person Sam; 07.02.2013
comment
Под вариантами! =) Так что оставьте отредактированную версию на всеобщее обозрение! ;-) - person El Dorado; 07.02.2013
comment
Всегда делайте это в представлении. Ваше представление не должно просачиваться в ваши классы. - person emix; 08.04.2016
comment
@mike Хотя в целом я согласен, формы - в целом - крайний случай веб-разработки. Формы ОТСУТСТВУЮТ. ВЫ НЕ МОЖЕТЕ ДЕЛАТЬ ФОРМЫ ПРАВИЛЬНО. Формы всегда будут в беспорядке. Назначение CSS-класса по умолчанию в Form-Object, который должен автоматически отображаться, совершенно нормально. - person Sam; 09.04.2016
comment
Я не согласен. Можете ли вы привести некоторые аргументы, почему они отстой? Мои формы пригодны для модульного тестирования и обеспечивают мою систему идеальным, полностью проверенным вводом от пользователя. - person emix; 10.04.2016
comment
@mike Формы отстой, потому что по своей природе они являются компонентом, который является как моделью, так и уровнем представления. Они переплетены, их нельзя разъединить. Конечно, у вас может быть отличный компонент формы, но это не значит, что он не отстой ;) - person Sam; 10.04.2016
comment
Ну, это люди, которые привязывают объекты к формам и смешивают модели с представлением. Сам компонент удобен при правильном использовании. - person emix; 10.04.2016
comment
@Майк действительно. Говоря о таком компоненте, как Zend\Form, чаще всего вы хотите сделать именно это. Я бы сказал, что более опытные программисты больше не возятся с Forms. Они пишут InputFilters и Mapper/Hydrators, но полностью оставляют форму ребятам из внешнего интерфейса — что, по моему опыту, также является лучшим решением. - person Sam; 10.04.2016

Это хорошо работает в Zend Framework 2.3:

$this->add(array(
  'name' => 'userName',
  'attributes' => array(
      'type'  => 'text',
      'class' => 'form-control',
      'placeholder' =>'Username',
  ),
  'options' => array(
      'label' => 'Username',
      'label_attributes' => array('class' => 'control-label')
  ),

));
person speedy32    schedule 03.10.2014

$element->setOptions(array('label_class' => array('class' => 'control-label')));

Выдает такой код:

<label class="control-label">
  <input type="radio" name="option1" id="option1" value="1">
  Option 1
</label>
<label class="control-label">
  <input type="radio" name="option2" id="option2" value="2">
  Option 2
</label>

Я пробовал это. Он работает в Zend Framework One.

Обратите внимание, если вы используете

$element->setOptions(array('label_attributes' => array('class' => 'control-label')));

вы получаете нежелательный эффект по какой-то причине

<label attributes="control-label">
  <input type="radio" name="option1" id="option1" value="1">
  Option 1
</label>
person Damon Hogan    schedule 30.04.2014
comment
I have tried this. It works in Zend Framework One. Замечательно, но это вопрос по ZF2, там он не работает. - person Crisp; 02.05.2014

Для программного подхода на ZF2+ попробуйте следующее:

$element->setOptions(array(
    'label_attributes' => array(
        'style' => 'color:gray;'
    )
));

Вдохновленный ответом Деймона.

person Dennis    schedule 24.10.2017