gpt4 book ai didi

zend-framework - 如何使用 Zend_Form->createElement()

转载 作者:行者123 更新时间:2023-12-04 14:51:03 25 4
gpt4 key购买 nike

我有一个基本用户表单,我为每个用例子类化,即注册、编辑等。

一些表单元素对于所有用例都是通用的,对于这些我使用表单作为元素工厂,例如$this->addElement('text', 'first_name', array(...))。这很好用。

对于仅在某些用例中需要的元素,我在基本表单类中创建它们,但不添加它们,例如$this->createElement('text', 'id', array(...))。当我进入子类本身时,就是我实际添加这些可选元素的时候。

现在,我认为在子类中,我可以简单地使用以下任一方法添加元素:

$this->addElement($this->getElement('id'));

或者
$this->addElement($this->id);

但事实并非如此。我收到一个异常,说我正在尝试 addElement(NULL)。

我可以获得所需结果的唯一方法是将 create 元素专门分配给成员变量,然后使用该变量名称。

例如在基本形式中:
$this->id = $this->createElement('text', 'id', array(...));

然后在子类中:
$this->addElement($this->id);

在我看来,这应该会产生变量名称冲突。如果 createElement 没有将我的元素命名为“id”,那么它的命名是什么?

编辑

我在父类和子类中都使用 init() 方法,子类的 init() 调用父类 init() 作为其第一个任务。

最佳答案

一切都按预期工作。没有名称冲突,因为当您使用 $this->createElement() 时,您创建的元素实际上并未保留在任何地方。使用这种方法,您必须显式地将元素保留在某个变量(如成员变量)中,然后使用 $this->addElement() 将其添加到表单元素集中。

如果您查看 Zend_Form 源代码,您会注意到:

1-调用createElement()时,元素被创建并立即返回;换句话说,该元素不在内部保存在任何地方,因此您必须自己保存它并将其添加到后面的表单中:

public function createElement($type, $name, $options = null)
{
...
$element = new $class($name, $options);
return $element;
}

2- 当您调用 addElement() 时,元素随后被添加到表单中,并在内部保存在名为 _elements 的 protected 成员数组中。这与做同样的事情:
$this->id = $this->createElement('text', 'id', array(...));

它神奇地调用了 addElement() (正如用户 user594791 在他的评论中指出的那样)。您也可以直接将元素放入 _elements 数组中,但我建议不要这样做,因为 addElement() 会做一些进一步的处理。没有名称冲突,因为您两次执行相同的操作(正如 Marcin 在另一个答案中指出的那样),并且在第二次您用自身覆盖元素。

最后,我还建议不要实例化您不会使用的元素(浪费资源并且不是很好的编程实践)。最好为父类中可能需要的元素保留一个关联的配置数组;然后,在您的子类中,您只需使用预先存储在父类中的相应配置数组来实例化您真正需要的元素。一个例子:
class ParentForm extends Zend_Form {
...
protected $_elementConfig;
...
public function init() {
...
// Add element configuration, but don't instantiate element right now
$this->_elementConfig = array();
// Element 1, a text input
$this->elementConfig['myTextInput'] = array(
'Text',
array(
'label' => 'Theme',
'description' => 'Main application theme',
'maxLength' => 128,
'validators' => array(
array('StringLength', false, array('max' => 128))
),
'filters' => array(
array('HtmlEntities')
)
)
);
// Element 2, a submit button
$this->elementConfig['mySubmitButton'] = array(
'Submit',
array(
'label' => 'Save'
)
);
// Element 3, something else
...
}
...
}

class ChildForm extends ParentForm {
public function init() {
parent::__construct(); // Parent init() is called by the parent constructor
...
// Will use the submit button
$this->addElement(
$this->_elementConfig['mySubmitButton'][0], // Type of element
'mySubmitButton', // Name of element
$this->_elementConfig['mySubmitButton'][1] // Config of element
);
}
}

如果你有很多元素,并且不想过多地污染父init()方法,我建议你把完整的元素定义放在一个外部文件中,这个文件可以是一个PHP文件,它返回一个完整配置的PHP数组、XML 文件、INI 文件或 Zend_Config 支持的任何其他格式(您可以在没有实际 PHP 代码的情况下定义元素 - here - 在页面底部 - 是使用 INI 定义元素的示例文件)。

关于zend-framework - 如何使用 Zend_Form->createElement(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6577110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com