如何使用 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 中添加自定义属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在不安装 Zend 框架的情况下使用 Zend 库

Zend 框架 - 直接使用 SQL

如何使用 zend 框架创建站点地图?

如何在Zend框架中使用Zend_auth时设置超时

如何在zend框架中设置cookie?

在学说2和zend框架2中如何使用缓存?