CakePHP - Manual11/BlogTutorial /wiki/Manual11/BlogTutorial History/revisions of CakePHP/Manual11/BlogTutorial en-us 2008-01-17 15:14:04 /wiki/Manual11/BlogTutorial/show?time=2008-01-17+15%3A14%3A04 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a name=".manual11.blogtutorial" href="/wiki/Manual11/BlogTutorial" class="">/Manual&nbsp;11&nbsp;/&nbsp;Blog&nbsp;Tutorial</a> за <a href="/wiki/Manual11/BlogTutorial?time=2008-01-17+15%3A14%3A04">2008-01-17 15:14:04</a> и <a href="/wiki/Manual11/BlogTutorial">2008-02-13 09:16:52</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Это&nbsp;сделает ваши ссылки похожими на&nbsp;<tt>www.example.com/index.php/controllername/actionname/param</tt> или&nbsp;<tt>www.example.com/controllername/actionname/param</tt>.</div><br /> <b>Удалено:</b><br /> <div class="deletions">Это&nbsp;сделает ваши ссылки похожимы на&nbsp;эти www.example.com/index.php/controllername/actionname/param rather than www.example.com/controllername/actionname/param.</div></div> 2007-10-23 23:05:36 /wiki/Manual11/BlogTutorial/show?time=2007-10-23+23%3A05%3A36 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a href="/wiki/Manual11/BlogTutorial" class="">/Manual&nbsp;11&nbsp;/&nbsp;Blog&nbsp;Tutorial</a> за <a href="/wiki/Manual11/BlogTutorial?time=2007-10-23+23%3A05%3A36">2007-10-23 23:05:36</a> и <a href="/wiki/Manual11/BlogTutorial?time=2008-01-17+15%3A14%3A04">2008-01-17 15:14:04</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Выбор имен таблицы и&nbsp;колонок не&nbsp;случаен. Если вы&nbsp;следуете соглашению о&nbsp;присвоении имен баз&nbsp;данных Cake, и&nbsp;соглашению о&nbsp;присвоении имен классов Cake (оба выделены в&nbsp;дополнении &laquo;Соглашение Cake&raquo;), вы&nbsp;сможете получить выгоду из&nbsp;множества бесплатной функциональности и&nbsp;избежать настройки. Cake достаточно гибкий, чтобы совладать с&nbsp;самой страшной схемой базы данных, но&nbsp;твердое поддерживание соглашения сохранит ваше время.<br /> Если вы&nbsp;не хотите или&nbsp;не&nbsp;можете заставить mod_rewrite (или подобный модуль) работать на&nbsp;вашем сервере, вам&nbsp;нужно использовать встроенные красивые ссылки Cake. В&nbsp;/app/config/core.php разкоментируйте линию, которая выглядит так:<br /> Класс модели это&nbsp;хлеб и&nbsp;масло приложений <span class="missingpage">Cake&nbsp;PHP</span><a href="/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?</a>. Создавая модель Cake, которая будет взаимодействовать с&nbsp;нашей базой данных, мы&nbsp;получим потребность в&nbsp;создании операций &laquo;показать&raquo;, &laquo;добавить&raquo;, &laquo;редактировать&raquo;, и&nbsp;&laquo;удалить&raquo;.<br /> Теперь когда у&nbsp;нас есть наша база данных соединена использованием нашей модели, а&nbsp;наш код&nbsp;приложения определен нашим контроллером, давайте создадим отображение для&nbsp;действия index, которое мы&nbsp;определили выше.<br /> Возможно вы&nbsp;заметили использование объекта названного $html. Это&nbsp;отдельный пример из&nbsp;класса <span class="missingpage">Html&nbsp;Helper</span><a href="/wiki/HtmlHelper/edit?add=1" title="Создать эту страницу">?</a>. Хелперы помогают делать ссылки, формы, <span class="missingpage">Java&nbsp;Script</span><a href="/wiki/JavaScript/edit?add=1" title="Создать эту страницу">?</a> и&nbsp;Ajax. Подробнее о&nbsp;хелперах в... вы&nbsp;угадали, в&nbsp;главе Хелперы, но&nbsp;что важно заметить здесь это&nbsp;то, что&nbsp;метод link() сгенерирует ссылки HTML с&nbsp;данным заголовком (первый параметр) и&nbsp;данным адресом (второй параметр).</div><br /> <b>Удалено:</b><br /> <div class="deletions">Выбор имен таблицы и&nbsp;колоноки не&nbsp;случаен. Если вы&nbsp;следуете соглашению о&nbsp;присвоении имен баз&nbsp;данных Cake, и&nbsp;соглашению о&nbsp;присвоении имен классов Cake (оба выделены в&nbsp;дополнении &laquo;Соглашение Cake&raquo;), вы&nbsp;сможете получить выгоду из&nbsp;множества бесплатной функциональности и&nbsp;избежать настройки. Cake гибкий достаточно, чтобы совладать с&nbsp;самой страшной схемой базы данных, но&nbsp;твердое поддерживание соглашения сохранит ваше время.<br /> Если вы&nbsp;не хотите или&nbsp;не&nbsp;можете заставить mod_rewrite (или подобный модуль) работать на&nbsp;вашем сервере, вам&nbsp;нужно использовать встроенный красивые ссылки Cake. В&nbsp;/app/config/core.php разкоментируйте линию, которая выглядит так:<br /> Класс модели это&nbsp;хлеб и&nbsp;масло приложений <span class="missingpage">Cake&nbsp;PHP</span><a href="/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?</a>. Создавая модель Cake, которая будет взаимодействовать с&nbsp;нашей базой данных, мы&nbsp;получим потребность в&nbsp;создании операций показать, добавить, редактировать, и&nbsp;удалить.<br /> Теперь когда у&nbsp;нас есть наша база данных соединенна использованием нашей модели, а&nbsp;наш код&nbsp;приложения определен нашим контроллером, давайте создадим отображение для&nbsp;действия index, которое мы&nbsp;определили выше.<br /> Возможно вы&nbsp;заметили использование объекта названного $html. Это&nbsp;отдельный пример из&nbsp;класса <span class="missingpage">Html&nbsp;Helper</span><a href="/wiki/HtmlHelper/edit?add=1" title="Создать эту страницу">?</a>. Хелперы помогают делать ссылки, формы, <span class="missingpage">Java&nbsp;Script</span><a href="/wiki/JavaScript/edit?add=1" title="Создать эту страницу">?</a> и&nbsp;Ajax. Подробнее о&nbsp;хелпрах в... вы&nbsp;угадали главе Хелперы, но&nbsp;что важно заметить здесь это&nbsp;то, что&nbsp;метод link() сгенерирует ссылки HTML с&nbsp;данным заголовком (первый параметр) и&nbsp;данным адресом (второй параметр).</div></div> 2007-10-23 22:49:24 /wiki/Manual11/BlogTutorial/show?time=2007-10-23+22%3A49%3A24 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a href="/wiki/Manual11/BlogTutorial" class="">/Manual&nbsp;11&nbsp;/&nbsp;Blog&nbsp;Tutorial</a> за <a href="/wiki/Manual11/BlogTutorial?time=2007-10-23+22%3A49%3A24">2007-10-23 22:49:24</a> и <a href="/wiki/Manual11/BlogTutorial?time=2007-10-23+23%3A05%3A36">2007-10-23 23:05:36</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions"><a name="h44-1"></a><h1>Обучение: Блог Cake</h1><a name="h44-2"></a><h2>Введение</h2> Добро пожаловать в&nbsp;Cake! Возможно вы&nbsp;просматриваете это&nbsp;обучение, потому что&nbsp;хотите узнать больше о&nbsp;том как&nbsp;работает Cake. Это&nbsp;наша цель, увеличить продуктивность и&nbsp;сделать написание кода более приятным: мы&nbsp;надеемся вы&nbsp;осознаете это, когда углубитесь в&nbsp;код.<br /> Это&nbsp;обучение проведет вас&nbsp;через создание простого приложения блогов. Мы&nbsp;будем доставать и&nbsp;устанавливать Cake, создавая и&nbsp;настраивая базу данных, создавать достаточно кода приложения, чтобы просматривать, добавлять, редактировать и&nbsp;удалять посты в&nbsp;блоге.<br /> Вот, что&nbsp;вам понадобится:<br /> <ol type="1"><li> Работающий веб-сервер. Мы&nbsp;будем предполагать, что&nbsp;вы&nbsp;используете Apache, хотя иструкции также должны подойти и&nbsp;к другим серверам. Возможно нам&nbsp;придется еще&nbsp;немного поковыряться в&nbsp;настройках сервера, но&nbsp;большинство достают Cake и&nbsp;запускают его&nbsp;вообще без&nbsp;каких-либо настроек. </li><li> Сервер базы данных. Мы&nbsp;собираемся использовать mySQL в&nbsp;этом обучении. Вам&nbsp;нужно знать достаточно об&nbsp;SQL чтобы создать базу данных. </li><li> Базовые знания PHP. Чем&nbsp;больше объекто-ориентированого программирования было в&nbsp;вашей жизни, тем&nbsp;лучше: но&nbsp;бойтесь если вы&nbsp;фанат процедурного программирования. </li><li> Наконец, вам&nbsp;нужны базовые знания MVC&nbsp;шаблонного программирования. Быстрый обзор можно найти в&nbsp;главе Основные концепции, Раздел 2: MVC. Не&nbsp;волнуйтесь там&nbsp;половина страницы или&nbsp;около того.</li></ol> Давайте начнем!<a name="h44-3"></a><h2>Достаем Cake</h2> Сначала давайте достанем копию свеженького кода Cake. Самый последний релиз на&nbsp;момент этой документации это&nbsp;<span class="missingpage">Cake&nbsp;PHP</span><a href="/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?</a> 1.0.1.2708.<br /> Для&nbsp;скачивания посетите проект <span class="missingpage">Cake&nbsp;PHP</span><a href="/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?</a> на&nbsp;Cakeforge: <a href="http://cakeforge.org/projects/cakephp/" target="_blank" title="Внешняя ссылка (откроется в новом окне)" class="outerlink"><img src="/wiki_/themes/cake/icons/web.gif" alt="" border="0" />http://cakeforge.org/projects/cakephp/</a> и&nbsp;закачайте стабильный релиз.<br /> Также можете посмотреть здесь: <a href="https://svn.cakephp.org/repo/trunk/cake/1.x.x.x/" target="_blank" title="Внешняя ссылка (откроется в новом окне)" class="outerlink"><img src="/wiki_/themes/cake/icons/web.gif" alt="" border="0" />https://svn.cakephp.org/repo/trunk/cake/1.x.x.x/</a><br /> Не&nbsp;важно как&nbsp;вы&nbsp;закачали, поместите код&nbsp;в&nbsp;ваш <span class="missingpage">Document&nbsp;Root</span><a href="/wiki/DocumentRoot/edit?add=1" title="Создать эту страницу">?</a>. Директория должна выглядить как-то так:<br /> <!--notypo--><textarea class="code" rows="8" readonly="readonly">/path_to_document_root /app /cake /vendors .htaccess index.php VERSION.txt</textarea><!--/notypo--><br /> Теперь неплохо будет узнать немного о&nbsp;том, как&nbsp;работает структура директории Cake: взгляните на&nbsp;Главу &laquo;Основные концепции&raquo; Раздел 3: Обзор размещения файлов Cake.<a name="h44-4"></a><h2>Создание базы данных блога</h2> Далее, давайте настроем основную базу данных для&nbsp;нашео блога. Сейчас, мы&nbsp;просто создадим простую таблицу для&nbsp;хранения постов. Мы&nbsp;также вкинем туда несколько постов, чтобы ипользовать их&nbsp;в целях тестирования. Выполните следующий запрос SQL&nbsp;в&nbsp;вашей базе данных:<br /> <!--notypo--><div class="code"><code><font color=green><b></b></font>/*&nbsp;Сначала,&nbsp;создайте&nbsp;таблицу&nbsp;постов:&nbsp;*/<br /> <font color=blue>CREATE</font>&nbsp;<font color=blue>TABLE</font>&nbsp;posts&nbsp;(<br /> &nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;<font color=blue>INT</font>&nbsp;UNSIGNED&nbsp;AUTO_INCREMENT&nbsp;<font color=blue>PRIMARY</font>&nbsp;<font color=blue>KEY</font>,<br /> &nbsp;&nbsp;&nbsp;&nbsp;title&nbsp;<font color=blue>VARCHAR</font>(<font color=green><b>50</b></font>),<br /> &nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>body</font>&nbsp;TEXT,<br /> &nbsp;&nbsp;&nbsp;&nbsp;created&nbsp;DATETIME&nbsp;<font color=blue>DEFAULT</font>&nbsp;<font color=blue>NULL</font>,<br /> &nbsp;&nbsp;&nbsp;&nbsp;modified&nbsp;DATETIME&nbsp;<font color=blue>DEFAULT</font>&nbsp;<font color=blue>NULL</font><br /> );<br /> /*&nbsp;Затем&nbsp;вставим&nbsp;пару&nbsp;постов&nbsp;для&nbsp;тестирования:&nbsp;*/<br /> <font color=blue>INSERT</font>&nbsp;<font color=blue>INTO</font>&nbsp;posts&nbsp;(title,<font color=blue>body</font>,created)<br /> &nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>VALUES</font>&nbsp;('The&nbsp;title',&nbsp;'This&nbsp;<font color=blue>is</font>&nbsp;the&nbsp;post&nbsp;<font color=blue>body</font>.',&nbsp;NOW());<br /> <font color=blue>INSERT</font>&nbsp;<font color=blue>INTO</font>&nbsp;posts&nbsp;(title,<font color=blue>body</font>,created)<br /> &nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>VALUES</font>&nbsp;('A&nbsp;title&nbsp;<font color=blue>once</font>&nbsp;again',&nbsp;'And&nbsp;the&nbsp;post&nbsp;<font color=blue>body</font>&nbsp;follows.',&nbsp;NOW());<br /> <font color=blue>INSERT</font>&nbsp;<font color=blue>INTO</font>&nbsp;posts&nbsp;(title,<font color=blue>body</font>,created)<br /> &nbsp;&nbsp;&nbsp;&nbsp;<font color=blue>VALUES</font>&nbsp;('Title&nbsp;strikes&nbsp;back',&nbsp;'This&nbsp;<font color=blue>is</font>&nbsp;really&nbsp;exciting!&nbsp;<font color=blue>Not</font>.',&nbsp;NOW());<font color=green><b></b></font></code></div><!--/notypo--><br /> Выбор имен таблицы и&nbsp;колоноки не&nbsp;случаен. Если вы&nbsp;следуете соглашению о&nbsp;присвоении имен баз&nbsp;данных Cake, и&nbsp;соглашению о&nbsp;присвоении имен классов Cake (оба выделены в&nbsp;дополнении &laquo;Соглашение Cake&raquo;), вы&nbsp;сможете получить выгоду из&nbsp;множества бесплатной функциональности и&nbsp;избежать настройки. Cake гибкий достаточно, чтобы совладать с&nbsp;самой страшной схемой базы данных, но&nbsp;твердое поддерживание соглашения сохранит ваше время.<br /> Посмотрите на&nbsp;Соглашение Cake для&nbsp;справки, но&nbsp;достаточно сказать, что&nbsp;название таблицы 'posts' автоматически привязывает ее&nbsp;к модели Post, а&nbsp;поля названные 'modiefied' и&nbsp;'created' автоматически будут управляться Cake'ом.<a name="h44-5"></a><h2>Настройка базы данных Cake</h2> Давайте сообщим Cake где&nbsp;находится наша база данных и&nbsp;как с&nbsp;ней связаться. Это&nbsp;будет первый и&nbsp;последний этап, где&nbsp;вы&nbsp;что-либо настраиваете.<br /> Копия конфигурации базы данных находится в&nbsp;/app/config/database.php.default. Скопируйте этот файл в&nbsp;ту же&nbsp;директорию, только переименуйте в&nbsp;database.php.<br /> Конфиг-файл должен быть достаточно понятным: просто замените значения в&nbsp;масиве $default теми, что&nbsp;применены к&nbsp;вашей настройке. Образец завершенного массива настроек может выглядить как&nbsp;следующий:<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?<br /></span><span style="color: #007700">var&nbsp;</span><span style="color: #0000BB">$default&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #DD0000">'driver'&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'mysql'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'connect'&nbsp;&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'mysql_pconnect'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'host'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'localhost'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'login'&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'cakeBlog'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'password'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'c4k3-rUl3Z'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'database'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'cake_blog_tutorial'&nbsp;</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">Когда&nbsp;вы&nbsp;сохранили&nbsp;ваш&nbsp;новый&nbsp;файл&nbsp;database</span><span style="color: #007700">.</span><span style="color: #0000BB">php</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">вы&nbsp;можете&nbsp;открыть&nbsp;свой&nbsp;браузер&nbsp;и&nbsp;увидеть&nbsp;приветственную&nbsp;страницу&nbsp;Cake</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">Она&nbsp;также&nbsp;должна&nbsp;сообщить&nbsp;вам</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">что&nbsp;файл&nbsp;соединения&nbsp;с&nbsp;базой&nbsp;данных&nbsp;найден</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">и&nbsp;что&nbsp;Cake&nbsp;может&nbsp;успешно&nbsp;связываться&nbsp;с&nbsp;базой</span><span style="color: #007700">.<br />===</span><span style="color: #0000BB">Заметка&nbsp;о&nbsp;mod_rewrite</span><span style="color: #007700">===<br /></span><span style="color: #0000BB">Если&nbsp;приветсвенная&nbsp;страница&nbsp;Cake&nbsp;выгядит&nbsp;слегка&nbsp;смешно&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">без&nbsp;изображений&nbsp;или&nbsp;стилей&nbsp;css</span><span style="color: #007700">),&nbsp;</span><span style="color: #0000BB">это&nbsp;скорее&nbsp;всего&nbsp;значит</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">что&nbsp;mod_rewrite&nbsp;не&nbsp;работает&nbsp;на&nbsp;вашей&nbsp;системе</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">Вот&nbsp;несколько&nbsp;советов&nbsp;как&nbsp;заставить&nbsp;его&nbsp;работать</span><span style="color: #007700">:<br />&nbsp;&nbsp;</span><span style="color: #0000BB">1.&nbsp;Убедитесь</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">что&nbsp;подмена&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">htaccess&nbsp;разрешена</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">в&nbsp;вашем&nbsp;httpd</span><span style="color: #007700">.</span><span style="color: #0000BB">conf</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">у&nbsp;вас&nbsp;должна&nbsp;быть&nbsp;секция</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">которая&nbsp;определяет&nbsp;секцию&nbsp;для&nbsp;каждой&nbsp;директории&nbsp;на&nbsp;вашем&nbsp;сервере</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">Убедитесь</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">что&nbsp;AllowOverride&nbsp;установлен&nbsp;на&nbsp;All&nbsp;для&nbsp;правильной&nbsp;директории</span><span style="color: #007700">.<br />&nbsp;&nbsp;</span><span style="color: #0000BB">2.&nbsp;Убедитесь</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">что&nbsp;вы&nbsp;редактируете&nbsp;системный&nbsp;httpd</span><span style="color: #007700">.</span><span style="color: #0000BB">conf</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">а&nbsp;не&nbsp;пользовательский&nbsp;или&nbsp;определенного&nbsp;сайта</span><span style="color: #007700">.<br />&nbsp;&nbsp;</span><span style="color: #0000BB">3.&nbsp;По&nbsp;тем&nbsp;или&nbsp;иным&nbsp;причинам</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">у&nbsp;вас&nbsp;может&nbsp;быть&nbsp;копия&nbsp;CakePHP&nbsp;в&nbsp;которой&nbsp;нету&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">htaccess</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">Это&nbsp;иногда&nbsp;случается&nbsp;потому</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">что&nbsp;некоторые&nbsp;операционные&nbsp;системы&nbsp;воспринимают&nbsp;файлы&nbsp;с&nbsp;точкой&nbsp;перед&nbsp;именем</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">как&nbsp;скрытые&nbsp;и&nbsp;не&nbsp;копирует&nbsp;их</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">Убедитесь</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">что&nbsp;ваша&nbsp;копия&nbsp;CakePHP&nbsp;скачана&nbsp;с&nbsp;надежного&nbsp;источника</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">то&nbsp;есть&nbsp;у&nbsp;нас</span><span style="color: #007700">.<br />&nbsp;&nbsp;</span><span style="color: #0000BB">4.&nbsp;Убедитесь</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">что&nbsp;вы&nbsp;правильно&nbsp;загружаете&nbsp;mod_rewrite</span><span style="color: #007700">!&nbsp;</span><span style="color: #0000BB">У&nbsp;вас&nbsp;должно&nbsp;быть&nbsp;что</span><span style="color: #007700">-</span><span style="color: #0000BB">то&nbsp;вроде&nbsp;LoadModule&nbsp;rewrite_module&nbsp;libexec</span><span style="color: #007700">/</span><span style="color: #0000BB">httpd</span><span style="color: #007700">/</span><span style="color: #0000BB">mod_rewrite</span><span style="color: #007700">.</span><span style="color: #0000BB">so&nbsp;и&nbsp;AddModule&nbsp;mod_rewrite</span><span style="color: #007700">.</span><span style="color: #0000BB">c&nbsp;в&nbsp;вашем&nbsp;httpd</span><span style="color: #007700">.</span><span style="color: #0000BB">conf</span><span style="color: #007700">.<br /></span><span style="color: #0000BB">Если&nbsp;вы&nbsp;не&nbsp;хотите&nbsp;или&nbsp;не&nbsp;можете&nbsp;заставить&nbsp;mod_rewrite&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">или&nbsp;подобный&nbsp;модуль</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">работать&nbsp;на&nbsp;вашем&nbsp;сервере</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">вам&nbsp;нужно&nbsp;использовать&nbsp;встроенный&nbsp;красивые&nbsp;ссылки&nbsp;Cake</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">В&nbsp;</span><span style="color: #007700">/</span><span style="color: #0000BB">app</span><span style="color: #007700">/</span><span style="color: #0000BB">config</span><span style="color: #007700">/</span><span style="color: #0000BB">core</span><span style="color: #007700">.</span><span style="color: #0000BB">php&nbsp;разкоментируйте&nbsp;линию</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">которая&nbsp;выглядит&nbsp;так</span><span style="color: #007700">:</span> </span> </code></div><!--/notypo-->(php)&lt;? define ('BASE_URL', env('SCRIPT_NAME')); ?&gt;<!--notypo--><textarea class="code" rows="5" readonly="readonly"></textarea><!--/notypo-->(php)/app/models/post.php<br /> class Post extends <span class="missingpage">App&nbsp;Model</span><a href="/wiki/AppModel/edit?add=1" title="Создать эту страницу">?</a><br /> <div class="indent"><div class="indent">var $name = 'Post';</div></div> В&nbsp;связи со&nbsp;способом, по&nbsp;которому классу и&nbsp;файлу даны имена, это&nbsp;говорит Cake'у, что&nbsp;вы&nbsp;хотите чтобы модель Post была доступна в&nbsp;вашем <span class="missingpage">Post&nbsp;Controller</span><a href="/wiki/PostController/edit?add=1" title="Создать эту страницу">?</a>, который связан с&nbsp;таблицей в&nbsp;вашей базе данных 'posts'.<br /> Переменная $name всегда стоит того, чтобы ее&nbsp;добавили, и&nbsp;используется чтобы совладать с&nbsp;некоторыми именами классов в&nbsp;PHP4.<br /> Больше о&nbsp;моделях, таких как&nbsp;префиксы таблиц, колбеки и&nbsp;верификация, посмотрите главу Модели.<a name="h44-6"></a><h2>Создание контроллера постов</h2> Дальше мы&nbsp;создадим контроллер для&nbsp;наших постов. Контроллер это&nbsp;то, где&nbsp;будет весь код&nbsp;для взаимодействия с&nbsp;постами, и&nbsp;он также находится там&nbsp;где и&nbsp;все действия для&nbsp;этой модели. Вам&nbsp;нужно разместить этот новый контроллер в&nbsp;файл под&nbsp;названием posts_controller.php в&nbsp;вашем каталоге /app/controllers. Вот&nbsp;как должен выглядить основной контроллер:<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> /app/controllers/posts_controller.php<br />class&nbsp;PostsController&nbsp;extends&nbsp;AppController<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;$name&nbsp;=&nbsp;'Posts';<br />Теперь&nbsp;давайте&nbsp;добавим&nbsp;действие&nbsp;в&nbsp;наш&nbsp;контроллер.&nbsp;Когда&nbsp;пользователи&nbsp;запришивают&nbsp;www.example.com/posts,&nbsp;это&nbsp;то&nbsp;же,&nbsp;что&nbsp;и&nbsp;запрос&nbsp;www.example.com/posts/index.&nbsp;С&nbsp;тех&nbsp;пор&nbsp;как&nbsp;мы&nbsp;хотим,&nbsp;чтобы&nbsp;пользователи&nbsp;могли&nbsp;просматривать&nbsp;список&nbsp;постов,&nbsp;когда&nbsp;они&nbsp;приходят&nbsp;по&nbsp;этой&nbsp;ссылке,&nbsp;действие&nbsp;index&nbsp;будет&nbsp;выглядить&nbsp;как&nbsp;это:</span> </code></div><!--/notypo-->(php)/app/controllers/posts_controller.php (действие index добавлено)<br /> class <span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a> extends <span class="missingpage">App&nbsp;Controller</span><a href="/wiki/AppController/edit?add=1" title="Создать эту страницу">?</a><br /> <div class="indent"><div class="indent">var $name = 'Posts';<br /> function index()<br /> <div class="indent"><div class="indent">$this-&gt;set('posts', $this-&gt;Post-&gt;findAll());</div></div></div></div> Позвольте мне&nbsp;немного пояснить действие. После определения функции index() в&nbsp;нашем <span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a>, пользователи могут получить доступ к&nbsp;коду запрашивая www.example.com/posts/index. Также, если бы&nbsp;мы определили функцию foobar(), пользователи могли бы&nbsp;получить доступ по&nbsp;адресу www.example.com/posts/foobar.<br /> Простое указание в&nbsp;действие использует set() для&nbsp;вставки данных в&nbsp;отображение (которое мы&nbsp;создадим следующим). Устанавливается переменная отображения 'posts' еквивалентная возвращаемому значению метода findAll() модели Post. Наша модель Post автоматически доступна в $this-&gt;Post, потому что&nbsp;мы&nbsp;следили соглашению Cake по&nbsp;присвоению имен.<br /> Узнать больше о&nbsp;контроллерах Cake можно в&nbsp;главе Контроллеры.<a name="h44-7"></a><h2>Создание отображений постов</h2> Теперь когда у&nbsp;нас есть наша база данных соединенна использованием нашей модели, а&nbsp;наш код&nbsp;приложения определен нашим контроллером, давайте создадим отображение для&nbsp;действия index, которое мы&nbsp;определили выше.<br /> Отображения Cake это&nbsp;просто фрагменты HTML и&nbsp;PHP, которые устанавливаются в&nbsp;разметку приложения. Разметки можно определять и&nbsp;переключаться между ними, но&nbsp;пока, давайте просто использовать стандартную.<br /> Помните в&nbsp;последнем разделе как&nbsp;мы&nbsp;назначали переменную 'posts' в&nbsp;отображении используя метод set()? Это&nbsp;будет передавать данные в&nbsp;отображение, которое будет выглядить как&nbsp;это:<br /> <!--notypo--><textarea class="code" rows="15" readonly="readonly"></textarea><!--/notypo-->(php)/app/views/posts/index.thtml<br /> &lt;h1&gt;Blog posts&lt;/h1&gt;<br /> &lt;table&gt;<br /> <div class="indent"><div class="indent">&lt;tr&gt;<br /> <div class="indent"><div class="indent">&lt;th&gt;Id&lt;/th&gt;<br /> &lt;th&gt;Title&lt;/th&gt;<br /> &lt;th&gt;Created&lt;/th&gt;<br /> </div></div>&lt;/tr&gt;<br /> </div> &lt;!--Здесь мы&nbsp;проходим цикл через наш&nbsp;масив $posts, выводя информацию о&nbsp;постах --&gt;<br /> <div class="indent">&lt;?php foreach ($posts as $post): ?&gt;<br /> &lt;tr&gt;<br /> <div class="indent"><div class="indent">&lt;td&gt;&lt;?php echo $post['Post']['id']; ?&gt;&lt;/td&gt;<br /> &lt;td&gt;<br /> <div class="indent"><div class="indent">&lt;?php echo $html-&gt;link($post['Post']['title'], &laquo;/posts/view/&raquo;.$post['Post']['id']); ?&gt;<br /> </div></div>&lt;/td&gt;<br /> &lt;td&gt;&lt;?php echo $post['Post']['created']; ?&gt;&lt;/td&gt;<br /> </div></div>&lt;/tr&gt;<br /> &lt;?php endforeach; ?&gt;</div></div> &lt;/table&gt;<!--notypo--><textarea class="code" rows="6" readonly="readonly"></textarea><!--/notypo-->(php)/app/controllers/posts_controller.php (view action added)<br /> class <span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a> extends <span class="missingpage">App&nbsp;Controller</span><a href="/wiki/AppController/edit?add=1" title="Создать эту страницу">?</a><br /> <div class="indent"><div class="indent">var $name = 'Posts';<br /> function index()<br /> <div class="indent"><div class="indent"><div class="indent">$this-&gt;set('posts', $this-&gt;Post-&gt;findAll());<br /> </div></div></div>function view($id = null)<br /> <div class="indent"><div class="indent">$this-&gt;Post-&gt;id = $id;<br /> $this-&gt;set('post', $this-&gt;Post-&gt;read());</div></div></div></div> Запрос set() должен казаться знакомым. Заметьте мы&nbsp;используем read() а&nbsp;не findAll(), потому что&nbsp;мы&nbsp;хотим получить информацию только об&nbsp;одном посте.<br /> Заметьте что&nbsp;действие нашего отображение берет параметр. Этот параметр передан в&nbsp;приложение запросом URL. Если пользователь запрашивает /posts/view/3, тогда значение 3 будет вставлено как $id.<br /> Теперь давайте создадим отображение для&nbsp;нашего нового действия 'view' и&nbsp;разместим в&nbsp;/app/views/posts/view.thtml.<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> /app/views/posts/view.thtml<br />&lt;h1&gt;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'title'</span><span style="color: #007700">]</span><span style="color: #0000BB">?&gt;</span>&lt;/h1&gt;<br />&lt;p&gt;&lt;small&gt;Created:&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'created'</span><span style="color: #007700">]</span><span style="color: #0000BB">?&gt;</span>&lt;/small&gt;&lt;/p&gt;<br />&lt;p&gt;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'body'</span><span style="color: #007700">]</span><span style="color: #0000BB">?&gt;</span>&lt;/p&gt;</span> </code></div><!--/notypo--><br /> Проверьте работает ли&nbsp;это, пройдя по&nbsp;ссылкам /posts/index или&nbsp;запросом поста /posts/view/1.<a name="h44-8"></a><h2>Добавление постов</h2> Чтение постов из&nbsp;базы данных и&nbsp;показывание их&nbsp;нам это&nbsp;конечно хорошо, но&nbsp;давайте позволим добавление новых постов.<br /> Во-первых, начнем с&nbsp;действия add() в&nbsp;<span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a>:<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> /app/controllers/posts_controller.php&nbsp;(&nbsp;действие&nbsp;add&nbsp;добавлено)<br />class&nbsp;PostsController&nbsp;extends&nbsp;AppController<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;$name&nbsp;=&nbsp;'Posts';<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;index()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;set('posts',&nbsp;$this-&gt;Post-&gt;findAll());<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;view($id)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Post-&gt;id&nbsp;=&nbsp;$id;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;set('post',&nbsp;$this-&gt;Post-&gt;read());<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;add()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($this-&gt;Post-&gt;save($this-&gt;data))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;flash('Your&nbsp;post&nbsp;has&nbsp;been&nbsp;saved.','/posts');<br />Позвольте&nbsp;мне&nbsp;прочесть&nbsp;вам&nbsp;действие&nbsp;add()&nbsp;в&nbsp;простом&nbsp;языке:&nbsp;если&nbsp;данные&nbsp;формы&nbsp;не&nbsp;пустые,&nbsp;попробовать&nbsp;сохранить&nbsp;модель&nbsp;поста&nbsp;использовав&nbsp;эти&nbsp;данные.&nbsp;Если&nbsp;по&nbsp;каким-то&nbsp;причинам&nbsp;данные&nbsp;не&nbsp;сохраняются,&nbsp;выдать&nbsp;мне&nbsp;ошибки&nbsp;верификации&nbsp;данных&nbsp;и&nbsp;отрендерить&nbsp;отображение&nbsp;с&nbsp;показом&nbsp;этих&nbsp;ошибок.<br />Когда&nbsp;пользователь&nbsp;использует&nbsp;форму&nbsp;для&nbsp;отправки&nbsp;данных&nbsp;в&nbsp;ваше&nbsp;приложение,&nbsp;эта&nbsp;информация&nbsp;доступна&nbsp;в&nbsp;$this-&gt;params.&nbsp;Вы&nbsp;можете&nbsp;вывести&nbsp;их&nbsp;с&nbsp;помощью&nbsp;pr()&nbsp;если&nbsp;хотите&nbsp;увидеть&nbsp;их.&nbsp;$this-&gt;data&nbsp;это&nbsp;псеводоним&nbsp;для&nbsp;$this-&gt;params['data'].<br />Функция&nbsp;$this-&gt;flash()&nbsp;это&nbsp;функция&nbsp;контроллера,&nbsp;которая&nbsp;отображает&nbsp;сообщения&nbsp;пользователю&nbsp;на&nbsp;секунду&nbsp;(используя&nbsp;разметку&nbsp;для&nbsp;флеш-сообщений)&nbsp;потом&nbsp;перенаправляет&nbsp;пользователя&nbsp;по&nbsp;другому&nbsp;адресу&nbsp;(/posts,&nbsp;в&nbsp;нашем&nbsp;случае).&nbsp;Если&nbsp;DEBUG&nbsp;стоит&nbsp;на&nbsp;0&nbsp;$this-&gt;flash()&nbsp;переадресует&nbsp;автоматически,&nbsp;однако,&nbsp;если&nbsp;DEBUG&nbsp;на&nbsp;0&nbsp;вы&nbsp;сможете&nbsp;увидить&nbsp;флеш&nbsp;верстку&nbsp;и&nbsp;кликнуть&nbsp;на&nbsp;сообщении&nbsp;чтобы&nbsp;управлять&nbsp;переадресацией.<br />Вызываемый&nbsp;метод&nbsp;save()&nbsp;проверит&nbsp;наявность&nbsp;верификационных&nbsp;ошибок&nbsp;и&nbsp;не&nbsp;сохранит&nbsp;данные&nbsp;если&nbsp;таковые&nbsp;присутствуют.&nbsp;Доступно&nbsp;несколько&nbsp;методов,&nbsp;которыми&nbsp;вы&nbsp;сможете&nbsp;проверить&nbsp;верификационные&nbsp;ошибки,&nbsp;но&nbsp;мы&nbsp;немного&nbsp;поговорим&nbsp;о&nbsp;запросе&nbsp;validateErrors(),&nbsp;так&nbsp;что&nbsp;будьте&nbsp;на&nbsp;связи,&nbsp;когда&nbsp;я&nbsp;расскажу&nbsp;как&nbsp;выглядит&nbsp;отображение,&nbsp;а&nbsp;пока&nbsp;мы&nbsp;переходим&nbsp;к&nbsp;разделу&nbsp;о&nbsp;верификации&nbsp;данных.<br />===Верификация&nbsp;данных===<br />Cake&nbsp;уничтожает&nbsp;монотонность&nbsp;созданий&nbsp;проверок&nbsp;в&nbsp;форме.&nbsp;Все&nbsp;ненавидят&nbsp;прописывать&nbsp;бесконечные&nbsp;формы&nbsp;с&nbsp;их&nbsp;проверками,&nbsp;а&nbsp;Cake&nbsp;делает&nbsp;это&nbsp;легко&nbsp;и&nbsp;быстро.<br />Чтобы&nbsp;воспользоваться&nbsp;преимуществами&nbsp;возможностей&nbsp;проверки,&nbsp;вам&nbsp;надо&nbsp;использовать&nbsp;HTML&nbsp;хелпер&nbsp;в&nbsp;вашем&nbsp;отображении.&nbsp;HTML&nbsp;хелпер&nbsp;доступен&nbsp;по&nbsp;умолчанию&nbsp;во&nbsp;всех&nbsp;отображениях&nbsp;в&nbsp;$html.<br />Вот&nbsp;наше&nbsp;отображения&nbsp;для&nbsp;добавления:</span> </code></div><!--/notypo-->(php)/app/views/posts/add.thtml<br /> &lt;h1&gt;Add Post&lt;/h1&gt;<br /> &lt;form method="post" action="&lt;?php echo $html-&gt;url('/posts/add')?&gt;"&gt;<br /> <div class="indent"><div class="indent">&lt;p&gt;<br /> <div class="indent"><div class="indent">Title:<br /> &lt;?php echo $html-&gt;input('Post/title', array('size' =&gt; '40'))?&gt;<br /> &lt;?php echo $html-&gt;tagErrorMsg('Post/title', 'Title is&nbsp;required.') ?&gt;<br /> </div></div>&lt;/p&gt;<br /> &lt;p&gt;<br /> <div class="indent"><div class="indent">Body:<br /> &lt;?php echo $html-&gt;textarea('Post/body', array('rows'=&gt;'10')) ?&gt;<br /> &lt;?php echo $html-&gt;tagErrorMsg('Post/body', 'Body is&nbsp;required.') ?&gt;<br /> </div></div>&lt;/p&gt;<br /> &lt;p&gt;<br /> <div class="indent"><div class="indent">&lt;?php echo $html-&gt;submit('Save') ?&gt;<br /> </div></div>&lt;/p&gt;</div></div> Как&nbsp;и&nbsp;с $html-&gt;link(), $html-&gt;url() будет генерировать подходящую ссылку из&nbsp;контроллера и&nbsp;действия, которое мы&nbsp;предоставили. По&nbsp;умолчанию, это&nbsp;выводит тег&nbsp;формы POST, но&nbsp;это можно модифицировать вторым параметром. Функции $html-&gt;input() и $html-&gt;textarea() убирает элементы формы одинаковых имен. Первый параметр сообщает Cake, к&nbsp;которой модели/полю они&nbsp;относятся, а&nbsp;второй параметр для&nbsp;дополнительных аттрибутов HTML (как размер поля). Снова-таки посмотрите главу Хелперы для&nbsp;подробной информации о&nbsp;хелперах.<br /> Функция tagErrorMsg() выводит сообщения об&nbsp;ошибках в&nbsp;случае появления верификационных проблем.<br /> Если вы&nbsp;хотите обновить свое отображение /app/views/posts/index.thtml чтобы включить новую ссылку &#147;Add Post&#148; направляющую www.example.com/posts/add.<br /> Выглядит достаточно круто, но&nbsp;как мне&nbsp;сообщить Cake о&nbsp;своих требованиях верификации? Вот&nbsp;где мы&nbsp;возвращаемся к&nbsp;модели.<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> /app/models/post.php&nbsp;(верификационный&nbsp;массив&nbsp;добавлен)<br />class&nbsp;Post&nbsp;extends&nbsp;AppModel<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;$name&nbsp;=&nbsp;'Post';<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;$validate&nbsp;=&nbsp;array(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title'&nbsp;&nbsp;=&gt;&nbsp;VALID_NOT_EMPTY,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'body'&nbsp;&nbsp;&nbsp;=&gt;&nbsp;VALID_NOT_EMPTY<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br />Массив&nbsp;$validate&nbsp;сообщает&nbsp;Cake&nbsp;как&nbsp;проверять&nbsp;ваши&nbsp;данные&nbsp;когда&nbsp;вызван&nbsp;метод&nbsp;save().&nbsp;Значение&nbsp;для&nbsp;тех&nbsp;ключей&nbsp;просто&nbsp;константы&nbsp;установленные&nbsp;Cake'ом,&nbsp;который&nbsp;переводит&nbsp;их&nbsp;в&nbsp;регулярные&nbsp;выражения&nbsp;(см.&nbsp;/cake/libs/validators.php).&nbsp;Сейчас&nbsp;проверки&nbsp;Cake'а&nbsp;базируются&nbsp;на&nbsp;регулярных&nbsp;выражениях,&nbsp;но&nbsp;вы&nbsp;так&nbsp;же&nbsp;можете&nbsp;использовать&nbsp;Model::invalidate()&nbsp;чтобы&nbsp;просмотреть&nbsp;свои&nbsp;собственные&nbsp;верификации.<br />Теперь&nbsp;когда&nbsp;ваши&nbsp;проверки&nbsp;на&nbsp;месте,&nbsp;используйте&nbsp;приложение&nbsp;чтобы&nbsp;попробовать&nbsp;добавить&nbsp;новый&nbsp;пост&nbsp;без&nbsp;заголовка&nbsp;или&nbsp;тела,&nbsp;чтобы&nbsp;глянуть&nbsp;как&nbsp;это&nbsp;работает.<br />===Удаление&nbsp;постов===<br />Теперь&nbsp;давайте&nbsp;создадим&nbsp;возможность&nbsp;пользователям&nbsp;удалять&nbsp;посты.&nbsp;Начнем&nbsp;с&nbsp;действия&nbsp;delete()&nbsp;в&nbsp;PostsController:</span> </code></div><!--/notypo-->(php)&lt;?<br /> /app/controllers/posts_controller.php (только действие delete)<br /> function delete($id)<br /> <div class="indent"><div class="indent">$this-&gt;Post-&gt;del($id);<br /> $this-&gt;flash('The post with id: '.$id.' has&nbsp;been deleted.', '/posts');</div></div> Этот код&nbsp;удаляет пост определенный по $id, и&nbsp;использует flash() чтобы показать пользователю сообщение подтверждения перед переадрисаций в&nbsp;/posts.<br /> Поскольку мы&nbsp;просто выполняем некий код&nbsp;и&nbsp;переадресовуем, это&nbsp;действие не&nbsp;имеет отображения. Вы&nbsp;можете обновить отображения index чтобы позволить пользователям удалять посты.<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> /app/views/posts/index.thtml&nbsp;(добавленны&nbsp;ссылки&nbsp;добавления&nbsp;и&nbsp;удаления)<br />&lt;h1&gt;Blog&nbsp;posts&lt;/h1&gt;<br />&lt;p&gt;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">link</span><span style="color: #007700">(</span><span style="color: #DD0000">'Add&nbsp;Post'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'/posts/add'</span><span style="color: #007700">);&nbsp;</span><span style="color: #0000BB">?&gt;</span>&lt;/p&gt;<br />&lt;table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Id&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Title&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Created&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;Цикл&nbsp;в&nbsp;котором&nbsp;показуются&nbsp;посты&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">foreach&nbsp;(</span><span style="color: #0000BB">$posts&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">$post</span><span style="color: #007700">):&nbsp;</span><span style="color: #0000BB">?&gt;<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'id'</span><span style="color: #007700">];&nbsp;</span><span style="color: #0000BB">?&gt;</span>&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">link</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'title'</span><span style="color: #007700">],&nbsp;</span><span style="color: #DD0000">'/posts/view/'</span><span style="color: #007700">.</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'id'</span><span style="color: #007700">]);</span><span style="color: #0000BB">?&gt;<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">link</span><span style="color: #007700">(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'Delete'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">"/posts/delete/</span><span style="color: #007700">{</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'id'</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">null</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'Are&nbsp;you&nbsp;sure?'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">)</span><span style="color: #0000BB">?&gt;<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'created'</span><span style="color: #007700">];&nbsp;</span><span style="color: #0000BB">?&gt;</span>&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">endforeach;&nbsp;</span><span style="color: #0000BB">?&gt;<br /></span>&lt;/table&gt;</span> </code></div><!--/notypo--><br /> Этот код&nbsp;отображения также позволяет использовать Html хелпер, чтобы подсказать пользователю диалог подтверждения <span class="missingpage">Java&nbsp;Script</span><a href="/wiki/JavaScript/edit?add=1" title="Создать эту страницу">?</a> перед попыткой удалить пост.<a name="h44-9"></a><h2>Редактирование постов</h2> Итак... редактирование поста: начнем-с. Теперь вы&nbsp;профессионал в&nbsp;Cake, так&nbsp;что вы&nbsp;должны были подобрать образец. Сделайте действие, потом отображение. Вот&nbsp;как будет выглядить действие редактирования <span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a>:<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> /app/controllers/posts_controller.php&nbsp;(только&nbsp;действие&nbsp;edit)<br /><span style="color: #0000BB">&lt;?<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">edit</span><span style="color: #007700">(</span><span style="color: #0000BB">$id&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">null</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(empty(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Post</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$id</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Post</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">read</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Post</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">save</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">]))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">flash</span><span style="color: #007700">(</span><span style="color: #DD0000">'Your&nbsp;post&nbsp;has&nbsp;been&nbsp;updated.'</span><span style="color: #007700">,</span><span style="color: #DD0000">'/posts'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">Это&nbsp;проверяет&nbsp;на&nbsp;наличие&nbsp;отправленных&nbsp;данных&nbsp;формы</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">Если&nbsp;ничего&nbsp;не&nbsp;отправлено</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">идем&nbsp;искать&nbsp;пост&nbsp;и&nbsp;отправляем&nbsp;его&nbsp;в&nbsp;отображение</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">Если&nbsp;какие</span><span style="color: #007700">-</span><span style="color: #0000BB">то&nbsp;данные&nbsp;были&nbsp;отправлены</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">пробуем&nbsp;сохранить&nbsp;модель&nbsp;Post&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">или&nbsp;возвращает&nbsp;назад&nbsp;пользователя&nbsp;и&nbsp;показываем&nbsp;верификационные&nbsp;ошибки</span><span style="color: #007700">).<br /></span><span style="color: #0000BB">Отображение&nbsp;редактирования&nbsp;может&nbsp;выглядить&nbsp;так</span><span style="color: #007700">:</span> </span> </code></div><!--/notypo-->(php)/app/views/posts/edit.thtml<br /> &lt;h1&gt;Edit Post&lt;/h1&gt;<br /> &lt;form method="post" action="&lt;?php echo $html-&gt;url('/posts/edit')?&gt;"&gt;<br /> <div class="indent"><div class="indent">&lt;?php echo $html-&gt;hidden('Post/id'); ?&gt;<br /> &lt;p&gt;<br /> <div class="indent"><div class="indent">Title:<br /> &lt;?php echo $html-&gt;input('Post/title', array('size' =&gt; '40'))?&gt;<br /> &lt;?php echo $html-&gt;tagErrorMsg('Post/title', 'Title is&nbsp;required.') ?&gt;<br /> </div></div>&lt;/p&gt;<br /> &lt;p&gt;<br /> <div class="indent"><div class="indent">Body:<br /> &lt;?php echo $html-&gt;textarea('Post/body', array('rows'=&gt;'10')) ?&gt;<br /> &lt;?php echo $html-&gt;tagErrorMsg('Post/body', 'Body is&nbsp;required.') ?&gt;<br /> </div></div>&lt;/p&gt;<br /> &lt;p&gt;<br /> <div class="indent"><div class="indent">&lt;?php echo $html-&gt;submit('Save') ?&gt;<br /> </div></div>&lt;/p&gt;</div></div> Это&nbsp;отображение выводит форму редактирования (с заполненными значениями), и&nbsp;нужные сообщения об&nbsp;ошибках (если есть). Одна вещь на&nbsp;заметку: Cake будет подразумевать, что&nbsp;вы&nbsp;редактируете модель если поле 'id' существует в&nbsp;текущей сохраненной модели. Если нет&nbsp;'id' (оглянитесь на&nbsp;наше отображение добавления), Cake будет подразумевать, что&nbsp;вы&nbsp;вводите новую модель, когда вызываете save().<br /> Теперь вы&nbsp;можете обновить ваше отображение index ссылками на&nbsp;редактирование определенных постов:<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> /app/views/posts/index.thtml&nbsp;(edit&nbsp;links&nbsp;added)<br />&lt;h1&gt;Blog&nbsp;posts&lt;/h1&gt;<br />&lt;p&gt;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">link</span><span style="color: #007700">(</span><span style="color: #DD0000">"Add&nbsp;Post"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"/posts/add"</span><span style="color: #007700">);&nbsp;</span><span style="color: #0000BB">?&gt;<br /></span>&lt;table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Id&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Title&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Created&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;Здесь&nbsp;в&nbsp;цикле&nbsp;отображаются&nbsp;посты&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">foreach&nbsp;(</span><span style="color: #0000BB">$posts&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">$post</span><span style="color: #007700">):&nbsp;</span><span style="color: #0000BB">?&gt;<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'id'</span><span style="color: #007700">];&nbsp;</span><span style="color: #0000BB">?&gt;</span>&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">link</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'title'</span><span style="color: #007700">],&nbsp;</span><span style="color: #DD0000">'/posts/view/'</span><span style="color: #007700">.</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'id'</span><span style="color: #007700">]);</span><span style="color: #0000BB">?&gt;<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">link</span><span style="color: #007700">(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'Delete'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">"/posts/delete/</span><span style="color: #007700">{</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'id'</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">null</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'Are&nbsp;you&nbsp;sure?'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">)</span><span style="color: #0000BB">?&gt;<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">link</span><span style="color: #007700">(</span><span style="color: #DD0000">'Edit'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'/posts/edit/'</span><span style="color: #007700">.</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'id'</span><span style="color: #007700">]);</span><span style="color: #0000BB">?&gt;<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #DD0000">'Post'</span><span style="color: #007700">][</span><span style="color: #DD0000">'created'</span><span style="color: #007700">];&nbsp;</span><span style="color: #0000BB">?&gt;</span>&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">endforeach;&nbsp;</span><span style="color: #0000BB">?&gt;<br /></span>&lt;/table&gt;</span> </code></div><!--/notypo--><a name="h44-10"></a><h2>Роуты</h2> Эта&nbsp;часть опциональная, но&nbsp;полезная в&nbsp;понимании как&nbsp;формулируются ссылки к&nbsp;определенным функциям в&nbsp;Cake. Мы&nbsp;собираемся сделать только быстрые изменения в&nbsp;роутах в&nbsp;этом обучающем примере. Для&nbsp;более полной справки смотрите главу &laquo;Настройка&raquo;, Раздел 3: Настройка роутов.<br /> Роут по&nbsp;умолчанию Cake отведет человека, посещающего корень сайта (например <a href="http://www.example.com" target="_blank" title="Внешняя ссылка (откроется в новом окне)" class="outerlink"><img src="/wiki_/themes/cake/icons/web.gif" alt="" border="0" />http://www.example.com</a>) к&nbsp;<span class="missingpage">Pages&nbsp;Controller</span><a href="/wiki/PagesController/edit?add=1" title="Создать эту страницу">?</a>'у, и&nbsp;отрендерит отображение под&nbsp;названием home. Вместо этого, мы&nbsp;хотим, чтобы пользователи нашего блога шли&nbsp;к&nbsp;нашему <span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a>'у, который скоро будет создан.<br /> Роутинг Cake находится в&nbsp;/app/config/routes.php. Вы&nbsp;хотите разкоментировать или&nbsp;удалить линию похожую на&nbsp;эту:<br /> $Route-&gt;connect ('/', array('controller'=&gt;'pages', 'action'=&gt;'display', 'home'));<br /> Эта&nbsp;линия связывает ссылку / с&nbsp;домашней страницей Cake по&nbsp;умолчанию. Мы&nbsp;хотим связать ее&nbsp;с нашим собственным контроллером, так&nbsp;что добавьте линию, которая выгляит так:<br /> $Route-&gt;connect ('/', array('controller'=&gt;'posts', 'action'=&gt;'index'));<br /> Это&nbsp;должно связывать запрос пользователей '/' с&nbsp;действием index() нашего <span class="missingpage">Posts&nbsp;Controller</span><a href="/wiki/PostsController/edit?add=1" title="Создать эту страницу">?</a>.<a name="h44-11"></a><h2>Итог</h2> Создание приложений таким способом выиграет вам&nbsp;время, честь, женщин и&nbsp;деньги и&nbsp;даже ваши самые дикие фантазии. Просто, не&nbsp;так ли? А&nbsp;теперь вспомните, что&nbsp;этот обучающий пример &ndash; основы. Cake обладает большим количеством возможностей и&nbsp;является очень гибким. Используйте это&nbsp;руководство как&nbsp;гид для&nbsp;создания более богатых на&nbsp;возможности приложений.<br /> Теперь, когда вы&nbsp;создали начальное приложение, вы&nbsp;готовы к&nbsp;реальным вещам. Начните свой собственный проект, прочтите остальное руководство и&nbsp;API.<br /> Если вам&nbsp;нужна помощь, приходите в&nbsp;#cakephp. Добро пожаловать в&nbsp;Cake!</div><br /> <b>Удалено:</b><br /> <div class="deletions"><a name="h44-1"></a><h1>Пример: Простая аутентификация пользователей</h1><a name="h44-2"></a><h2>Общая картина</h2> Если вы&nbsp;новичок в&nbsp;<span class="missingpage">Cake&nbsp;PHP</span><a href="/wiki/CakePHP/edit?add=1" title="Создать эту страницу">?</a>, вам&nbsp;настоятельно рекомендуется копировать код&nbsp;и&nbsp;вставлять в&nbsp;свое приложение для&nbsp;использования. Если нет: эта&nbsp;глава &ndash; обсуждение ядра Cake, а&nbsp;не безопасности приложений. Я&nbsp;сомневаюсь, что&nbsp;мы&nbsp;будем обсуждать очевидные засады безопасности, главная цель этого примера &ndash; показать как&nbsp;работает ядро Cake, и&nbsp;позволить вам&nbsp;создавать пуленепробиваемые приложения.<br /> В&nbsp;Cake есть контроль доступа через втроенный движок ACL, но&nbsp;как насчет аутентификации пользователей? Как&nbsp;насчет этого?<br /> Что&nbsp;ж, на&nbsp;данный момент, мы&nbsp;установили, что&nbsp;система аутентификации пльзователей изменяется от&nbsp;приложения к&nbsp;приложению. Некоторые люят хешированные пароли, другие, LDAP (Облегченный протокол доступа к&nbsp;кталогам) &ndash; и&nbsp;почти все&nbsp;приложения содержат модели User, которые незначительно отличаются. Теперь мы&nbsp;оставляем это&nbsp;на&nbsp;вас. Изменится ли&nbsp;это? Мы&nbsp;не уверены пока. Сейчас, мы&nbsp;думаем, что&nbsp;большие накладные расходы при&nbsp;встаивании этого в&nbsp;фреймворк того не&nbsp;стоят, потому что&nbsp;создание собственной системы аутентификации пользователей с&nbsp;Cake достаточно просто.<br /> Вам&nbsp;нужно всего три&nbsp;вещи:<br /> <ol type="1"><li> Способ аутентифицировать пользователей (обычно делается проверкой логина/пароля) </li><li> Способ упорно следить что&nbsp;пользователи путешествуют по&nbsp;вашему приложению (обычно делается сессиями) </li><li> Способ проверить аутентифицировался ли&nbsp;пользователь (обычно устанавливается с&nbsp;помощью взаимодействия с&nbsp;сессиями)</li></ol> В&nbsp;этом примере, мы&nbsp;создадим простую систему аутентификации пользователей для&nbsp;системы управления клиентами. Это&nbsp;вымышленное приложение скорее всего будет использоваться в&nbsp;офисе, чтобы следить за&nbsp;контактной информацией и&nbsp;соответсвенными заметками клиентов. Вся&nbsp;функциональность системы будет размещена за&nbsp;нашей системой аутентификации пользователей, кроме нескольких отображений, которые будут показывать только имена и&nbsp;титулы клиентов, сохраненные в&nbsp;системе.<br /> Мы&nbsp;начнем с&nbsp;того, что&nbsp;покажем вам&nbsp;как проверить пользователей, которые пытаются получить доступ к&nbsp;системе. Информация об&nbsp;аутентифицированном пользователе будет храниться в&nbsp;сессии PHP, используя компонент сессий. Когда у&nbsp;нас есть информация пользователя в&nbsp;сессии, мы&nbsp;поместим проверки в&nbsp;приложение, чтобы убедится, что&nbsp;пользователь не&nbsp;пытается добраться до&nbsp;мест, куда ему&nbsp;&laquo;не нужно&raquo; добираться.<br /> На&nbsp;заметку &ndash; аутентификация это&nbsp;не&nbsp;то же&nbsp;самое что&nbsp;и&nbsp;контроль доступа. Все&nbsp;что нам&nbsp;нужно в&nbsp;этом примере это&nbsp;являются ли&nbsp;пользователи теми, кем&nbsp;себя заявляют, и&nbsp;дать им&nbsp;основной доступ к&nbsp;частям приложения. Мы&nbsp;будем делать заметки где&nbsp;можно разместить ACL, но&nbsp;пока, давайте сфокусируемся на&nbsp;простой аутентификации пользователей.<br /> Я&nbsp;также должен отметить, что&nbsp;этот пример не&nbsp;претендует на&nbsp;звание какого-то букваря в&nbsp;безопасности приложения. Мы&nbsp;просто хотим дать вам&nbsp;достаточно, чтобы вы&nbsp;могли создать защищенные приложения самостоятельно.<a name="h44-3"></a><h2>Аутентификация и&nbsp;стойкость</h2> Сначала нам&nbsp;нужен способ хранить информацию о&nbsp;пользователях, пытающихся получить доступ к&nbsp;нашей системе управления клиентами. Система, которую мы&nbsp;используем хранит информацию о&nbsp;пользователях в&nbsp;таблице базы данных, которая была создана согласно следующему SQL:<br /> <!--notypo--><div class="code"><code><font color=blue>CREATE</font>&nbsp;<font color=blue>TABLE</font>&nbsp;`users`&nbsp;(<br /> &nbsp;&nbsp;`id`&nbsp;<font color=blue>int</font>(<font color=green><b>11</b></font>)&nbsp;<font color=blue>NOT</font>&nbsp;<font color=blue>NULL</font>&nbsp;auto_increment,<br /> &nbsp;&nbsp;`username`&nbsp;<font color=blue>varchar</font>(<font color=green><b>255</b></font>)&nbsp;<font color=blue>NOT</font>&nbsp;<font color=blue>NULL</font>,<br /> &nbsp;&nbsp;`password`&nbsp;<font color=blue>varchar</font>(<font color=green><b>32</b></font>)&nbsp;<font color=blue>NOT</font>&nbsp;<font color=blue>NULL</font>,<br /> &nbsp;&nbsp;`first_name`&nbsp;<font color=blue>varchar</font>(<font color=green><b>255</b></font>)&nbsp;<font color=blue>NOT</font>&nbsp;<font color=blue>NULL</font>,<br /> &nbsp;&nbsp;`last_name`&nbsp;<font color=blue>varchar</font>(<font color=green><b>255</b></font>)&nbsp;<font color=blue>NOT</font>&nbsp;<font color=blue>NULL</font>,<br /> &nbsp;&nbsp;<font color=blue>PRIMARY</font>&nbsp;<font color=blue>KEY</font>&nbsp;&nbsp;(`id`)<br /> Достаточно&nbsp;просто,&nbsp;не&nbsp;так&nbsp;ли?&nbsp;Модель&nbsp;Cake&nbsp;для&nbsp;этой&nbsp;таблицы&nbsp;может&nbsp;быть&nbsp;достаточно&nbsp;ясной:<font color=green><b></b></font></code></div><!--/notypo-->(php)&lt;?php<br /> class User extends <span class="missingpage">App&nbsp;Model</span><a href="/wiki/AppModel/edit?add=1" title="Создать эту страницу">?</a><br /> <div class="indent"><div class="indent">var $name = 'User';</div></div> Первое, что&nbsp;нам нужно это&nbsp;отображение и&nbsp;действие логина. Это&nbsp;даст возможность пользователям логиниться и&nbsp;возможность системе обрабатывать информацию, чтобы узнать давать пользователю доступ или&nbsp;нет. Отображение это&nbsp;простая форма HTML, созданная при&nbsp;помощи HTML Хелпера:<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> /app/views/users/login.thtml<br /><span style="color: #0000BB">&lt;?</span><span style="color: #007700">if&nbsp;(</span><span style="color: #0000BB">$error</span><span style="color: #007700">):&nbsp;</span><span style="color: #0000BB">?&gt;<br /></span>&lt;p&gt;The&nbsp;login&nbsp;credentials&nbsp;you&nbsp;supplied&nbsp;could&nbsp;not&nbsp;be&nbsp;recognized.&nbsp;Please&nbsp;try&nbsp;again.&lt;/p&gt;<br /><span style="color: #0000BB">&lt;?&nbsp;</span><span style="color: #007700">endif;&nbsp;</span><span style="color: #0000BB">?&gt;<br /></span>&lt;form&nbsp;action="<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">url</span><span style="color: #007700">(</span><span style="color: #DD0000">'/users/login'</span><span style="color: #007700">);&nbsp;</span><span style="color: #0000BB">?&gt;</span>"&nbsp;method="post"&gt;<br />&lt;div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;label&nbsp;for="username"&gt;Username:&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">input</span><span style="color: #007700">(</span><span style="color: #DD0000">'User/username'</span><span style="color: #007700">,&nbsp;array(</span><span style="color: #DD0000">'size'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">20</span><span style="color: #007700">));&nbsp;</span><span style="color: #0000BB">?&gt;<br /></span>&lt;/div&gt;<br />&lt;div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;label&nbsp;for="password"&gt;Password:&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">password</span><span style="color: #007700">(</span><span style="color: #DD0000">'User/password'</span><span style="color: #007700">,&nbsp;array(</span><span style="color: #DD0000">'size'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">20</span><span style="color: #007700">));&nbsp;</span><span style="color: #0000BB">?&gt;<br /></span>&lt;/div&gt;<br />&lt;div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$html</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">submit</span><span style="color: #007700">(</span><span style="color: #DD0000">'Login'</span><span style="color: #007700">);&nbsp;</span><span style="color: #0000BB">?&gt;<br /></span>&lt;/div&gt;<br />Это&nbsp;отображение&nbsp;предоставляет&nbsp;простую&nbsp;форму&nbsp;логина&nbsp;для&nbsp;пользователей&nbsp;пытающихся&nbsp;получить&nbsp;доступ&nbsp;к&nbsp;системе.&nbsp;Действие&nbsp;для&nbsp;формы&nbsp;это&nbsp;/users/login,&nbsp;находится&nbsp;в&nbsp;UsersController&nbsp;и&nbsp;выглядит&nbsp;так:</span> </code></div><!--/notypo-->(php)/app/controllers/users_controller.php (частично)<br /> class <span class="missingpage">Users&nbsp;Controller</span><a href="/wiki/UsersController/edit?add=1" title="Создать эту страницу">?</a> extends <span class="missingpage">App&nbsp;Controller</span><a href="/wiki/AppController/edit?add=1" title="Создать эту страницу">?</a><br /> <div class="indent"><div class="indent">function login()<br /> <div class="indent"><div class="indent">//Не показывать сообщение об&nbsp;ошибке, если данные не&nbsp;были отправлены.<br /> $this-&gt;set('error', false);<br /> //Если пользователь отправил данные из&nbsp;формы:<br /> <div class="indent"><div class="indent">// Сначала проверим, есть ли&nbsp;пользователи в&nbsp;базе данных<br /> //с именем, которое предоставил пользователь в&nbsp;форме:<br /> $someone = $this-&gt;User-&gt;findByUsername($this-&gt;data['User']['username']);<br /> // На&nbsp;этом этапе $someone это&nbsp;все данные пользователя, или&nbsp;же&nbsp;она пуста.<br /> // Давайте сравним пароль из&nbsp;формы с&nbsp;паролем<br /> //из базы данных.<br /> if(!empty($someone['User']['password']) && $someone['User']['password'] == $this-&gt;data['User']['password'])<br /> <div class="indent"><div class="indent">// Заметка: надеемся что&nbsp;пароли в&nbsp;вашей БД&nbsp;хешированы,<br /> // так&nbsp;что ваше сравнение может выглядеть так:<br /> // md5($this-&gt;data['User']['password']) == ...<br /> // Это&nbsp;значит, что&nbsp;они были одинаковыми. Теперь мы&nbsp;можем создавать некую основную<br /> //информацию сессии, чтобы запомнить этого пользователя как&nbsp;&laquo;залогиненого&raquo;.<br /> $this-&gt;Session-&gt;write('User', $someone['User']);<br /> //Теперь, когда у&nbsp;нас они&nbsp;сохранены в&nbsp;сессии, перенаправим их<br /> //на нужную страницу в&nbsp;приложении.<br /> $this-&gt;redirect('/clients');<br /> </div></div>//В другом случае, они&nbsp;предоставили не&nbsp;верные данные:<br /> else<br /> <div class="indent"><div class="indent">//Помните переменную $error в&nbsp;отображении? Давайте поставим ее&nbsp;на true:<br /> $this-&gt;set('error', true);<br /> </div></div></div></div></div></div>function logout()<br /> <div class="indent"><div class="indent">//Перенаправляем пользователя на&nbsp;это действие, если они&nbsp;нажали кнопку Выйти.<br /> //Все что&nbsp;нам здесь нужно, это&nbsp;удалить информацию сессии:<br /> $this-&gt;Session-&gt;delete('User');<br /> //Ну и&nbsp;наверняка нам&nbsp;нужно перенаправить их&nbsp;куда-нибудь...<br /> </div></div> <br /> <div class="indent"><div class="indent">$this-&gt;redirect('/');</div></div></div></div> Не&nbsp;плохо: содержание действия login() может быть меньше 20 линий, если вы&nbsp;были лаконичны. Результат этого действия либо 1: информация пользователя записана в&nbsp;сессию и&nbsp;он перенаправлен на&nbsp;нужную страницу приложения, или&nbsp;2: отброшен обратно на&nbsp;страницу входа (в дополнении с&nbsp;сообщением об&nbsp;ошибке).<a name="h44-4"></a><h2>Проверка доступа в&nbsp;вашем приложении</h2> Теперь мы&nbsp;можем аутентифицировать пользователей, давайте сделаем так, что&nbsp;приложение будет отбрасывать пользователей, пытающихся пробраться в&nbsp;систему не&nbsp;из формы логина или&nbsp;&laquo;основной&raquo; директории клиентов.<br /> Один способ это&nbsp;создать функцию в&nbsp;<span class="missingpage">App&nbsp;Controller</span><a href="/wiki/AppController/edit?add=1" title="Создать эту страницу">?</a>, которая будет делать проверку сессии и&nbsp;отбрасывание.<br /> <!--notypo--><div class="code"><code><span style="color: #000000"> /app/app_controller.php<br />class&nbsp;AppController&nbsp;extends&nbsp;Controller<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;checkSession()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Если&nbsp;иформация&nbsp;сессии&nbsp;не&nbsp;была&nbsp;установлена...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!$this-&gt;Session-&gt;check('User'))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Отправляет&nbsp;пользователя&nbsp;к&nbsp;экрану&nbsp;логина<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;redirect('/users/login');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit();<br />Теперь&nbsp;у&nbsp;вас&nbsp;есть&nbsp;функция,&nbsp;которую&nbsp;вы&nbsp;можете&nbsp;использовать&nbsp;в&nbsp;любом&nbsp;контроллере,&nbsp;чтобы&nbsp;убедиться&nbsp;что&nbsp;пользователи&nbsp;не&nbsp;пытаются&nbsp;добраться&nbsp;до&nbsp;действий&nbsp;контроллера,&nbsp;не&nbsp;залогинившись&nbsp;до&nbsp;этого.&nbsp;Когда&nbsp;она&nbsp;на&nbsp;месте&nbsp;вы&nbsp;можете&nbsp;проверять&nbsp;доступ&nbsp;на&nbsp;любом&nbsp;уровне&nbsp;-&nbsp;вот&nbsp;некоторые&nbsp;примеры:<br />====Принудительная&nbsp;аутентификация&nbsp;перед&nbsp;всеми&nbsp;действиями&nbsp;контроллера====</span> </code></div><!--/notypo-->(php)&lt;?php<br /> class <span class="missingpage">Notes&nbsp;Controller</span><a href="/wiki/NotesController/edit?add=1" title="Создать эту страницу">?</a> extends <span class="missingpage">App&nbsp;Controller</span><a href="/wiki/AppController/edit?add=1" title="Создать эту страницу">?</a><br /> <div class="indent"><div class="indent">// Не&nbsp;хотите, чтобы неаутентифицированный пользователь бродил по&nbsp;каким-либо действия<br /> // в&nbsp;этом контроллере? Воспользуйтесь beforeFilter, чтобы запускать checkSession<br /> // перед любым кодом действия.<br /> function beforeFilter()<br /> <div class="indent"><div class="indent">$this-&gt;checkSession();</div></div></div></div><a name="h44-5"></a><h3>Принудительная аутентификация перед одним действием контроллера</h3> %%(php)&lt;?php<br /> class <span class="missingpage">Notes&nbsp;Controller</span><a href="/wiki/NotesController/edit?add=1" title="Создать эту страницу">?</a> extends <span class="missingpage">App&nbsp;Controller</span><a href="/wiki/AppController/edit?add=1" title="Создать эту страницу">?</a><br /> <div class="indent"><div class="indent">function publicNotes($clientID)<br /> <div class="indent"><div class="indent">//Публичный доступ к&nbsp;этому действию открыт....<br /> </div></div>function edit($noteId)<br /> <div class="indent"><div class="indent">// Но&nbsp;вы хотите, что&nbsp;бы&nbsp;этим действием пользовались только аутентифицированные пользователи.<br /> $this-&gt;checkSession();</div></div></div></div> Теперь вы&nbsp;получили основы, вы&nbsp;можете усовершенствовать возможности аутентификации или&nbsp;настроить их&nbsp;по своему желанию или&nbsp;нуждам. Интеграция с&nbsp;компонентом ACL&nbsp;Cake может быть отличным шагом.</div></div>