Журнал LinuxFormat - перейти на главную

LXF141:CackePHP3

Материал из Linuxformat
Перейти к: навигация, поиск
Учебник CakePHP

Содержание

CakePHP: Сайт для за­кла­док

Часть III Cерию уро­ков по CakePHP Грэм Уэл­дон за­кан­чи­ва­ет чу­точ­кой ма­гии Web 2.0, соз­да­вая сер­вис за­кла­док.

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

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

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

Как всегда, по­тра­тим немно­го вре­мени на то, что­бы убе­дить­ся, что на­ша ба­за дан­ных со­от­вет­ст­ву­ет со­гла­шениям и стан­дар­там CakePHP, что­бы кар­кас сде­лал за нас всю труд­ную ра­бо­ту. Впро­чем, ес­ли вы за­хо­ти­те от­клонить­ся от пред­ло­жен­ных здесь стан­дар­тов или струк­ту­ры, это очень про­сто. Оз­на­комь­тесь со спи­ском со­гла­шений на странице http://book.cakephp.org/view/901/CakePHP-Conventions – там же мож­но по­лу­чить всю ин­фор­ма­цию о том, как уй­ти в сво­бод­ное пла­вание соб­ст­вен­ным пу­тем.

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


 CREATE DATABASE `bookmark`;
 USE `bookmark`;
 CREATE TABLE `urls` (
 ` id` CHAR(36) NOT NULL PRIMARY KEY,
 `user_id` CHAR(36) NOT NULL,
 `name` VARCHAR(128) NOT NULL,
 `url` TEXT,
 `created` DATETIME,
 `modified` DATETIME
 );
 CREATE TABLE `users` (
 `id` CHAR(36) NOT NULL PRIMARY KEY,
 `username` VARCHAR(45) NOT NULL,
 `password` VARCHAR(255) NOT NULL,
 `email` VARCHAR(255) NOT NULL,
 `created` DATETIME,
 `modified` DATETIME
 );

Ми­ну­точ­ку… но ведь это, конеч­но, не все таб­ли­цы, ко­то­рые нам нуж­ны? Спи­сок па­ра­мет­ров, ко­то­рые мы хо­те­ли хранить для ка­ж­дой вклад­ки, был до­воль­но длин­ным. И непо­хо­же, что в этой таб­ли­це хва­та­ет по­лей на все дан­ные – ес­ли не счи­тать то­го мо­мен­та, что ка­ж­дый мо­дуль рас­ши­рения мо­жет хранить необ­хо­ди­мую ин­фор­ма­цию из ба­зы дан­ных са­мо­стоя­тель­но, что­бы га­ран­ти­ро­вать, что в па­ке­те мо­ду­ля со­дер­жит­ся весь пре­достав­ляе­мый им функ­цио­нал, вклю­чая тре­бо­вания ба­зы по хранению дан­ных.

Ну и как это ра­бо­та­ет? Для это­го необ­хо­ди­мо восполь­зо­вать­ся ли­бо обо­лоч­кой “Schema”, по­став­ляе­мой с CakePHP, ли­бо мо­ду­лем рас­ши­рения “Migrations”, раз­ра­бо­тан­ным Cake Develop­ment Corporation. Мы восполь­зу­ем­ся мо­ду­лем ми­гра­ции, так как он пре­достав­ля­ет го­раз­до боль­шие воз­мож­но­сти, оста­ва­ясь про­стым в ис­поль­зо­вании.

За­па­лим ду­хов­ку — вре­мя печь!

Bake – кон­соль­ная ко­ман­да CakePHP, с по­мо­щью ко­то­рой мож­но генери­ро­вать код, вы­пол­нять ми­гра­ции, за­пускать тес­ты и мно­гое дру­гое. По­вто­рим­ся, что для удоб­ст­ва ра­бо­ты с ней из кон­со­ли, путь cake/console внут­ри па­ке­та CakePHP нуж­но вклю­чить в пе­ре­мен­ную ок­ру­же­ния PATH. Сде­лать это мож­но сле­дую­щей ко­ман­дой:

$ export PATH=”$PATH:/path/to/cakephp/cake/console”

Един­ст­вен­ное остав­шее­ся тре­бо­вание – PHP дол­жен быть досту­пен в команд­ной стро­ке. Во мно­гих ди­ст­ри­бу­ти­вах есть па­кет php-cli или по­доб­ный ему, в ко­то­ром есть ис­пол­няе­мый файл PHP для команд­ной стро­ки.

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

$ cake bake project bookmark
$ cd bookmark

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

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


 <?php
 class DATABASE_CONFIG {
 var $default = array(
 ‘driver’ =>mysql,
 ‘persistent’ => false,
 ‘host’ => ‘localhost’,
 ‘login’ => ‘dev’,
 ‘password’ => ‘dev’,
 ‘database’ => ‘bookmark’,
 ‘prefix’ => ‘’,
 );
 }

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

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

$ cake bake all user
$ cake bake all url

Пусть вас не пу­га­ет объ­ем вы­во­да ко­ман­ды bake; чем боль­ше дан­ных она вы­во­дит, тем боль­ше мы сэ­ко­но­мим на на­пи­сании ко­да. Взгля­нув на ее вы­вод, вы уви­ди­те все пу­ти и име­на фай­лов, ко­то­рые бы­ли соз­да­ны для нас. Те­перь у вас есть поль­зо­ва­тель и сис­те­ма управ­ления ссыл­ка­ми, и вы мо­же­те за­хо­дить на сайт, что­бы до­бав­лять и из­ме­нять ка­кую-ли­бо ин­фор­ма­цию. По­про­буй­те от­крыть ссыл­ку /users. Я вы­пекал ка­та­лог в корне сво­его web-сер­ве­ра, и мой ад­рес бу­дет та­ким: http://localhost/bookmark/users. От­кро­ет­ся страница со спи­ском поль­зо­ва­те­лей, где вы смо­же­те най­ти ссыл­ки для до­бав­ления поль­зо­ва­те­лей и из­менения ин­фор­ма­ции о них.

До­ба­вим ау­тен­ти­фи­ка­цию

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

От­крой­те файл app_controller.php в корне про­ек­та. Это пустой кон­трол­лер, от ко­то­ро­го на­сле­ду­ют свой функ­цио­нал все осталь­ные кон­трол­ле­ры при­ло­жения. Все сде­лан­ное здесь бу­дет доступ­но во всех кон­трол­ле­рах, так что это пре­крас­ное ме­сто для ау­тен­ти­фи­ка­ции, ко­то­рая за­ста­вит поль­зо­ва­те­лей вхо­дить на сайт и по­ме­ша­ет незва­ным гостям из­ме­нять дан­ные. До­бавь­те ком­понен­ты “Auth” и “Session”. Те­перь ваш кон­трол­лер AppController дол­жен вы­гля­деть так:


 <?php
 class AppController extends Controller {
 var $components = array(‘Auth’, ‘Session’);
 function beforeFilter() {
 $this->set(‘authUser’, $this->Auth->user());
 return parent::beforeFilter();
 }
 }

Как ви­ди­те, мы из­менили вы­зов set в функ­ции beforeFilter. Это га­ран­ти­ру­ет нам доступ к ин­фор­ма­ции о те­ку­щем поль­зо­ва­те­ле во всех пред­став­лениях сай­та. Ес­ли те­ку­ще­го поль­зо­ва­те­ля нет, this уста­новится в null.

За­тем от­крой­те /controllers/users_controller.php и до­бавь­те дей­ст­вие login. Оно мо­жет быть пустым: о его со­дер­жании по­за­бо­тит­ся CakePHP. По­ка мы тут, до­бавь­те и дей­ст­вие logout, что­бы поль­зо­ва­те­ли мог­ли вы­хо­дить из сис­те­мы:

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

На­ко­нец, в кон­трол­ле­ре нуж­но га­ран­ти­ро­вать, что для соз­да­ния поль­зо­ва­те­ля не при­дет­ся вхо­дить в сис­те­му, ина­че сис­те­ма за­бло­ки­ру­ет­ся, так как в ней не бу­дет ни од­но­го поль­зо­ва­те­ля, и соз­дать но­во­го поль­зо­ва­те­ля то­же бу­дет нель­зя! До­бавь­те сле­дую­щий ме­тод в кон­трол­лер users:

 function beforeFilter() {
 $this->Auth->allow(‘add’);
 return parent::beforeFilter();
 }

По­след­ний фраг­мент этой мо­заи­ки – файл пред­став­ле­ния view, ко­то­рый не был соз­дан CakePHP ути­ли­той bake. Он при­мет имя поль­зо­ва­те­ля и па­роль и по­зво­лит поль­зо­ва­те­лям вой­ти в сис­те­му. Соз­дай­те пред­став­ле­ние login в но­вом фай­ле: /views/users/login.ctp:


 <div class=”users form”>
 <?php echo $this->Form->create(‘User’, array(‘url’ =>
 array(‘action’ => ‘login’)));?>
 <fieldset>
 <legend><?php __(‘Login’); ?></legend>
 <?php
 echo $this->Form->input(‘username’);
 echo $this->Form->input(‘password’);
 ?>
 </fieldset>
 <?php echo $this->Form->end(__(‘Login’, true));?>
 </div>

Сно­ва от­крой­те спи­сок поль­зо­ва­те­лей users (http://localhost/bookmark/users), и вы неза­мед­ли­тель­но бу­де­те пе­ре­на­прав­ле­ны на фор­му ав­то­ри­за­ции. Те­перь по­про­буй­те зай­ти на страницу до­бав­ления поль­зо­ва­те­ля (http://localhost/bookmark/users/add), и вы уви­ди­те, что ее мож­но про­смат­ри­вать без вво­да ло­ги­на и па­ро­ля. Пре­крас­но! Про­ще не бы­ва­ет!

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

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

Как схит­рить

Итак, да­вай­те оты­щем необ­хо­ди­мые мо­ду­ли, за­гру­зим их и на­стро­им ка­та­ло­ги в /app/plugins. Для за­груз­ки мо­ду­лей восполь­зу­ем­ся Git. Воз­мож­но, он у вас уже уста­нов­лен. С по­мо­щью Git мо­ду­ли за­гру­жа­ют­ся бы­ст­рее, и ра­бо­тать с ними удобнее. Вдо­ба­вок это пре­крас­ная воз­мож­ность нау­чить­ся ра­бо­тать с Git как со сред­ст­вом управ­ле­ния вер­сия­ми, ес­ли он вам еще не зна­ком.

Вы­пол­ни­те сле­дую­щие ко­ман­ды Git в кон­со­ли:

git clone https://github.com/CakeDC/migrations.git plugins/migrations
git clone https://github.com/CakeDC/ratings.git plugins/ratings
git clone https://github.com/CakeDC/search.git plugins/search
git clone https://github.com/predominant/cake_social.git plugins/cake_social
git clone https://github.com/predominant/goodies.git plugins/goodies

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


При­ме­ня­ем мо­ду­ли

Ес­ли у вас цен­тра­ли­зо­ван­ный ва­ри­ант ус­та­нов­ки CakePHP, и ин­фор­ма­ция о ней есть в ди­рек­ти­ве include_path в фай­ле php.ini (для бо­лее под­роб­ной ин­фор­ма­ции по раз­вер­ты­ва­нию, ва­ри­ан­там ус­та­нов­ки и луч­шим под­хо­дам см. http://book.cakephp.org/view/1645/Deployment), мо­же­те до­ба­вить свои мо­ду­ли в ка­та­лог /cake/plugins, и ка­ж­дый из мо­ду­лей тут же ста­нет дос­туп­ным лю­бо­му при­ло­же­нию CakePHP, ис­поль­зую­ще­му эту ус­та­нов­ку. Это луч­ший спо­соб га­ран­ти­ро­вать све­жесть мо­ду­лей и из­бе­жать их мно­же­ст­вен­ных ко­пий, и са­мим не ко­пи­ро­вать фай­лы по­всю­ду.

Вы­полнение ми­гра­ций

Ранее я го­во­рил, что нам не хва­та­ет таб­лиц в ба­зе дан­ных, и мы по­за­бо­тим­ся об этом с по­мо­щью ми­гра­ции ба­зы дан­ных. Это вре­мя при­шло, и сей­час вы уви­ди­те, как про­сто соз­дать таб­ли­цу ба­зы дан­ных для мо­ду­лей и по­втор­но­го ис­поль­зо­вания ко­да в про­ек­тах. Не всем мо­ду­лям нуж­на ми­гра­ция, и не все ее пре­ду­смат­ри­ва­ют. У тех, у ко­го она есть, в ка­та­ло­ге config есть под­ка­та­лог migrations. На­при­мер, вы мо­же­те най­ти ка­та­лог /plugins/ratings/config/migrations. Вы мо­же­те прой­тись по мо­ду­лям и по­смот­реть, ка­ким из них нуж­на ми­гра­ция, или про­сто за­пустить ее для всех: тогда для мо­ду­лей, ко­то­рым она не нуж­на, поя­вит­ся со­об­щение об ошиб­ке – тут мы их и на­кро­ем.

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

$ cake migration -plugin ratings all

Те­перь у вас долж­ны быть все не­об­хо­ди­мые таб­ли­цы! Для на­ча­ла обес­пе­чим спо­соб вы­став­ле­ния рей­тин­га. Рей­тинг дол­жен быть толь­ко у URL-ад­ре­сов. До­ба­вить ком­по­нент очень про­сто. От­крой­те UrlsController в фай­ле /controllers/urls_controller.php и до­бавь­те ком­по­нент Ratings. В ре­зуль­та­те по­лу­чит­ся код

 class UrlsController extends AppController {
 var $components = array(‘Ratings.Ratings’);
 // ... existing code ...
 }

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

Сле­дую­щий фраг­мент ко­да до­воль­но ве­лик, по­это­му мы по­мес­ти­ли его в файл http://www.linuxformat.com/files/cakephp_04.txt, но до­воль­но и прост, ес­ли его ра­зо­брать. Он со­сто­ит из двух час­тей: пер­вая вы­во­дит фор­му, ес­ли вы еще не оценили за­клад­ку, вто­рая – по­ка­зы­ва­ет наш рей­тинг. Обе час­ти ис­поль­зу­ют класс Set, что уп­ро­ща­ет ра­бо­ту с боль­ши­ми спи­ска­ми дан­ных и по­зво­ля­ет вы­пол­нять фильт­ра­цию. До­бавь­те этот код сра­зу по­сле тэ­га <dl> в на­ча­ле пред­став­ления ва­ших ад­ре­сов в фай­ле /views/urls/view.ctp.

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

Ис­поль­зу­ем ава­та­ры gravatar

Страница про­смот­ра ад­ре­са смот­рит­ся до­воль­но пре­сно. Да, пре­сно! Нуж­но как минимум до­ба­вить немно­го гра­фи­ки и эле­мен­тов управ­ления, что­бы по­се­ти­те­ли бы­ст­рее воспринима­ли ин­фор­ма­цию. Ос­та­вим слож­но­сти CSS и сти­ли­за­ции страницы до со­вер­шен­ст­ва web-ди­зайнерам, но уп­ро­стим их за­да­чу с по­мо­щью гра­ва­та­ров, по­ка­зав икон­ки поль­зо­ва­те­ля из ин­фор­ма­ции о поль­зо­ва­те­ле для ка­ж­до­го ад­ре­са. Гра­ва­тар – гло­баль­ный ава­тар, ко­то­рый бес­плат­но пре­достав­ля­ет­ся сер­ви­сом http://gravatar.com. Ког­да мы клониро­ва­ли все пла­ги­ны, то под­клю­чи­ли и пла­гин Goodies, и вспо­мо­га­тель­ный класс gravatar – толь­ко од­на из его уди­ви­тель­ных воз­мож­но­стей.

Но хва­тит хва­леб­ных ре­чей – да­вай­те по­ка­жем эти ава­та­ры. Ес­ли вы еще это­го не сде­ла­ли, зай­ди­те на сайт gravatar, за­ре­ги­ст­ри­руй­те бес­плат­ную учет­ную запись и вы­бе­ри­те свой ава­тар (grava­tar). За­тем от­крой­те пред­став­ление для ад­ре­сов (/views/urls/view.ctp). Про­кру­ти­те немно­го вниз, ту­да, где вы­во­дит­ся ин­фор­ма­ция о поль­зо­ва­те­ле. Мы за­ме­ним стро­ку

 <?php echo $this->Html->link($url[‘User’][‘id’], array(‘controller’
 => ‘users’, ‘action’ => ‘view’, $url[‘User’] [‘id’])); ?>

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

 <?php echo $this->Html->link(
 $this->Gravatar->image($url[‘User’][‘email’]),
 array(‘controller’ => ‘users’, ‘action’ => ‘view’,
 $url[‘User’][‘id’]),
 array(‘escape’ => false)); ?>
 <?php echo $url[‘User’][‘username’]; ?>

На­ко­нец, под­клю­чи­те вспо­мо­га­тель­ный класс в кон­трол­ле­ре AppController в фай­ле /app_controller.php:

 class AppController extends Controller {
 var $helpers = array(‘Html’, ‘Form’, ‘Session’,
 ‘Goodies.Gravatar’);
 // ... existing code ...
 }

Те­перь бу­дет ото­бра­жать­ся гра­ва­тар поль­зо­ва­те­ля, по­лу­чен­ный по его e-mail, ука­зан­но­му во вре­мя ре­ги­ст­ра­ции, а вме­сто урод­ли­во­го иден­ти­фи­ка­то­ра UUID бу­дет по­ка­за­но имя поль­зо­ва­те­ля. Идем даль­ше. Об­но­ви­те страницу или про­смот­ри­те ин­фор­ма­цию о дру­гом ад­ре­се, и гра­ва­тар бу­дет ото­бра­жать­ся на мес­те ин­фор­ма­ции о поль­зо­ва­те­ле.

До­бав­ление вид­же­та со­ци­аль­ных се­тей

Да­вай­те еще немно­го ук­ра­сим до­полнитель­ную ин­фор­ма­цию, до­ба­вив воз­мож­ность по­де­лить­ся ссыл­кой в со­ци­аль­ных се­тях, что­бы при­влечь боль­ше по­се­ти­те­лей на сайт и что­бы поль­зо­ва­те­ли мог­ли по­де­лить­ся за­клад­ка­ми, ко­то­рые им в са­мом де­ле нра­вят­ся. Этот функ­цио­нал пре­достав­ля­ет мо­дуль CakeSocial, ко­то­рый мы до­ба­ви­ли в на­ча­ле. В мо­ду­ле есть вспо­мо­га­тель­ный класс для сер­ви­са “ShareThis”, ко­то­рый очень силь­но уп­ро­ща­ет об­мен кон­тен­том в со­ци­аль­ных се­тях. Про­стой мо­дуль для про­сто­го сер­ви­са дол­жен быть вдвойне про­стым, пра­виль­но? Су­ди­те са­ми. До­бавь­те вспо­мо­га­тель­ный класс в кон­трол­лер AppController в фай­ле /app_controller.php:

 class AppController extends Controller {
 var $helpers = array(‘Html’, ‘Form’, ‘Session’,
 ‘Goodies.Gravatar’, ‘CakeSocial.ShareThis’);
 // ... existing code ...
 }

И сра­зу пе­ред за­кры­ваю­щим тэ­гом </dl> в пред­став­ле­нии для ад­ре­сов /views/urls/view.ctp вставь­те сле­дую­щий код:

 <dt<?php if ($i % 2 == 0) echo $class;?>><?php __(‘Share’); ?></dt>
 <dd<?php if ($i++ % 2 == 0) echo $class;?>>
 <?php echo $this->ShareThis->display(); ?>
 &nbsp;
 </dd>

Ух ты! В этом пред­став­лении пять строк, но толь­ко од­на вы­во­дит ссыл­ки на со­ци­аль­ные се­ти. Ос­таль­ное – мет­ка и сти­ли для оберт­ки вы­во­да. Об­но­ви­те страницу и уви­ди­те, что ссыл­ки на со­ци­аль­ные се­ти ShareThis поя­ви­лись, и мож­но по­де­лить­ся ссыл­кой в спи­ске сер­ви­сов по умол­чанию. А на http://www.linuxformat.com/files/cakephp_04.txt вы уз­нае­те, как до­ба­вить миниа­тю­ры.

Что даль­ше? При­ло­жение, ко­то­рое у нас по­лу­чи­лось, по­ка­зы­ва­ет, как бы­ст­ро мож­но соз­да­вать при­ло­жения с CakePHP, и ил­лю­ст­ри­ру­ет ка­че­­ст­во сво­бод­ных мо­ду­лей, соз­дан­ных со­об­ще­ст­вом. У при­ло­жения есть боль­шой по­тен­ци­ал для рас­ши­рения – пре­достав­ление до­полнитель­ной ин­фор­ма­ции, на­при­мер, ча­ст­ных URL-ад­ре­сов, ин­те­гра­ция в сер­вис REST, Ajax-скри­плет для ра­бо­ты с за­клад­ка­ми, ко­то­рый мож­но встро­ить в брау­зер, неболь­шое при­ук­ра­ши­ва­ние и уда­ле­ние не­ко­то­рых дан­ных и стра­ниц, ус­та­нов­лен­ных по умол­ча­нию. Воз­мож­но­сти без­гра­нич­ны!

Повторно об исходниках

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

О лю­бых во­про­сах или пред­ло­же­ни­ях по этой ста­тье дай­те мне знать че­рез мой сайт http://grahamweldon.com или по элек­трон­ной поч­те [mailot:graham@grahamweldon.com graham@grahamweldon.com].

Персональные инструменты
купить
подписаться
Яндекс.Метрика