Zend Framework 2:能否从已添加元素访问Form类?
能否从已添加的元素访问Form类?
当然可以!咱们一步步来拆解你的需求和对应的解决方案。
首先,关于从元素访问所属的Form类:所有实现ElementInterface的元素类(比如Zend框架里的Zend\Form\Element),本身就自带getForm()方法,你可以直接通过它获取元素绑定的Form实例。比如在你的自定义视图助手里,就能这么用:
public function render(ElementInterface $element = NULL) { // 获取元素所属的Form对象 $form = $element->getForm(); // 可以进一步获取Form的类名 $formClassName = get_class($form); // 保留你原有的渲染逻辑 return '<div class="myclass">'.$this->view->formElement($element).'</div>'; }
看你的描述,你应该是希望把div的类名myclass和Form/元素关联起来(而不是单纯提取字符串)?如果是这样,拿到Form实例后,你可以从Form的自定义选项、配置或者属性里动态获取类名,替换掉固定的myclass。
举个实用的例子:先在你的Form类里定义自定义选项:
class MyCustomForm extends Form { public function init() { // 给Form设置自定义的容器类名选项 $this->setOption('container_class', 'my-custom-form-container'); // 添加元素逻辑 $this->add([ 'name' => 'email', 'type' => 'Email', ]); } }
然后在视图助手里,就可以动态获取这个类名:
public function render(ElementInterface $element = NULL) { // 先设置默认类名 $containerClass = 'myclass'; // 确保元素存在且已绑定Form if ($element && ($form = $element->getForm())) { // 优先用Form里定义的类名,没有则用默认值 $containerClass = $form->getOption('container_class') ?? $containerClass; } return '<div class="'.$containerClass.'">'.$this->view->formElement($element).'</div>'; }
这里要注意一个小细节:如果元素还没被添加到Form中,getForm()会返回null,所以加个判断能避免报错,让代码更稳妥。
内容的提问来源于stack exchange,提问作者Gwen Hufschmid
相关产品推荐
相关产品推荐

