У меня есть форма продуктов (придерживайтесь меня здесь), у которой есть подформа, которая идентифицируется индексом массива продуктов, и каждая из этих подформ содержит другую подформу (подформой), которая идентифицируется по идентификатору продукта и этому подразделу. -form содержит мульти-флажок, который отображает для каждого продукта две опции: выберите продукт и отметьте его как бесплатный.
Когда я добавляю декоратор любого вида (в идеале я хочу добавить собственный скрипт вида), ничего не выводится (без ошибок). Когда я не указываю декоратор для элемента, он выводит форму.
Макет ниже.
products sub-form [
selection sub-form [
MultiCheckbox element[
decorator[
ViewScript[]
]
]
]
]
Вот моя форма. Возможно ли реализовать этот способ?
<?php
/**
* Properties_Form_Admin_Products
*/
/**
* Admin form for creating a new property
*
* @category Properties
* @package Form
*/
class Properties_Form_Admin_Products extends Cms_Form_DtDd {
/**
* @var Properties_Model_Property
*/
protected $_property;
/**
* @var Properties_Manager_Property
*/
protected $_propertyManager;
/**
* @var array
*/
private $products;
/**
* Initialize form (extended from Zend_Form)
*
* @return void
*/
public function init() {
parent::init();
$this->_propertyManager = Caboodle_Manager_Factory::get('Property');
$request = Zend_Controller_Front::getInstance()->getRequest();
$this->setMethod('post')
->setAttrib('id', 'product_form')
->setAttrib('class', 'page_form admin_form')
->setDecorators($this->formDecorators)
->setAction($this->getView()->url());
$subform = $this->addSubform(new Zend_Form_SubForm, 'products')
->getSubform('products')
->clearDecorators()
->addDecorator('FormElements');
// Add subform for each existing product time.
foreach ($this->getProducts() as $index => $product) {
$subform->addSubform(new Zend_Form_SubForm, (string) $index)
->getSubform((string) $product->getId())
->addElements(array(
new Zend_Form_Element_MultiCheckbox('selection', array(
'label' => $product->getName() . ' ('.$product->getDescription().')',
'decorators' => array(
// This form displays when the below decorator is commented out
array('ViewScript', array(
'viewScript' => '/partials/property-products.phtml',
'category' => 'Products',
'options' => $product
)
)
),
'multiOptions' => array(
'select' => 'Select',
'free' => 'Mark as free'
)
))
));
}
/* buttons */
$submit = new Zend_Form_Element_Submit('submit_btn');
$submit->setRequired(false)
->setIgnore(true)
->setLabel('Add and Pay')
->setAttrib('class', 'pos_btn')
->setDecorators($this->buttonDecorators);
$this->addElement($submit);
$this->addDisplayGroup(
array('submit_btn'), 'buttons', array('decorators' => $this->plainGroupDecorators)
);
}
/**
* Validate the form
*
* @param array $data
* @return boolean
*/
public function isValid($data) {
parent::isValid($data);
return !$this->_errorsExist;
}
/**
* Handle all of the form processing for the login form
*
* @param Zend_Controller_Request_Abstract $request
* @return void
*/
public function processForm(Zend_Controller_Request_Abstract $request) {
if ($request->isPost()) {
if ($this->isValid($request->getPost())) { // valid
$values = $this->getValues();
}
}
}
/**
* @param $products
* @return $this
*/
protected function setProducts($products)
{
$this->products = $products;
return $this;
}
/**
* @return array
*/
public function getProducts()
{
return $this->products;
}
}
Заранее спасибо 🙂
Натан
Синтаксис моего декоратора был немного неправильным и ему не хватало одного внешнего массива. Вот как должен выглядеть декоратор:
'decorators' => array(
array(
'ViewScript', array(
'viewScript' => '/admin/partials/property-products.phtml',
'category' => 'services',
'options' => $product
)
)
)
Других решений пока нет …