如何在 zend dojo 表单中添加 javascript 函数?

Posted

技术标签:

【中文标题】如何在 zend dojo 表单中添加 javascript 函数?【英文标题】:How to add javascript function in a zend dojo form? 【发布时间】:2012-08-22 09:19:25 【问题描述】:

我正在与 Zend_dojo_form 战斗。

这是(部分)代码:

class Application_Form_RegistrationForm extends Zend_Dojo_Form 

    private $_user;
    private $_admin;
    private $_teamadmin;
    private $_newuser;
    private $_redirect;

    public function __construct($admin = false, $user = null, $redirect = '') 
        //blablabla
        parent::__construct();
    

    public function init() 

        Zend_Dojo::enableForm($this);

        $this->setMethod('post');
        $this->setAttribs(array(
            'id' => 'formRegistration',
            'name' => 'formRegistration',
        ));

        //some decorators

        if ($this->_admin) 
            $this->addElement(
                //blabla + inline javascript
                'onChange' => "if(this == ".E_UserRole::OPERATOR.") dojo.query(\".perms\").style( display:\"block\" );  else dojo.query(\".perms\").style( display:\"none\" ); "
                )
            );
        

        if (Application_Manager_Login::hasRole(E_UserRole::ADMIN)) 
                //add some display:none elements
                $permission_decorators  = array(
                    "DijitElement",
                    "Errors",
                    array(array("data" => "htmlTag"), array("tag" => "td", "class" => "perms", "style"=> "display:none", )),
                    array("Label", array("tag" => "td", "class" => "perms", "style"=> "display:none", 'escape' => false, 'requiredSuffix' => ' <span class="red">*</span>')),
                    array(array("row" => "HtmlTag"), array("tag" => "tr"))
                );

                //hidden element
                $this->addElement(
                    'CheckBox',
                    'permission_content',
                    array(
                        'decorators' => $permission_decorators,
                        'label'          => 'Gestione contenuti',
                        'checkedValue'   => true,
                        'uncheckedValue' => false,
                        'checked'        => $this->_user->permission_content,
                    )
                );      
        
        //submit button and other stuff
    

如您所见,我已经放置了一些内联 javascript 来在 user_role 更改时显示/隐藏一些选项。

现在情况有点复杂。我可以继续编写内联 javascript,但我想在开头声明一个 js 函数,然后从 onchange 事件中调用它。

由于这个表单被多个控制器调用,我不会每次手动添加这个函数

new RegistrationForm();

被调用。

【问题讨论】:

你不能在一个外部的 JS 文件中不显眼地做到这一点吗? @TimFountain 我找到了解决方案。外部化 js 不是我想要的,因为我不在视图中。我要写解决方案。 【参考方案1】:

好的,我想出了这个解决方案..

function addJavascript()

        echo "<script>
        function toggle( e )
            alert(e);
            if(e == ".E_UserRole::USER." || e == ".E_UserRole::ADMIN.") 
                dojo.query(\".perms\").style( display:\"none\" );
              
            else  
                dojo.query(\".perms\").style( display:\"block\" ); 
            
           
        </script>
        ";


我在类中声明了这个函数,我只是在开头调用它:

$this->addJavascript();

然后在 onChange 中我调用了我需要的切换函数(函数会变得更复杂,我需要这个变通方法使其可读):

$this->addElement(
       //blabla
       'onChange' => "toggle(this)",
       )
);

希望这对其他人有帮助:)

【讨论】:

以上是关于如何在 zend dojo 表单中添加 javascript 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过按 Enter 使用 Dojo 和 XHR 发送 Zend 表单

在 Zend Framework 中按需启用对表单的 Dojo 支持

如何使用 DOJO 元素以 zend 形式分别呈现标签和元素

Zend_Dojo 表单密码文本框验证不起作用

Zend Dojo 表单上的斜线被 \/ 替换

Zend Dojo 元素 ID 缺失