1

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
    }
}

ご覧のとおり、user_role が変更されたときにいくつかのオプションを表示/非表示にするインライン JavaScript をいくつか入れました。

現在、状況は少し複雑です。インライン JavaScript を書き続けることもできますが、最初に js 関数を宣言し、onchange イベントから呼び出すだけにしたいと考えています。

このフォームは複数のコントローラーによって呼び出されるため、毎回この関数を手動で追加することはしません。

new RegistrationForm();

と呼ばれます。

4

1 に答える 1

0

わかりました、私はこの解決策を思いつきました..

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)",
       )
);

これが他の誰かに役立つことを願っています:)

于 2012-08-22T09:59:53.203 に答える