Разработка простого веб-приложения CakePHP (часть 2)

Что такое CakePHP?

CakePHP – это мощный и надежный фреймворк, разработанный на основе архитектуры Model-View-Controller (MVC, или «Модель-Представление-Контроллер»). Данный фреймворк не только обладает гибкостью разработки приложения, но и предоставляет структуру для организации имен файлов и таблиц базы данных, которая помогает сохранять все в последовательном и логичном порядке.

В предыдущих руководствах этой серии было показано, как установить и настроить CakePHP на облачном сервере, а также как создать небольшое приложение, выполняющее операции CRUD (create, read, update, delete). На данном этапе вы уже знаете, как прочитать данные (посты) при помощи модели (Post), запросить их с помощью контроллера (PostsController) и создать пару представлений для отображения информации.

Данное руководство продемонстрирует, как завершить разработку приложения путем выполнения других операций CRUD (а именно создавать, обновлять и удалять данные). Для этого нужны созданные ранее контроллер и модель.

Примечание: прежде чем следовать данному руководству, пожалуйста, выполните два предыдущих руководства (если они не были выполнены ранее):

Установка CakePHP на сервер Ubuntu 12.04;
Разработка простого веб-приложения CakePHP (часть 1).

Добавление данных

Научившись выполнять операцию «чтение», можно приступить к добавлению новых постов. Прежде чем создать метод для контроллера, убедитесь, что у контроллера есть все необходимые компоненты. В предыдущем руководстве был добавлен хелпер (helper) Form:

public $helpers = array('Form');

Теперь нужно добавить хелперы HTML и Session; это делается путем внесения их в массив:

public $helpers = array('Form', 'Html', 'Session');

Кроме того, нужно добавить компонент Session. Ниже, под только что отредактированной строкой, внесите следующее:

public $components = array('Session');

Теперь нужно создать представление, которое будет содержать форму для добавления новой записи. Это представление будет использовать только что добавленный хелпер Form, что значительно упростит работу. Итак, в папке app/View/Posts/ создайте файл add.ctpи внесите в него следующий код:

<h1>Add Post</h1>
<?php
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->end('Save');
?>

Как видите, хелпер Form доступен прямо из представления, что позволяет очень быстро создать форму. Важно, что метод create() не получил при этом никаких параметров, он будет считать, что форма подчиняется ему (метод контроллера, загружающий данное представление будет создан далее).

Метод input() самоочевиден; тем не менее, есть один важный момент: этот метод будет генерировать элементы формы, которые соответствуют данным в таблице. Сохраните файл и создайте метод PostsController.

Внесите следующий код прямо под ранее созданный метод view() в PostsController:

public function add() {
if ($this->request->is('post')) {
$this->Post->create();
$post_data = $this->request->data;
if ($this->Post->save($post_data)) {
$this->Session->setFlash(__('New post saved successfully to the database'));
return $this->redirect(array('action' => 'index'));
}
$this->Session->setFlash(__('Unable to save the post to the database.'));
}
}

Эта функция (названная, как и представление, к которому она относится) сначала проверяет, поступил ли запрос типа POST, и вносит новые данные в таблицу, используя модель Post. Если все проходит успешно, функция добавляет данные сессии текущего пользователя и передает их методу index() (который выводит все посты на экран), который затем вернет сообщение с подтверждением. Если что-то пошло не так, метод вернет сообщение об ошибке. Чтобы проверить, все ли работает, перейдите по ссылке www.example.com/project/posts/add. Заполните форму, и она должна сохранить новый пост, перенаправить на индексную страницу поста и отобразить сообщение с подтверждением.

Поскольку PostsController был создан путем расширения контроллера CakePHP по умолчанию, он имеет доступ к большому количеству полезных функций, таким как объекты запроса. При помощи объекта запроса можно проверить, какие HTTP-запросы выполняются, а также получить доступ к данным POST. Кроме того, это дает доступ к методу redirect(), с помощью которого можно быстро перенаправить пользователя на другой метод или контроллер.

Проверка данных

На данном этапе нужно создать правило для модели Post, которое будет требовать установить заголовок при публикации нового поста. Добавьте следующую строку в модель Post:

public $validate = array('title' => array('rule' => 'notEmpty'));

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

Зачем нужен хелпер HTML?

Хелпер HTML необходимо включать в PostsController потому, что он может показать, как поставить правильную для CakePHP ссылку на страницу. Итак, откройте представление index.ctp, расположенное в папке app/View/Posts/ и добавьте следующий код после тега H1:

<?php echo $this->Html->link(
'Add Post',
array('controller' => 'posts', 'action' => 'add')
); ?>

Это вернет ссылку с анкером Add Post, которая будет передана методу add() контроллера PostsController. При желании можно таким же образом снова отредактировать файл, превратив названия постов на этой странице в ссылки на их страницы. Замените:

<?php echo $post['Post']['title']; ?>

Следующим кодом:

<?php echo $this->Html->link($post['Post']['title'], array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>

Больше информации о данном хелпере можно найти по этой ссылке.

Редактирование данных

Научившись создавать новые посты, можно попробовать отредактировать уже существующие посты. Рядом с add.ctp нужно создать представление, назвать его edit.ctp и внести следующее:

<h1>Edit Post</h1>
<?php
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->input('id', array('type' => 'hidden'));
echo $this->Form->end('Save');
?>

Главное отличие между представлениями edit.ctp и add.ctp состоит в том, что edit.ctp содержит идентификатор поста в качестве скрытых входных данных, благодаря чему CakePHP знает, что пост нужно редактировать, а не добавить. Сохраните и закройте файл. Теперь нужно создать метод edit() для PostsController:

public function edit($id = null) {
if (!$id) {
throw new NotFoundException(__('Post is not valid!'));
}
$post = $this->Post->findById($id);
if (!$post) {
throw new NotFoundException(__('Post is not valid!'));
}
if ($this->request->is('post') || $this->request->is('put')) {
$this->Post->id = $id;
$post_data = $this->request->data;
if ($this->Post->save($post_data)) {
$this->Session->setFlash(__('Your post has been updated.'));
return $this->redirect(array('action' => 'index'));
}
$this->Session->setFlash(__('Unable to update your post.'));
}
if (!$this->request->data) {
$this->request->data = $post;
}
}

Проверив ID поста, это поведение убеждается, что пост, к которому что пользователь пытается получить доступ, является действительным и существует в базе данных. Как и add(), этот метод проверяет, является ли запрос POST-запросом, и обновляет пост в базе данных. Если данных в объекте запроса нет, он заполнит элементы формы существующими в БД данными. И, как и поведение add(), это поведение перенаправляет пользователя к методу index() и выводит сообщение с подтверждением. Проверьте его работу.

Кроме того, можно отредактировать представление index.ctp и внести в него ссылку для редактирования отдельных постов. Добавьте следующий код после раздела Created:

<?php echo $this->Html->link('Edit', array('action' => 'edit', $post['Post']['id'])); ?>

Удаление данных

Последнее, что нужно сделать – это позволить пользователям удалять посты. Итак, добавьте к PostsController следующее поведение:

public function delete($id) {
if ($this->request->is('post')) {
if ($this->Post->delete($id)) {
$this->Session->setFlash(__('The post number %s has been deleted.', h($id)));
return $this->redirect(array('action' => 'index'));
}
}
}

Данный метод выдает исключение, если запрос относится к типу GET. Потом он использует модель Post (как и вышеуказанные поведения), но теперь он удаляет строку в таблице с идентификатором, который поставляется в запросе. В завершение он отправляет сообщение пользователю и перенаправляет на метод index(), который отображает сообщение.

Чтобы запустить метод delete(), нужно отредактировать представление index.ctp и использовать функцию postLink(), которая выведет небольшую форму, отправляющую POST-запросы, чтобы удалить строку из таблицы. Эта функция использует javascript, чтобы добавить окно предупреждения, а затем удаляет сообщение/пост. В файл index.ctp после ссылки на метод edit можно добавить следующее:

<?php echo $this->Form->postLink(
'Delete',
array('action' => 'delete', $post['Post']['id']),
array('confirm' => 'Are you sure you want to delete this post?'));
?>

Сохраните и закройте файл. Теперь посты можно удалять.

Итак, резюмируя все выполненные в руководстве действия, классы должны иметь такой вид:

Контроллер PostsController.php

class PostsController extends AppController {
public $helpers = array('Form', 'Html', 'Session');
public $components = array('Session');
public function index() {
$this->set('posts', $this->Post->find('all'));
}
public function view($id = null) {
$post = $this->Post->findById($id);
$this->set('post', $post);
}
public function add() {
if ($this->request->is('post')) {
$this->Post->create();
$post_data = $this->request->data;
if ($this->Post->save($post_data)) {
$this->Session->setFlash(__('New post saved successfully to the database'));
return $this->redirect(array('action' => 'index'));
}
$this->Session->setFlash(__('Unable to save the post to the database.'));
}
}
public function edit($id = null) {
if (!$id) {
throw new NotFoundException(__('Post is not valid!'));
}
$post = $this->Post->findById($id);
if (!$post) {
throw new NotFoundException(__('Post is not valid!'));
}
if ($this->request->is('post') || $this->request->is('put')) {
$this->Post->id = $id;
$post_data = $this->request->data;
if ($this->Post->save($post_data)) {
$this->Session->setFlash(__('Your post has been updated.'));
return $this->redirect(array('action' => 'index'));
}
$this->Session->setFlash(__('Unable to update your post.'));
}
if (!$this->request->data) {
$this->request->data = $post;
}
}
public function delete($id) {
if ($this->request->is('post')) {
if ($this->Post->delete($id)) {
$this->Session->setFlash(__('The post number %s has been deleted.', h($id)));
return $this->redirect(array('action' => 'index'));
}
}
}
}

Модель Post.php

class Post extends AppModel {
public $validate = array('title' => array('rule' => 'notEmpty'));
}

Итоги

Эта небольшая серия руководств показывает, как легко использовать CakePHP для выполнения CRUD-операций над данными. Данные статьи рассказывают, как читать и отображать информацию, редактировать и удалять ее и как добавлять новые посты.

Запомните: при работе с CakePHP настоятельно рекомендуется придерживаться соглашения об именах, поскольку это значительно упрощает разработку приложения. Попробуйте самостоятельно поэкспериментировать с простым приложением, полученным в результате выполнения этих руководств. Чтобы получить более подробную информацию о некоторых компонентах и хелперах CakePHP, перейдите по этой ссылке.

Tags: , , , , , , ,

Добавить комментарий