Запутался при обновлении контента - PullRequest
0 голосов
/ 05 ноября 2011

Я использую CakePHP 1.3.10, jQuery для JsHelper и jQueryUI. На моей странице есть ссылка «Вход», и когда пользователь нажимает на нее, открывается диалоговое окно с формой входа внутри. Все работает нормально, но часть CakePHP, отправив форму, полностью облажалась.

У меня есть два шаблона входа в систему "login.ctp" и "ajax_login.ctp". Поэтому, когда диалоговое окно открывается в первый раз, отображается «Login.ctp», и при отправке неверных данных для входа «ajax_login.ctp» появляется как «update». Все работает нормально, но когда я отправляю форму в "ajax_login.ctp" - он перенаправляет меня на http://localhost/project/login - что явно не должно.

После поиска ошибки, я обнаружил, что HTML все правильно. Ошибка заключается в том, что id-атрибут из кнопки «ajax_login.ctp» является другим, чем в кодовом блоке javascript. Да, я знаю, что мог бы использовать идентификатор исправления, но я думаю, что это неправильное решение, потому что я думаю, что 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 * - login () функция

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

Идентификатор кнопки отправки при первом открытии диалогового окна входа в систему: # submit-1033269670 Идентификатор кнопки подтверждения после первого входа в систему (неправильные данные): # submit-2037877124

Как вы можете видеть, во второй раз Id - это еще один, но JavaScript не изменил его. Событие javascript ссылается на первый идентификатор # submit-1033269670

Надеюсь, мои объяснения не слишком запутаны ^^. Ждем вашей помощи!

1 Ответ

0 голосов
/ 05 ноября 2011

Хорошо, из вашего описания, вот грубое объяснение того, что я думаю, что происходит.Js Helper Cake генерирует jQuery и записывает его в представления, которые отображаются в макетах.Помощник Js добавляет динамически сгенерированное число к концу каждого сгенерированного идентификатора элемента, чтобы гарантировать, что все сгенерированные идентификаторы элемента уникальны (и отслеживает их для обратных вызовов, таких как 'update'=>'#whatever-id'.)

Одна из проблем здесьэто просто два разных представления - не макет ajax, а представление, и небольшой фрагмент кода формы в элементе представления, готовом к ajax.У вас есть 2 идентичные формы, и по звукам Cake отображает обе (правильно, для того, что было сказано) следующим образом:

  1. users / login - первый вызов делает плоскийПредставление users / login.ctp
  2. при попытке войти в систему, нажав кнопку с поддержкой jquery, заставляет RequestHandler обнаруживать ответ ajax, когда метод login () запускается как действие формы,
  3. , что, в свою очередь,содержит логику, которая вручную отображает второе представление users / ajax_login.ctp
  4. и, поскольку они представляют собой две разные формы в двух разных представлениях, 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.:) Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...