Zend Forms and Ext.grid.Panel



我在一家使用表格式html/JS接口的公司工作。这些都是自己开发的(非常诚实),查询事件附加到每个单元。对于旧的用法,它们是合适的,但是在客户端,行和单元格之间所需的交互变得复杂得多。具体来说,他们需要服务器端和客户端验证。

为了方便起见,我报告的开发人员都非常热衷于Zend_Forms,并坚持使用像ExtJS这样的框架,他们不想必须编写两次后端和前端代码(请忽略,如果它都是自己开发的,他们无论如何都必须这样做)。

因此,考虑到这一点,我试图利用Zend_Form装饰器来创建Ext.grid.Panel列定义。为此,我需要使用装饰器来导出一个数组(然后使用ViewHelper对其进行json),或者直接渲染一个json字符串。

就像这样:

$dateElement = new Zend_Form_Element_Text('startDate', array(
    'label' => 'Start Date',
    'validators' => array(
        new Zend_Validate_Date()
    )
));
echo (string)$dateElement;

将输出:

{ text: 'Start Date',  dataIndex:'startDate', xtype:'datecolumn'}

或(显然不是字符串强制转换,但可能是->toArray()或其他):

array( 'text' => 'Start Date', 'dataIndex' => 'startDate', 'xtype' => 'datecolumn')

我想如果我能把它弄到这个阶段,我就能得到我想要的了。

这里有人试图做类似的事情(获得JSON/XML/其他标记输出,而不是HTML从Zend_Forms使用装饰器),或者如果他们可以指向我任何资源?

我想我有一个解决办法…

创建一个类似这样的装饰器:

class My_Form_JSON_Decorator extends Zend_Form_Decorator_Abstract{
    protected $xtype;
    protected $dataIndex;
    public function __construct($dataIndex,$xtype){
        $this->xtype=$xtype;
        $this->dataIndex=$dataIndex;
    }
    public function render($content){
        $element=$this->getElement();
        $label=$element->getLabel
        //if you need errors here too do the same with $element->getMessages();
        return 'array ("text"=>"'.$label.'","dataIndex"=>"'.$this->dataIndex.'","datecolumn"=>"'.$this->xtype.'")';
    }
}

然后,在表单上,使用类似这样的内容:

$dateElement = new Zend_Form_Element_Text('startDate', array(
    'label' => 'Start Date',
    'validators' => array(
        new Zend_Validate_Date()
)
$dateElement->setDecorators(array(
    new My_Form_JSON_Decorator("startDate","datecolumn");
));

最后,在视图中,你应该有这个:

{
    Date: <?php echo $this->form->startDate; ?>,
}

我没有尝试上面的代码,但是,我用了一个类似的代码,当我需要改变一个窗体的装饰器。

它不可能完全正确,但我认为它向您展示了一种方法。

做得好=)

最新更新