Zend_Form: массив полей "имя - значение"
Найти: решение, которое позволит добавлять на сайте META-теги в произвольном количестве (или хотя бы 10 фиксированных). В результате должна получиться такая SubForm:
http://img515.imageshack.us/img515/9045/multifield.png
В базе этот массив будет храниться как serialize(array(...)). Также надо разобраться, как unserialize() будет заполнять эту субформу.
Желательно для субформы сделать также декораторы.
Вот моё текущее решение:
Код:
<?php
class Form_EditOptionsDomain extends Zend_Form
{
public function __construct($options = null)
{
parent::__construct($options);
$this->setName('editoptionsdomain')
->setDecorators(array(
'FormElements',
array('HtmlTag', array('tag' => 'table')),
'Form',
));
$id = new Zend_Form_Element_Hidden('id');
/*
$meta = new Zend_Form_Element_Textarea('meta');
$meta->setLabel('Meta-теги (HTML)')
->addFilter('StringTrim')
->setOptions(array(
'cols' => '50',
'rows' => '10'))
->setDecorators(array(
'ViewHelper',
'Errors',
array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')),
array('Label', array('tag' => 'td')),
array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
));
*/
$subForm = new Zend_Form_SubForm();
$subForm->setLegend('META-теги:');
$meta_param = new Zend_Form_Element_Text('param');
$meta_param->setIsArray(true)
->setLabel('Параметр')
->addFilter('StringTrim');
$subForm->addElement($meta_param);
$meta_value = new Zend_Form_Element_Text('value');
$meta_value->setIsArray(true)
->setLabel('Значение')
->addFilter('StringTrim');
$subForm->addElement($meta_value);
$this->addSubForm($subForm, 'element');
$sitemap = new Zend_Form_Element_Textarea('sitemap');
/* ......... */
$robots = new Zend_Form_Element_Textarea('robots');
/* ......... */
$submit = new Zend_Form_Element_Submit('submit');
$submit->setAttrib('id', 'submitbutton')
->setDecorators(array(
'ViewHelper',
array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')),
array(array('label' => 'HtmlTag'), array('tag' => 'td', 'placement' => 'prepend')),
array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
));
//$this->addSubForm($subForm, 'aa');
$this->addElements(array($id, $sitemap, $robots, $submit));
}
}
class Form_EditOptionsDomain extends Zend_Form
{
public function __construct($options = null)
{
parent::__construct($options);
$this->setName('editoptionsdomain')
->setDecorators(array(
'FormElements',
array('HtmlTag', array('tag' => 'table')),
'Form',
));
$id = new Zend_Form_Element_Hidden('id');
/*
$meta = new Zend_Form_Element_Textarea('meta');
$meta->setLabel('Meta-теги (HTML)')
->addFilter('StringTrim')
->setOptions(array(
'cols' => '50',
'rows' => '10'))
->setDecorators(array(
'ViewHelper',
'Errors',
array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')),
array('Label', array('tag' => 'td')),
array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
));
*/
$subForm = new Zend_Form_SubForm();
$subForm->setLegend('META-теги:');
$meta_param = new Zend_Form_Element_Text('param');
$meta_param->setIsArray(true)
->setLabel('Параметр')
->addFilter('StringTrim');
$subForm->addElement($meta_param);
$meta_value = new Zend_Form_Element_Text('value');
$meta_value->setIsArray(true)
->setLabel('Значение')
->addFilter('StringTrim');
$subForm->addElement($meta_value);
$this->addSubForm($subForm, 'element');
$sitemap = new Zend_Form_Element_Textarea('sitemap');
/* ......... */
$robots = new Zend_Form_Element_Textarea('robots');
/* ......... */
$submit = new Zend_Form_Element_Submit('submit');
$submit->setAttrib('id', 'submitbutton')
->setDecorators(array(
'ViewHelper',
array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')),
array(array('label' => 'HtmlTag'), array('tag' => 'td', 'placement' => 'prepend')),
array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
));
//$this->addSubForm($subForm, 'aa');
$this->addElements(array($id, $sitemap, $robots, $submit));
}
}
Выглядит это так:
http://img515.imageshack.us/img515/7821/multifield1.png
На ZF пишу не так давно, но половина проекта уже написана, осталось только эту штуку реализовать.
Читал темы http://stackoverflow.com/questions/405897/zendform-array-based-elements и на этом форуме, но это всё немного не то...
Главная проблема - сделать поля построчно "имя[n] - значение[n]" ну в общем декораторы правильные и какой-то цикл по n добавить надо.
Прошу прощения, две ночи сидел, не соображаю уже. Буду рад любым подсказкам, спасибо.
Код:
$element = new Zend_Form_Element_...('someNameELement');
$element->setBelongsTo('parentElementName');
$subForm = new Zend_Form();
$subForm->setElementsBelongTo('parentElementName');
$subForm->addElement($element);
$form->addSubForm($subForm,'subFormName');
$element->setBelongsTo('parentElementName');
$subForm = new Zend_Form();
$subForm->setElementsBelongTo('parentElementName');
$subForm->addElement($element);
$form->addSubForm($subForm,'subFormName');
Код на основе вот этого поста:
http://stackoverflow.com/questions/405897/zend-form-array-based-elements