Как отобразить обертки Foundation 5 вокруг элементов формы, используя Zend Framework
Я пытаюсь сделать форму Foundation 5 с проверкой Abide, используя Zend Form. Я все еще изо всех сил пытаюсь полностью понять, как использовать Zend's ViewHelpers и Decorators для рендеринга формы с помощью div, требуемых Foundation. Я могу обернуть элемент формы в правильно классифицированный div, но я не могу поместить несколько элементов в <div class="row">
например.
Вот что я не могу сделать:
1) Назначение класса каждому родительскому элементу div элемента формы. Я могу назначить каждому обёртку div один и тот же класс (см. Мой код ниже), но не отдельному элементу. Когда я попытался добавить $element->setAttrib('class','small-##')
это применило его к <input />
элемент, а не тот обертка div. Например firstName
а также lastName
должно быть class="small-6"
в то время как company
на следующем ряду class="small-12"
2) Размещение нескольких элементов формы в <div class="row">
тег, а затем сделать это снова для следующей строки формы. Прямо сейчас я могу поместить каждый элемент в ряд, но я не знаю, как поместить несколько элементов в один и тот же элемент. <div class="row">
,
3) В примерах Фонда <label>
метки обернуть вокруг <input>
тег, но Zend закрывает метку перед вводом. Имеет ли это значение?
Вот HTML-код, который я хочу визуализировать:
<form method="post" action="" enctype="multipart/form-data" data-abide>
<div class="row">
<div class="large-12 columns">
<div class="row">
<div class="small-2 columns">
<label for="display" class="inline">Display For: </label>
</div>
<div class="small-10 columns">
<input type="radio" name="display" value="0" id="displayEveryone" checked><label for="displayEveryone" class="inline">Everyone</label>
<input type="radio" name="display" value="999" id="displaySelf"><label for="displaySelf" class="inline">Only Me</label>
</div>
</div>
</div>
</div>
<div class="row">
<div class="small-6 columns">
<label>First Name
<input type="text" required class="contact" name="firstName" id="firstName" maxlength="25" autofocus="autofocus"/>
</label>
<small class="error">First name is required.</small>
</div>
<div class="small-6 columns">
<label>Last Name
<input type="text" required class="contact" name="lastName" id="lastName" maxlength="25"/>
</label>
<small class="error">Last name is required.</small>
</div>
</div>
<div class="row">
<div class="small-12 columns">
<label>Company or Affiliation
<input type="text" class="contact" name="company" id="company" maxlength="125"/>
</label>
</div>
</div>
<div class="row">
<div class="small-4 columns">
<label>Work Phone
<input type="text" class="contact" name="workPhone" id="workPhone" />
</label>
</div>
<div class="small-4 columns">
<label>Cell Phone
<input type="text" class="contact" name="cellPhone" id="cellPhone" />
</label>
</div>
<div class="small-4 columns">
<label>Home Phone
<input type="text" class="contact" name="homePhone" id="homePhone" />
</label>
</div>
</div>
</form>
А вот сценарий формы Zend, который у меня сейчас есть и который нужно изменить:
class Application_Form_Contact extends Zend_Form
{
public function init()
{
$this->setMethod('post');
$this->setName('addContact');
$this->setAttrib('enctype', 'multipart/form-data') ;
$id = new Zend_Form_Element_Hidden('contactID');$id->addFilter('Int');
$display= new Zend_Form_Element_Radio('display');
$display->setLabel('Display For: ')
->setRequired(true)
->addMultiOptions(array(0 => "Everyone", 999 => "Only Me"));
$fName = new Zend_Form_Element_Text('firstName');
$fName->setLabel('First Name: ')
->setRequired(true)
->setAttrib('maxlength', 25)
->setAttrib('autofocus', 'autofocus')
->addFilter('StripTags')
->addFilter('StringTrim');
$lName = new Zend_Form_Element_Text('lastName');
$lName->setLabel('Last Name: ')
->setRequired(true)
->setAttrib('maxlength', 25)
->addFilter('StripTags')
->addFilter('StringTrim');
$company = new Zend_Form_Element_Text('company');
$company->setLabel('Company: ')
->setRequired(false)
->setAttrib('maxlength', 125)
->addFilter('StripTags')
->addFilter('StringTrim');
$workPhone = new Zend_Form_Element_Text('workPhone');
$workPhone->setLabel('Work Phone: ')
->setRequired(false)
->setAttrib('class', 'small-4')
->addFilter('StripTags')
->addFilter('StringTrim');
$cellPhone = new Zend_Form_Element_Text('cellPhone');
$cellPhone->setLabel('Cell Phone: ')
->setRequired(false)
->setAttrib('class', 'small-4')
->addFilter('StripTags')
->addFilter('StringTrim');
$homePhone = new Zend_Form_Element_Text('homePhone');
$homePhone->setLabel('Home Phone: ')
->setRequired(false)
->setAttrib('class', 'small-4')
->addFilter('StripTags')
->addFilter('StringTrim');
$otherPhone = new Zend_Form_Element_Text('otherPhone');
$otherPhone->setLabel('Other Phone: ')
->setRequired(false)
->addFilter('StripTags')
->addFilter('StringTrim');
$submit = new Zend_Form_Element_Submit('submit');
$submit->setAttrib('id', 'submitbutton');
$this->addElements(array($id, $display, $fName, $lName, $company, $workPhone, $cellPhone, $homePhone, $otherPhone, $submit));
$this->setElementDecorators(array(
'ViewHelper',
array('Description'),
array('Errors'),
array(array('data' => 'HtmlTag'), array('tag' => 'div', 'class'=>'small-6 columns')),
array('Label'),
array(array('row' => 'HtmlTag'), array('tag' => 'div', 'class'=> 'row'))
));
$submit->setDecorators(array(
'ViewHelper',
array(array('data' => 'HtmlTag')),
array(array('row' => 'HtmlTag'))
));
$this->setDecorators(array(
'FormElements',
array('HtmlTag', array('tag' => 'div', 'class'=>'small-12 columns')),
array('Form', array('data-abide'=>'data-abide'))
));
$view = $this->getView();
$formErrors = $view->getHelper('formErrors');
$formErrors->setElementStart('<small class="error">')
->setElementSeparator('')
->setElementEnd('</small>');
}
}
Спасибо за помощь.
1 ответ
Декораторы по умолчанию загружать не нужно
По умолчанию декораторы по умолчанию загружаются во время инициализации объекта. Вы можете отключить это, передав опцию 'disableLoadDefaultDecorators' в конструктор:
$element = new Zend_Form_Element('foo',
array('disableLoadDefaultDecorators' => true)
);
Создайте представление и добавьте элементы формы следующим образом:
<?php echo $this->YourFormObject->getElement('YourElementID'); ?>
Я сделал эту надежду, это полезно для вас...