CakePHP: создаем сайт для закладок.

В статье рассказывается как с помощью фреймворка CakePHP создавать быстрые и легкие приложения, затрачивая при этом минимум времени и сил. На примере создания сайта для закладок, практически показаны методы и приемы работы с контроллерами, методами и представлениями CakePHP.

 Если вы эксперт в CakePHP, вы знаете, как находить контроллеры, углубляться в модели и создавать представления, впечатляющие публику. Но, войдя во вкус быстрой разработки приложений с CakePHP, вы хотите сделать еще, причем больше за меньшее время. Что ж, имеете право: и мы посмотрим, как расширить функционал нашего приложения с помощью модулей CakePHP. Это следствие принципа DRY (Don't repeat yourself — Не повторяй себя). Найдя решение проблемы однажды, разумным образом оформите его и поделитесь им со всем миром, чтобы каждый мог что-то вложить и что-то получить от этого решения. А для этого прихватите немного кода, уже написанного другими, и воспользуйтесь модулями расширения, чтобы сэкономить массу времени. 

Рискнем создать сайт для хранения закладок, где будут храниться не только адреса с их описанием, но и симпатичные миниатюры. Так как мы живем в эпоху социальных сетей, добавим возможность быстрого и удобного размещения закладок в социальных сетях, чтобы друзья и знакомые узнали о них. 


Как всегда, потратим немного времени на то, чтобы убедиться, что наша база данных соответствует соглашениям и стандартам CakePHP, чтобы каркас сделал за нас всю трудную работу. Желающим отклониться от предложенных стандартов и структур советую заглянуть на страничку http://book.cakephp.org/view/901/cakephp-conventions — там можно получить информацию о том, как уйти в свободное плавание собственным путем. 
Немного поразмыслим над данными, которые нам нужно будет хранить. Нам понадобятся URL, пользователи, рейтинги, чтобы при размещении адресов закладок в Twitter, Facebook или любой другой социальной сети пользователи смогли оценить содержимое, если оно им нравится. 
CREATE DATABASE `bookmark`; 
USE `bookmark`; 
CREATE TABLE `urls` ( 
`id` CHAR(36) NOT NULL PRIMARY KEY, 
`user_id` CHAR(36) NOT NULL, 
`name` VARCHAR(128) NOT NULL, 
`url` TEXT, 
`created` DATETIME, 
`modified` DATETIME 
); 
CREATE TABLE `users` ( 
`id` CHAR(36) NOT NULL PRIMARY KEY, 
`username` VARCHAR(45) NOT NULL, 
`password` VARCHAR(255) NOT NULL, 
`email` VARCHAR(255) NOT NULL, 
`created` DATETIME, 
`modified` DATETIME 
); 

Минуточку, но ведь это, конечно, не все таблицы, которые нам нужны? Список параметров, которые мы хотели хранить для каждой вкладки, был довольно длинным. И непохоже, что в этой таблице хватает полей на все данные — если не считать того момента, что каждый модуль расширения может хранить необходимую информацию из базы данных самостоятельно, чтобы гарантировать, что в пакете модуля содержится весь предоставляемый функционал, включая требования базы по хранению данных. 
Ну и как это работает? Для этого необходимо воспользоваться либо оболочкой «Schema», поставляемой с CakePHP, либо модулем расширения «Migrations». Мы воспользуемся модулем миграции. 
Bake — консольная команда, с помощью которой можно генерировать код, выполнять миграции, запускать тесты и многое другое. Для удобства работы с ней из консоли, путь cake/console внутри пакета CakePHP нужно включить в переменную окружения PATH. Сделать это можно так: 
$export PATH=''$PATH:/path/to/cakephp/cake/console'' 
Единственное оставшееся требование — РНР должен быть доступен в командной строке. Во многих дистрибутивах есть пакет php-cli или подобный ему, в котором есть исполняемый файл РНР для командной строки. 
Начнем новый проект и создадим базовую структуру, от которой и будем отталкиваться. Выполняем следующие команды: 
$cake bake project bookmark 
$cd bookmark 
CakePHP создал базовую структуру приложения. Она содержит каталоги и ряд исходных файлов для обслуживания статических страниц. Покопайтесь в ней, присмотритесь, чем именно вас снабдили. 
Прежде чем заняться выпеканием, нужно дать понять CakePHP, как подключится к нашей базе данных. Скопируйте файл /config/database.php.default в /config/datаbase.php. Введите туда настройки своей базы данных, имя пользователя и пароль для базы данных. Вот, примерно, что у вас должно получиться: 
<?php 
class DATABASE_CONFIG { 
var $default=array( 
`driver`=> `mysql`, 
`persistent` => false, 
`host` => `localhost`, 
`login` => `login`, 
`password` => `password`, 
`database` => `bookmark`, 
`prefix` => ``, 
); 

Заметьте, что настройки базы test из этого файла удалены. Тестовая конфигурация используется при модульном тестировании, а мы в рамках нашего проекта этим заниматься не будем. 
Давайте приступим к созданию моделей, представлений и контроллеров для таблиц базы данных, которые мы создали ранее. С помощью команд создадим весь код, необходимый для работы приложения в целом, потом нам останется только его модифицировать. 
$cake bake all user 
$cake bake all url 
Пусть вас не пугает объем вывода команды bake, чем больше данных она выводит, тем больше времени мы сэкономим на написании кода. Взглянув на вывод, вы увидите все пути и имена файлов, которые были созданы для нас. Теперь у нас есть пользователь и система управления ссылками, и вы можете заходить на сайт, чтобы добавлять или изменять какую-либо информацию. Попробуйте открыть ссылку /users. У меня каталог находится в корне веб-сервера и адрес будет таким: http://localhost/bookmark/users. Откроется страница со списком пользователей, где вы сможете найти ссылки для добавления пользователей и изменения информации о них. 
Быстренько пробежимся по тому, как закрыть сайт от доступа посторонних, чтобы мы смогли создавать пользователей и входить в систему, но без входа в систему доступ ко всему был бы закрыт. 
Откройте файл app_controller.php в корне проекта. Это пустой контроллер, от которого наследуют свой функционал все остальные контроллеры приложения. Все сделанное в нем будет доступно во всех остальных контроллерах, так что это прекрасное место для аутентификации, которая заставит пользователей входить на сайт и помешает незваным гостям изменять данные. Добавьте компоненты «Auth» и «Session». Теперь ваш контроллер AppController длжен выглядеть так: 
<?php 
class AppController extends Controller { 
var $components=array('Auth','Session'); 
function beforeFilter() { 
$this->set('authUser',$this->Auth->user()); 
return parent::beforeFilter; 


Как видите, мы изменили вызов set в функции beforeFilter. Это гарантирует нам доступ к информации о текущем пользователе во всех представлениях сайта. Если текущего пользователя нет, this установится в null. 
Затем откройте /controllers/users_controller.php и добавьте действие login. Оно может быть пустым: о его содержании позаботиться CakePHP. Пока мы тут, давайте добавим еще и logout, чтобы дать возможность пользователям выходить из системы: 
function login() { 

function logout() { 
return $this->redirect($this->Auth->logout()); 

Наконец, в контроллере нужно гарантировать, что для создания пользователя не придется входить в систему, иначе система заблокируется, так как в ней не пользователей. Добавляем следующий метод в контроллер users: 
function beforeFilter() { 
$this->Auth->allow('add'); 
return parent::beforeFilter(); 

Последний фрагмент этой мозайки — файл представления view, который был создан утилитой bake. Он примет имя пользователя и пароль и позволит пользователям войти в систему. Создайте представление login в новом файле: /views/users/login.ctp: 
<div class=''users form''> 
<?php echo $this->Form->create('User', array('url' => 
array('action' => 'login')));?> 
<fieldset> 
<legend><?php __('Login');?></legend> 
<?php 
echo $this->Form->input('username'); 
echo $this->Form->input('password'); 
?> 
</fieldset> 
<?php echo $this->Form->end(__('Login', true));?> 
</div> 
Снова откройте список пользователей users, и вы незамедлительно будете перенаправлены на форму авторизации. Теперь попробуйте зайти на страницу добавления пользователя, и вы увидите, что ее можно просматривать без ввода логина и пароля. 
Пора выпить чашку чаю/кофе, кому что нравиться — сайт работает, данные мы защитили. Пробегитесь по приложению и создайте нового пользователя. Зайдите на сайт под этим пользователем и проверьте, что все работает правильно, добавьте пару ссылок. Теперь, когда сайт вам знаком и вы довольны его работой, пора подключить несколько модулей и заставить работать некоторые примочки. 
Давайте отыщем необходимые модули, загрузим их и настроим каталоги в /app/plugins. Для загрузки модулей воспользуемся Git. С помощью Git модули грузятся быстрее. Вдобавок, это прекрасная возможность научится работать с Git как со средством управления версиями: 
git clone https://github.com/cakedc/migration.git plugins/migrations 
git clone https://github.com/cakedc/ratings.git plugins/rating 
git clone https://cakedc/search.git plugins/search 
git clonr https://github.com/predominant/cake_social.git plugins/cake_social 
git clonr https://github.com/predominant/goodies.git plugins/goodies 
Только что мы сэкономили несколько месяцев на разработке. Я не шучу. Мы воспользовались набором модулей с открытым исходным кодом, которые доступны любому разработчику. 
Ранее говорилось, что нам не хватает таблиц в базе данных, и мы позаботимся об этом с помощью миграции баз данных. Сейчас вы увидите, как просто создать таблицу базы данных для модулей и повторного использования кода в проектах. Не всем модулям нужна миграция, и не все модули ее предусматривают. У тех, у кого она есть, в каталоге config есть подкаталог migrations. Например, вы можете пройтись по модулям и посмотреть, кому из них нужна миграция, или просто запустить ее для всех: тогда для модулей, которым она не нужна, появится сообщение об ошибке — тут-то они нам и попадутся. 
Выполните следующую команду, чтобы завершить настройку таблиц для добавленных модулей: 
$cake migration -plugin ratings all 
Теперь у вас есть все необходимые таблицы. 
Для начала обеспечим возможность выставления рейтинга. Рейтинг должен быть только у URL-адресов. Добавить компонент очень просто: открываем UrlsController в файле /controllers/urls_controller.php и добавьте компонент Ratings: 
class UrlsController extends AppController { 
var $components=array('Ratings.Ratings'); 
//.. existing code 

Свежедобавленный компонент сам подключается вспомогательный класс, необходимый для отображения формы с рейтингом, а также обрабатывает сохранение и загрузку информации о рейтингах. Поэтому все, что нужно — это задать представление для отображения формы с рейтингами с помощью вспомогательного класса рейтингов. 
Страница просмотра адреса смотрится довольно пресно. Нужно как минимум добавить немного графики и элементов управления, чтобы посетители быстрее воспринимали информацию. Оставим сложности CSS и стилизации веб-мастерам, но немного упростим им задачу, показав иконки пользователя из информации о пользователя для каждого адреса. Для этого будем использовать вспомогательный класс gravatar плагина Goodies. 
Откройте представление для адресов. Мы заменим строку: 
<?php echo $this->Html->link($url['User']['id'], array('controller' => 'users', 'action' => 'view',$url['User']['id']));?> 
на похожую, но включающую в себя вывод аватара с помощью вспомогательного класса: 
<?php echo $this->Html->link( 
$this->Gravatar->image($url['User']['email']), 
array('controller' => 'users', 'action' => 'view', 
$url['User']['id']), 
array('escape' => false));?> 
<?php echo $url['User']['username'];?> 
Наконец, подключите вспомогательный класс в контроллере AppController в файле /app_controller.php: 
class AppController extends Controller { 
var $helpers=array('Html','Form','Sessions','Goodies.Gravatar'); 
//.. existing code 

Теперь будет отображаться граватар пользователя, полученный по его e-mail, указанному во время регистрации, а вместо уродливого UUID будет показано имя пользователя. 
Давайте еще немного украсим дополнительную информацию, добавив возможность поделиться ссылкой в социальных сетях, чтобы привлечь больше посетителей на сайт. Этот функционал предоставляет модуль CakeSocial. В модуле есть вспомогательный класс «ShareThis», который очень сильно упрощает обмен контентом в социальных сетях. Добавляем вспомогательный класс в контроллер AppController в файле /app_controller.php: 
class AppController extends Controller { 
var $helpers=array('Html','Form','Sessions','Goodies.Gravatar','CakeSocial.ShareThis'); 
//,,existing code 

С разу перед закрывающим тегом </dl> в представлении для адресов /view/urls/view.php вставьте следующий код: 
<dt<?php if ($i % 2==0) ehco $class;?>><?php __('Share');?></dt> 
<dd<?php if ($i++ % 2==0) echo $class;?>> 
<?php echo $this->ShareThis->display();?> 
&nbsp; 
</dd> 
В этом представлении пять строк, но только одна выводит ссылки на социальные сети. Остальное — метка и стили для обертки вывода. Обновите страницу и увидите, что ссылки на социальные сети ShareThis появились, и можно поделиться ссылкой в списке сервисов по умолчанию. 
Приложение, которое у нас получилось, показывает, как быстро можно создавать код с CakePHP, и иллюстрирует качество свободных модулей. У приложение есть большой потенциал для расширения — предоставление дополнительной информации, например, частых URL-адресов, интеграция в сервис REST, Ajax-скриплет для работы с закладками, который можно встроить в браузер. Возможности CakePHP по истине безграничны!

  • Аватар пользователя LorenRox

    Комментарий написал LorenRox (не проверено)

    Тинедол – эффективное средство от грибка стопы,
    неприятного запаха и зуда
    нейтрализует неприятные запахи
    борется с грибком стопы
    устраняет зуд между пальцев
    предотвращает микоз ногтей
    убирает шелушение
    Климбазол
    эффективно борется с грибком

    Фарнезол
    быстро устраняет неприятные запахи

    Эфирное масло мяты
    комфртно охлаждает стопу, придает приятный аромат

    Витамин E
    смягчает кожу, устраняет шелушение

    Быстрый эффект, постоянный результат!

    Тинедол – это уникальная запатентованная формула,
    которая борется с грибком стопы,
    неприятным запахом и зудом.

    Комплекс смягчающих компонентов
    создает невидимую защиту,
    препятствуя образованию трещин,
    что не оставляет грибкам
    ни единого шанса поселиться на коже.

    Благодаря наличию активных
    натуральных ингредиентов Климбазола и Фарнезола
    Тинедол эффективен в борьбе
    с микозами стоп и ногтей различной этиологии.

    Эфирное масло Мяты Перечной
    подарит прохладу и устранит неприятные запахи
    после напряженного трудового дня

    Перейти на сайт: http://tinedol.bxox.info/

Отправить комментарий

Содержимое этого поля является приватным и не будет отображаться публично.

Железо