пятница, 18 апреля 2008 г.

Форма Login

Форма Login


Изменим глобальній шаблон /apps/frontend/templates/layout.php, добавив ссілку на регистрацию:

<li><?php echo link_to('sign in', 'user/login') ?></li>


Создадим модуль пользователь

$ symfony init-module frontend user


Создадим user/login action


в /apps/frontend/modules/user/actions/action.class.php добавим:


public function executeLogin()

{

$this->getRequest()->setAttribute('referer', $this->getRequest()->getReferer());

return sfView::SUCCESS;

}



Создадим шаблон loginSuccess.php


В /apps/frontend/modules/user/templates/ создаем файл loginSuccess.php:


<?php echo form_tag('user/login') ?>



<fieldset>



<div class="form-row">

<label for="nickname">nickname:</label>

<?php echo input_tag('nickname', $sf_params->get('nickname')) ?>

</div>



<div class="form-row">

<label for="password">password:</label>

<?php echo input_password_tag('password') ?>

</div>



</fieldset>



<?php echo input_hidden_tag('referer', $sf_request->getAttribute('referer')) ?>

<?php echo submit_tag('sign in') ?>



</form>



По правилам формі действие візівается, когда нажата кнопка submit


Изменим код executeLogin():


public function executeLogin()

{

if ($this->getRequest()->getMethod() != sfRequest::POST)

{

// display the form

$this->getRequest()->setAttribute('referer', $this->getRequest()->getReferer());

}

else

{

// handle the form submission

$nickname = $this->getRequestParameter('nickname');



$c = new Criteria();

$c->add(UserPeer::NICKNAME, $nickname);

$user = UserPeer::doSelectOne($c);



// nickname exists?

if ($user)

{

// password is OK?

if (true)

{

$this->getUser()->setAuthenticated(true);

$this->getUser()->addCredential('subscriber');



$this->getUser()->setAttribute('subscriber_id', $user->getId(), 'subscriber');

$this->getUser()->setAttribute('nickname', $user->getNickname(), 'subscriber');



// redirect to last page

return $this->redirect($this->getRequestParameter('referer', '@homepage'));

}

}

}

}



Привилегии устанавливаются здесь с помощью

$this->getContext()->getUser()->setAuthenticated(true);

$this->getContext()->getUser()->addCredential('subscriber');



Добавим функцию user/logout


public function executeLogout()

{

$this->getUser()->setAuthenticated(false);

$this->getUser()->clearCredentials();



$this->getUser()->getAttributeHolder()->removeNamespace('subscriber');



$this->redirect('@homepage');

}


Изменим layout


/apps/frontend/templates/layout.php:


<?php if ($sf_user->isAuthenticated()): ?>

<li><?php echo link_to('sign out', 'user/logout') ?></li>

<li><?php echo link_to($sf_user->getAttribute('nickname', '', 'subscriber').' profile', 'user/profile') ?></li>

<?php else: ?>

<li><?php echo link_to('sign in/register', 'user/login') ?></li>

<?php endif ?>



Постраничное листание Question


Изменим действие question/list


public function executeList ()

{

$this->questions = QuestionPeer::doSelect(new Criteria());

}



Воспользуемся обїектом sfPropelPager:


public function executeList ()

{

$pager = new sfPropelPager('Question', 2);

$c = new Criteria();

$c->addDescendingOrderByColumn(QuestionPeer::INTERESTED_USERS);

$pager->setCriteria($c);

$pager->setPage($this->getRequestParameter('page', 1));

$pager->setPeerMethod('doSelectJoinUser');

$pager->init();



$this->question_pager = $pager;

}


Конфигурацию листания зададим в /apps/frontend/config/app.yml:

  
all:
pager:
homepage_max: 2

Реализация этого - заменим new sfPropelPager line above by:

на

$pager = new sfPropelPager('Question', sfConfig::get('app_pager_homepage_max'));



Также модифицируем шаблон listSuccess.php


Заменим строку

<?php foreach($questions as $question): ?>

на

<?php foreach($question_pager->getResults() as $question): ?>



Организуем навигацию


В конец шаблона добавим

<div id="question_pager">

<?php if ($question_pager->haveToPaginate()): ?>

<?php echo link_to('&laquo;', 'question/list?page=1') ?>

<?php echo link_to('&lt;', 'question/list?page='.$question_pager->getPreviousPage()) ?>



<?php foreach ($question_pager->getLinks() as $page): ?>

<?php echo link_to_unless($page == $question_pager->getPage(), $page, 'question/list?page='.$page) ?>

<?php echo ($page != $question_pager->getCurrentMaxLink()) ? '-' : '' ?>

<?php endforeach; ?>



<?php echo link_to('&gt;', 'question/list?page='.$question_pager->getNextPage()) ?>

<?php echo link_to('&raquo;', 'question/list?page='.$question_pager->getLastPage()) ?>

<?php endif; ?>

</div>


Добавим routing правила


в apps/frontend/config/routing.yml добавим сверху:


popular_questions:

url: /index/:page

param: { module: question, action: list }


И для страницы login:


login:

url: /login

param: { module: user, action: login }


Оптимизация


Заменим question/list :


public function executeList ()

{

$this->question_pager = QuestionPeer::getHomepagePager($this->getRequestParameter('page', 1));

}


И добавим следующий метод в класс QuestionPeer.php модели lib/model:


public static function getHomepagePager($page)

{

$pager = new sfPropelPager('Question', sfConfig::get('app_pager_homepage_max'));

$c = new Criteria();

$c->addDescendingOrderByColumn(self::INTERESTED_USERS);

$pager->setCriteria($c);

$pager->setPage($page);

$pager->setPeerMethod('doSelectJoinUser');

$pager->init();



return $pager;

}


Тоже самое касается действия question/show: Заменим действие question/show на:


public function executeShow()

{

$this->question = QuestionPeer::getQuestionFromTitle($this->getRequestParameter('stripped_title'));



$this->forward404Unless($this->question);

}


Добавим в QuestionPeer.php:


public static function getQuestionFromTitle($title)

{

$c = new Criteria();

$c->add(QuestionPeer::STRIPPED_TITLE, $title);



return self::doSelectOne($c);

}


Шаблоны


Вопросы отображаются в question/templates/listSuccess.php. Поместим код шпблона в файл _list.php а содержимое listSuccess.php заменим на:


<h1>popular questions</h1>



<?php echo include_partial('list', array('question_pager' => $question_pager)) ?>

Комментариев нет: