Javascript 对更新内容感到困惑

Javascript 对更新内容感到困惑,javascript,jquery,ajax,cakephp,Javascript,Jquery,Ajax,Cakephp,我使用CakePHP1.3.10、jQuery作为JsHelper和jQueryUI。在我的页面上有一个名为“Login”的链接,当用户单击它时,会打开一个对话框,其中包含loginform。一切正常,但提交表单的CakePHP部分完全搞糟了 我有两个登录模板“login.ctp”和“ajax\u login.ctp”。因此,当对话框第一次打开时,会显示“Login.ctp”,并且通过提交错误的登录数据,“ajax_Login.ctp”会显示为“update”。一切正常,但当我在“ajax\u

我使用CakePHP1.3.10、jQuery作为JsHelper和jQueryUI。在我的页面上有一个名为“Login”的链接,当用户单击它时,会打开一个对话框,其中包含loginform。一切正常,但提交表单的CakePHP部分完全搞糟了

我有两个登录模板“login.ctp”和“ajax\u login.ctp”。因此,当对话框第一次打开时,会显示“Login.ctp”,并且通过提交错误的登录数据,“ajax_Login.ctp”会显示为“update”。一切正常,但当我在“ajax\u login.ctp”中提交表单时,它会将我重定向到-这显然是不应该的

在搜索bug之后,我发现html是正确的。错误在于“ajax_login.ctp”的submit按钮的id属性是javascript代码块中的另一个属性。是的,我知道我可以使用一个修复id,但我想这不是正确的解决方案,因为我认为CakePHP工作正常,只有我犯了一个错误(?)

以下是一个例子: 用户/login.ctp

第一次打开登录对话框时提交按钮Id:#提交-1033269670 首次登录失败后的Submitbutton Id(数据错误):#submit-2037877124

正如您所看到的,第二次,Id是另一个,但是javascript没有改变它。javascript事件引用第一个id#submit-1033269670


我希望我的解释不要太混乱。期待您的帮助

好的,根据你的描述,这里是我认为正在发生的事情的粗略解释。Cake的Js助手生成jQuery并将其写入在布局中呈现的视图中。Js助手在每个生成的元素id的末尾追加一个动态生成的编号,以确保所有生成的元素id都是唯一的(并跟踪它们以进行回调,例如
'update'=>'#which id'

这里的一个问题是,这仅仅是两个不同的视图——不是ajax布局,而是一个视图,以及ajax就绪视图元素中的一小段光滑的表单代码。你有两种完全相同的形式,从它的声音来看,Cake将这两种形式都呈现出来(正确地说,就是它被告知要做的事情),如下所示:

  • users/login-第一次调用呈现平面用户/login.ctp视图
  • 当login()方法作为表单操作激发时,试图通过单击jquery enabled按钮进行登录会导致RequestHandler检测到ajax响应
  • 它又包含手动呈现第二个users/ajax\u login.ctp视图的逻辑
  • 由于它们是两个不同视图中的两种不同形式,Cake会为每个视图生成唯一的ID 不同的回调id完全是免费的

    您需要的是1.)视图/布局中的ajax布局,2.)最初将表单作为元素(而不是整个视图)拉入自身的用户/login.ctp视图文件,以及4.)可能是登录()成功并调用account()后要呈现的元素

    设置身份验证组件的一种名义姿态,即允许/不允许控制器操作和定义默认登录重定向:

    // this could live in app_controller, to be 
    // application-wide, or users_controller
    function beforeFilter() {
            $this->Auth->allow('index','view', 'account');
            // and you probably want something like this:
            $this->Auth->loginRedirect = array('controller' => 'users',
                                               'action' => 'account');
    }
    
    Auth组件在提示用户登录之前记住用户请求的控制器/操作,并将用户重定向到该控制器操作(如果存在);否则,它会将用户重定向到LoginDirect属性中指定的任何位置

    在用户/登录方法中:

    //change this:
    if($this->Auth->login() === 1) {
    // to this:
    if($this->Auth->user() != null) {
    // and you probably want something like this:
     $this->redirect(array('action' => 'account'));
    
    $this->Auth->login()
    用于手动登录用户,例如作为
    注册()方法的回调等

    以下是您的ajax布局:

    // views/layouts/ajax.ctp
    <?=$content_for_layout;?>
    
    (esp流量控制)

    真正的好处在api中:


    HTH.:)祝你好运。

    谢谢你的回答,但这也不行。我采用了视图部分,因此我创建了元素/login.ctp和用户/login.ctp。但是现在,当我提交表单时,它返回其内部的users/login.ctp及其隐藏项,因为id login对话框具有css属性display:none;。然后我想“好吧,那么让我们返回elements/login.ctp视图。”但正如您所说,Javascript生成唯一的提交id,这种方式也不起作用。好吧,这就是进展:当您提交表单时,它返回AJAX的用户/登录操作。如果表单处理将其定向到登录操作,则表示登录正在查找$this->Auth->users()为空。发送什么?在login()方法的顶部粘贴
    debug($this->Auth)
    ,了解登录时发生的情况。别忘了sessions组件,再说一次,在没有ajax的情况下,您是否可以使用它?
    // this could live in app_controller, to be 
    // application-wide, or users_controller
    function beforeFilter() {
            $this->Auth->allow('index','view', 'account');
            // and you probably want something like this:
            $this->Auth->loginRedirect = array('controller' => 'users',
                                               'action' => 'account');
    }
    
    //change this:
    if($this->Auth->login() === 1) {
    // to this:
    if($this->Auth->user() != null) {
    // and you probably want something like this:
     $this->redirect(array('action' => 'account'));
    
    // views/layouts/ajax.ctp
    <?=$content_for_layout;?>
    
    <div id="login-dialog" title="Login">
        <?= $this->element('login') ?>
    </div>
    
    <?php
    echo $this->Session->flash('auth');
    echo $this->Form->create(...) /* etc. the rest of your form */
    ?>
    
    <div class="user-account">
    <? // Markup, results of an `account()` action, etc. ?>
    </div>
    
    var $components = array('Auth', 'Session', 'RequestHandler', 
                            'Js'=>array('Jquery'));
    
    public function login() {
        $this->layout = 'ajax';
        if ($this->Auth->user() != null) {
            $this->render('elements/account', 'ajax'); // enforces ajax layout
        } else {
            // whatever you want to do here, ie. log attempts, flash message, etc.
            $this->Session->flash('Please login'); 
        }
    }