CakePHP с нуля вносим изменения в тему0


Содержание

CakePHP 3 Изменение темы во время выполнения

Я начинаю работу с CakePHP 3 Themes. Я знаю, что могу установить темы в AppController в функции beforeRender проекта с помощью

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

Html->link((‘changeTheme’), [‘action’ => ‘changeTheme’])?>

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

Хорошо, я исправил эту проблему с помощью файла cookie. Файл cookie сохранит переменную темы и в запросе if в функции beforeRender выполните действие.

Печём пирожки или начало работы с CakePHP по-русски

Скоро товарищей, пишущих по старинке веб-страницы на голом php, можно будет показывать в зоопарках :) Наступает эра Фреймворков. И это хорошо, потому что программист избавлен от множества рутинных задач, и может сосредоточиться на создании логики приложения. В CakePHP используется подход MCV (Model — View — Controller). Теперь вместо одного файла *.php на одну страничку их будет целых три минимум %) — один для модели (описывает связь формы с базой данных, имеет расширение php), thtml файл будет описывать внешний вид страницы (view), третий (контроллер страницы с расширением php будет реализовывать логику формы и будет содержать методы, дополняющие функциональность родительского класса AppController.

Что ж, начнем печь приложения как пирожки :)) Но для этого придется преступить через себя и принять новый подход к программированию. Оно того стоит ^_^

Установка

Вам нужен Apache с установленным mod_rewrite и mod_php, php4 или php5, а также база данных (в нашем примере используется MySQL). Первым делом разживитесь на www.cakephp.org свежей версией CakePHP. Там же расположен неплохой мануал, которому я во многом буду следовать. Распакуйте архив в корневую директорию веб-сервера и наберите в браузере адрес сайта. Должна появиться приветственная страничка: Your database configuration file is not present.

Нужно прописать соединение с базой данных. Делается это в директории app/config — берем за основу database.php.default и переименовываем его в database.php. Прописываем в файле параметры соединения с базой. Если все ОК то CakePHP сообщит об этом. Your database configuration file is present. Cake is able to connect to the database.

Все готово для творчества.

Модуль новостей

Напишем простейший модуль новостей, чтобы проиллюстрировать технологию создания сайтов на Фреймворке. Создадим в базе данных таблицу posts, в которой будут храниться новости.CREATE TABLE `posts` ( `id` bigint(20) NOT NULL auto_increment, `post_date` date NOT NULL default ‘0000-00-00’, `post_header` varchar(255) NOT NULL default », `post_text` text NOT NULL, `archived` tinyint(4) NOT NULL default ‘0’, PRIMARY KEY (`id`) )

Вопрос: почему бы таблицу не назвать «news»? Таблица должна иметь имя сущности во множественном числе. В английском «новости» news всегда употребляется во множественном числе, тем более слово new является ключевым в php, что приводит к ошибке.

Модель

В папке app/models создадим файл модели post.php VALID_NOT_EMPTY, ‘post_text’ => VALID_NOT_EMPTY, ‘post_date’ => VALID_NOT_EMPTY ); > ?>

В массиве $validate описываются ограничения накладываемые логикой приложения на данные. Мы запретили пустые поля Текст, Заголовок и Дата.

Контроллер

В папке app/controllers создадим файл posts_controller.php. Создадим объект, который реализует основные функции модуля новостей: отображение списка (index), просмотр новости (view), удаление новости (delete), добавления новости (add).set(‘posts’, $this->Post->findAll()); // выборка всех
записей //из таблицы $this->pageTitle = ‘Новости’; > function view($id) // просмотр новости < $this->Post-> >set(‘post’, $this->Post->read()); > function add() // добавление новости < if (!empty($this->data)) < if ($this->Post->save($this->data)) < $this->flash(‘Новость была успешно добавлена’,’/posts’); // flash выдает сообщение пользователю в виде ссылки на страницу, указанной во втором аргументе функции > > > function delete($id) // удаление новости < $this->Post->del($id); $this->flash(‘Новость была удалена’, ‘/posts’); > function edit($ >data)) < $this->Post-> >data = $this->Post->read(); > else < if ($this->Post->save($this->data[‘Post’])) < $this->flash(‘Новость была отредактирована’,’/posts’); > > > > ?>

В папке app/views создадим папку posts. В этой папке необходимо создать файлы видов для каждой функции, кроме функции Delete, которая не требует своего вида, а использует только функцию flash.

app/views/posts/index.thtmlНовости >’; if (count($posts)>0) < ?>

Дата Заголовок Текст
= $news_teaser_length) < $last_word = $mes_words[$news_teaser_length -1]; for ($i = 0; $i link($text.$news_more_annex, '/posts/view/'.$post['Post']['id']); >else < echo $html->link($post[‘Post’][‘post_text’], ‘/posts/view/’.$post[‘Post’][‘id’]); > ?> link(‘Редактировать’, ‘/posts/edit/’.$post[‘Post’][‘id’]); ?> link(‘Удалить’, ‘/posts/delete/’.$post[‘Post’][‘id’]); ?>

Новостей пока нет»; > ?>

Название:
input(‘Post/post_header’, array(‘size’ => ’40’))?> tagErrorMsg(‘Post/post_header’, ‘Название не может быть пустым.’) ?>

Дата:
input(‘Post/post_date’, array(‘size’ => ’40’))?> tagErrorMsg(‘Post/post_data’, ‘Дата не может быть пустой.’) ?>

Текст:
textarea(‘Post/post_text’, array(‘rows’=>’10’)) ?> tagErrorMsg(‘Post/post_text’, ‘Сообщение не может быть пустым.’) ?>

app/views/posts/edit.thtmlРедактирование новости hidden(‘Post/id’); ?>

Заголовок:
input(‘Post/post_header’, array(‘size’ => ’40’))?> tagErrorMsg(‘Post/post_header’, ‘Необходим заголовок.’) ?>

Дата:
input(‘Post/post_date’, array(‘size’ => ’40’))?> tagErrorMsg(‘Post/post_date’, ‘Необходима дата.’) ?>

Текст:
textarea(‘Post/post_text’, array(‘rows’=>’10’)) ?> tagErrorMsg(‘Post/post_text’, ‘Текст не должен быть пустым!’) ?>

Фу: вроде все почти готово :) Теперь осталось перенаправить пользователя c приветственной странички CakePHP на страничку app/posts.

Для этого идем в app/config/routes.php и меняем там строку$Route->connect(’/’, array(’controller’ =>
‘pages’, ‘action’ => ‘display’, ‘home’));

на строку$Route->connect (’/’, array(’controller’=>’posts’, ‘action’=>’index’));

Теперь можете в браузере набрать адрес сайта и понаблюдать CakePHP в действии :)

Небольшая обработка напильником

Полюбовавшись на полученное приложение, пытливый читатель скоро почувствует разочарование. Как поменять стиль страницы, убрать маленький баннер снизу и гордое «CakePHP Rapid Development» в верху каждой страницы? Как заставить функцию flash отображать текст по-русски? Для этой цели служат layouts. (Долго думал, как перевести layouts и решил остановиться на слове «шаблоны»). Бодро идем в папку app/views/layouts и помещаем там нужные файлы:

default.thtml, например, такой:

Вылечим функцию flash от любви к utf8. Для этого разместим там же flash.thtml

Прототипы этих файлов можно увидеть в папке cake/libs/view/templates/layouts

LXF138:CakePHP

Подписка на печатную версию Весь 2015 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров) Подписка на электронную версию Весь 2015 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров) Подшивки старых номеров журнала (печатные версии) Весь 2014 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров)

CakePHP’ Про­стая раз­ра­бот­ка web-при­ло­же­ний с БД. Ну, до­воль­но про­стая…

CakePHP
  • Часть 1: CakePHP: Раз – и web-при­ло­же­ние!
  • Часть 2: CakePHP: Раз – и web­-приложениe!
  • Часть 3: CakePHP: Пишем загрузчик файлов
  • Часть 4: CakePHP: Сайт для закладок
  • Заключсение: CakePHP: Важные ресурсы

Содержание

CakePHP: Раз – и web-при­ло­же­ние!

Ввод­ная стра­ни­ца CakePHP да­ет сла­бое пред­став­ле­ние о его мо­щи — вни­кай­те глуб­же!

На­ча­лось. У вас все­го 15 ми­нут, а нуж­но соз­дать ка­та­лог ог­ром­ной кол­лек­ции филь­мов. Кто при­дет на по­мощь? Конеч­но, CakePHP! CakePHP – кар­кас для бы­ст­рой раз­ра­бот­ки при­ло­жений, ох­ва­ты­ваю­щий все стан­дарт­ные ве­щи, встре­чаю­щие­ся в web-про­грам­ми­ро­вании. Ре­шение по­вто­ряю­щих­ся за­дач вы­сво­бо­дит вам боль­ше вре­мени на ко­фе, иг­ры и про­чее. На этом ввод­ном уро­ке мы соз­да­дим биб­лио­те­ку муль­ти­ме­диа, где бу­дет хранить­ся ин­фор­ма­ция о ва­ших филь­мах.

Для ра­бо­ты CakePHP нуж­но со­всем немно­го. По­на­до­бит­ся web-сер­вер ти­па Apache, PHP 4+ (луч­ше 5+), MySQL 4+ и тек­сто­вый ре­дак­тор на ваш вы­бор. На мо­мент напи­сания ста­тьи по­следней вер­си­ей CakePHP бы­ла 1.3.

За­гру­зить по­след­нюю вер­сию мож­но в ви­де ар­хи­ва с сай­та http://github.com/cakephp/cakephp/downloads, или по­лу­чить ее из ре­по­зи­то­рия http://github.com/cakephp/cakephp с по­мо­щью Git.

По­сле за­груз­ки ар­хи­ва с сай­та или из ре­по­зи­то­рия ско­пи­руй­те со­дер­жи­мое па­ке­та cakephp в DocumentRoot web-сер­ве­ра. У вас дол­жен поя­вить­ся ка­та­лог /directory, со­дер­жа­щий под­ка­та­ло­ги /app, /cake, /plugins и /vendors и фай­лы .htaccess, index.php и README.

На­строй­ка ба­зы дан­ных

Для по­вы­ше­ния бы­ст­ро­дей­ст­вия CakePHP за­пи­сы­ва­ет фай­лы кэ­ша и дру­гие ме­ло­чи в ка­та­лог app/tmp. Нуж­но убе­дить­ся, что у поль­зо­ва­те­ля, под ко­то­рым за­пу­щен web-сер­вер, есть пра­во на за­пись в этот ка­та­лог. Бы­ст­рее все­го раз­ре­шить за­пись всем ко­ман­дой: chmod -R 777 app/tmp

Сле­дую­щий шаг – на­строй­ка ба­зы дан­ных. Восполь­зу­ем­ся MySQL, так как это са­мая по­пу­ляр­ная из сво­бод­ных СУБД, и для на­ше­го при­ло­жения соз­да­дим сле­дую­щую ба­зу дан­ных:

Конеч­но, это все­го лишь таб­ли­ца, но для хранения ин­фор­ма­ции и ра­бо­ты при­ло­жения ее доста­точ­но.

Об­ра­ти­те внимание, что для иден­ти­фи­ка­то­ра ка­ж­дой запи­си ис­поль­зу­ет­ся по­ле ти­па CHAR(36). CakePHP за­ме­ча­ет это, и при до­бав­лении но­вых запи­сей ав­то­ма­ти­че­ски генери­ру­ет им уникаль­ный универ­саль­ный иден­ти­фи­ка­тор UUID вме­сто чи­сло­во­го зна­чения. Это по­лез­ная при­выч­ка, поскольку она уп­роща­ет дальней­шее слияние дан­ных из раз­лич­ных баз. Та­ков один из под­хо­дов CakePHP, осно­ван­ный на со­гла­шениях и от­ра­жаю­щий прин­цип раз­ра­бот­ки при­ло­жений в CakePHP: «Со­гла­шения важнее кон­фи­гу­ра­ции».

Еще один при­мер дан­но­го под­хо­да за­ме­тен в по­лях created и modified. Не нуж­но пи­сать ника­ко­го ко­да, что­бы по­ле created за­пол­ня­лось те­ку­щи­ми да­той и вре­менем при соз­дании запи­си. Для за­полнения вто­ро­го по­ля де­лать то­же ниче­го не нуж­но. CakePHP возь­мет все в свои ру­ки и по­за­бо­тит­ся об этом сам, зна­чи­тель­но уско­рив раз­ра­бот­ку при­ло­жения и уп­ро­стив его.

Так как для на­званий филь­мов мы вы­бра­ли по­ле title, что со­от­вет­ству­ет од­но­му из из­вест­ных CakePHP «умол­ча­тель­ных» за­го­лов­ков ко­ло­нок, мы уви­дим еще немно­го вол­шеб­ства – CakePHP ав­то­ма­ти­че­ски возьмет на­звания всех запи­сей (при со­став­лении спи­сков и да­лее в та­ком ду­хе) имен­но из это­го столб­ца.

Пе­ред пе­ре­хо­дом к сле­дую­ще­му ша­гу соз­дай­те таб­ли­цу.

Уста­нов­ка со­единения с БД

На­строй­ка ба­зы дан­ных в CakePHP про­ста. Есть файл /app/config/database.php.default – это при­мер фай­ла кон­фи­гу­ра­ции БД. Про­ще все­го ско­пи­ро­вать этот файл в /app/config/database.php. В соз­дан­ной ко­пии из­мените па­ра­мет­ры досту­па к ба­зе дан­ных. Для на­ше­го при­ло­жения нуж­но на­стро­ить толь­ко со­единение $default. Это долж­но вы­гля­деть при­мер­но так:

CakePHP вклю­ча­ет фай­лы .htaccess для ра­бо­ты с мо­ду­ля­ми mod_rewrite на сер­ве­рах Apache с эф­фек­тив­ной пе­ре­за­пи­сью URL-ад­ре­сов. Эти бо­лее удоб­ные ад­ре­са не обя­за­тель­ны, но с ни­ми пу­ти про­ще за­по­ми­на­ют­ся: http://mysite.com/movies/add луч­ше, чем http://mysite.com?url=movies/add. Ус­та­но­ви­те mod_rewrite для Apache, ес­ли вы это­го еще не сде­ла­ли, и на­строй­те его на при­ме­не­ние дру­же­люб­ных URL-ад­ре­сов.

Те­перь мож­но ­гру­зить страницу при­вет­ствия CakePHP, от­крыв в брау­зе­ре ад­рес, по ко­то­ро­му рас­по­ло­жен сер­вер. Вы уви­ди­те зе­ле­ные ин­ди­ка­то­ры, оз­на­чаю­щие успеш­ную уста­нов­ку CakePHP. Ес­ли в на­строй­ках что-то не так, ин­ди­ка­то­ры бу­дут жел­ты­ми, и поя­вит­ся под­роб­ное со­об­щение об ошиб­ке, ко­то­рое по­мо­жет ре­шить про­бле­му. Для на­ше­го при­ло­жения мож­но иг­но­ри­ро­вать все со­об­щения о за­тра­воч­ном зна­чении [Security Salt] или пре­ду­пре­ж­дения о клю­че шиф­ро­вания [Cipher Key] – ему это­го не на­до.

Возь­мем­ся за код все­рь­ез, соз­дав класс MoviesController в /app/controllers/movies_controller.php.

Для об­ра­бот­ки со­об­ще­ний об ошиб­ках мы вклю­чи­ли ком­по­нент Session.

Од­но за дру­гим соз­да­дим дей­ствия, предоставляемые поль­зо­ва­те­лям, про­смат­ри­ваю­щим ба­зу дан­ных филь­мов. Дей­ствия – это пуб­лич­но до­ступ­ные функ­ции кон­трол­ле­ра. Для всех опе­ра­ций, вы­пол­няе­мыхнад филь­мом в ба­зе дан­ных, соз­да­дим в кон­трол­ле­ре дей­ствия типа CRUD. CRUD – это со­кра­щение от Create, Read, Update и Delete [Соз­дать, Про­чи­тать, Об­но­вить и Уда­лить]. На­ши дей­ствия по­лу­чат на­звания index, add, edit, view и delete.

Начнем с дей­ствия index – вы­во­д спи­ска всех филь­мов в ба­зе дан­ных. В кон­тро­ле­ре есть объ­ект сущ­но­сти Movie; он пред­став­ля­ет со­бой мо­дель. Он ав­то­ма­ти­че­ски вклю­ча­ет­ся CakePHP и со­от­вет­ству­ет имени кон­трол­ле­ра. Мо­жер вы­звать find() в этой мо­де­ли, и CakePHP пре­об­ра­зу­ет эти вы­зо­вы в за­про­се к ба­зе дан­ных – нам не при­дет­ся пи­сать SQL-за­прос вруч­ную. По­тря­саю­ще! Ниже мы вы­зы­ва­ем ме­тод find() с ар­гу­мен­том all и запи­сы­ва­ем ре­зуль­тат в пред­став­ление для по­сле­дую­ще­го ото­бра­жения.

Вот и все, что нуж­но для дей­ствия index. Понимаю, что вы­гля­дит это бе­зы­скусным, но в том-то и пре­лесть CakePHP – неза­чем все услож­нять.

Соз­да­ем пер­вое пред­став­ление

Дей­ствие го­то­во – соз­дадим пред­став­ление, что­бы мож­но бы­ло про­смат­ри­вать дан­ные и ра­бо­тать с ними. Пред­став­ления в CakePHP – про­стые PHP-фай­лы с рас­ши­рением ctp. Они напи­са­ны на обыч­ном PHP.

Соз­дай­те свое пер­вое пред­став­ление в фай­ле /app/views/mov­ies/index.ctp. Сна­ча­ла соз­дайте ка­та­лог movies в /app/views. До­бавь­те ту­да код из фраг­мен­та 1 на LXFDVD:

Это бу­дет зна­ко­мо всем, кто стал­ки­вал­ся с HTML и PHP. От­ли­чие в том, как вспо­мо­га­тель­ные клас­сы пред­став­ления ис­поль­зу­ют­ся для вы­во­да ин­фор­ма­ции вро­де ссылок. Вспо­мо­га­тель­ный класс HtmlHelper по­зво­ля­ет пе­ре­да­вать мас­си­вы дан­ных в дей­ствия View, Edit и Delete. Они пре­об­ра­зу­ют­ся в ад­ре­са на­по­до­бие http://mysite.com/movies/view/1234 (для ссыл­ки на про­смотр).

Пред­став­ление ите­ри­ру­ет пе­ре­мен­ную $movies, уста­нов­лен­ную ранее кон­трол­ле­ром MoviesController, и вы­во­дит все запи­си в таб­ли­це (в кон­це кон­цов, это таб­лич­ные дан­ные).

Ес­ли у вас дру­гой стан­дарт струк­ту­ры ба­зы дан­ных, это не про­бле­ма. CakePHP спра­вит­ся с лю­бым. Сле­до­ва­ние со­гла­ше­ни­ям (http://book.cakephp.org/view/901) сэ­ко­но­мит вам вре­мя, но это не же­ст­кое тре­бо­ва­ние.

Те­перь от­кроем ад­рес /movies/index на ва­шем сер­ве­ре и про­смот­рим дан­ные, вы­ве­ден­ные но­вым пред­став­лением. Ес­ли на сер­ве­ре толь­ко од­но раз­ра­ба­ты­вае­мое при­ло­жение CakePHP, ад­рес бу­дет та­ким: http://mysite.com/movies/index. Или, ес­ли при­ло­жение на­хо­дит­ся в под­ка­та­ло­ге, об­ра­щай­тесь к нему: http://mysite.com/my_directory/movies/index.

На дан­ный мо­мент филь­мов в ба­зе нет. Сроч­но соз­да­дим функ­цио­нал для их до­бав­ления: вре­мя-то идет!

Соз­дание дей­ствия add и про­смотр

Те­перь рас­ши­рим наш кон­трол­лер, до­ба­вив в него функ­цию add. С ее по­мо­щью но­вые филь­мы бу­дут до­бав­лять­ся в ба­зу дан­ных. Нуж­но про­ве­рить, бы­ли ли вве­де­ны в фор­му ка­кие-то дан­ные, и ес­ли да, про­ве­рить ее на на­ли­чие оши­бок и об­ра­бо­тать. Это ка­жет­ся слож­ным, но CakePHP об­лег­ча­ет ре­шение дан­ной за­да­чи. Со­от­вет­ствую­щий фраг­мент ко­да мож­но уви­деть в Листин­ге 2 на LXFDVD.

Пред­став­ление для до­бав­ления филь­мов ис­поль­зу­ет вспо­мо­га­тель­ный класс форм CakePHP, по­зво­ляю­щий лег­ко соз­да­вать фор­мы на все слу­чаи жизни. Здесь мы про­сто оп­ре­де­ля­ем, для ка­кой мо­де­ли соз­да­ет­ся фор­ма (в дан­ном слу­чае, мо­дель Movie) и ка­кие по­ля мы пре­доста­вим поль­зо­ва­те­лям.

Соз­дай­те файл /app/views/movies/add.ctp и по­мести­те ту­да сле­дую­щий код:

Са­мо соз­дание фор­мы про­ис­хо­дит в пер­вых трех стро­ках фай­ла. Все осталь­ное – HTML-код для рас­по­ло­жения эле­мен­тов на странице и генера­ции ссыл­ки для воз­вра­та к спи­ску филь­мов.

Те­перь мож­но пе­рей­ти к фор­ме соз­дания филь­мов, от­крыв ад­рес /movies/add или щелк­нув по ссыл­ке «New Movie», ко­то­рую мы до­ба­ви­ли на глав­ную страницу.

Добавление фильма с действием Add Да, это просто, но вся пре­лесть в малом объеме требуемого кода

Бле­стя­ще! Но мож­но пой­ти даль­ше и до­ба­вить па­ру филь­мов. В при­ме­ре на сле­дую­щем эк­ран­ном сним­ке мы до­бав­ля­ем ин­фор­ма­цию о филь­ме «Че­ло­век-па­ук 3» в фор­ма­те Blu-ray. По­сле до­бав­ления ин­фор­ма­ции об оче­ред­ном филь­ме вы пе­ре­на­прав­ляе­тесь на глав­ную страницу, где в спи­ске филь­мов по­яв­ля­ет­ся но­вая запись.

Уда­ля­ем филь­мы

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

До­бавь­те дей­ст­вие уда­ле­ния в кон­трол­лер Movies:

Для тех, у ко­го на на­шем уро­ке воз­ник­ли про­бле­мы или про­сто не хва­та­ет тер­пе­ния на­би­рать код с жур­на­ла, был соз­дан ре­по­зи­то­рий, от­ку­да мож­но лег­ко и бы­ст­ро за­гру­зить код это­го при­ме­ра. Най­ти его мож­но на GitHub под мо­ей учет­ной за­пи­сью (http://github.com/predominant/cakephp_linux_format).

До­пол­ни­тель­ная ин­фор­ма­ция и ру­ко­во­д­ства по CakePHP дос­туп­ны че­рез офи­ци­аль­ную сеть его под­держ­ки. Мы по­пы­та­лись по­до­б­рать са­мые по­лез­ные:

Ранее мы уже до­ба­ви­ли ссыл­ки на уда­ление филь­мов на страницу ин­дек­са. А те­перь мож­но запросто уда­лять филь­мы, щелк­нув по этим ссыл­кам! Вы мог­ли за­ме­тить, что фраг­мент ко­да, соз­даю­ще­го ссыл­ку на уда­ление, длиннее, чем для дей­ствий про­смот­ра и ре­дак­ти­ро­вания. Это объ­яс­ня­ет­ся тем, что в дей­ствие уда­ления вклю­чен код JavaScript для по­ка­за пре­ду­пре­ж­дения, ко­то­рый спра­ши­ва­ет поль­зо­ва­те­ля, дей­ст­ви­тель­но ли он хо­чет уда­лить эту запись. Этот ме­ханизм по­зво­лит поль­зо­ва­те­лю вер­нуть­ся на­зад, из­бе­жав слу­чай­но­го уда­ления, так как с дей­стви­ем не свя­за­но ни од­но­го пред­став­ления.

До­бав­ле­ние филь­ма с дей­ст­ви­ем Add. Да, это про­сто, но вся пре­лесть в ма­лом объ­е­ме тре­буе­мо­го ко­да.

Ре­дак­ти­ру­ем дан­ные

Да­же луч­шим из луч­ших слу­ча­ет­ся оши­бить­ся, и хо­ро­шо бы иметь дей­ствие для ре­дак­ти­ро­вания дан­ных, что­бы при необ­хо­ди­мо­сти ис­прав­лять ошиб­ки или вно­сить в запи­си изменения. Это дей­ствие очень по­хо­же на дей­ствие до­бав­ления; основ­ное от­ли­чие в том, что ра­бо­та про­из­во­дит­ся с ID су­ще­ствую­щей запи­си. На са­мом де­ле они на­столь­ко по­хо­жи, что опыт­ные раз­ра­бот­чи­ки CakePHP объ­е­ди­ня­ют дей­ствия add и edit в од­но. Для эко­но­мии места код вынесен на LXFDVD в Листинг 3; до­бавь­те его в свой кон­трол­лер.

Основ­ные раз­ли­чия ме­ж­ду дей­ствия­ми add и edit в том, что дей­ствию ре­дак­ти­ро­вания пе­ре­да­ет­ся иден­ти­фи­ка­тор запи­си и в нем не вы­зы­ва­ет­ся ме­тод create() объ­ек­та Movie, по той при­чине, что при со­хранении в ба­зе долж­ны уце­леть все имею­щие­ся в запи­си поля.

Пред­став­ление для ре­дак­ти­ро­вания

По­ка все долж­но вы­гля­деть зна­ко­мым. Пред­став­ление edit, ко­то­рое мы на­ме­ре­ны соз­дать, поч­ти иден­тич­но фор­ме до­бав­ления add. По­вто­рюсь, раз­ра­бот­чи­ки, ка­кое-то вре­мя про­ра­бо­тав­шие с CakePHP, объ­е­ди­ня­ют add и edit в од­но пред­став­ление, что­бы не бы­ло по­вто­ров ко­да. Един­ствен­ное от­ли­чие со­сто­ит в по­яв­лении в фор­ме вход­но­го па­ра­мет­ра id и кноп­ки для от­прав­ки фор­мы.

Соз­дай­те файл /app/views/movies/edit.ctp и по­мести­те ту­да сле­дую­щий код:

Со­хра­ним пред­став­ле­ние

По­ра про­ве­рить, как все ра­бо­та­ет. Как и пре­ж­де, от­крой­те в брау­зе­ре глав­ную страницу и пе­рей­ди­те к странице ре­дак­ти­ро­вания дан­ных для од­но­го из ва­ших филь­мов. На эк­ране поя­вят­ся все по­ля вво­да для запи­си. Об­ра­ти­те внимание, что по­ле id не ото­бра­жа­ет­ся. Это скры­тое по­ле фор­мы, и поль­зо­ва­тель не мо­жет ра­бо­тать с эти­ми дан­ны­ми. На­ше по­следнее дей­ствие и пред­став­ление вы­ве­дут под­роб­ную ин­фор­ма­цию о ка­ж­дом филь­ме, по­ка­зав все дан­ные, не ото­бра­жае­мые на глав­ной странице, та­кие как вре­мя соз­дания и из­менения запи­си.

Когда вы от­кры­вае­те в брау­зе­ре дей­ствие про­смот­ра, ему пе­ре­да­ет­ся иден­ти­фи­ка­тор в URL-ад­ре­се, что­бы мы зна­ли, ин­фор­ма­цию о ка­ком филь­ме нуж­но по­ка­зать.

До­бавь­те та­кое дей­ст­вие про­смот­ра в кон­трол­лер Movies:

Про­смотр под­роб­ной ин­фор­ма­ции о филь­ме.

Соз­да­ем под­роб­ное пред­став­ле­ние

На­ше по­следнее пред­став­ление – про­сто таб­ли­ца со всей име­ющейся ин­фор­ма­ци­ей о филь­ме. Соз­дай­те это пред­став­ление в фай­ле /app/views/movies/view.ctp – код при­ве­ден в Листин­ге 4 на LXFDVD.

По­следние дей­ствие, на ко­то­рое мы со­сла­лись с глав­ной стра­ницы, те­перь ра­бо­та­ет! Щелкните по ссыл­ке «view» ря­дом с одним из филь­мов – вы уви­ди­те ре­зуль­тат ра­бо­ты толь­ко что соз­дан­но­го пред­став­ления. Об­ра­ти­те внимание, что вы­во­дит­ся так­же удоб­ный спи­сок под­хо­дя­щих дей­ствий для те­ку­щей запи­си.

Ес­ли из­менить запись или соз­дать но­вую, CakePHP об­но­вит по­ля со вре­менем соз­дания и из­менения. Это часть ав­то­ма­ти­че­ско­го функ­цио­на­ла, пре­достав­ляе­мо­го кар­ка­сом. От­ре­дак­ти­руй­те па­ру запи­сей, что­бы по­смот­реть, как ме­ня­ют­ся их по­ля.

Видеокурс «Фреймворк CakePHP: с Нуля до Гуру на примере создания корпоративного сайта». (Андрей Кудлай — Webformyself)

Автор(ы): Андрей Кудлай

Первый и единственный в Рунете исчерпывающий видеокурс на тему работы с фреймворком CakePHP… Уже в ближайшие 2 месяца вы из полного новичка веб-программирования превратитесь в профессионала, которому по зубам будут даже очень сложные и дорогие веб-проекты… Если вы будете посвящать всего лишь 2-3 часа в день изучению материалов курса, то уже менее чем через 60 дней вы уверенно сможете создавать сайты любой сложности, используя фреймворк CakePHP. Вы создадите свою первую страничку вашего будущего сайта уже во время прохождения первых занятий курса. Если у вас не получится либо вы решите, что этот курс вам не подходит, то я верну вам все потраченные деньги обратно!

Смотреть видео:

Фреймворк CakePHP: с Нуля до Гуру на примере создания корпоративного сайта. (Андрей Кудлай — Webformyself)

  • Часть 1. Фреймворк CakePHP. Изучаем теорию и возможности фреймворка

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

ВИДЕОУРОКИ ПЕРВОЙ ЧАСТИ КУРСА:

В первом уроке курса мы пройдемся по организационным моментам, рассмотрим структуру курса, узнаем основные источники документации, с которой будем работать на протяжении всего курса. Также обозначим необходимое программное обеспечение (сервер, редактор, версия фреймворка CakePHP)

Установка фреймворка на сервер и его настройка. Также, для облегчения дальнейшего процесса разработки мы установим плагин DebugKit и познакомимся с ним поближе

  • Урок 3: Установка консоли CakePHP

CakePHP, как и многие фреймворки, имеет генератор кода. Код генерируется с помощью специальной консольной утилиты CakePHP’s Bake console. Если нам нужно построить несложное работающее приложение с системой управления, не заморачиваясь с написанием кода, тогда консоль Кейка – то, что нужно. В этом уроке мы установим консоль кейка и рассмотрим нюансы ее установки

  • Урок 4: URL-адреса фреймворка CakePHP

Более плотно приступим к изучению фреймворка CakePHP и познакомимся со структурой URL-адресов Кейка. CakePHP уже по умолчанию работает с чистыми или, так называемыми ЧПУ-адресами (ЧПУ – Человеку Понятный УРЛ). При этом каждая часть (сегмент) этого адреса является значимой. Также CakePHP позволяет изменять имеющиеся по умолчанию адреса на любые другие, нужные нам, предоставляя для этих целей гибкие возможности раутинга (маршрутизации)

  • Урок 5: Соглашения об именованиях. Контроллеры

В этом уроке мы с Вами познакомимся с соглашениями или конвенциями об именованиях. Данные соглашения дают рекомендации по тому, как называть файлы, классы, методы и таблицы базы данных в разрабатываемом проекте. Следуя конвенциям, мы значительно облегчаем процесс разработки сайта и знакомимся с таким понятием, как магия Кейка (automagic). Также в этом уроке мы создадим свой первый контроллер

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

  • Урок 7: Метод модели find(). Часть 1

Основа любого динамичного сайта заключается в хранении информации в базе данных и получении информации оттуда. За работу с базой данных в Кейке отвечает модель, методы которой можно использовать в контроллере. Один из таких методов – метод find(). Используя этот метод, мы можем получить информацию из базы данных. Ну а комбинируя параметры метода find(), мы можем гибко управлять получением данных

  • Урок 8: Метод модели find(). Часть 2

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

  • Урок 9: Магические типы метода find()

Текущий урок мы также продолжим изучением метода find(). В данном уроке мы познакомимся с так называемыми магическими типами (Mafic Find Types). Используя этот метод и зная название поля (или полей), из которого необходимо получить данные, мы можем легко это сделать, не используя никаких дополнительных параметров. При этом здесь возникает столь много вариантов получения данных, что мы буквально можем экспериментировать с ними

  • Урок 10: Выводим данные в шаблон

Итак, мы научились получать и передавать данные в шаблон. Теперь пришла очередь познакомиться детальнее с еще одной составной частью паттерна MVC – видами. В этом уроке мы создадим файлы видов и выведем на экран полученные в них данные

  • Урок 11: Вывод отдельной статьи

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

В этом уроке мы познакомимся с еще одним методом модели – методом exists(). Этот метод очень полезен, когда нам необходимо просто проверить существование в базе данных той или иной записи

Фреймворк CakePHP предоставляет разработчикам 2 незаменимые вещи, ускоряющие процесс разработки – Хелперы (Heplers) и Компоненты (Components). Используя Хелперы и Компоненты, мы можем удобнее работать с сессиями, формами, легко и быстро создать постраничную навигацию для статей и прочая, и прочая. Кейк предлагает как уже готовые Компоненты и Хелперы, которыми мы можем пользоваться, так и возможность создавать собственные Компоненты и Хелперы

  • Урок 14: Хелпер для работы с формами

Одним из ключевых и часто используемых хелперов, является хелпер по работе с формами (Form Helper). Изучив работу с этим помощником, мы без труда создадим форму, которую можно использовать для сохранения информации в базу данных или отправки формы на Email. При этом помощник Form Helper позволяет не только создавать формы, но и автоматически заполняет их данными и буквально догадывается о том, какой тип поля формы необходимо сгенерировать

  • Урок 15: Добавляем данные в БД

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

  • Урок 16: Валидация данных в CakePHP

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

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

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

В этом уроке мы создадим еще одну функцию для управления нашим блогом – это будет функция редактирования данных. Для данного функционала мы воспользуемся уже знакомым нам методом save(), позволяющим сохранять данные в БД

  • Урок 20: Ассоциации и связи моделей

Одна из наиболее приятных и мощных возможностей CakePHP – ассоциации моделей. Эта возможность является одной из составляющих магии Кейка. Используя ассоциации, мы можем организовать всего одной строкой кода связи между различными таблицами базы данных. Благодаря установленным связям, нам не нужно писать запросы для получения дополнительных данных, эти данные Кейк любезно предоставит нам автоматически, используя ту самую автомагию (automagic)

  • Урок 21: Работаем с категориями

В этом уроке мы продолжим написание нашего приложения – блога. В уроке мы поработаем с категориями постов и закрепим на практике получение данных из БД и оперирование этими данными

  • Урок 22: Зависимость моделей на практике

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

Фреймворк CakePHP предоставляет специальный метод, позволяющий гибко работать с видами – это метод render(). Данный метод неявно вызывается в конце каждого экшена контроллера, подгружая вид по умолчанию. Но Кейк позволяет вызывать данный метод в любом месте кода контроллера, тем самым указывая, какой вид необходимо загрузить

  • Урок 24: Работа с темами в CakePHP

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

  • Урок 25: Приготовление кода в консоли (Cake Bake)

В данном уроке мы вернемся к вопросу работы с консольной утилитой Кейка, позволяющей «испекать код» (Cake Bake). В качестве примера мы приготовим с нуля коды Контроллера, Модели и Вида нашего простого сайта. При этом на приготовление кода мы потратим считанные минуты, ни единой строчки кода мы не будем писать самостоятельно, и весь сгенерированный код будет абсолютно рабочим

  • Урок 26: Регистрация и авторизация. Часть 1

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

  • Урок 27: Регистрация и авторизация. Часть 2

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

  • Урок 28: Регистрация и авторизация. Часть 3

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

  • Часть 2. Разработка сайта с использованием фреймворка CakePHP

Как уже отмечалось выше, большинство курсов по изучению фреймворка CakePHP ограничиваются созданием простейшего блога из примеров документации. Мы пойдем дальше и во второй, практической части нашего курса, будем создавать сайт, который Вы можете видеть на скриншотах ниже.

Основа данного сайта – каталог товаров. Функционал, который будет нами реализован в курсе:

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

После изучения данной части Вы закрепите на практике все изученное в первой части курса, а также почерпнете для себя много новой информации и возможностей.

ВИДЕОУРОКИ ВТОРОЙ ЧАСТИ КУРСА:

Итак, у нас есть верстка шаблона (html-страничка), который я нашел на одном из сайтов, предлагающем бесплатные шаблоны. Задачей первого урока будет перенос данного шаблона в структуру фреймворка CakePHP. Мы должны перенести код самой html-странички, а также скрипты, стили, картинки и шрифты. В итоге, при обращении к главной странице нашего сайта мы должны увидеть картинку, которая ничем не должна отличаться от исходного шаблона HTML

  • Урок 2: Создаем первый контроллер сайта

Во втором уроке мы начнем превращать пока что статичный шаблон в динамичную страницу нашего сайта. Здесь мы создадим свой первый контроллер, который будет работать с главной страницей сайта и заниматься выводом новинок товаров на главную страницу сайта

  • Урок 3: Формируем многоуровневое меню. Часть 1

Изюминкой выбранного нами шаблона и, пожалуй, наиболее сложной в реализации его частью является меню категорий. Это красивое выпадающее меню, которое можно сейчас встретить на многих интернет-магазинах, предлагающих различные категории товаров. Основная сложность реализации нашего меню заключается в его многоуровневости, т.е. пользователь может создавать сколь угодно много вложенных друг в друга категорий и все эти категории должны появиться на сайте с соблюдением уровней вложенности и соответствующим визуальным оформлением вложенности. Благо, Кейк предлагает нам несколько возможностей по реализации и работе с деревьями

  • Урок 4: Формируем многоуровневое меню. Часть 2

В этом уроке мы продолжим реализовывать многоуровневое меню категорий для нашего сайта

  • Урок 5: Создаем компонент меню

Итак, мы создали многоуровневое меню, и оно замечательно работает. Однако, пока что это меню работает только на главной странице. Нам же необходимо, чтобы меню было доступно на всех страницах сайта. Чтобы избежать дублирования кода, мы создадим собственный компонент – компонент Меню – который будем использовать на всех страницах сайта

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

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

  • Урок 8: Выводим товары категорий

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

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

  • Урок 10: Меню категорий в сайдбаре

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

Поскольку основа создаваемого нами сайта – это каталог товаров, соответственно, нам необходима карточка товара, в которой мы отобразим детальную информацию по выбранному товару. В этом уроке мы займемся реализацией карточки товара, создав необходимые контроллер, модель и вид

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

Наш шаблон предполагает не только меню категорий, но и меню страниц, которое так же, как и меню категорий, должно присутствовать на всех страницах нашего сайта. В этом уроке мы создадим меню страниц, и при его создании мы будем использовать уже созданный нами ранее компонент Меню

В этом уроке мы с Вами поработаем с еще одним компонентом Кейка – CakeEmail. Данный компонент представляет собой класс, позволяющий работать с отправкой писем на email. На нашем сайте есть страница контактов, которая может предполагать наличие контактной формы. Давайте создадим такую форму и реализуем логику отправки данных из нее на email

  • Урок 15: Архитектура админской части

Начиная с текущего урока, мы приступаем к разработке админской части нашего сайта. В этом уроке мы продумаем архитектуру админской части, более плотно поработаем с маршрутизацией (раутингом) и узнаем, как можно работать с префиксами в URL-адресах

  • Урок 16: Ограничиваем доступ к админке

Данный урок будет посвящен ограничению доступа к админской части сайта. Мы воспользуемся уже знакомым нам компонентом Auth, создадим форму авторизации и ограничим доступ к админским экшенам

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

  • Урок 18: Дерево категорий товара

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

  • Урок 19: Устанавливаем визуальный редактор

Обязательным компонентом админской части является визуальный редактор, поскольку администрировать сайт может пользователь, который впервые слышит слово HTML. Соответственно, мы должны сделать удобным процесс редактирования даже для таких пользователей. В этом уроке мы установим и настроим визуальный редактор CKEditor, а также интегрируем файловый менеджер KCFinder. В процессе мы узнаем нюансы установки и настройки подобных вещей в CakePHP

В этом уроке мы реализуем функционал добавления товара. Здесь все будет предельно просто, поскольку данный функционал очень напоминает реализованный ранее функционал редактирования товара

Последним действием по управлению товаром будет его удаление, которое мы и реализуем в текущем уроке

Основываясь на реализованном ранее функционале управления товарами, мы можем легко реализовать управлением страницами. Здесь мы наглядно увидим, как фреймворк облегчает нам жизнь при написании кода. Фактически весь необходимый функционал – добавление, редактирование и удаление страниц – мы реализуем за один текущий урок

  • Урок 23: Управление метаданными

В этом уроке будет показано, как организовать управление метаданными страниц Вашего сайта. Мы выведем название страницы (title), ее ключевые слова (keywords) и описание (description)

  • Урок 24: Управление категориями

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

  • Урок 25: Загрузка картинок. Часть 1

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

  • Урок 26: Загрузка картинок. Часть 2

В данном уроке мы продолжим реализацию функционала по загрузке и ресайзу изображений для товаров

CakePHP ускорит веб-сайт

Разработчики которые не использовали CakePHP, думают о нём, как о медлительном фреймворке. Действительно, CakePHP не самый быстрый framework по результатам многих тестов, прежде всего производительность CakePHP зависит от самих приложений.

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

Есть два типа изменений, которые Я буду описывать в этой статье. Первое, это изменение в коде, например, это будет работать везде, даже если вы работаете на виртуальном хостинге. Второй тип ориентирован для пользователей, которые имеют свой собственный выделенный или виртуальный сервер, что бы они могли добавлять и удалять программное обеспечение по мере необходимости.

Обновить версию CakePHP

В версии 1.3 был произведён капитальный ремонт базовой архитектуры CakePHP. Я сделал несколько тестов , что бы сравнить CakePHP версии 1.2 и 1,3 и 2,0. Результаты были поразительными. После обновления с 1,2 до 1,3 был прирост производительности на 70%.

Если вы не обновляли CakePHP, то первое, что вы должны сделать, это обновить как минимум до версии 1.3, но предпочтительнее версии 2.x.

Отключить режим отладки

Когда перемещаешь код в реализацию, можно легко забыть отключить отладку. Для типичной установки, для приложения нужно создать несколько файлов /config /core.php: один для локальной среды, для каждого разработчика, один для настройки и один для производства. Эти файлы содержат различные настройки в зависимости от направления.

Ключевые изменения Configure::write(‘debug’, 2) на Configure::write(‘debug’, 0)

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

Отключить рекурсивный вывод результатов

При выполнении запроса с использованием метода find() , рекурсии имеет значение по умолчанию 0 . Это означает, что CakePHP должен пытаться присоединиться к любой связанной модели первого уровня. Например, если у вас есть модель пользователя, которая имеет много комментариев, каждый раз при выполнении запроса пользователем, модель будет подключаться к таблице комментарий.

Время на выполнение, возврат, а также создания ассоциативного массива с этими данными, может быть значительным.

Подход по умолчанию, убедившись, что ни одна рекурсия не является для переопределения значений, добавив в приложение app/Model/AppModel.php следующий код:

Результаты кэширования запросов

Есть и другие статьи аналогичного решения.

Во многих веб-приложениях, есть, вероятно, много запросов к базе данных, но не обязательно. Значение по умолчанию для функции find() внутри приложение app/Model/AppModel.php, сделать это легко для кэширования результатов полного ассоциативного массива запросов. Это означает, что мы не только избежим столкновения с базой данных, но и избежим время обработки CakePHP преобразования результатов в массив. Необходимый код выглядит следующим образом:

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

требует обновления, чтобы включить кэширование информации:

Два дополнительных значений добавит: имя кэш-памяти и конфигурацию кэша, которые должны быть использованы. Два заключительных изменения должны быть внесены в приложение /config /core.php. Кэш должен быть включен и значение cacheConfig, которое используется должно быть определено. Во-первых, раскомментируйте следующую строку:

А затем, добавить новые конфигурации кэша следующим образом (обновление необходимые параметры для имени и срока действия):

Все из перечисленных выше вариантов может быть обновлено, изменить имя, или даже определить, где память кэша должна хранится.

Для более подробного объяснения о том, как добавить, обновить и очистить кэш, продолжите чтение о конкретной оптимизации кэширования.

Не думайте что это конец CakePHP кэширования. Можно кэшировать контроль действий, представлений и даже вспомогательные функции. Смотрите книгу CakePHP с кэшем и компонентами для получения дополнительной информации.

Установить память для кэша

По умолчанию, сессий PHP хранятся на диске (обычно в папке). Это означает, что каждый раз при обращении к сессии, PHP необходимо открыть файл сессии и декодировать информацию, которую он содержит. Проблема в том, на дисках запись/чтение может быть довольно дорогим процессом. Доступ к элементам в памяти, отличается скоростью запись/чтение с диска и является намного быстрее.

Есть два хороших подхода к сессии связанных дисков I/O. Первый из них заключается в настройке памяти RAM на жестком диске сервера. После настройки диска будет смонтирован как и любой другой диск и значение session.save_path в php.ini будет обновляться, чтобы указать на новый диск. Вторым способом является установка программного обеспечения, такое как Memcached , открытая система кэширования, которая позволяет объектам хранится в памяти.

Что бы узнать, какой подход для вас лучше, ответе на следующие вопросы: Сколько будет серверов требующие доступ к этой памяти одновременно? Если больше одного, то вам нужен Memcached, поскольку он может быть установлен ​​на отдельной системе, и разрешает доступ к нему другим серверам. Но, если вам нужно, ускорить один веб-сервер, выбирайте решение RAM диск, это хорошо и быстро работает и не требует никакого дополнительного программного обеспечения.

Установить Memcached

В зависимости от вашей операционной системы, установка Memcached простая.

Если в кэше ничего нет, то делается запрос к базе и результаты записываются в Memcache

Добавляем строку в /etc/rc.conf:

Ставим расширение для php:

По окончанию установки наблюдаем следующее:

Говорится о том что pecl-memcache удачно установлен, и нужно лишь подключить его:

Ну и можно перезапустить апач что бы изменения вступили в силу.
После установки, вы можете настроить PHP для хранения сессий в памяти путем обновления php.ini :

Если Memcached установлен на другой порт или хост, то изменение записи соответственно.

После того как вы закончили установку на своем сервере, вам также необходимо установить модуль PHP Memcache. Снова в зависимости от вашей операционной системы, одной из этих команд:

Установка Memcached PHP под Windows

  1. Скачиваем файл запуска exememcached и распаковываем его в любое, удобное для Вас, место.
  2. Скачиваем модульmemcached для PHP и распаковываем php_memcache.dll в каталог расширений PHP (обычно «ext/» в директории PHP), а также в php.ini дописываем следующую строку:
  3. Устанавливаем memcached .Подробности: дело в том, что данная версия (1.4.5) не устанавливается как служба Windows самостоятельно, отображается ошибка:

Поэтому нам понадобится некий « NSSM — the Non-Sucking Service Manager » для решения этой проблемы.

Переходим в каталог с распакованным NSSM и из командной строки запускаем:

  • Идем в Панель Управления — Администрирование — Службы и запускаем службу « memcached «, а также учим её запускаться автоматически с Windows.
  • Перезапускаем PHP (Apache)
  • Удаление Apache и Установка Nginx

    Apache по-прежнему является хорошим сервером но согласно последним статистическим данным Ngnix набирает много рейтинга, когда речь идет о наиболее интенсивным движением веб-сайтов в Интернете. В самом деле, Nginx становится популярной заменой Apache.

    Apache, как Microsoft Word, он имеет миллион вариантов, но вам нужно всего лишь шесть. Nginx делает эти шесть вещей, и это делает пять из них в 50 раз быстрее, чем Apache. — Крис Ли

    Nginx от Apache отличается событиями, а не процессами на основе серверов. Apache быстро забивает память. Чтобы правильно обрабатывать новые запросы, процессы Apache вызывают увеличение памяти и времени ожидания создание новых потоков. Между тем, Nginx работает асинхронно и использует один или несколько очень легкие темы.

    Nginx также очень быстр в обслуживании статических файлов, так что если вы не используете сеть для доставки контента, то вам определенно нужно использовать Nginx.

    В конце концов, если вам не хватает памяти Nginx будет потреблять всего 20-30M, где Apache может быть много вверх 200M для той же нагрузке. Память может быть дешевым для настольного ПК, но не тогда, когда дело доходит до оплаты серверов в сети!

    Для более глубокого разбора между Apache и Nginx посетите Apache против Nginx WikiVS .

    HowToForge имеет отличную статью по настройке Nginx на вашем сервере. Я предлагаю следующий шаг-за-шагом руководство по установке и настройке Nginx с PHP-FPM.

    Настроить Nginx для Memcached

    После установки Nginx и Memcached, что делает их рядом друг с другом будет еще больше расширять производительность. Хотя приложение CakePHP являются динамическими, то, скорее всего 80-90% все еще относительно статических — это значит, что изменения только в определенные промежутки времени.

    Путем внесения следующих изменений в файл конфигурации Nginx, Memcached начнет, обрабатывать ваши запросы Nginx, которые уже были обработаны и сохранены в памяти. Это означает, что всего лишь несколько запросов, будет вызываться PHP, что увеличит скорость вашего сайта.

    Приведенная выше конфигурация указывает, что статические файлы должны быть приняты сразу. PHP файлы должны быть направлены на Memcached, чтобы служить странице, если она была сохранена в кэше. Если она не существует в кэше, @ NOCACHE расположение будет достигнуто, которое действует как предыдущие настройки PHP, чтобы работать на странице через PHP-FPM.

    Не забудьте обновить приложение сonfig /core.php:

    Наш код для кэширования запросов также требует обновления:

    Удалить MySQL и установить Percona

    Окончательная модификацию сервера, установка сборки MySQL Percona . Команда Percona в течение многих лет работала с пониманием и тонкой настройкой архитектуры базы данных для оптимальной производительности. Инструкции по установке Percona там описывается несколько различных вариантов установки.

    Заключение

    Есть довольно много методов для обеспечения CakePHP которые будут работать. Некоторые изменения сделать труднее, чем другие.

    Тема Basic. Правильное внесение изменений

    Тема Basic от WP Puzzle — быстрая, удобная и одна из самых популярных тем в репозитории WordPress. Многие разворачивают свои сайты на этой теме, но вот изменения зачастую вносятся не верно. Так что будем разбирать как правильно вносить изменения в эту тему.

    • Дочерняя тема
    • Изменение шрифтов
    • Выбор шрифта
    • Подключение шрифтов
    • Верхний бар
    • Бонус
    • Заключение

    Дочерняя тема

    Что такое дочерняя тема и для чего она нужна смотрим в видео

    Создание дочерней темы — процесс не сложный и действовать надо по такому алгоритму:

    • создать папку с названием темы;
    • создать в этой папке файл style.css ;
    • создать там же файл functions.php .

    Теперь надо в файл style.css добавим нужные теги

    Формально, теперь можно активировать тему и все будет работать. Вот только внешний вид хромает, требуется подрубить стили родительской темы. Для этого в файл functions.php добавляем следующее:

    Вот теперь все как надо…

    Изменение шрифтов

    Выбор шрифта

    Давайте, например, изменим шрифты. В теме Basic используются шрифты от Google Fonts, выберем и настроим шрифтовую пару. Это будет Oswald и Roboto. Забираем ссылку

    Подключение шрифтов

    Чтобы не грузить лишние шрифты отключаем шрифты родительской темы и подключаем выбранные

    Осталось только изменить семейство шрифтов в стилях дочерней темы. Ищем в родительской теме старые семейства и заменяем на новые

    Профит. Шрифты изменены.

    Верхний бар

    Тема Basic удобна наличием в ней множества action и filter , а значит можно не изменять файлы, а просто воспользоваться хуками. Для примера, подключим верхний бар над логотипом

    В баре можно вывести все, что угодно. Например номер телефона или поиск

    Добавим немножко стилей

    Бонус

    Все, что выше мною сказано, я упаковал в готовую дочернюю тему. Можете ее скачать совершенно бесплатно.

    Скачать дочернюю тему для темы «Basic»

    Чтобы скачать файл, вам потребуется ввести адрес вашей электронной почты. Иногда вам будут приходит дайжесты о новых статьях и видео проекта Финты WordPress. Если вы уже подписаны, то достаточно ввести адрес почты.

    You have Successfully Subscribed!

    Заключение

    Итак, это был небольшой пример того, как правильно вносить изменения в тему Basic. Все изменения вносятся через дочернюю тему, а хуки и фильтры позволяют не изменять файлы.

    Как-то так, вопросы и предложения оставляем в комментариях.

    Автор и ведущий проекта «Финты WordPress». WordPress & WooCommerce разработчик. Четыре года создаю плагины и темы. В свободное время пишу статьи, видеообзоры, гайды.

    Какие перспективы у CakePHP?

    Добрый день!
    Выбираю php-фреймворк для дальнейшего обучения. Знание PHP начальные.
    Посмотрел несколько популярных:

    • Yii
    • Laravel
    • Kohana
    • CakePhp

    Из несложных вроде последние 2.
    Но склоняюсь к CakePhp, понравилась система соглашений!
    Php и так настолько «гибкий», что больше на бардак походит.

    Однако не вижу каких-то движений в русско-яз. сообществе(
    Подскажите, есть ли смысл продолжать? Не хотелось бы забивать голову, чем-то неактуальным и тратить по-напрасно время.
    Спасибо!

    • Вопрос задан более трёх лет назад
    • 2177 просмотров

    Посмотрел несколько популярных:
    Yii
    Laravel
    Kohana
    CakePhp
    Из несложных вроде последние 2.

    Kohana мертв, CakePhp не развивается, Laravel и Yii по качеству кода не фонтан (к тому же Yii страдает синдромом nih).
    Лучше посмотрите на Symfony.

    Однако не вижу каких-то движений в русско-яз. сообществе(

    > Лучше посмотрите на Symfony.

    Да, Симфони спроектирована грамотно. Всё сделано красиво, но порой, когда требуется сделать что-то нестандартное, хочется убить себя.

    Поэтому бессмысленно создавать комьюнити фреймворка на русском языке, а не на английском, который знают все.

    когда требуется сделать что-то нестандартное, хочется убить себя.

    Sashkett: Максим Тимофеев: кроме увеличения порядкового номера версии надо и код модифицировать.

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

    CobaltTheTerrible: Это статья я уже читал.

    Я же хотел услышать о вашем случае, а именно о том что за «нестандартная» задача из за которого хочется убит себя? мне правда интересно

    Sashkett: попсовый == популярный. Трушные чуваки не юзают фреймворки (эра композера все таки). Берешь раутер, кернел какой PSR-7 совместимый, DI контейнер и вперед к свершениям).

    А кейки и кохаты, как и код игнайтеры если и не мертвы то должны умереть.

    Хотите гибкости — Symfony/Zend/Laravel.

    Хотите практиковать persistence ignorance и DDD, абстрагировать бизнес логику от фреймворков, делать сложные приложения — то выкидываем Active Record или используем его исключительно как DAO.

    Хотите писать CRUD — без разницы тогда что вы возьмете, все примерно одинаковое. Но у Laravel/Symfony есть преимущество в виде LTS релизов. Есть ли LTS релизы у зэнда — не вкурсе. Yii2 можно потыкать только потому что рускоязычное сообщество большое и архитектура в принципе схожа с ларкой.

    CobaltTheTerrible: вы же поняли сарказм? В целом я не вижу в подходе с собиранием проекта из компонентов ничего плохого, только на это надо время дополнительное. А так есть чудные правила 12-ти факторных приложений, следуя которым ада и холокоста в коде быть не должно быть особо. Ну и да, если мы будем использовать отдельные компоненты то это ничем не будет отличаться от той же Symfony.

    В целом я согласен, новичкам только фулстэк фреймворки готовые. Браться за сооружение своего можно только поработав хорошенько с уже существующими фреймворками и только если они вас чем-то ограничивают.

    Конфигурация приложения на CakePHP 3

    Содержание

    Настройка приложения

    П араметры конфигурации обычно хранятся в файлах PHP или INI и загружается во время начальной загрузки приложения. CakePHP поставляется с одним конфигурационным файлом по умолчанию, но при необходимости вы можете добавить дополнительные файлы конфигурации и использовать их при начальной загрузке вашего приложения. Cake\Core\Configure используется для глобальной конфигурации, и классы типа Cache основываются на методах config(), что делает настройку простой и понятной.

    Загрузка дополнительных файлов конфигурации

    Если ваше приложение имеет множество параметров конфигурации, может оказаться полезным разбить конфигурацию на несколько файлов. После создания каждого из файлов в вашем каталоге config/, их следует загрузить в bootstrap.php:

    Вы также можете использовать дополнительные файлы конфигурации для обеспечения переопределения среды. Каждый файл, загруженный после app.php, может переопределять ранее объявленные значения, позволяя настраивать конфигурацию для сред разработки или промежуточных сред.

    Общая конфигурация

    Ниже приведено описание переменных среды и их влияние на ваше приложение CakePHP.

    Debug Изменяет вывод отладочной информации. False = Отсутствуют сообщения об ошибках и предупреждениях. True = Режим отладки, при котором показываются ошибки и предупреждения. App.namespace Пространство имен, в котором находятся классы приложения.

    Важно! При изменении пространства имен в конфигурации вам также потребуется обновить файл composer.json, чтобы можно было это пространство имен использовать. Кроме того, создайте новый автозагрузчик, запустив php composer.phar dumpautoload из командной строки.

    App.baseUrl Не комментируйте это определение, если вы не планируете использовать mod_rewrite от Apache с CakePHP. В противном случае, не забудьте также удалить файлы .htaccess. App.base Базовый каталог, в котором находится приложение. Если false, это будет обнаружено автоматически. Если не false, убедитесь, что строка начинается с косой черты ( / ) и заканчивается не косой чертой. Например, /basedir является допустимым App.base. В противном случае AuthComponent не будет работать должным образом. App.encoding Определяет, какую кодировку использует приложение. Эта кодировка будет использоваться при генерации макета и кодирования сущностей. Это определение должно соответствовать значениям кодировки, указанным для вашей базы данных. App.webroot Каталог webroot. App.fullBaseUrl Полное доменное имя (включая протокол) в корне вашего приложения. Настройка используется при генерации абсолютных URL-адресов. По умолчанию это значение генерируется из серверной переменной $_SERVER. Однако полезно определить его вручную для оптимизации производительности или если вы часто имеете дело с пользователями, манипулирующими заголовком Host. В CLI-контексте (из командной строки) fullBaseUrl не может быть прочитан из $_SERVER, поэтому вам, опять таки, необходимо указать его самостоятельно, если требуется генерировать URL-адреса из командной строки (например, при отправке электронных писем). App.imageBaseUrl Путь к каталогу изображений в папке webroot. App.cssBaseUrl Путь к директории, в которой размещаются таблицы стилей. App.jsBaseUrl Путь к директории, в которой размещаются файлы javascript. App.paths Настройка путей для ресурсов, не основанных на классе. Сюда входят плагины, шаблоны и локализация (plugins, templates, locales). Security.salt Случайная строка, используемая в хэшировании. Это значение также используется в качестве соли для HMAC при выполнении симметричного шифрования. Asset.timestamp Добавляет временную метку, которая является временем последнего изменения конкретного файла в конце URL- адресов файлов ресурсов (CSS, JavaScript, Image), при использовании соответствующих помощников. Допустимые значения:

    • (bool) false — Ничего не делает (по умолчанию);
    • (bool) true — Добавляет метку времени, когда debug true;
    • (string) ‘force’ — Всегда добавляет метку времени.

    Так же, к общей конфигурации относятся следующие разделы:

    • Конфигурация базы данных;
    • Конфигурация кэширования;
    • Настройка обработки ошибок и исключений;
    • Конфигурация протоколирования;
    • Настройка электронной почты;
    • Конфигурация сессии;
    • Конфигурация изменения формы слова (Inflector);
    • Конфигурация маршрутизации.

    Дополнительные пути к классам

    Дополнительные пути к классам настраиваются через автозагрузчики вашего приложения. При использовании Composer для генерации автозагрузчика, чтобы предоставить запасные пути для контроллеров, необходимо сделать следующее (файл composer.json):

    Запись выше установит пути для пространств имен App и App\Controller. Сначала произойдет проверка первого ключа и если этот путь не содержит искомый класс/файл, будет произведен поиск по второму ключу. Также допускается сопоставление одного пространства имен с несколькими каталогами:

    Пути для плагина, шаблона представления и локализации

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

    Пути должны заканчиваться разделителем каталогов, иначе они не будут работать должным образом.

    Переменные среды

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

    Как вы можете увидеть в файле app.php, функция env() используется для чтения данных конфигурации из среды и создания конфигурации приложения. CakePHP использует строки DSN для конфигураций базы данных, журналов, почтового транспорта и кеша, что позволяет легко изменять эти библиотеки в каждой среде.

    Xтобы обеспечить легкую локальную разработку с использованием переменных среды, CakePHP использует dotenv. Обратите внимание на файл config/.env.default в своем приложении. Скопировав этот файл в config/.env, вы можете настроить свое приложение.

    Вам следует избегать передачи файла config/.env в ваш репозиторий и вместо этого использовать config/.env.default в качестве шаблона с записями-заполнителями, чтобы все в вашей команде знали, какие переменные среды и с какими значениями используются.

    После того, как переменные среды установлены, вы можете использовать env() для чтения данных из среды:

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

    Внимание, новое в версии 3.5.0: Поддержка библиотеки dotenv была добавлена ​​в скелет приложения.

    Класс Configure

    class Cake\Core\Configure

    Класс CakePHP Configure может использоваться для хранения и извлечения конкретных значений приложения или среды выполнения. Будьте осторожны, этот класс позволяет хранить в нем что угодно, а затем использовать это в любой другой части вашего кода: верное искушение нарушить разработанный в CakePHP шаблон MVC. Главная цель класса Configure — хранить централизованные переменные, которые могут совместно использоваться разными объектами. Не забывайте следовать этому принципу и вы не нарушите созданную разработчиками структуру MVC.

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

    Запись данных конфигурации

    static Cake\Core\Configure::write($key, $value)

    Используйте write() для хранения данных в конфигурации приложения:

    Обратите внимание! Точечная нотация, используемая в параметре $key, может использоваться для организации настроек конфигурации в логические группы.

    Вышеприведенный пример также может быть написан в одном вызове:

    Вы можете использовать Configure::write(‘debug’, $bool) для переключения между режимами отладки и производства, что называется — на лету. Это особенно удобно для взаимодействия JSON, когда отладочная информация может вызвать проблемы с разбором синтаксиса.

    Чтение данных конфигурации

    static Cake\Core\Configure::read($key = null)

    Используется для чтения данных конфигурации из приложения. Возвращаются данные по указанному ключу. Для вышеприведенного примера, где использовался метод write(), мы можем прочитать записанные данные следующим образом:

    Если параметр $key не указывать, то метод вернет все значения Configure.

    static Cake\Core\Configure::readOrFail($key)

    Читает конфигурационные данные так же, как Cake\Core\Configure::read, но ожидает найти пару ключ/значение. В случае, если запрошенная пара не существует, будет выброшено исключение RuntimeException:

    Внимание, новое в версии 3.1.7: Configure::readOrFail() добавлен начиная с версии 3.1.7

    Проверка того, определены ли данные конфигурации

    static Cake\Core\Configure::check($key)

    Используется для проверки наличия ключа/пути, возвращает true или false:

    Удаление данных конфигурации

    static Cake\Core\Configure::delete($key)

    Используется для удаления информации из конфигурации приложения:

    Чтение и последующее удаление конфигурационных данных

    static Cake\Core\Configure::consume($key)

    Чтение и удаление ключа из конфигурации. Это полезно, когда вы хотите объединить чтение и удаление значений в одной операции.

    Чтение и запись конфигурационных файлов

    static Cake\Core\Configure::config($name, $engine)

    CakePHP предоставляет два встроенных механизма управления файлами конфигурации. Cake\Core\Configure\Engine\PhpConfig, который может читать PHP файлы и Cake\Core\Configure\Engine\IniConfig — читает ini файлы конфигурации. Дополнительную информацию о специфике ini-файлов смотрите в документации по PHP. Чтобы использовать соответствующий механизм, вам нужно будет подключить его к Configure используя метод Configure::config():

    Допускается использование нескольких механизмов, подключенных к Configure, для чтения различных видов файлов конфигурации из разных источников. Вы можете взаимодействовать с подключенными механизмами, используя несколько дополнительных методов в Configure. Чтобы проверить какие механизмы конфигурации подключены, используйте Configure::configured():

    static Cake\Core\Configure::drop($name)

    Вы также можете удалять подключенные механизмы. Configure::drop(‘default’) удалит механизм, имеющий псевдоним ‘default’. Любые последующие попытки загрузить конфигурационные файлы для этого механизма — потерпят неудачу:

    Загрузка файлов конфигурации

    static Cake\Core\Configure::load($key, $config = ‘default’, $merge = true)

    После того, как вы подключили к Configure соответствующий механизм, далее можно загружать конфигурационные файлы:

    Загруженные конфигурационные файлы объединяют свои данные с существующей в Configure конфигурацией. Это позволяет перезаписывать или добавлять новые значения в существующие настройки приложения. Установив $merge в true, значения не будут перезаписаны а объединятся с существующей конфигурацией.

    Создание или изменение файлов конфигурации

    static Cake\Core\Configure::dump($key, $config = ‘default’, $keys = [])

    Выгружает все или часть данных из Configure в файл или систему хранения, поддерживаемую механизмом конфигурации. Формат сериализации определяется подключенным механизмом, псевдоним которого указывается в $config. Например, если псевдоним «default» механизма Cake\Core\Configure\Engine\PhpConfig, то сгенерированный файл будет файлом конфигурации PHP, загружаемым посредством Cake\Core\Configure\Engine\PhpConfig

    Если механизм ‘default’ является экземпляром PhpConfig. То все данные конфигурации Configure будут сохранены в файле my_config.php:

    Сохранит только конфигурацию обработки ошибок:

    Configure::dump() используется для изменения или перезаписи конфигурационных файлов, которые в последствии можно прочитать с помощью Configure::load().

    Сохранение конфигурации времени выполнения

    static Cake\Core\Configure::store($name, $cacheConfig = ‘default’, $data = null)

    Вы также можете сохранить значения конфигурации времени выполнения (Runtime) для использования в будущем запросе. Поскольку Configure запоминает значения только для текущего запроса, вам нужно будет сохранять любую измененную конфигурационную информацию, если требуется использовать ее в дальнейшем:

    Данные сохраняются в кэше согласно его конфигурации.

    Восстановление сохраненной Runtime конфигурации

    static Cake\Core\Configure::restore($name, $cacheConfig = ‘default’)

    После того как вы сохранили значения конфигурации времени выполнения, вам, вероятно, может понадобится их восстановить, для дальнейшего использования. Configure::restore() делает именно это:

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

    Создание собственных конфигурационных механизмов

    Поскольку конфигурация является расширяемой частью CakePHP, вы можете создавать собственные её механизмы в своих приложениях и плагинах. Создаваемые механизмы должны реализовывать Cake\Core\Configure\ConfigEngineInterface. Этот интерфейс подразумевает создание метода чтения, как единственного необходимого метода. Если вы хотите использовать конфигурационные файлы XML, то можете создать простой механизм конфигурации Xml для своего приложения:

    В config/bootstrap.php вы можете подключить вновь созданный движок и далее его использовать:

    Метод read() в модуле конфигурации должен возвращать массив информации о конфигурации, который содержит ресурс с именем $key.

    interface Cake\Core\Configure\ConfigEngineInterface

    Определяет интерфейс, используемый классами, которые читают данные конфигурации и сохраняют их в Configure

    Cake\Core\Configure\ConfigEngineInterface::read($key)

    Parameters: $key (string) – Имя ключа или идентификатор для загрузки.

    Этот метод должен загружать/парсить конфигурационные данные, идентифицированные ключом $key и возвращать массив данных из конфигурационного файла.

    Cake\Core\Configure\ConfigEngineInterface::dump($key, array $data)

    Parameters: $key (string) – Идентификатор (название файла), куда будет производиться запись; $data (array) – данные для дампа (записи).

    Этот метод должен сохранять предоставленные данные конфигурации в файл с названием идентифицированным по ключу $key.

    Встроенные конфигурационные механизмы

    Файлы конфигурации PHP

    class Cake\Core\Configure\Engine\PhpConfig

    Позволяет читать конфигурационные файлы, которые хранятся в виде простых PHP-файлов. Вы можете читать эти файлы из каталогов конфигурации приложения или из каталогов конфигураций плагинов с помощью синтаксиса плагинов. Файлы должны возвращать массив. Пример файла конфигурации приведен ниже:

    Загрузка файла конфигурации (customConfig.php) происходит вставкой в config/bootstrap.php следующего кода:

    Файлы конфигурации Ini

    class Cake\Core\Configure\Engine\IniConfig

    Позволяет читать конфигурационные файлы, которые хранятся в виде простых INI-файлов. Эти файлы должны быть совместимы с php функцией parse_ini_file() и учитывать следующие условия:

    • точечные разделения значений будут преобразованы в массивы;
    • значения типа булев, такие как «on» и «off», преобразуются в логические значения «true» и «false».

    Пример содержания файла ini приведён ниже:

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

    Файлы конфигурации Json

    class Cake\Core\Configure\Engine\JsonConfig

    Позволяет выполнять дамп/чтение конфигурационных файлов .json, информация в которых хранится в виде JSON-кодированных строк.

    Пример содержания файла json приведён ниже:

    Начальная загрузка CakePHP (Bootstrapping)

    Если у вас есть дополнительные требования к конфигурации, их необходимо добавить в файл config/bootstrap.php вашего приложения. Подключение файла config/bootstrap.php выполняется перед каждым запросом и командой через CLI.

    Этот файл идеален для ряда обычных задач начальной загрузки:

    • Выполнение определяющих функций (например, проверка версии PHP);
    • Объявление констант;
    • Определение конфигурации кэша;
    • Определение конфигурации протоколирования;
    • Загрузка пользовательских изменений;
    • Загрузка конфигурационных файлов.

    Может возникнуть соблазн разместить здесь функции форматирования, чтобы использовать их в контроллерах. Как вы увидите в разделах «Контроллеры» (Controllers) и «Представления» (Views), есть лучшие способы добавления пользовательской логики в ваше приложение.

    Application::bootstrap()

    В дополнение к файлу config/bootstrap.php, который следует использовать для низкоуровневых настроек приложения, вы также можете использовать хук метод Application::bootstrap() для загрузки/инициализации плагинов и присоединения глобальных слушателей событий:

    Отключение общих таблиц

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

    Вы можете проверить, был ли какой-либо запрос выдан из общего класса таблицы через DebugKit через панель SQL в DebugKit. Если вам все еще не удается диагностировать проблему, которая может быть вызвана автотаблицами, вы можете выбросить исключение, когда CakePHP неявно использует общий Cake \ ORM \ Table вместо вашего конкретного класса следующим образом:

    Установка CakePHP на сервер Ubuntu 12.04

    Что такое CakePHP?

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

    Минимальные требования CakePHP: веб-сервер и PHP 5.2.8+. Хотя данный фреймворк, как правило, запускают на Apache, он также отлично работает на других веб-серверах (как Lighttpd или Microsoft IIS). Поскольку базы данных являются неотъемлемой частью большинства веб-приложений, CakePHP поддерживает ряд СУБД, таких как MySQL, PostgreSQL, Microsoft SQL или SQLite (с расширениями PDO).

    Данное руководство покажет, как установить и начать работу с CakePHP. Для этого понадобятся настроенные облачный сервер и веб-сервер. Все действия руководства выполнены в операционной системе Ubuntu на веб-сервере Apache (+ PHP и MySQL).

    Установка CakePHP

    Существует несколько способов установки CakePHP на виртуальный выделенный сервер. Можно скачать и распаковать архив с сайта CakePHP, клонировать релиз фреймворка с Github при помощи Git или же использовать библиотеку PEAR. В данном случае удобнее воспользоваться первым способом установки CakePHP (с сайта проекта), поскольку он самый простой.

    Итак, для начала нужно загрузить последнюю стабильную версию фреймворка (ссылку можно найти на главной странице сайта CakePHP) и распаковать полученный архив в отдельную папку. Перейдите в root папку веб-сервера и скачайте архив:

    cd /var/www
    wget https://github.com/cakephp/cakephp/zipball/2.3.9

    Это загрузит zip-файл с релизом. Теперь его нужно распаковать. Если инструмент unzip еще не установлен, выполните следующую команду, чтобы быстро установить его:

    sudo apt-get install unzip

    Теперь можно распаковать архив (скачав другую версию фреймворка, не забудьте заменить имя файла):

    Должна появиться новая папка, содержащая все файлы CakePHP. Переименуйте ее, выбрав более удобное имя (например, project):

    mv cakephp-cakephp-4b9e390 project

    Итак, на данный момент CakePHP загружен и находится в папке /var/www/project.

    Теперь нужно изменить права доступа к папке app/tmp; CakePHP нужно будет выполнить в ней некоторые действия, потому веб-сервер должен иметь право на запись в ней. Для Apache запустите следующие команды в папке /var/www/project:

    cd project
    chown -R root:www-data app/tmp
    chmod -R 775 app/tmp

    Это изменит владельца папки, передав все права пользователю root и папке www-data (в которую также входит пользователь www-data, используемый Apache для запуска процессов). Вторая команда устанавливает права на папку таким образом, чтобы группа www-data могла вносить в нее изменения.

    Перезапись URL-адресов

    Поскольку CakePHP намного продуктивнее работает с чистыми URL-адресами, нужно проверить, позволяет ли веб-сервер перезаписывать URL. Для этого должен быть включен модуль Apache по имени mod_rewrite; кроме того, виртуальный хост должен разрешать файлам .htaccess переопределить инструкции Apache. Итак, для начала убедитесь в том, что mod_rewrite включен; это делается с помощью следующей команды:

    Если появившийся список содержит rewrite_module, модуль уже включен. В противном случае используйте команду:

    Далее нужно отредактировать виртуальный хост Apache по умолчанию и задать строке Allow Overrides значение All для каталога /var/www (если это не было сделано ранее). Откройте файл для редактирования с помощью следующей команды:

    Найдите следующий блок кода и внесите в него соответствующие изменения:

    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all

    Теперь файлы .htaccess могут переопределять инструкции Apache по умолчанию.

    Примечание: после внесения любых изменений в настройки Apache необходимо перезапустить веб-сервер:

    sudo service apache2 restart

    Дополнительные настройки

    Теперь, когда функция перезаписи URL-адресов включена, нужно установить некоторые связанные с безопасностью настройки CakePHP, а именно salt и seed. salt – это пользовательская строка, которая нужна CakePHP для хэширования, а seed – это пользовательское число, используемое для шифрования. Их лучше настроить сейчас, чтобы не возвращаться к этому позже. К слову, главная страница приложения CakePHP выведет два больших красных уведомления, если этого не сделать.

    Отредактируйте файл core.php, расположенный в папке app/Config; найдите в нем следующий блок кода:

    /**
    * A random string used in security hashing methods.
    */
    Configure::write(‘Security.salt’, ‘DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi’);
    /**
    * A random numeric string (digits only) used to encrypt/decrypt strings.
    */
    Configure::write(‘Security.cipherSeed’, ‘76859309657453542496749683645’);

    В целом, на разных серверах строки и числа могут отличаться; но установить новые значения, которые невозможно угадать, нужно именно в этом разделе кода. Убедитесь, что строка cipherSeed содержит только цифры.

    Сохраните и закройте файл.

    Подключение к базе данных

    Хотя база данных не является обязательным компонентом CakePHP, большинству веб-приложений БД необходима для хранения информации. На данном этапе нужно настроить подключение к базе данных MySQL.

    Примечание: чтобы узнать, как перейти с MySQL на MariaDB, читайте данное руководство.

    Итак, создайте БД с некоторым контентом и сообщите о ней CakePHP (эта БД понадобится для выполнения следующего руководства, в котором речь идет о разработке простого примера приложения). Базы данных с одной таблицей из 5 столбцов будет достаточно; столбцы должны содержать идентификатор, название, текст, а также даты создания и изменения, потому им нужно присвоить соответствующие имена: id, title, body, created, modified. Первый столбец должен содержать целое число с автоматическим увеличением (AUTO_INCREMENT PRIMARY KEY); второй – VARCHAR (500); третий – текст поста (TEXT); и последние два столбца – DATETIME.

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

    Итак, нужно выполнить пару команд. Войдите в MySQL или MariaDB. Базу данных можно создать при помощи консоли:

    create database cake;

    Затем в этой БД можно создать таблицу со всеми перечисленными выше столбцами. Но сначала нужно подключиться к базе данных:

    Теперь создайте таблицу:

    CREATE TABLE posts (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(50),
    body TEXT,
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
    );

    Затем внесите в нее контент:

    INSERT INTO posts (title,body,created)
    VALUES (‘Title 1’, ‘Some body text.’, NOW());

    Эта команда внесет в таблицу новую строку.

    Теперь нужно настроить CakePHP, чтобы фреймворк мог использовать эту БД. Для начала скопируйте файл database.php.default, расположенный в папке /app/Config/, и назовите его database.php. Затем откройте файл и внесите в него следующий блок кода (замените cakeBlog и а1b3-А2B4 своим логином и паролем mysql).

    public $default = array(
    ‘datasource’ => ‘Database/Mysql’,
    ‘persistent’ => false,
    ‘host’ => ‘localhost’,
    ‘port’ => »,
    ‘login’ => ‘cakeBlog’,
    ‘password’ => ‘а1b3-А2B4’,
    ‘database’ => ‘cake’,
    ‘schema’ => »,
    ‘prefix’ => »,
    ‘encoding’ => ‘utf8’
    );

    Как видите, нужно просто предоставить свою индивидуальную информацию о соединении базы данных. Сохраните файл и закройте его. Откройте браузер и направьте его на папку, в которой был размещен фреймворк CakePHP при установке (в данном случае это папка project) из root папки веб-сервера:

    Должна появиться домашняя страница нового приложения CakePHP; благодаря выполненной ранее настройке все сообщения должны быть зелеными (кроме сообщения о DebugKit – дополнительной внешней библиотеке).

    Если же PHP сообщает об ошибке часового пояса, раскомментируйте следующую строку в файле core.php, расположенном в папке app/Config:

    Итоги

    Данное руководство продемонстрировало процесс установки и настройки CakePHP на облачном сервере. Следующее руководство этой серии покажет, как создать простое приложение CakePHP, взаимодействующее с БД, созданной в ходе данного урока.

    LXF138:CakePHP

    Подписка на печатную версию Весь 2015 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров) Подписка на электронную версию Весь 2015 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров) Подшивки старых номеров журнала (печатные версии) Весь 2014 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров)

    CakePHP’ Про­стая раз­ра­бот­ка web-при­ло­же­ний с БД. Ну, до­воль­но про­стая…

    CakePHP
    • Часть 1: CakePHP: Раз – и web-при­ло­же­ние!
    • Часть 2: CakePHP: Раз – и web­-приложениe!
    • Часть 3: CakePHP: Пишем загрузчик файлов
    • Часть 4: CakePHP: Сайт для закладок
    • Заключсение: CakePHP: Важные ресурсы

    Содержание

    CakePHP: Раз – и web-при­ло­же­ние!

    Ввод­ная стра­ни­ца CakePHP да­ет сла­бое пред­став­ле­ние о его мо­щи — вни­кай­те глуб­же!

    На­ча­лось. У вас все­го 15 ми­нут, а нуж­но соз­дать ка­та­лог ог­ром­ной кол­лек­ции филь­мов. Кто при­дет на по­мощь? Конеч­но, CakePHP! CakePHP – кар­кас для бы­ст­рой раз­ра­бот­ки при­ло­жений, ох­ва­ты­ваю­щий все стан­дарт­ные ве­щи, встре­чаю­щие­ся в web-про­грам­ми­ро­вании. Ре­шение по­вто­ряю­щих­ся за­дач вы­сво­бо­дит вам боль­ше вре­мени на ко­фе, иг­ры и про­чее. На этом ввод­ном уро­ке мы соз­да­дим биб­лио­те­ку муль­ти­ме­диа, где бу­дет хранить­ся ин­фор­ма­ция о ва­ших филь­мах.

    Для ра­бо­ты CakePHP нуж­но со­всем немно­го. По­на­до­бит­ся web-сер­вер ти­па Apache, PHP 4+ (луч­ше 5+), MySQL 4+ и тек­сто­вый ре­дак­тор на ваш вы­бор. На мо­мент напи­сания ста­тьи по­следней вер­си­ей CakePHP бы­ла 1.3.

    За­гру­зить по­след­нюю вер­сию мож­но в ви­де ар­хи­ва с сай­та http://github.com/cakephp/cakephp/downloads, или по­лу­чить ее из ре­по­зи­то­рия http://github.com/cakephp/cakephp с по­мо­щью Git.

    По­сле за­груз­ки ар­хи­ва с сай­та или из ре­по­зи­то­рия ско­пи­руй­те со­дер­жи­мое па­ке­та cakephp в DocumentRoot web-сер­ве­ра. У вас дол­жен поя­вить­ся ка­та­лог /directory, со­дер­жа­щий под­ка­та­ло­ги /app, /cake, /plugins и /vendors и фай­лы .htaccess, index.php и README.

    На­строй­ка ба­зы дан­ных

    Для по­вы­ше­ния бы­ст­ро­дей­ст­вия CakePHP за­пи­сы­ва­ет фай­лы кэ­ша и дру­гие ме­ло­чи в ка­та­лог app/tmp. Нуж­но убе­дить­ся, что у поль­зо­ва­те­ля, под ко­то­рым за­пу­щен web-сер­вер, есть пра­во на за­пись в этот ка­та­лог. Бы­ст­рее все­го раз­ре­шить за­пись всем ко­ман­дой: chmod -R 777 app/tmp

    Сле­дую­щий шаг – на­строй­ка ба­зы дан­ных. Восполь­зу­ем­ся MySQL, так как это са­мая по­пу­ляр­ная из сво­бод­ных СУБД, и для на­ше­го при­ло­жения соз­да­дим сле­дую­щую ба­зу дан­ных:

    Конеч­но, это все­го лишь таб­ли­ца, но для хранения ин­фор­ма­ции и ра­бо­ты при­ло­жения ее доста­точ­но.

    Об­ра­ти­те внимание, что для иден­ти­фи­ка­то­ра ка­ж­дой запи­си ис­поль­зу­ет­ся по­ле ти­па CHAR(36). CakePHP за­ме­ча­ет это, и при до­бав­лении но­вых запи­сей ав­то­ма­ти­че­ски генери­ру­ет им уникаль­ный универ­саль­ный иден­ти­фи­ка­тор UUID вме­сто чи­сло­во­го зна­чения. Это по­лез­ная при­выч­ка, поскольку она уп­роща­ет дальней­шее слияние дан­ных из раз­лич­ных баз. Та­ков один из под­хо­дов CakePHP, осно­ван­ный на со­гла­шениях и от­ра­жаю­щий прин­цип раз­ра­бот­ки при­ло­жений в CakePHP: «Со­гла­шения важнее кон­фи­гу­ра­ции».

    Еще один при­мер дан­но­го под­хо­да за­ме­тен в по­лях created и modified. Не нуж­но пи­сать ника­ко­го ко­да, что­бы по­ле created за­пол­ня­лось те­ку­щи­ми да­той и вре­менем при соз­дании запи­си. Для за­полнения вто­ро­го по­ля де­лать то­же ниче­го не нуж­но. CakePHP возь­мет все в свои ру­ки и по­за­бо­тит­ся об этом сам, зна­чи­тель­но уско­рив раз­ра­бот­ку при­ло­жения и уп­ро­стив его.

    Так как для на­званий филь­мов мы вы­бра­ли по­ле title, что со­от­вет­ству­ет од­но­му из из­вест­ных CakePHP «умол­ча­тель­ных» за­го­лов­ков ко­ло­нок, мы уви­дим еще немно­го вол­шеб­ства – CakePHP ав­то­ма­ти­че­ски возьмет на­звания всех запи­сей (при со­став­лении спи­сков и да­лее в та­ком ду­хе) имен­но из это­го столб­ца.

    Пе­ред пе­ре­хо­дом к сле­дую­ще­му ша­гу соз­дай­те таб­ли­цу.

    Уста­нов­ка со­единения с БД

    На­строй­ка ба­зы дан­ных в CakePHP про­ста. Есть файл /app/config/database.php.default – это при­мер фай­ла кон­фи­гу­ра­ции БД. Про­ще все­го ско­пи­ро­вать этот файл в /app/config/database.php. В соз­дан­ной ко­пии из­мените па­ра­мет­ры досту­па к ба­зе дан­ных. Для на­ше­го при­ло­жения нуж­но на­стро­ить толь­ко со­единение $default. Это долж­но вы­гля­деть при­мер­но так:

    CakePHP вклю­ча­ет фай­лы .htaccess для ра­бо­ты с мо­ду­ля­ми mod_rewrite на сер­ве­рах Apache с эф­фек­тив­ной пе­ре­за­пи­сью URL-ад­ре­сов. Эти бо­лее удоб­ные ад­ре­са не обя­за­тель­ны, но с ни­ми пу­ти про­ще за­по­ми­на­ют­ся: http://mysite.com/movies/add луч­ше, чем http://mysite.com?url=movies/add. Ус­та­но­ви­те mod_rewrite для Apache, ес­ли вы это­го еще не сде­ла­ли, и на­строй­те его на при­ме­не­ние дру­же­люб­ных URL-ад­ре­сов.

    Те­перь мож­но ­гру­зить страницу при­вет­ствия CakePHP, от­крыв в брау­зе­ре ад­рес, по ко­то­ро­му рас­по­ло­жен сер­вер. Вы уви­ди­те зе­ле­ные ин­ди­ка­то­ры, оз­на­чаю­щие успеш­ную уста­нов­ку CakePHP. Ес­ли в на­строй­ках что-то не так, ин­ди­ка­то­ры бу­дут жел­ты­ми, и поя­вит­ся под­роб­ное со­об­щение об ошиб­ке, ко­то­рое по­мо­жет ре­шить про­бле­му. Для на­ше­го при­ло­жения мож­но иг­но­ри­ро­вать все со­об­щения о за­тра­воч­ном зна­чении [Security Salt] или пре­ду­пре­ж­дения о клю­че шиф­ро­вания [Cipher Key] – ему это­го не на­до.

    Возь­мем­ся за код все­рь­ез, соз­дав класс MoviesController в /app/controllers/movies_controller.php.

    Для об­ра­бот­ки со­об­ще­ний об ошиб­ках мы вклю­чи­ли ком­по­нент Session.

    Од­но за дру­гим соз­да­дим дей­ствия, предоставляемые поль­зо­ва­те­лям, про­смат­ри­ваю­щим ба­зу дан­ных филь­мов. Дей­ствия – это пуб­лич­но до­ступ­ные функ­ции кон­трол­ле­ра. Для всех опе­ра­ций, вы­пол­няе­мыхнад филь­мом в ба­зе дан­ных, соз­да­дим в кон­трол­ле­ре дей­ствия типа CRUD. CRUD – это со­кра­щение от Create, Read, Update и Delete [Соз­дать, Про­чи­тать, Об­но­вить и Уда­лить]. На­ши дей­ствия по­лу­чат на­звания index, add, edit, view и delete.

    Начнем с дей­ствия index – вы­во­д спи­ска всех филь­мов в ба­зе дан­ных. В кон­тро­ле­ре есть объ­ект сущ­но­сти Movie; он пред­став­ля­ет со­бой мо­дель. Он ав­то­ма­ти­че­ски вклю­ча­ет­ся CakePHP и со­от­вет­ству­ет имени кон­трол­ле­ра. Мо­жер вы­звать find() в этой мо­де­ли, и CakePHP пре­об­ра­зу­ет эти вы­зо­вы в за­про­се к ба­зе дан­ных – нам не при­дет­ся пи­сать SQL-за­прос вруч­ную. По­тря­саю­ще! Ниже мы вы­зы­ва­ем ме­тод find() с ар­гу­мен­том all и запи­сы­ва­ем ре­зуль­тат в пред­став­ление для по­сле­дую­ще­го ото­бра­жения.

    Вот и все, что нуж­но для дей­ствия index. Понимаю, что вы­гля­дит это бе­зы­скусным, но в том-то и пре­лесть CakePHP – неза­чем все услож­нять.

    Соз­да­ем пер­вое пред­став­ление

    Дей­ствие го­то­во – соз­дадим пред­став­ление, что­бы мож­но бы­ло про­смат­ри­вать дан­ные и ра­бо­тать с ними. Пред­став­ления в CakePHP – про­стые PHP-фай­лы с рас­ши­рением ctp. Они напи­са­ны на обыч­ном PHP.

    Соз­дай­те свое пер­вое пред­став­ление в фай­ле /app/views/mov­ies/index.ctp. Сна­ча­ла соз­дайте ка­та­лог movies в /app/views. До­бавь­те ту­да код из фраг­мен­та 1 на LXFDVD:

    Это бу­дет зна­ко­мо всем, кто стал­ки­вал­ся с HTML и PHP. От­ли­чие в том, как вспо­мо­га­тель­ные клас­сы пред­став­ления ис­поль­зу­ют­ся для вы­во­да ин­фор­ма­ции вро­де ссылок. Вспо­мо­га­тель­ный класс HtmlHelper по­зво­ля­ет пе­ре­да­вать мас­си­вы дан­ных в дей­ствия View, Edit и Delete. Они пре­об­ра­зу­ют­ся в ад­ре­са на­по­до­бие http://mysite.com/movies/view/1234 (для ссыл­ки на про­смотр).

    Пред­став­ление ите­ри­ру­ет пе­ре­мен­ную $movies, уста­нов­лен­ную ранее кон­трол­ле­ром MoviesController, и вы­во­дит все запи­си в таб­ли­це (в кон­це кон­цов, это таб­лич­ные дан­ные).

    Ес­ли у вас дру­гой стан­дарт струк­ту­ры ба­зы дан­ных, это не про­бле­ма. CakePHP спра­вит­ся с лю­бым. Сле­до­ва­ние со­гла­ше­ни­ям (http://book.cakephp.org/view/901) сэ­ко­но­мит вам вре­мя, но это не же­ст­кое тре­бо­ва­ние.

    Те­перь от­кроем ад­рес /movies/index на ва­шем сер­ве­ре и про­смот­рим дан­ные, вы­ве­ден­ные но­вым пред­став­лением. Ес­ли на сер­ве­ре толь­ко од­но раз­ра­ба­ты­вае­мое при­ло­жение CakePHP, ад­рес бу­дет та­ким: http://mysite.com/movies/index. Или, ес­ли при­ло­жение на­хо­дит­ся в под­ка­та­ло­ге, об­ра­щай­тесь к нему: http://mysite.com/my_directory/movies/index.

    На дан­ный мо­мент филь­мов в ба­зе нет. Сроч­но соз­да­дим функ­цио­нал для их до­бав­ления: вре­мя-то идет!

    Соз­дание дей­ствия add и про­смотр

    Те­перь рас­ши­рим наш кон­трол­лер, до­ба­вив в него функ­цию add. С ее по­мо­щью но­вые филь­мы бу­дут до­бав­лять­ся в ба­зу дан­ных. Нуж­но про­ве­рить, бы­ли ли вве­де­ны в фор­му ка­кие-то дан­ные, и ес­ли да, про­ве­рить ее на на­ли­чие оши­бок и об­ра­бо­тать. Это ка­жет­ся слож­ным, но CakePHP об­лег­ча­ет ре­шение дан­ной за­да­чи. Со­от­вет­ствую­щий фраг­мент ко­да мож­но уви­деть в Листин­ге 2 на LXFDVD.

    Пред­став­ление для до­бав­ления филь­мов ис­поль­зу­ет вспо­мо­га­тель­ный класс форм CakePHP, по­зво­ляю­щий лег­ко соз­да­вать фор­мы на все слу­чаи жизни. Здесь мы про­сто оп­ре­де­ля­ем, для ка­кой мо­де­ли соз­да­ет­ся фор­ма (в дан­ном слу­чае, мо­дель Movie) и ка­кие по­ля мы пре­доста­вим поль­зо­ва­те­лям.

    Соз­дай­те файл /app/views/movies/add.ctp и по­мести­те ту­да сле­дую­щий код:

    Са­мо соз­дание фор­мы про­ис­хо­дит в пер­вых трех стро­ках фай­ла. Все осталь­ное – HTML-код для рас­по­ло­жения эле­мен­тов на странице и генера­ции ссыл­ки для воз­вра­та к спи­ску филь­мов.

    Те­перь мож­но пе­рей­ти к фор­ме соз­дания филь­мов, от­крыв ад­рес /movies/add или щелк­нув по ссыл­ке «New Movie», ко­то­рую мы до­ба­ви­ли на глав­ную страницу.

    Добавление фильма с действием Add Да, это просто, но вся пре­лесть в малом объеме требуемого кода

    Бле­стя­ще! Но мож­но пой­ти даль­ше и до­ба­вить па­ру филь­мов. В при­ме­ре на сле­дую­щем эк­ран­ном сним­ке мы до­бав­ля­ем ин­фор­ма­цию о филь­ме «Че­ло­век-па­ук 3» в фор­ма­те Blu-ray. По­сле до­бав­ления ин­фор­ма­ции об оче­ред­ном филь­ме вы пе­ре­на­прав­ляе­тесь на глав­ную страницу, где в спи­ске филь­мов по­яв­ля­ет­ся но­вая запись.

    Уда­ля­ем филь­мы

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

    До­бавь­те дей­ст­вие уда­ле­ния в кон­трол­лер Movies:

    Для тех, у ко­го на на­шем уро­ке воз­ник­ли про­бле­мы или про­сто не хва­та­ет тер­пе­ния на­би­рать код с жур­на­ла, был соз­дан ре­по­зи­то­рий, от­ку­да мож­но лег­ко и бы­ст­ро за­гру­зить код это­го при­ме­ра. Най­ти его мож­но на GitHub под мо­ей учет­ной за­пи­сью (http://github.com/predominant/cakephp_linux_format).

    До­пол­ни­тель­ная ин­фор­ма­ция и ру­ко­во­д­ства по CakePHP дос­туп­ны че­рез офи­ци­аль­ную сеть его под­держ­ки. Мы по­пы­та­лись по­до­б­рать са­мые по­лез­ные:

    Ранее мы уже до­ба­ви­ли ссыл­ки на уда­ление филь­мов на страницу ин­дек­са. А те­перь мож­но запросто уда­лять филь­мы, щелк­нув по этим ссыл­кам! Вы мог­ли за­ме­тить, что фраг­мент ко­да, соз­даю­ще­го ссыл­ку на уда­ление, длиннее, чем для дей­ствий про­смот­ра и ре­дак­ти­ро­вания. Это объ­яс­ня­ет­ся тем, что в дей­ствие уда­ления вклю­чен код JavaScript для по­ка­за пре­ду­пре­ж­дения, ко­то­рый спра­ши­ва­ет поль­зо­ва­те­ля, дей­ст­ви­тель­но ли он хо­чет уда­лить эту запись. Этот ме­ханизм по­зво­лит поль­зо­ва­те­лю вер­нуть­ся на­зад, из­бе­жав слу­чай­но­го уда­ления, так как с дей­стви­ем не свя­за­но ни од­но­го пред­став­ления.

    До­бав­ле­ние филь­ма с дей­ст­ви­ем Add. Да, это про­сто, но вся пре­лесть в ма­лом объ­е­ме тре­буе­мо­го ко­да.

    Ре­дак­ти­ру­ем дан­ные

    Да­же луч­шим из луч­ших слу­ча­ет­ся оши­бить­ся, и хо­ро­шо бы иметь дей­ствие для ре­дак­ти­ро­вания дан­ных, что­бы при необ­хо­ди­мо­сти ис­прав­лять ошиб­ки или вно­сить в запи­си изменения. Это дей­ствие очень по­хо­же на дей­ствие до­бав­ления; основ­ное от­ли­чие в том, что ра­бо­та про­из­во­дит­ся с ID су­ще­ствую­щей запи­си. На са­мом де­ле они на­столь­ко по­хо­жи, что опыт­ные раз­ра­бот­чи­ки CakePHP объ­е­ди­ня­ют дей­ствия add и edit в од­но. Для эко­но­мии места код вынесен на LXFDVD в Листинг 3; до­бавь­те его в свой кон­трол­лер.

    Основ­ные раз­ли­чия ме­ж­ду дей­ствия­ми add и edit в том, что дей­ствию ре­дак­ти­ро­вания пе­ре­да­ет­ся иден­ти­фи­ка­тор запи­си и в нем не вы­зы­ва­ет­ся ме­тод create() объ­ек­та Movie, по той при­чине, что при со­хранении в ба­зе долж­ны уце­леть все имею­щие­ся в запи­си поля.

    Пред­став­ление для ре­дак­ти­ро­вания

    По­ка все долж­но вы­гля­деть зна­ко­мым. Пред­став­ление edit, ко­то­рое мы на­ме­ре­ны соз­дать, поч­ти иден­тич­но фор­ме до­бав­ления add. По­вто­рюсь, раз­ра­бот­чи­ки, ка­кое-то вре­мя про­ра­бо­тав­шие с CakePHP, объ­е­ди­ня­ют add и edit в од­но пред­став­ление, что­бы не бы­ло по­вто­ров ко­да. Един­ствен­ное от­ли­чие со­сто­ит в по­яв­лении в фор­ме вход­но­го па­ра­мет­ра id и кноп­ки для от­прав­ки фор­мы.

    Соз­дай­те файл /app/views/movies/edit.ctp и по­мести­те ту­да сле­дую­щий код:

    Со­хра­ним пред­став­ле­ние

    По­ра про­ве­рить, как все ра­бо­та­ет. Как и пре­ж­де, от­крой­те в брау­зе­ре глав­ную страницу и пе­рей­ди­те к странице ре­дак­ти­ро­вания дан­ных для од­но­го из ва­ших филь­мов. На эк­ране поя­вят­ся все по­ля вво­да для запи­си. Об­ра­ти­те внимание, что по­ле id не ото­бра­жа­ет­ся. Это скры­тое по­ле фор­мы, и поль­зо­ва­тель не мо­жет ра­бо­тать с эти­ми дан­ны­ми. На­ше по­следнее дей­ствие и пред­став­ление вы­ве­дут под­роб­ную ин­фор­ма­цию о ка­ж­дом филь­ме, по­ка­зав все дан­ные, не ото­бра­жае­мые на глав­ной странице, та­кие как вре­мя соз­дания и из­менения запи­си.

    Когда вы от­кры­вае­те в брау­зе­ре дей­ствие про­смот­ра, ему пе­ре­да­ет­ся иден­ти­фи­ка­тор в URL-ад­ре­се, что­бы мы зна­ли, ин­фор­ма­цию о ка­ком филь­ме нуж­но по­ка­зать.

    До­бавь­те та­кое дей­ст­вие про­смот­ра в кон­трол­лер Movies:

    Про­смотр под­роб­ной ин­фор­ма­ции о филь­ме.

    Соз­да­ем под­роб­ное пред­став­ле­ние

    На­ше по­следнее пред­став­ление – про­сто таб­ли­ца со всей име­ющейся ин­фор­ма­ци­ей о филь­ме. Соз­дай­те это пред­став­ление в фай­ле /app/views/movies/view.ctp – код при­ве­ден в Листин­ге 4 на LXFDVD.

    По­следние дей­ствие, на ко­то­рое мы со­сла­лись с глав­ной стра­ницы, те­перь ра­бо­та­ет! Щелкните по ссыл­ке «view» ря­дом с одним из филь­мов – вы уви­ди­те ре­зуль­тат ра­бо­ты толь­ко что соз­дан­но­го пред­став­ления. Об­ра­ти­те внимание, что вы­во­дит­ся так­же удоб­ный спи­сок под­хо­дя­щих дей­ствий для те­ку­щей запи­си.

    Ес­ли из­менить запись или соз­дать но­вую, CakePHP об­но­вит по­ля со вре­менем соз­дания и из­менения. Это часть ав­то­ма­ти­че­ско­го функ­цио­на­ла, пре­достав­ляе­мо­го кар­ка­сом. От­ре­дак­ти­руй­те па­ру запи­сей, что­бы по­смот­реть, как ме­ня­ют­ся их по­ля.

    Цукерберг рекомендует:  Web - С чего начать обучение в вашей школе
    Понравилась статья? Поделиться с друзьями:
    Все языки программирования для начинающих