我使用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
我希望我的解释不会太混乱^^。期待您的帮助!
答案 0 :(得分:0)
好的,根据您的描述,这里是我认为正在发生的事情的粗略解释。 Cake的Js Helper 生成 jQuery并将其写入在布局中呈现的视图中。 Js Helper将动态生成的数字附加到每个生成元素的id的末尾,以确保所有生成的元素ID都是唯一的(并跟踪它们以回复诸如'update'=>'#whatever-id'
之类的回调。)
这里的一个问题是,这些只是两个不同的视图 - 不是ajax布局,视图,以及ajax-ready视图元素中的一小部分表单代码。你有两个相同的形式,从它的声音,Cake正在渲染两个(正确的,它被告知要做的)如下:
不同的回调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。祝你好运。