对更新内容感到困惑

时间:2011-11-05 01:03:50

标签: javascript jquery ajax cakephp

我使用CakePHP 1.3.10,jQuery用于JsHelper和jQueryUI。在我的页面上有一个名为“Login”的链接,当用户点击它时,会打开一个对话框,里面有loginform。一切正常,但提交表格的CakePHP部分完全搞砸了。

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

搜索完bug后,我发现html是正确的。错误是来自“ajax_login.ctp”的提交按钮的id-attribut是另一个而不是javascript代码块。是的,我知道我可以使用修复ID,但我想这不是正确的解决方案,因为我认为CakePHP工作正常,只有我做错了(?)。

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

<div id="login-dialog" title="Login">
  <?php
    echo $this->Session->flash('auth');
    echo $this->Form->create('User', array('controller' => 'users', 'action' => 'login'));
    echo $this->Form->input('email');
    echo $this->Form->input('password');
    echo $this->Js->submit(
        'Login', 
        array(
            'type' => 'html', 
            'url' => array('controller' => 'users', 'action' => 'login'),
            'update' => '#login-dialog'
        )
    );
    echo $this->Form->end();
  ?>
</div>

*用户/ ajax_login.ctp *

<?php
echo $this->Session->flash('auth');
echo $this->Form->create('User', array('controller' => 'users', 'action' => 'login'));
echo $this->Form->input('email');
echo $this->Form->input('password');
echo $this->Js->submit(
    'Login', 
    array(
        'type' => 'html', 
        'url' => array('controller' => 'users', 'action' => 'login'),
        'update' => '#login-dialog'
    )
);
echo $this->Form->end();
?>

* users_controller.php * - 登录()功能

public function login() {
        if($this->RequestHandler->isAjax() == true) {
            $this->layout = 'ajax';
            if($this->Auth->login() === 1) {
                $this->redirect(array('action' => 'account'));
            }
            $this->render('ajax_login');
        }
        return $this->Auth->login();
    }

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

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

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

1 个答案:

答案 0 :(得分:0)

好的,根据您的描述,这里是我认为正在发生的事情的粗略解释。 Cake的Js Helper 生成 jQuery并将其写入在布局中呈现的视图中。 Js Helper将动态生成的数字附加到每个生成元素的id的末尾,以确保所有生成的元素ID都是唯一的(并跟踪它们以回复诸如'update'=>'#whatever-id'之类的回调。)

这里的一个问题是,这些只是两个不同的视图 - 不是ajax布局,视图,以及ajax-ready视图元素中的一小部分表单代码。你有两个相同的形式,从它的声音,Cake正在渲染两个(正确的,它被告知要做的)如下:

  1. users / login - 首次调用呈现平面用户/ login.ctp视图
  2. 尝试通过单击启用jquery的按钮进行登录会导致RequestHandler在login()方法作为表单操作触发时检测到ajax响应,
  3. 反过来包含手动呈现第二个用户/ ajax_login.ctp视图的逻辑
  4. 由于它们在2个不同的视图中有两种不同的形式,因此Cake为每个视图生成一个唯一的ID。
  5. 不同的回调ID是一个死的赠品。

    你需要什么是你的视图/布局中的1.)ajax布局,2。)用户/ login.ctp视图文件最初将3.)表单作为元素而不是一个完整的视图,以及4.)可能是login()成功后调用的元素,并调用account()。

    设置Auth组件的标称手势,即允许/禁止控制器操作并定义默认登录重定向:

    // 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组件会记住用户在提示登录之前请求的控制器/操作,并将用户重定向到该控制器操作(如果存在);否则,它会将用户重定向到loginRedirect属性中指定的任何内容。

    在您的用户/登录方式中:

    //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()用于手动记录用户,例如用作signup()方法的回调等。

    这是你的ajax布局:

    // views/layouts/ajax.ctp
    <?=$content_for_layout;?>
    

    您的观点/用户/ login.ctp:

    <div id="login-dialog" title="Login">
        <?= $this->element('login') ?>
    </div>
    

    您的观点/元素/ login.ctp:

    <?php
    echo $this->Session->flash('auth');
    echo $this->Form->create(...) /* etc. the rest of your form */
    ?>
    

    您的观点/元素/ account.ctp:

    <div class="user-account">
    <? // Markup, results of an `account()` action, etc. ?>
    </div>
    

    您的controllers / users_controller.php方法:

    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'); 
        }
    }
    

    http://book.cakephp.org/view/57/Controller-Methods(特别是流量控制)

    http://book.cakephp.org/view/1250/Authentication

    真正的好东西在api中: http://api.cakephp.org/class/auth-component

    HTH。祝你好运。