如何使用 zend from 在 zend 框架 2 中添加自定义属性
Posted
技术标签:
【中文标题】如何使用 zend from 在 zend 框架 2 中添加自定义属性【英文标题】:How add custom attribute in zend framework 2 using zend from 【发布时间】:2014-05-02 05:30:34 【问题描述】:我想在一个 zend 框架项目中使用 angularJS,并且在这个项目中表单是使用 zend 表单生成的。如何在表单元素中添加角度指令,例如“ng-model”,但是每当我试图在 zend-form 元素(输入、选择等)中添加这个自定义属性时,我都没有得到这个属性--- -
这是我的潜在客户表格
LeadForm 类扩展表单
public function __construct()
parent::__construct('lead_form');
$this->setAttributes(array(
'action' => '',
'method' => 'post',
'name' => 'lead_form',
'id' => 'lead_form',
'class' => 'smart-form',
'role' => 'form',
'novalidate' => 'novalidate'
));
$this->add(array(
'name' => 'first_name',
'type' => 'text',
'options' => array(
'label' => 'First Name',
),
'attributes' => array(
'class' => 'form-control validate[required,custom[onlyLetterSp]]',
'placeholder' => 'First name',
**'ng-model' => "first_name", // this attribute is not generating in view**
),
));
这是我的控制器,它正在调用此表单并发送到视图以进行显示
$createLeadForm = new \Admin\Form\LeadForm();
return new ViewModel(array(
'form' => $createLeadForm,
));
这是我显示元素的代码
<?php echo $this->formInput($this->form->get('first_name')); ?>
但在打印此表单元素后,我在输入元素中看不到“ng-model”
<input type="text" value="" placeholder="First name" class="form-control validate[required,custom[onlyLetterSp]]" name="first_name" >
我已经设置了一个属性“ng-model”,但是这个属性没有出现在视图中
我想要这个元素(使用 zend 形式)-
<input type="text" ng-model="first_name" value="" placeholder="First name" class="form-control validate[required,custom[onlyLetterSp]]" name="first_name" >
如何使用 zend 表单来做到这一点,需要在此表单中进行哪些更改以及为什么我无法添加自定义属性?请帮帮我。
提前致谢
【问题讨论】:
【参考方案1】:你总是可以使用 data-ng-*:
$this->add(array(
// ...
'attributes' => array(
// ...
'data-ng-model' => 'first_name',
),
));
【讨论】:
感谢您的回答。我可以看到我可以在表单输入元素中使用“data-ng-model”属性,但不能在输入元素中使用“ng-model”。 为了使用 angular,我必须使用 zend 形式添加“ng-model”属性。你知道我该怎么做吗? uhmmm angular 也适用于 data-* :) 并且...更好...看看这个 URL:***.com/questions/16589853/…【参考方案2】:Zend 不支持其他属性,如果该属性以 data-* 以外的方式开始,因此为 ng-* 添加属性我必须修改 View Helper 类
在主库中的这个命名空间( Zend\Form\View\Helper )下,你会发现一个名为“AbstractHelper”的类,在这个类中,你可以获得一个名为“prepareAttributes”的方法,在这里你必须更改以下几行-
if (!isset($this->validGlobalAttributes[$attribute])
&& !isset($this->validTagAttributes[$attribute])
&& 'data-' != substr($attribute, 0, 5)
)
到
if (!isset($this->validGlobalAttributes[$attribute])
&& !isset($this->validTagAttributes[$attribute])
&& 'data-' != substr($attribute, 0, 5)
&& 'ng-' != substr($attribute, 0, 3)
)
看到这里我加了
&& 'ng-' != substr($attribute, 0, 3)
这样可以使用zend form添加ng-*属性
再次感谢
【讨论】:
哇,哇,你刚才是建议直接编辑 Zend 库文件吗?这是绝对不允许的——您的 Zend 库文件应该独立于您项目的其余部分,并且编辑这些文件意味着如果您升级 Zend 版本或将您的项目提供给其他人,它将无法工作。至少,您应该在自己的帮助程序中继承 Zend View 帮助程序,并在您自己的项目中进行所需的更改。作为一般规则,除非是您自己的,否则不应更改 Vendor 内部的任何内容。 如何在不编辑核心 Zend 框架的情况下完成这篇文章的建议?因为这实际上解决了问题。【参考方案3】:这对我有用。
class FooForm extends Form
public function __construct(LookupService $lookupService)
parent::__construct('fooForm');
$this->setAttribute('novalidate', true);
...
【讨论】:
【参考方案4】:试试这个:(数据属性)
ZF2:
public function __construct()
parent::__construct('lead_form');
$this->setAttributes(array(
'action' => '',
'method' => 'post',
'name' => 'lead_form',
'id' => 'lead_form',
'class' => 'smart-form',
'role' => 'form',
'novalidate' => 'novalidate'
));
$this->add(array(
'name' => 'first_name',
'type' => 'text',
'options' => array(
'label' => 'First Name',
),
'attributes' => array(
'class' => 'form-control validate[required,custom[onlyLetterSp]]',
'placeholder' => 'First name',
'data-ng' => json_encode(
array(
'ng-model' => 'first_name',
'ng-123' => '123',
), true
)
),
));
在你的 html 操作之后调用这个 JS 函数:
/**
* ZF2 supports no custom attributs
* this function converts data-ng attributes to ng attributes
*/
function addNgAttributes()
$('[data-ng]').each(function ()
var ngdata = $(this).data('ng');
var _this = this;
$.each(ngdata, function (key, value)
$(_this).attr(key, value)
);
)
【讨论】:
【参考方案5】:你应该扩展 Zend\Form\View\Helper\FormFile 并通过工厂替换它:
namespace YourNamespace;
use Zend\Form\View\Helper\FormFile;
class FormFile extends FormFile
/**
* Attributes valid for the input tag type="file"
*
* @var array
*/
protected $validTagAttributes = [
'name' => true,
'accept' => true,
'autofocus' => true,
'disabled' => true,
'form' => true,
'multiple' => true,
'required' => true,
'type' => true,
'yourCustomAttribute' => true, //<--- here add Your attribute
];
在module.php中:
public function getViewHelperConfig()
return array(
'factories' => array(
'Zend\Form\View\Helper\FormFile' => function($sm)
$helper = new \YourNamespace\FormFile();
return $helper;
)
);
那么您可以在表单类中使用 yourCustomAttribute 作为其他属性。
【讨论】:
以上是关于如何使用 zend from 在 zend 框架 2 中添加自定义属性的主要内容,如果未能解决你的问题,请参考以下文章