Форма 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('«', 'question/list?page=1') ?>
<?php echo link_to('<', '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('>', 'question/list?page='.$question_pager->getNextPage()) ?>
<?php echo link_to('»', '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)) ?>
Комментариев нет:
Отправить комментарий