CakePHP - Как использовать форму входа в качестве элемента

Я изучаю CakePHP. Я пытаюсь разработать систему входа в систему, но вместо того, чтобы использовать login.ctp в качестве пользователя/представления, я хотел бы использовать его как элемент, потому что у меня есть форма входа на многих других страницах. Как я могу объявить в своем user_controller, что моя функция login() будет использовать только элемент. Я сказал это, потому что использовал $this->render('/elements/login'), и это сработало. Однако мой элемент login.ctp находился в макете default.ctp, поэтому у меня было две формы входа. Один был элементом, а другой — моим содержимым в макете default.ctp.

Спасибо!


person ZéSá    schedule 21.06.2011    source источник


Ответы (2)


Макеты предназначены для «большой» разметки страницы: заголовок и метаинформация, включает в себя «нижний колонтитул», например, вашу аналитику. Общие указатели содержимого идут посередине, поэтому нет необходимости отмечать что-то конкретное, например форму в макете, если вы действительно не хотите включать эту форму на каждую страницу, использующую этот макет.

Похоже, вы либо вызвали $this->render() в своем представлении? $this->render() — это метод контроллера. $this->element — это метод представления.

Или вы вызвали $this->element('/elements/login'); из вашего представления login.ctp? Это означало бы, что контроллер отображает представление login.ctp по умолчанию, которое вызывает элемент login.ctp.

Таким образом, вы видели два. Чинить:

Чтобы вернуть что-то, отличное от представления по умолчанию, связанного с действием (например, фрагмент вашего входа в систему), вызовите $this->render('name/of/whatever'); как последняя строка метода контроллера. Он вернет указанное вами представление; set будет передавать ему любые переменные, как обычный вызов представления, и если вы хотите получить фантазию, укажите макет как ajax и наблюдайте, как начинается волшебство, как $this->render('/elements/login', 'ajax') .

Если вам нужно вызвать несколько элементов в одном файле представления, используйте метод $this->element('/fancy/nav/whatever'); вы также можете разместить их в соответствующих макетах (навигация и т. д.)

ХТН. :)

person OpenSorceress    schedule 21.06.2011
comment
Вау! Отличное объяснение! Я вызывал элемент из моего контроллера, поэтому у меня были сообщения об ошибках. Итак, я должен вызвать свой элемент с моей точки зрения. Уже слишком поздно, и я устал, но завтра я проверю, действительно ли я понял ваше объяснение. Большое тебе спасибо! - person ZéSá; 21.06.2011

Я сделал то же самое с моим проектом, и это то, что я сделал.

По сути, я создал новый loginElement.ctp и поместил его в папку element. Я создаю новые наборы HTML-кода, которые соответствовали бы макету, в котором я хотел использовать этот элемент, а затем loginElement.ctp <form отправлял данные в login action в users_controller.

Если вам нужно, и когда я вернусь домой позже, я могу опубликовать свой точный код здесь.

=================================== РЕДАКТИРОВАТЬ ============= =============================

Вот коды, которые я использовал:

Прежде всего вы заметите, что action в форме входа указывает на /login.

У меня есть эта настройка в моем файле /config/routes.php как таковая

Router::connect('/login', array('controller' => 'users', 'action' => 'login'));

Тогда другие коды ниже

/views/elements/thinlogin.ctp

<div id="login">                
    <form method="post" action="/login" accept-charset="utf-8" class="formBox">
      <fieldset>
            <input type="hidden" name="_method" value="POST" />
        <div class="form-col">
            <label for="username" class="lab">Username/Email</label>
            <input name="data[User][username]" type="text" id="UserUsername" class="input">
        </div>
        <div class="form-col form-col-right">
            <label for="password" class="lab">Password</label>
            <input type="password" name="data[User][password]" id="UserPassword" class="input">
        </div>
        <div class="form-col form-col-submit"> 
          <input name="" value="Login" class="submit" type="submit">
        </div>     
        <div class="form-col form-col-check">
          <label><input name="remember" class="checkbox" type="checkbox">Remember me on this computer</label>
        </div>            
      </fieldset>
    </form>
</div>

/views/pages/home.ctp

<div id="home_top_right_top">
        <?php
        if (!$this->Session->check('Auth.User.id'))
        {
            echo $this->element('login/thinlogin');
        }else{
            echo $this->element('login/loggedin');
        }
        ?>        
</div>
person AKKAweb    schedule 21.06.2011
comment
Не могли бы вы опубликовать точную процедуру вызова login.ctp внутри папки элемента. - person Anandhan; 09.08.2011