CakePHP: Добавляем «каменты» в блог.

Итак, мы решили начать программировать «по понятиям» и наконец разобраться с каким-нибудь фреймворком. Перед нами встаёт мучительный выбор, какой же фреймворк для этого использовать. Для этого можно найти кучу статей, обзоров, сравнительных анализов скорости, производительности, удобства использования и установки, а можно просто набрать в гугле «php framework» и кликнуть «Мне повезёт».

Ура, мы только что выбрали для разработки фрэймворк под названием CakePHP!
Конечно же читать про его достоинства и недостатки у нас нет времени, нам нужно как можно быстрее реализовать наш проект. Поэтому мы пишем в поиске tutorial и попадаем на статью о том, как за 5 минут наляпать маленький блог.

Статья эта начинается с описания того, как установить CakePHP в свой проект. Рассказывает о том, чего нужно хранить в каждой папочке и для чего они нужны.
Потом переходит сразу к делу, предлагает вам создать таблицу, настроить доступ к MySQL (почему-то именно в таком порядке, а не наоборот), проверить, правильно ли настроен mod_rewrite в апаче. И тут же предлагает приступить к созданию блога.
Блог этот представляет собой таблицу, в которой содержатся посты. Мы можем добавлять, редактировать и удалять посты. Надо заметить, что всё это действительно очень просто. Почти так же просто, как и на рельсах.

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

Но создав этот блог по этому туториалу, мы вдруг понимаем, что самого главного, ради чего ведутся все блоги, у нас нет. Это каменты (или «комментарии» для любителей чистоты языка). В панике мы начинаем гуглить, ища расширенный туториал, но убеждаемся, что кроме компонент заоблачной сложности нам ничего не найти. И тогда мы решаемся на отчаянный шаг: добавим функционал каментов сами.

Для этого сначала создадим таблицу, в которой будут хранится каменты

CREATE TABLE `comments` (
`id` int(11) NOT NULL auto_increment,
`post` int(11) default NULL,
`comment` text NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `comments` VALUES (1, 1, 'This is a comment to the first post.', NOW( ), '0000-00-00 00:00:00');
INSERT INTO `comments` VALUES (2, 2, 'The comment to second post.', NOW( ), '0000-00-00 00:00:00');

Этот запрос создал нам таблицу `comments` и добавил в неё два камента. К первой и второй записи соответственно.

Теперь надо сделать так, чтобы эти каменты были видны. Мы слыхали про MVC, поэтому сразу идём в контроллер постов (posts_controller.php). И добавляем там следующую строчку:

var $uses = array('Post', 'Comment');

Переменная $uses контроллера отвечает за те модели, которые будет использовать контроллер. Если эта переменная не задана, то по умолчанию он будет использовать только ту модель, чьим контроллером он собственно и является. То есть PostsController будет использовать только Post.

Тут, как видно, мы указываем контроллеру, что тот будет использовать модели Post и Comment.

Теперь отредактируем функцию контроллера, которая отвечает за отображение собственно поста.

function view($id)
{
$this->Post->id = $id;
$this->set('post',$this->Post->read());
// добавляем следующую строчку:
$this->set('comments' , $this->Comment->findAllByPost($id));
}

Этой новой строчкой, мы добавляем во вью новую переменную comment и устанавливаем её значение результату $this->Comment->findAllByPost($id).

Тут надо сказать пару слов о замечательном методе findAllByPost.

Умный CakePHP предоставляет классам, унаследованным от AppModel использовать методы типа findAllBy ( ). Которые найдут все записи из таблицы, соответствующей модели, где = . Здорово, правда?

Поэтому $this->Comment->findAllByPost($id) вернёт все каменты, принадлежащие отображаемому посту.

Теперь в файле view.thtml, который находится в папке app/views/posts добавим отображение этих каментов. Для этого в самый конец этого файла добавим:

<?php
foreach($comments as $comment):
echo '<p>'.$comment['Comment']['comment'].'</p><br/>';
endforeach;
?>

Тут вью пробежит по всем каментам, что мы передали во вью в предыдущем кусочке кода и выведит их на экран. Круто? Круто!

Но в каментах самое главное, чтобы их могли оставлять. Поэтому нам нужна форма добавления каментов внизу страницы поста. В этом нам поможет помощник форм.
var $helpers = array('Html', 'Form');

Эта строчка в файле posts_controller.php указывает контроллеру, какие помощники он будет использовать в своей работе. Нашему контроллеру постов помогают соответственно Html и Form.

Во всё тот же файл view.thtml добавляем следующее:

<?php
echo $form->create('Comment');
echo $form->hidden('post', array('value' => $post['Post']['id'])); echo $form->input('comment', array('type'=>'textarea'));
echo $form->submit('Submit');

echo $form->end();
?>

Это наш маленький помощник создал форму добавления камента. В нём скрытым полем (hidden) указан айдишник поста, а в textarea предлагается ввести камент.

Теперь нам нужно что-то, что сможет контролировать добавление этого камента. Это будет контроллер комментариев:

<?php
class CommentsController extends AppController
{
var $name = 'Comments';
function add()
{
if (!empty($this->data))
{
if ($this->Comment->save($this->data))
{
$this->Session->setFlash('Redirecting');
$this->redirect('/posts/view/'.$this->data['Comment']['post']);
}
else
$this->Session->setFlash('You fail');
}
}
}

У контроллера каментов всего один обработчик одного события «add». Он идентичен такому же обработчику добавления контроллера постов, только редиректит в другое место.

Ура! У нас теперь есть настоящий блог с каментами. Да не простой, а написанный на настоящем фреймворке, по взаправдашней архитектуре MVC. Своими собственными руками.

Источник: http://q-styler.habrahabr.ru/



Опубликовал admin
4 Апр, Пятница 2008г.



Программирование для чайников.