1

У меня есть форма продукта (придерживайтесь меня здесь), которая имеет подформу, которая идентифицируется индексом массива продукта, и каждая из этих подформ содержит другую подформу (субформпредставление), которое идентифицируется идентификатором продукта, и эта подформация содержит флажок multi, который отображает каждый продукт двумя параметрами: выберите продукт и отметьте его как бесплатный.PHP Zend Subform - просмотр декоратора скрипта на элементе подформы

Когда я добавляю какой-либо декоратор (в идеале я хочу добавить пользовательский сценарий) ничего не выводится (без ошибок). Когда я не укажу декоратор для элемента, он выводит форму.

Расположение ниже.

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; 
    } 

} 

Заранее спасибо :) Натан

ответ

1

Синтаксис моего декоратора был немного не так, и не хватало одного внешнего массива. Ниже приведено описание того, как должен выглядеть декоратор:

'decorators' => array(
    array(
     'ViewScript', array(
      'viewScript' => '/admin/partials/property-products.phtml', 
      'category' => 'services', 
      'options' => $product 
     ) 
    ) 
)