【问题标题】:Zend Forms and Ext.grid.PanelZend Forms 和 Ext.grid.Panel
【发布时间】:2012-01-19 19:55:12
【问题描述】:

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

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

因此,考虑到这一点,我正在尝试利用 Zend_Form decorators 创建 Ext.grid.Panel column defintions。为此,我需要使用装饰器来导出一个数组(然后使用 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/其他标记输出,而不是使用装饰器从 Zend_Forms 获取 HTML)或者他们是否可以向我指出任何资源?

【问题讨论】:

  • 你想要的是像打印一个字段和他的名字作为 JSON 或 XML 而没有 HTML?我问这个是因为我从来没有使用过 ExtJS,但是,如果这是你想要的,我想我有一部分解决方案......你能举一个你想要从装饰器输出的例子吗?
  • 我希望能够将整个元素表示为 JSON,就像渲染时元素在 HTML 中“表示”时一样,减去验证。这是这里的关键,我想将验证从后端传递到 javascript,这样我就可以进行用户方便的 js 验证,并且还可以在 PHP 上再次验证,因为出于安全原因,我不能相信 $_REQUEST 是卫生的.

标签: json extjs extjs4 zend-form zend-framework


【解决方案1】:

我想我有一个解决办法...

制作一个类似这样的装饰器:

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

我没有尝试上面的代码,但是我使用了我曾经在需要更改表单的装饰器时使用的类似代码。

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

干得好 =)

【讨论】:

  • 代码运行良好吗?还是有错误?如果有错误,请告诉我以更正的方式编辑答案 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多