Хорошо, из вашего описания, вот грубое объяснение того, что я думаю, что происходит.Js Helper Cake генерирует jQuery и записывает его в представления, которые отображаются в макетах.Помощник Js добавляет динамически сгенерированное число к концу каждого сгенерированного идентификатора элемента, чтобы гарантировать, что все сгенерированные идентификаторы элемента уникальны (и отслеживает их для обратных вызовов, таких как 'update'=>'#whatever-id'
.)
Одна из проблем здесьэто просто два разных представления - не макет ajax, а представление, и небольшой фрагмент кода формы в элементе представления, готовом к ajax.У вас есть 2 идентичные формы, и по звукам Cake отображает обе (правильно, для того, что было сказано) следующим образом:
- users / login - первый вызов делает плоскийПредставление users / login.ctp
- при попытке войти в систему, нажав кнопку с поддержкой jquery, заставляет RequestHandler обнаруживать ответ ajax, когда метод login () запускается как действие формы,
- , что, в свою очередь,содержит логику, которая вручную отображает второе представление users / ajax_login.ctp
- и, поскольку они представляют собой две разные формы в двух разных представлениях, Cake генерирует уникальные идентификаторы для каждого.
Различные идентификаторы обратного вызова - мертвая распродажа.
Что вам нужно - это 1) макет ajax в ваших представлениях / раскладках, 2.) aфайл представления users / login.ctp, изначально извлекающий 3.) форму как элемент, а не как целое представление, и 4.) вероятно, элемент для отображения после успешного входа в систему () и вызова 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.
В вашем методе users / login:
//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;?>
Your views / users / login.ctp:
<div id="login-dialog" title="Login">
<?= $this->element('login') ?>
</div>
Ваши представления / elements / login.ctp:
<?php
echo $this->Session->flash('auth');
echo $this->Form->create(...) /* etc. the rest of your form */
?>
Ваши представления / elements / account.ctp:
<div class="user-account">
<? // Markup, results of an `account()` action, etc. ?>
</div>
Ваши контроллеры / 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 (контроль потока esp)
http://book.cakephp.org/view/1250/Authentication
Реальные плюсы в API: http://api.cakephp.org/class/auth-component
HTH.:) Удачи.