<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>fxposter&#039;s wave &#187; MVC</title>
	<atom:link href="http://blog.fxposter.org/tag/mvc/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fxposter.org</link>
	<description>Stories about Ruby, JavaScript, Objective-C and other cool tools</description>
	<lastBuildDate>Sun, 30 Oct 2011 20:00:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Формы как обьекты, Zend_Form, MVC, Validation и многое другое</title>
		<link>http://blog.fxposter.org/2008/04/20/programming-talks/</link>
		<comments>http://blog.fxposter.org/2008/04/20/programming-talks/#comments</comments>
		<pubDate>Sat, 19 Apr 2008 22:52:00 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Validation]]></category>
		<category><![CDATA[Zend-Framework]]></category>
		<category><![CDATA[Zend_Form]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/04/20/programming-talks/</guid>
		<description><![CDATA[Сегодня мы с Мишей разговорились в ICQ. Разговор получился ОЧЕНЬ длинный и офигительно интересный. Читаем под катом: fxposter (00:19:08 20/04/2008) я немного о другом fxposter (00:19:20 20/04/2008) ты используешь отдельные классы ZF в CI fxposter (00:19:32 20/04/2008) у тебя основная логика - на CI fxposter (00:19:36 20/04/2008) а мне она не нравиться mihailt (00:19:47 20/04/2008) [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня мы с <a href="http://mihailt.wordpress.com/">Мишей</a> разговорились в ICQ. Разговор получился ОЧЕНЬ длинный и офигительно интересный. Читаем под катом:<br />
<span id="more-409"></span></p>
<blockquote><p> fxposter (00:19:08 20/04/2008)<br />
я немного о другом</p>
<p>fxposter (00:19:20 20/04/2008)<br />
ты используешь отдельные классы ZF в CI</p>
<p>fxposter (00:19:32 20/04/2008)<br />
у тебя основная логика - на CI</p>
<p>fxposter (00:19:36 20/04/2008)<br />
а мне она не нравиться</p>
<p>mihailt (00:19:47 20/04/2008)<br />
а чем?</p>
<p>fxposter (00:20:07 20/04/2008)<br />
основная логика у ZF классная - Controller - просто зашибись и View&#8217;хи очень хорошие</p>
<p>fxposter (00:20:48 20/04/2008)<br />
но вот чтобы это всё скомпоновать (ZF) до уровня скомпонованности всего в симфе - нужно потратить прилично времени.</p>
<p>fxposter (00:21:22 20/04/2008)<br />
я тебе, кстати, могу сказать еще кое-что насчет CI</p>
<p>mihailt (00:21:28 20/04/2008)<br />
м?</p>
<p>fxposter (00:21:34 20/04/2008)<br />
вот ты используешь ZF с CI</p>
<p>fxposter (00:21:39 20/04/2008)<br />
потому что &#8220;удобно&#8221;</p>
<p>mihailt (00:21:48 20/04/2008)<br />
угу</p>
<p>fxposter (00:21:55 20/04/2008)<br />
использовать CI в дополнении к ZF ты бы не стал</p>
<p>fxposter (00:21:59 20/04/2008)<br />
потому что - фигня :)</p>
<p>mihailt (00:22:12 20/04/2008)<br />
хех</p>
<p>fxposter (00:22:23 20/04/2008)<br />
ну не то, чтобы фигня</p>
<p>fxposter (00:22:30 20/04/2008)<br />
просто - не то</p>
<p>mihailt (00:22:38 20/04/2008)<br />
хелперы бы скорее всего стал бы</p>
<p>fxposter (00:22:48 20/04/2008)<br />
какие ?)</p>
<p>fxposter (00:23:34 20/04/2008)<br />
я, кстати, в ZF недавно просматривал View Helper&#8217;ы</p>
<p>mihailt (00:23:34 20/04/2008)<br />
да многие тот же form мне цишний больше нравится</p>
<p>fxposter (00:23:46 20/04/2008)<br />
формы в ZF такие же</p>
<p>fxposter (00:23:53 20/04/2008)<br />
как и в симфе 1.0 и CI</p>
<p>fxposter (00:24:04 20/04/2008)<br />
только они уже почти deprecated :)</p>
<p>fxposter (00:24:19 20/04/2008)<br />
т.е. до появления Zend_Form такие хелперы там были</p>
<p>fxposter (00:24:23 20/04/2008)<br />
и пока еще есть</p>
<p>fxposter (00:24:52 20/04/2008)<br />
мне вот понравилось, что добавили<br />
partial partialLoop и action хелперы</p>
<p>fxposter (00:24:56 20/04/2008)<br />
в ZF</p>
<p>mihailt (00:25:15 20/04/2008)<br />
ну нифига не удобно мне кучу параметров в масиве передавать, удобней просто вызвать элемент формы и описать его</p>
<p>fxposter (00:25:36 20/04/2008)<br />
каких параметров?</p>
<p>fxposter (00:25:39 20/04/2008)<br />
а</p>
<p>fxposter (00:25:46 20/04/2008)<br />
так тебе и не нужно :)</p>
<p>fxposter (00:25:52 20/04/2008)<br />
ты описываешь форму</p>
<p>fxposter (00:25:55 20/04/2008)<br />
как угодно</p>
<p>fxposter (00:26:03 20/04/2008)<br />
в том же ini-файле можно :)</p>
<p>fxposter (00:26:52 20/04/2008)<br />
а потом пишешь<br />
$this-&gt;view-&gt;form = new MyForm();<br />
а во вьюхе:<br />
echo $this-&gt;form;</p>
<p>mihailt (00:26:53 20/04/2008)<br />
нее</p>
<p>mihailt (00:27:08 20/04/2008)<br />
вот именно это мне и не нравится</p>
<p>fxposter (00:27:12 20/04/2008)<br />
почему?</p>
<p>mihailt (00:27:20 20/04/2008)<br />
напоминает работу с XML</p>
<p>fxposter (00:27:29 20/04/2008)<br />
знаешь, чем это лучше</p>
<p>fxposter (00:27:30 20/04/2008)<br />
?</p>
<p>fxposter (00:27:41 20/04/2008)<br />
тем, что у тебя НИЧЕГО не дублируется</p>
<p>fxposter (00:27:49 20/04/2008)<br />
что ОЧЕНЬ хорошо по умолчанию</p>
<p>fxposter (00:28:10 20/04/2008)<br />
и что всё, что относится к данной форме описывается в одном месте</p>
<p>fxposter (00:28:16 20/04/2008)<br />
а не в нескольких</p>
<p>fxposter (00:28:33 20/04/2008)<br />
это - очень хорошо</p>
<p>mihailt (00:29:17 20/04/2008)<br />
ну хз мне форму рассматривать как объект почему-то не очень нравится</p>
<p>fxposter (00:29:29 20/04/2008)<br />
лучше привыкай сейчас :)</p>
<p>fxposter (00:29:36 20/04/2008)<br />
или старайся привыкнуть</p>
<p>fxposter (00:29:58 20/04/2008)<br />
потому что такие системы очень помогают</p>
<p>fxposter (00:30:08 20/04/2008)<br />
и помогают отвлечься от рутины</p>
<p>fxposter (00:30:15 20/04/2008)<br />
от проверки валидности</p>
<p>fxposter (00:30:17 20/04/2008)<br />
и прочего</p>
<p>fxposter (00:31:18 20/04/2008)<br />
получается, что у тебя вместо этих доставших input-хелперов - формы строятся как единый обьект</p>
<p>fxposter (00:31:53 20/04/2008)<br />
все уже привыкли к фразе</p>
<p>fxposter (00:31:59 20/04/2008)<br />
&#8220;оно само себя рисует&#8221;</p>
<p>fxposter (00:32:05 20/04/2008)<br />
в ООП</p>
<p>fxposter (00:32:29 20/04/2008)<br />
только не все понимают, что это можно распространить на очень многое</p>
<p>fxposter (00:32:40 20/04/2008)<br />
опиши форму - и дай ей сделать остальное за тебя</p>
<p>fxposter (00:32:50 20/04/2008)<br />
пропадет куча рутинной работы</p>
<p>mihailt (00:33:00 20/04/2008)<br />
типа кодегенерация</p>
<p>fxposter (00:33:03 20/04/2008)<br />
нет</p>
<p>fxposter (00:33:14 20/04/2008)<br />
кодогенерация - это то, что ты input&#8217;ами пишешь</p>
<p>fxposter (00:33:15 20/04/2008)<br />
:)</p>
<p>fxposter (00:33:19 20/04/2008)<br />
только вручную</p>
<p>fxposter (00:33:28 20/04/2008)<br />
а тут оно просто &#8220;себя рисует&#8221;</p>
<p>mihailt (00:33:41 20/04/2008)<br />
ну сказать та что рисовать надо</p>
<p>fxposter (00:33:41 20/04/2008)<br />
когда ты на десктопе создаешь формочку</p>
<p>fxposter (00:33:46 20/04/2008)<br />
это кодогенерация?</p>
<p>fxposter (00:33:47 20/04/2008)<br />
:)</p>
<p>fxposter (00:33:52 20/04/2008)<br />
нет</p>
<p>mihailt (00:34:03 20/04/2008)<br />
да</p>
<p>fxposter (00:34:04 20/04/2008)<br />
это выполнение отрисовки в рантайме</p>
<p>mihailt (00:34:14 20/04/2008)<br />
хмм</p>
<p>fxposter (00:34:20 20/04/2008)<br />
вот с формами так же</p>
<p>fxposter (00:34:29 20/04/2008)<br />
т.е. - оно генерит HTML</p>
<p>fxposter (00:34:37 20/04/2008)<br />
но, подумай, - HTML</p>
<p>fxposter (00:34:37 20/04/2008)<br />
!</p>
<p>fxposter (00:34:43 20/04/2008)<br />
не php-код</p>
<p>fxposter (00:34:45 20/04/2008)<br />
ничего</p>
<p>fxposter (00:34:54 20/04/2008)<br />
оно ничего не eval&#8217;ит</p>
<p>fxposter (00:35:03 20/04/2008)<br />
оно выдает просто строку результата</p>
<p>mihailt (00:35:15 20/04/2008)<br />
хмм</p>
<p>fxposter (00:35:24 20/04/2008)<br />
хотя на самом деле - на это можно смотреть по разному :)</p>
<p>fxposter (00:35:58 20/04/2008)<br />
но в любом случае - это не обычная статическая генерация кода</p>
<p>mihailt (00:36:03 20/04/2008)<br />
озадачил ты меня</p>
<p>fxposter (00:36:04 20/04/2008)<br />
это всё происходит в динамике</p>
<p>fxposter (00:36:11 20/04/2008)<br />
и это в рантайме можно менять</p>
<p>fxposter (00:36:18 20/04/2008)<br />
правда, к этому всему нужно привыкнуть</p>
<p>fxposter (00:36:34 20/04/2008)<br />
и для этого - использовать что-то типа Zend_Form</p>
<p>mihailt (00:36:44 20/04/2008)<br />
то есть больше нефига не скриптовый язык</p>
<p>fxposter (00:37:00 20/04/2008)<br />
если честно, я сталкивался с мыслью, что что-то подобное должно быть</p>
<p>fxposter (00:37:05 20/04/2008)<br />
когда делал много форм</p>
<p>fxposter (00:37:22 20/04/2008)<br />
но именно ZF открым мне глаза на то, как это можно красиво сделать :)</p>
<p>fxposter (00:37:52 20/04/2008)<br />
вообще я под генерацией кода понимаю - генерируем что-то статически</p>
<p>fxposter (00:38:13 20/04/2008)<br />
и это потом используем отдельно</p>
<p>fxposter (00:38:24 20/04/2008)<br />
как в симфе - сделать CRUD для таблицы</p>
<p>mihailt (00:38:39 20/04/2008)<br />
ты програмист-прагматик читал?</p>
<p>fxposter (00:38:39 20/04/2008)<br />
оно накидает html и php-файлов - и вот и кодогенерация</p>
<p>fxposter (00:38:41 20/04/2008)<br />
нет</p>
<p>fxposter (00:39:00 20/04/2008)<br />
но собирался</p>
<p>mihailt (00:39:03 20/04/2008)<br />
так вот так кодегенерация описывалась по другому</p>
<p>mihailt (00:39:14 20/04/2008)<br />
почитай кстати интересная штука</p>
<p>fxposter (00:39:37 20/04/2008)<br />
это одна из самых советуемых книжек на programmingbooks раньше было</p>
<p>fxposter (00:39:39 20/04/2008)<br />
была</p>
<p>mihailt (00:40:30 20/04/2008)<br />
там люди для того чтобы не писать много однообразных программ написали программу которая принимала параматры и выдавала нужный код</p>
<p>fxposter (00:40:39 20/04/2008)<br />
угу</p>
<p>mihailt (00:41:04 20/04/2008)<br />
блин</p>
<p>mihailt (00:41:18 20/04/2008)<br />
не могу объяснит у меня получается тоже что ты написал</p>
<p>fxposter (00:41:35 20/04/2008)<br />
но тогда можно считать, что если Zend_Form делает кодогенерацию, то такую же кодогенерацию делает любая функция, которая что-то возвращает :)</p>
<p>mihailt (00:41:50 20/04/2008)<br />
во</p>
<p>mihailt (00:41:53 20/04/2008)<br />
ты понял</p>
<p>fxposter (00:42:02 20/04/2008)<br />
я бы сказал так:</p>
<p>mihailt (00:42:05 20/04/2008)<br />
только не что-то</p>
<p>mihailt (00:42:12 20/04/2008)<br />
а код</p>
<p>fxposter (00:42:14 20/04/2008)<br />
нет</p>
<p>fxposter (00:42:16 20/04/2008)<br />
смотри</p>
<p>fxposter (00:42:34 20/04/2008)<br />
кодогенерация - это когда мы генерируем код на том же уровне, на котором был написан изначальный</p>
<p>fxposter (00:43:06 20/04/2008)<br />
ну или как-то так</p>
<p>mihailt (00:43:12 20/04/2008)<br />
ну типо того</p>
<p>fxposter (00:43:24 20/04/2008)<br />
а то получается, что<br />
echo &#8220;&lt;html&gt;&#8230;&#8221;;<br />
это тоже кодогенерация</p>
<p>mihailt (00:43:44 20/04/2008)<br />
неее</p>
<p>fxposter (00:43:47 20/04/2008)<br />
ага ;)</p>
<p>fxposter (00:44:06 20/04/2008)</p>
<p>echo &#8220;&lt;html&gt;&#8230;&#8221;;</p>
<p>это выражение генерирует html-код</p>
<p>fxposter (00:44:12 20/04/2008)<br />
как и Zend_Form</p>
<p>mihailt (00:45:01 20/04/2008)<br />
нее ну в принципе круто, только почему то все равно не цепляет</p>
<p>mihailt (00:45:05 20/04/2008)<br />
но хз</p>
<p>fxposter (00:45:07 20/04/2008)<br />
:-D</p>
<p>fxposter (00:45:09 20/04/2008)<br />
:)</p>
<p>mihailt (00:45:14 20/04/2008)<br />
может я передумаю</p>
<p>fxposter (00:45:23 20/04/2008)<br />
писец, вот это у нас матёро пошел разговор</p>
<p>mihailt (00:45:24 20/04/2008)<br />
говорю озадачил ты меня</p>
<p>mihailt (00:45:31 20/04/2008)<br />
да конкретно так</p>
<p>mihailt (00:45:42 20/04/2008)<br />
по гиковски</p>
<p>fxposter (00:45:48 20/04/2008)<br />
просто суть в чем</p>
<p>fxposter (00:45:57 20/04/2008)<br />
есть неправильный код</p>
<p>fxposter (00:46:05 20/04/2008)<br />
там много характеристик</p>
<p>fxposter (00:46:59 20/04/2008)<br />
но две из них:<br />
1. дублирование<br />
2. решение одной задачи во многих местах - расплылось решение по разным классам/функциям/файлам</p>
<p>fxposter (00:47:17 20/04/2008)<br />
вот оба эти недостатка в себе сочетает подход с input&#8217;ами</p>
<p>fxposter (00:47:26 20/04/2008)<br />
и устраняется form-обьектами</p>
<p>fxposter (00:48:03 20/04/2008)<br />
кстати</p>
<p>fxposter (00:48:06 20/04/2008)<br />
!!!</p>
<p>fxposter (00:48:10 20/04/2008)<br />
офигенный аналог</p>
<p>fxposter (00:48:18 20/04/2008)<br />
источник данных</p>
<p>fxposter (00:48:23 20/04/2008)<br />
ORM!</p>
<p>fxposter (00:48:31 20/04/2008)<br />
ну, или wrapper таблицы</p>
<p>fxposter (00:48:35 20/04/2008)<br />
или как в CI</p>
<p>fxposter (00:48:38 20/04/2008)<br />
непринципиально</p>
<p>mihailt (00:48:51 20/04/2008)<br />
ну,</p>
<p>fxposter (00:48:53 20/04/2008)<br />
вместо того, чтобы писать в разных местах селекты</p>
<p>fxposter (00:48:55 20/04/2008)<br />
и прочее</p>
<p>fxposter (00:49:06 20/04/2008)<br />
мы инкапсулируем это всё в одном обьекте</p>
<p>mihailt (00:49:11 20/04/2008)<br />
так</p>
<p>fxposter (00:49:13 20/04/2008)<br />
и работаем уже с ним</p>
<p>fxposter (00:49:21 20/04/2008)<br />
предварительно его настроив</p>
<p>fxposter (00:49:33 20/04/2008)<br />
указав имя таблицы, поля и т.д.</p>
<p>fxposter (00:49:40 20/04/2008)<br />
вот с формами - ТО ЖЕ САМОЕ</p>
<p>fxposter (00:49:41 20/04/2008)<br />
пипец</p>
<p>fxposter (00:49:44 20/04/2008)<br />
1 в 1 почти</p>
<p>mihailt (00:50:12 20/04/2008)<br />
забавно</p>
<p>mihailt (00:51:02 20/04/2008)<br />
н в принципе наверное так и должно быть</p>
<p>fxposter (00:51:14 20/04/2008)<br />
блин :)</p>
<p>fxposter (00:51:21 20/04/2008)<br />
я этот разговор выложу на блог :)</p>
<p>fxposter (00:51:32 20/04/2008)<br />
твоё имя упоминать? :)</p>
<p>mihailt (00:51:47 20/04/2008)<br />
давай</p>
<p>mihailt (00:51:59 20/04/2008)<br />
дашь травки немного</p>
<p>mihailt (00:52:00 20/04/2008)<br />
)</p>
<p>fxposter (00:52:04 20/04/2008)<br />
ага :)</p>
<p>mihailt (00:52:17 20/04/2008)<br />
продолжая</p>
<p>mihailt (00:52:29 20/04/2008)<br />
какая разница то, чего именно мы инкапсулируем?</p>
<p>fxposter (00:53:00 20/04/2008)<br />
в смысле?</p>
<p>fxposter (00:53:10 20/04/2008)<br />
я не совсем так выразился</p>
<p>mihailt (00:53:11 20/04/2008)<br />
есть объект и мы с ним работаем</p>
<p>fxposter (00:53:17 20/04/2008)<br />
не инкапсулируем</p>
<p>fxposter (00:53:24 20/04/2008)<br />
хотя и инкапсулируем то же</p>
<p>fxposter (00:53:27 20/04/2008)<br />
*тоже</p>
<p>mihailt (00:53:33 20/04/2008)<br />
нее погоди</p>
<p>mihailt (00:53:38 20/04/2008)<br />
я щас</p>
<p>fxposter (00:54:04 20/04/2008)<br />
мы убираем дублирование пряча в один обьект функции/данные и т.д., которые отвечают за нечто общее</p>
<p>mihailt (00:54:13 20/04/2008)<br />
во</p>
<p>mihailt (00:54:30 20/04/2008)<br />
а что общее нам обсолютно пофиг</p>
<p>mihailt (00:54:38 20/04/2008)<br />
абсолютно</p>
<p>fxposter (00:54:43 20/04/2008)<br />
ну естественно :)</p>
<p>fxposter (00:55:03 20/04/2008)<br />
опять же - два недостатка:</p>
<p>1. дублирование<br />
2. решение одной задачи во многих местах - расплылось решение по разным классам/функциям/файлам</p>
<p>fxposter (00:55:09 20/04/2008)<br />
вот они во всей красе</p>
<p>mihailt (00:55:36 20/04/2008)<br />
так а чего дублируется то?</p>
<p>fxposter (00:55:46 20/04/2008)<br />
возьмем select</p>
<p>mihailt (00:56:06 20/04/2008)<br />
я кароче походу врубился что зенд_форм хорошая вещь</p>
<p>mihailt (00:56:11 20/04/2008)<br />
:)</p>
<p>fxposter (00:56:25 20/04/2008)<br />
возьмем селект</p>
<p>fxposter (00:56:56 20/04/2008)<br />
function select(table, array columns, where)</p>
<p>fxposter (00:57:02 20/04/2008)<br />
можно еще добавить всего</p>
<p>fxposter (00:57:09 20/04/2008)<br />
order там и прочее</p>
<p>fxposter (00:57:32 20/04/2008)<br />
если у нас на каждую таблицу 1 класс - то мы и table убираем</p>
<p>mihailt (00:57:58 20/04/2008)<br />
ну и где дублирование?</p>
<p>fxposter (00:58:06 20/04/2008)<br />
и получается, чтобы вместо &#8220;SELECT columns FROM TABLE WHERE&#8221; и т.д. мы вызываем одну функцию</p>
<p>mihailt (00:58:25 20/04/2008)<br />
угу ты придумал хелпер</p>
<p>fxposter (00:58:32 20/04/2008)<br />
:)</p>
<p>fxposter (00:58:42 20/04/2008)<br />
я придумал active record еще скажи :)</p>
<p>fxposter (00:58:59 20/04/2008)<br />
это обычный table gateway (есть такой паттерн)</p>
<p>mihailt (00:59:39 20/04/2008)<br />
у банды в четырёх он есть?</p>
<p>fxposter (00:59:42 20/04/2008)<br />
нет</p>
<p>fxposter (00:59:47 20/04/2008)<br />
он у фаулера есть</p>
<p>mihailt (00:59:52 20/04/2008)<br />
ок</p>
<p>fxposter (00:59:53 20/04/2008)<br />
в Patterns of EEA</p>
<p>fxposter (00:59:55 20/04/2008)<br />
или EAA</p>
<p>fxposter (00:59:58 20/04/2008)<br />
:)</p>
<p>fxposter (01:00:12 20/04/2008)<br />
или AAE</p>
<p>fxposter (01:00:15 20/04/2008)<br />
блие</p>
<p>fxposter (01:00:17 20/04/2008)<br />
блин</p>
<p>mihailt (01:00:18 20/04/2008)<br />
типа ентерпрайз чего-то там?</p>
<p>fxposter (01:00:23 20/04/2008)<br />
ага</p>
<p>mihailt (01:00:29 20/04/2008)<br />
понял</p>
<p>fxposter (01:00:31 20/04/2008)<br />
EAA</p>
<p>fxposter (01:00:35 20/04/2008)<br />
всё-таки</p>
<p>mihailt (01:00:51 20/04/2008)<br />
не суть давай дальше</p>
<p>fxposter (01:00:55 20/04/2008)<br />
далее - насчет дублирования</p>
<p>fxposter (01:01:06 20/04/2008)<br />
тебе нужно выбрать N статей</p>
<p>fxposter (01:01:10 20/04/2008)<br />
в нескольких местах</p>
<p>fxposter (01:01:20 20/04/2008)<br />
пишешь sql - вот тебе дублирование</p>
<p>fxposter (01:01:30 20/04/2008)<br />
делаешь функцию с параметром N - вот его и нет</p>
<p>fxposter (01:01:46 20/04/2008)<br />
+ код, который работает с бд обьединен в одном месте</p>
<p>mihailt (01:01:54 20/04/2008)<br />
extends млин</p>
<p>fxposter (01:02:01 20/04/2008)<br />
;)</p>
<p>mihailt (01:02:56 20/04/2008)<br />
а ZF начинает такое делать для ХНТМL</p>
<p>fxposter (01:03:05 20/04/2008)<br />
в смысле?</p>
<p>mihailt (01:03:23 20/04/2008)<br />
в смысле зенд_форм</p>
<p>fxposter (01:03:50 20/04/2008)<br />
там, кстати, насколько я помню еще и html поддерживается :)</p>
<p>fxposter (01:04:03 20/04/2008)<br />
по крайней мере что-то с хелперами проскакивало</p>
<p>fxposter (01:04:13 20/04/2008)<br />
типа - есть поле isXhtml</p>
<p>fxposter (01:04:34 20/04/2008)<br />
и в зависимости от него оно input-хелперы раньше генерировало</p>
<p>mihailt (01:04:38 20/04/2008)<br />
в итоге получаем что пхп деву с хтмл  вобще работать не нужно будет</p>
<p>fxposter (01:04:51 20/04/2008)<br />
не совсем</p>
<p>fxposter (01:05:00 20/04/2008)<br />
вот форму нужно выводить</p>
<p>mihailt (01:05:16 20/04/2008)<br />
не смотри</p>
<p>fxposter (01:05:16 20/04/2008)<br />
ты можешь описать в самой форме -как ты её будешь выводить</p>
<p>fxposter (01:05:25 20/04/2008)<br />
таблицами</p>
<p>fxposter (01:05:29 20/04/2008)<br />
списками и т.д.</p>
<p>mihailt (01:05:36 20/04/2008)<br />
погоди</p>
<p>fxposter (01:05:40 20/04/2008)<br />
в каком-нибудь From_View</p>
<p>fxposter (01:05:44 20/04/2008)</p>
<p>mihailt (01:05:50 20/04/2008)<br />
смотри</p>
<p>fxposter (01:05:57 20/04/2008)<br />
экземпляр которого будет храниться в Zend_From</p>
<p>fxposter (01:05:58 20/04/2008)<br />
lf</p>
<p>fxposter (01:05:59 20/04/2008)<br />
да</p>
<p>mihailt (01:06:35 20/04/2008)<br />
у нас есть код который берет чего нить из бд и создаёт структуру докумунта</p>
<p>mihailt (01:06:47 20/04/2008)<br />
семантически правилный</p>
<p>fxposter (01:07:00 20/04/2008)<br />
это ты к Zend_Form</p>
<p>fxposter (01:07:06 20/04/2008)<br />
или вообще</p>
<p>fxposter (01:07:07 20/04/2008)<br />
?</p>
<p>mihailt (01:07:23 20/04/2008)<br />
вобще более глобально</p>
<p>fxposter (01:07:26 20/04/2008)<br />
ага</p>
<p>fxposter (01:07:27 20/04/2008)<br />
ну</p>
<p>mihailt (01:07:38 20/04/2008)<br />
делаем это так</p>
<p>mihailt (01:07:51 20/04/2008)<br />
после того как получили пишем</p>
<p>mihailt (01:08:14 20/04/2008)<br />
$output = new $html;</p>
<p>mihailt (01:08:40 20/04/2008)<br />
а дальше appendChild</p>
<p>fxposter (01:08:49 20/04/2008)<br />
гм</p>
<p>fxposter (01:09:00 20/04/2008)<br />
тебя куда-то не туда понесло</p>
<p>fxposter (01:09:03 20/04/2008)<br />
ты о чем?)</p>
<p>mihailt (01:09:21 20/04/2008)<br />
ну смотри что делает зенд_форм?</p>
<p>mihailt (01:09:27 20/04/2008)<br />
генерит форму</p>
<p>fxposter (01:09:41 20/04/2008)<br />
смотри</p>
<p>fxposter (01:09:46 20/04/2008)<br />
в общем случае</p>
<p>fxposter (01:09:57 20/04/2008)<br />
ты, например, наследуешь от зенд-форм</p>
<p>mihailt (01:10:00 20/04/2008)<br />
а в чем проблема сделать класс который будет весь документ генерит?</p>
<p>fxposter (01:10:13 20/04/2008)<br />
и указываешь ему, какие поля и что должно там быть</p>
<p>fxposter (01:10:29 20/04/2008)<br />
проблемы нет</p>
<p>fxposter (01:10:38 20/04/2008)<br />
тебе View&#8217;ха его и генерит по сути</p>
<p>fxposter (01:10:39 20/04/2008)</p>
<p>fxposter (01:11:23 20/04/2008)<br />
а вообще - да, можно на всё делать обьекты</p>
<p>fxposter (01:11:30 20/04/2008)<br />
собственно, DOM - это оно и есть</p>
<p>mihailt (01:11:32 20/04/2008)<br />
мне это почему то XSLT очень силно напоминает</p>
<p>mihailt (01:11:54 20/04/2008)<br />
правда я с ним не работал</p>
<p>fxposter (01:11:55 20/04/2008)<br />
только не очень удобно работать на этом уровне с тегами</p>
<p>fxposter (01:11:58 20/04/2008)<br />
я тоже</p>
<p>fxposter (01:12:07 20/04/2008)<br />
вот что-то типа такого</p>
<p>mihailt (01:13:06 20/04/2008)<br />
но в принципе получается правилно, программист занят своим делом а именно составлением программы и обработкой данных а остальное его не касается</p>
<p>fxposter (01:13:28 20/04/2008)<br />
$doc = new Document($content); // content - то, что получили из базы<br />
$doc-&gt;setSidebar($sidebar); // если нам нужно использовать не default&#8217;ный sidebar, например</p>
<p>fxposter (01:13:54 20/04/2008)<br />
давай опустимся несколько ниже</p>
<p>fxposter (01:13:58 20/04/2008)<br />
на уровень MVC</p>
<p>mihailt (01:14:05 20/04/2008)<br />
давай</p>
<p>fxposter (01:14:17 20/04/2008)<br />
есть модель, есть её вьюха, есть контроллер</p>
<p>mihailt (01:14:28 20/04/2008)<br />
кастати мне его в последнее время не хватает</p>
<p>mihailt (01:14:40 20/04/2008)<br />
ок</p>
<p>fxposter (01:14:52 20/04/2008)<br />
пойми, что то, что реализовано в фреймворках - это не единое применение</p>
<p>fxposter (01:15:00 20/04/2008)<br />
берем Zend_Form</p>
<p>fxposter (01:15:13 20/04/2008)<br />
модель - это поля, валидаторы и прочее</p>
<p>fxposter (01:15:21 20/04/2008)<br />
именно логически</p>
<p>mihailt (01:15:40 20/04/2008)<br />
ну</p>
<p>fxposter (01:15:44 20/04/2008)<br />
контроллер - какие-нибудь внутренние события, обработчики и т.д.</p>
<p>fxposter (01:15:56 20/04/2008)<br />
в данном случае мне придмать что-то сложно</p>
<p>fxposter (01:16:12 20/04/2008)<br />
а view&#8217;ха - это то, что из себя эта форма представляет в html</p>
<p>mihailt (01:16:32 20/04/2008)<br />
погоди ты к чему? типа куда зенд_форм?</p>
<p>fxposter (01:16:36 20/04/2008)<br />
т.е. мы разделили сам Zend_Form на MVC-составляющие</p>
<p>mihailt (01:16:42 20/04/2008)<br />
аа ну</p>
<p>fxposter (01:17:00 20/04/2008)<br />
&gt; но в принципе получается правилно, программист занят своим делом а именно составлением программы и обработкой данных а остальное его не касается</p>
<p>fxposter (01:17:24 20/04/2008)<br />
программист даже в Zend_Form может заняться моделью и контроллером</p>
<p>fxposter (01:17:35 20/04/2008)<br />
оставив вьюху верстальщику</p>
<p>mihailt (01:17:47 20/04/2008)<br />
именно</p>
<p>fxposter (01:17:50 20/04/2008)<br />
т.е. всё так же, как и с обычными страницами</p>
<p>fxposter (01:18:02 20/04/2008)<br />
только на следующем уровне</p>
<p>fxposter (01:18:07 20/04/2008)<br />
внутри самой страницы</p>
<p>fxposter (01:18:18 20/04/2008)<br />
и так можно описывать любые элементы страницы</p>
<p>fxposter (01:18:26 20/04/2008)<br />
хедер, футер, меню, логотип</p>
<p>fxposter (01:18:31 20/04/2008)<br />
как тебе удобно</p>
<p>fxposter (01:18:37 20/04/2008)<br />
но это в теории</p>
<p>mihailt (01:18:37 20/04/2008)<br />
ну это уже NMVC получается, нет?</p>
<p>fxposter (01:18:46 20/04/2008)<br />
что такое N?</p>
<p>mihailt (01:18:56 20/04/2008)<br />
типа nested</p>
<p>fxposter (01:18:57 20/04/2008)<br />
на практике такое вряд ли будет</p>
<p>fxposter (01:19:01 20/04/2008)</p>
<p>fxposter (01:19:13 20/04/2008)<br />
я такой терминологии не слышал, но так сказать можно</p>
<p>mihailt (01:19:46 20/04/2008)<br />
ну компонетный подход где каздй компонет проектируется по MVC</p>
<p>fxposter (01:20:01 20/04/2008)<br />
честно?</p>
<p>mihailt (01:20:08 20/04/2008)<br />
?</p>
<p>fxposter (01:20:08 20/04/2008)<br />
я с таким подходом не знаком</p>
<p>mihailt (01:20:19 20/04/2008)<br />
гм</p>
<p>fxposter (01:20:25 20/04/2008)<br />
т.е. я представляю, что оно такое</p>
<p>fxposter (01:20:34 20/04/2008)<br />
но никогда в лоб не сталкивался</p>
<p>fxposter (01:20:41 20/04/2008)<br />
почему формы сюда попали (в категорию выделяемых в отдельный обьект), а остальные компоненты - нет</p>
<p>fxposter (01:21:24 20/04/2008)<br />
ну во первых, формы - это более общее понятие, типа Page, Document и т.д., ккоторые уже на MVC как раз разделены. А еще потому, что формы нужно обрабатывать</p>
<p>fxposter (01:21:30 20/04/2008)<br />
на сервере</p>
<p>mihailt (01:22:11 20/04/2008)<br />
кстати про валидацию</p>
<p>mihailt (01:22:37 20/04/2008)<br />
в последнее время не вижу смысла в ней на стороне клиента</p>
<p>fxposter (01:22:42 20/04/2008)</p>
<p>fxposter (01:23:01 20/04/2008)<br />
ну у меня к валидации смешанные чувства</p>
<p>mihailt (01:23:08 20/04/2008)<br />
осjбенно при работе с ajax</p>
<p>fxposter (01:23:09 20/04/2008)<br />
стараюсь делать код валидным</p>
<p>fxposter (01:23:19 20/04/2008)<br />
но в принципе - не гонюсь за этим</p>
<p>mihailt (01:23:29 20/04/2008)<br />
нее</p>
<p>mihailt (01:23:37 20/04/2008)<br />
я про валидацию данных</p>
<p>mihailt (01:23:43 20/04/2008)<br />
из формы</p>
<p>fxposter (01:23:56 20/04/2008)<br />
а</p>
<p>fxposter (01:24:06 20/04/2008)<br />
я её никогда не делал</p>
<p>fxposter (01:24:14 20/04/2008)<br />
смысл вижу явно</p>
<p>fxposter (01:24:20 20/04/2008)<br />
но не делал</p>
<p>mihailt (01:24:34 20/04/2008)<br />
стандартная хрен форма-валидация(клиент)-валидация(сервер)</p>
<p>fxposter (01:24:39 20/04/2008)<br />
смысл - БЫСТРО, реально БЫСТРО сказать пользователю, что он ввел фигню</p>
<p>mihailt (01:25:30 20/04/2008)<br />
при использовани ajax  все равно не вижу</p>
<p>fxposter (01:25:50 20/04/2008)<br />
пройдет пол секунды, пока ты получишь ответ с сервера</p>
<p>fxposter (01:25:56 20/04/2008)<br />
в лучшем случае - меньше</p>
<p>fxposter (01:26:06 20/04/2008)<br />
но не абсолютно быстро</p>
<p>mihailt (01:26:34 20/04/2008)<br />
зато не будет безумных алёртов</p>
<p>fxposter (01:26:42 20/04/2008)<br />
+ нет дополнительных запросов к серваку, но для меня это на данный момент пока что не главный фактоп</p>
<p>fxposter (01:26:45 20/04/2008)<br />
фактор</p>
<p>fxposter (01:27:05 20/04/2008)<br />
&gt; зато не будет безумных алёртов<br />
не обязательно делать алерты</p>
<p>mihailt (01:27:16 20/04/2008)<br />
а если так же апдейтит див то вобще пофиг запрос всё равно есть</p>
<p>fxposter (01:27:27 20/04/2008)<br />
можно сделать сообщения об ошибках неотличимыми при серверной проверке и клиентской</p>
<p>fxposter (01:28:02 20/04/2008)<br />
я тебе могу сказать одно</p>
<p>mihailt (01:28:11 20/04/2008)<br />
типа генерить хтмл во внутрь елемента по ид?</p>
<p>fxposter (01:28:13 20/04/2008)<br />
валидация на клиенте не необходима</p>
<p>fxposter (01:28:15 20/04/2008)<br />
но удобна</p>
<p>fxposter (01:28:21 20/04/2008)<br />
да</p>
<p>fxposter (01:28:25 20/04/2008)<br />
или просто по селектору</p>
<p>fxposter (01:28:29 20/04/2008)<br />
непринципиально</p>
<p>mihailt (01:28:46 20/04/2008)<br />
ну допустим</p>
<p>mihailt (01:28:47 20/04/2008)<br />
но</p>
<p>mihailt (01:28:58 20/04/2008)<br />
получается тоже саме дублирование</p>
<p>fxposter (01:29:05 20/04/2008)<br />
ага</p>
<p>fxposter (01:29:11 20/04/2008)<br />
но на разных уровнях</p>
<p>fxposter (01:29:18 20/04/2008)<br />
это раз</p>
<p>fxposter (01:29:50 20/04/2008)<br />
и два - в теории никто не запрещает делать так, чтобы тот же Zend_From генерировал код с проверками на клиенте</p>
<p>fxposter (01:30:04 20/04/2008)<br />
т.е. описываем мы форму 1 раз</p>
<p>fxposter (01:30:13 20/04/2008)<br />
а проверки оно всё само делает</p>
<p>mihailt (01:30:36 20/04/2008)<br />
хрено получается на мой взгляд, код смешивается</p>
<p>fxposter (01:30:48 20/04/2008)<br />
нет</p>
<p>mihailt (01:30:54 20/04/2008)<br />
в смысле в самом зенд_форм</p>
<p>fxposter (01:30:57 20/04/2008)<br />
нет</p>
<p>fxposter (01:31:04 20/04/2008)<br />
Zend_Form_View</p>
<p>fxposter (01:31:11 20/04/2008)<br />
такого класса, наверное, нет</p>
<p>fxposter (01:31:16 20/04/2008)<br />
но суть понятна</p>
<p>mihailt (01:31:21 20/04/2008)<br />
:D</p>
<p>fxposter (01:31:23 20/04/2008)<br />
ты наследуешься от него</p>
<p>fxposter (01:31:45 20/04/2008)<br />
и в зависимости от валидаторов серверных - делаешь js-проверки</p>
<p>mihailt (01:32:13 20/04/2008)<br />
придумали новый класс в zf&#8217;е осталось только написать и заккомитить</p>
<p>mihailt (01:32:19 20/04/2008)<br />
:D</p>
<p>fxposter (01:32:22 20/04/2008)<br />
не думаю</p>
<p>fxposter (01:32:42 20/04/2008)<br />
всё равно там zend-form разделено на модель и представление</p>
<p>fxposter (01:32:44 20/04/2008)<br />
или нет?</p>
<p>fxposter (01:32:54 20/04/2008)<br />
я не знаю, я zend-form не использовал</p>
<p>fxposter (01:33:05 20/04/2008)<br />
я больше по symfony 1.1 forms сужу</p>
<p>fxposter (01:33:12 20/04/2008)<br />
но суть работы та же</p>
<p>fxposter (01:33:55 20/04/2008)<br />
т.е. можешь считать, что я тут говорил о неком Zend_Form, который в чем-то от настоящего Zend_Form отличается</p>
<p>fxposter (01:34:06 20/04/2008)<br />
но суть не меняет</p>
<p>mihailt (01:34:39 20/04/2008)<br />
setAction(&#8217;/usr/login&#8217;)<br />
-&gt;setMethod(&#8217;post&#8217;);</p>
<p>// Create and configure username element:<br />
$username = $form-&gt;createElement(&#8217;text&#8217;, &#8216;username&#8217;);<br />
$username-&gt;addValidator(&#8217;alnum&#8217;)<br />
-&gt;addValidator(&#8217;regex&#8217;, false, array(&#8217;/^[a-z]+/&#8217;))<br />
-&gt;addValidator(&#8217;stringLength&#8217;, false, array(6, 20))<br />
-&gt;setRequired(true)<br />
-&gt;addFilter(&#8217;StringToLower&#8217;);</p>
<p>// Create and configure password element:<br />
$password = $form-&gt;createElement(&#8217;password&#8217;, &#8216;password&#8217;);<br />
$password-&gt;addValidator(&#8217;StringLength&#8217;, false, array(6))<br />
-&gt;setRequired(true);</p>
<p>// Add elements to form:<br />
$form-&gt;addElement($username)<br />
-&gt;addElement($password)<br />
// use addElement() as a factory to create &#8216;Login&#8217; button:<br />
-&gt;addElement(&#8217;submit&#8217;, &#8216;login&#8217;, array(&#8217;label&#8217; =&gt; &#8216;Login&#8217;));<br />
?&gt;</p>
<p>fxposter (01:34:56 20/04/2008)<br />
мм</p>
<p>fxposter (01:35:08 20/04/2008)<br />
я бы всё это сделал в наследние Zend_Form&#8217;а</p>
<p>fxposter (01:35:30 20/04/2008)<br />
и мог бы потом reuse&#8217;ить такую форму логина во многих местах</p>
<p>mihailt (01:35:58 20/04/2008)<br />
ну это нормально</p>
<p>mihailt (01:36:26 20/04/2008)<br />
я про клентскую часть</p>
<p>mihailt (01:36:40 20/04/2008)<br />
$username-&gt;addValidator(&#8217;alnum&#8217;)</p>
<p>mihailt (01:37:00 20/04/2008)<br />
$username-&gt;addValidator(&#8217;alnum&#8217;,'clientside&#8217;)</p>
<p>mihailt (01:37:11 20/04/2008)<br />
ну или что то типо того</p>
<p>mihailt (01:37:30 20/04/2008)<br />
по моему нормально</p>
<p>fxposter (01:38:22 20/04/2008)<br />
да</p>
<p>fxposter (01:38:36 20/04/2008)<br />
в зенде есть zend_from_decorator</p>
<p>fxposter (01:38:47 20/04/2008)<br />
который отвечает за отрисовку этого всего в html</p>
<p>fxposter (01:38:55 20/04/2008)<br />
судя по всему</p>
<p>mihailt (01:40:00 20/04/2008)<br />
угу принимет 3 аргумента</p>
<p>mihailt (01:40:39 20/04/2008)<br />
содержимое, элемент и параметры</p>
<p>mihailt (01:40:50 20/04/2008)<br />
смотрю на ман</p>
<p>mihailt (01:41:35 20/04/2008)<br />
в принципе его для такого дела тоже можно заюзать</p>
<p>fxposter (01:43:01 20/04/2008)<br />
ну вот он и должен в зависимости от валидаторов серверных, добавленных к элементу писать дополнительный js-код</p>
<p>fxposter (01:44:41 20/04/2008)<br />
отдельные валидаторы для клиента прописывать - имхо, не есть хорошо. хотя - всё может быть.</p>
<p>fxposter (01:44:44 20/04/2008)<br />
ы</p>
<p>mihailt (01:44:51 20/04/2008)<br />
хмм</p>
<p>mihailt (01:45:01 20/04/2008)<br />
во</p>
<p>mihailt (01:45:03 20/04/2008)<br />
Zend_Form_Decorator_Errors</p>
<p>fxposter (01:45:05 20/04/2008)<br />
кстати, еще хорошо бы в валидаторы добавить<br />
Zend_Validator_View</p>
<p>fxposter (01:45:07 20/04/2008)<br />
)))))))))0</p>
<p>mihailt (01:45:12 20/04/2008)<br />
вот он должен</p>
<p>fxposter (01:45:25 20/04/2008)<br />
нет</p>
<p>fxposter (01:45:30 20/04/2008)<br />
он выводит ошибки</p>
<p>fxposter (01:45:33 20/04/2008)<br />
просто выводит</p>
<p>fxposter (01:45:38 20/04/2008)<br />
если они уже найдены</p>
<p>mihailt (01:46:46 20/04/2008)<br />
хмм</p>
<p>mihailt (01:46:49 20/04/2008)<br />
тоже верно</p>
<p>fxposter (01:46:49 20/04/2008)<br />
в общем, тут долго можно размышлять</p>
<p>fxposter (01:47:00 20/04/2008)<br />
но вряд ли это будет сделано в таком виде</p>
<p>mihailt (01:47:13 20/04/2008)<br />
даа ZF можно очень долго копать</p>
<p>fxposter (01:47:23 20/04/2008)</p>
<p>fxposter (01:47:25 20/04/2008)<br />
угу</p>
<p>fxposter (01:47:42 20/04/2008)<br />
ладно, пойду я спать</p>
<p>mihailt (01:47:57 20/04/2008)<br />
даа, чего то я тоже засиделся</p>
<p>mihailt (01:48:03 20/04/2008)<br />
но поговорили хорошо</p>
<p>fxposter (01:48:09 20/04/2008)<br />
ага</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/04/20/programming-talks/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Symfony: как начать</title>
		<link>http://blog.fxposter.org/2008/02/26/symfony-how-to-begin/</link>
		<comments>http://blog.fxposter.org/2008/02/26/symfony-how-to-begin/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 22:41:03 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/02/26/symfony-how-to-begin/</guid>
		<description><![CDATA[Чем больше я работаю над своим первым проектом на работе, тем больше мне хочется в нем поменять и тем больше я жалею о том, что перед началом работы я не прочитал до конца «The Definitive Guide to Symfony» и не изучил плагины для Symfony. Многие из них мне бы помогли намного сократить время разработки и, [...]]]></description>
			<content:encoded><![CDATA[<p>Чем больше я работаю над своим первым проектом на работе, тем больше мне хочется в нем поменять и тем больше я жалею о том, что перед началом работы я не прочитал до конца «<a href="http://www.symfony-project.org/book/1_0/">The Definitive Guide to Symfony</a>» и не изучил <a href="http://trac.symfony-project.com/wiki/SymfonyPlugins">плагины</a> для <a href="http://www.symfony-project.org/">Symfony</a>. Многие из них мне бы помогли намного сократить время разработки и, что самое главное, не думать о том, как красиво реализовать те или иные вещи… И еще одно — если у вас уже есть кусок системы (как это было у меня), который вы собираетесь переписывать с использованием вашего фреймворка (или просто переписывать, потому что код вам не нравиться) — то мой вам совет — <strong>потратьте время на то, чтобы спроектировать этот кусок на план вашей новой системы, не бросайтесь сразу всё переписывать</strong> (каюсь, я поступил именно так), так как после анализа (который, возможно, займет у вас не один день, и даже не одну неделю), возможно, от предыдущей архитектуры системы не останется и следа.</p>
<p><em>Вообще, я люблю проектировать, продумывать, анализировать те или иные решения, которые хочу внедрить в систему (хотя, признаюсь, опыта у меня в этом маловато), но как обьяснить заказчику, что ты провел день в раздумьях… Эх…</em></p>
<p>Ну ладно, это я отвлекся. Сегодня хочется рассказать о том, с чего стоит начать при разработке системы с помощью Symfony и каких правил следует придерживаться.</p>
<p><span id="more-368"></span>Собственно, всё начинается с создания проекта (project) и приложений (applications) в нем. Как это делается — можно почитать в книжке (ссылка приведена выше), а мне бы хотелось остановиться на обьяснении того, что такое проект и принципах выбора приложений в нем — какие им дать имена, как их структурировать и т.д.</p>
<h4>Проект</h4>
<p>Насколько я понял, в общем случае предполагается, что проект у вас будет один на весь сайт, и он будет представлять собой некое хранилище приложений, конфигурационных файлов и моделей, которыми будут пользоваться все приложения этого проекта.</p>
<h4>Приложения</h4>
<p>В отличии от <a href="http://www.djangoproject.com/">Django</a> — здесь приложение не является атомарной единицей системы, которую можно использовать в других проектах… В Symfony они созданы лишь для того, чтобы логически (ну, и физически) разграничить функциональность вашего проекта. И самое главное — приложения имеют место быть только в рамках одного проекта. Т.е. если вы в рамках проекта удалите одно приложение — другие от этого не пострадают, но вот перенести из одного проекта в другой приложение будет очень проблематично, т. к. оно зависит от настроек проекта, от модели проекта и так далее.</p>
<p>Будет нелишним сказать, что официально рекомендовано (читать как «предлагается») в проекте создавать два приложения: frontend и backend (для русскоязычной аудитории термин «админка» в данном случае будет более уместен). Сам могу порекомендовать создавать приложения только для объединения модулей, которые ставят перед собой одну цель. Например, та же админка, пользовательский интерфейс (то есть, например, профиль пользователя, всё, что пользователь может изменять на сайте) и frontend (всё, что доступно всем).</p>
<p><em>Сам я пользуюсь рекомендацией книги и имею два приложения в своем проекте.</em></p>
<p>Плюсы и минусы такого подхода мне рассматривать не хочется. Скажу лишь, что для меня Django’вский подход гораздо более удобен и логичен, и вот эти проекты/приложения для новичка выглядят достаточно сложно и непонятно, в большинстве случаев новички просто слушаются рекомендаций книги, не совсем понимая, что это и зачем это нужно. Я бы на месте разработчиков Symfony подумал бы о пересмотре этого подхода, особенно, если учитывать, что плагины в Symfony — это по сути те же Django apps, но об этом несколько позже.</p>
<h4>Окружения (environments)</h4>
<p>Останавливаться на окружениях особенно не хочется. Это очень удобный, но в то же время очень простой механизм, обеспечивающий возможность заходить в одно и то же приложение с различными серверными настройками. Если сказать проще — представьте себе, что у вас есть приложения и галочка, которая переключает режим его работы в debug-mode и обратно. В debug-mode, например, все события логгируются, все ошибки выводятся на экран и т.д. Если же debug-mode выключен — все логи выключены, и на экране никогда никаких ошибок появляться не будет. Так вот — в Symfony вместо флага debug/<nobr>не-debug</nobr> имеется просто несколько различных окружений, каждое из которых можно настроить ПОЛНОСТЬЮ, т. е. не система решает — что включить, а что выключить, а вы сами. Хочется также отметить, что особо копаться в настройках вам не прийдется — по умолчанию для каждого приложения создается 3 environment’а: production, development, testing (используется исключительно при тестировании).</p>
<p>В общем, тут придраться не к чему — всё, на мой взгляд, просто идеально.</p>
<h4>Модули (modules)</h4>
<p>… содержат в себе контроллер с действиями и представления (т.е. MV из <a href="http://ru.wikipedia.org/wiki/Model-view-controller">MVC</a>), а также конфигурационные файлы и, возможно, библиотеки, нужные только в этом конкретном модуле. Тут всё достаточно просто и понятно.</p>
<p>Модули (как и приложения с проектом) можно создавать автоматически (и помощью командной строки). Кроме создания простого модуля можно создать (опять же — автоматически) <a href="http://en.wikipedia.org/wiki/Create%2C_read%2C_update_and_delete">CRUD</a> (<a href="http://en.wikipedia.org/wiki/Scaffold_%28programming%29">Scaffolding</a>) для одной из таблиц, либо админку (опять же, для одной из таблиц). Админка отличается тем, что никакого кода писать практически не нужно — почти всё в ней (фильтрация, сортировка и т.д.) настраивается с помощью конфигурационного файла, что ОЧЕНЬ удобно (привет джангистам, они поймут). CRUD же очень полезен при начальных стадиях разработки. Пример — добавили вы таблицу пользователей, теперь вам нужно: выводить список пользователей, позволять им редактировать свой профиль и регистрироваться. Вместо того, чтобы всё писать с самого начала — создаем CRUD-модуль для таблицы пользователей, а потом уже можно начинать писать свой код, основываясь на уже сгенерированном. В неявный плюс такого решения можно отнести то, что коды модулей получаются похожими друг на друга и путаницы возникает меньше.</p>
<p>Последнее, на чем хотелось бы остановиться — это…</p>
<h4>Модели (models)</h4>
<p>Все модели хранятся в одном (или нескольких) <a href="http://yaml.org/">YAML</a>-файлах. К написанию моделей привыкаешь за <nobr>3—4</nobr> дня. Из YAML модель с помощью одной комманды преобразуется в автоматически сгенерированные базовые классы <a href="http://ru.wikipedia.org/wiki/ORM">ORM</a> (<a href="http://propel.phpdb.org/trac/">Propel</a> или <a href="http://www.phpdoctrine.org/">Doctrine</a>). Всё быстро, просто и аккуратно.</p>
<p>Пожалуй, это всё, что может понадобиться новичку при изучении Symfony (чтобы она не казалась ему <nobr>какой-то</nobr> сложной и непонятной системой, какой она мне показалась год назад).</p>
<p>А вот теперь перейдем непосредственно к моим рекомендациям. Но перед этим я расскажу вам про…</p>
<h4>Плагины (plugins)</h4>
<p>Плагины — это, по сути, тот код, который может быть использован несколько раз в разных проектах и приложениях. Плагины могут содержать:</p>
<ul>
<li>конфигурационные файлы, в том числе свои модели (!!!)</li>
<li>модули</li>
<li>библиотеки</li>
</ul>
<p>Я могу оказаться не прав, но как мне кажется, плагины — это такие себе мини-проекты, «всё в себе», чем выгодно отличаются от Symfony applications. На мой взгляд, ставку стоило делать в первую очередь на них — убрать приложения, а вместо них поставить плагины и создать некий инструмент, который бы позволил эти плагины связывать между собой.</p>
<h4>Мои рекоммендации</h4>
<ul>
<li>В первую очередь — проектирование. Не скупитесь на этом шаге, анализируйте и уточняйте у заказчика непонятные пункты.</li>
<li>Видя перед собой (да хоть в уме) макет системы — продумайте, на какие части систему можно разбить.</li>
<li>Поищите среди существующих плагинов такие части (<strong>обязательно</strong>). Я в своем проекте использовал следующие плагины:
<ul>
<li><a href="http://trac.symfony-project.com/wiki/sfGuardPlugin">sfGuardPlugin</a> — user management, security и т.д. Плагин - must have.</li>
<li><a href="http://trac.symfony-project.com/wiki/sfDateTimePlugin">sfDateTimePlugin</a> — очень удобная работа с датами и временем</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelAlternativeSchemaPlugin">sfPropelAlternativeSchemaPlugin</a> — полезен при работе с плагинами, позволяет менять модели, прописанные в плагинах, не изменяя коды самих плагинов</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelApprovableBehaviorPlugin">sfPropelApprovableBehaviorPlugin</a> — мне очень пригодился при «активации пользователей»</li>
<li><a href="http://trac.symfony-project.com/wiki/sfThumbnailPlugin">sfThumbnailPlugin</a> — уменьшение картинок (не смотрите на название — с ресайзом <nobr>3MP-фотографий</nobr> к 800×600 плагин справляется на отлично)</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelActAsTaggableBehaviorPlugin">sfPropelActAsTaggableBehaviorPlugin</a> — если вам нужны тэги</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelActAsSluggableBehaviorPlugin">sfPropelActAsSluggableBehaviorPlugin</a> — если вам нужны slug’и (а я советую их использовать — очень хорошо сказывается на читаемости url’ов, когда вместо id туда засовывать slug’и)</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelActAsRatableBehaviorPlugin">sfPropelActAsRatableBehaviorPlugin</a> — рейтинги, довольно крутые, мне, к сожалению, не подошли…</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelActAsCommentableBehaviorPlugin">sfPropelActAsCommentableBehaviorPlugin</a> — всё, что нужно для комментариев</li>
</ul>
</li>
<li>Используйте в работе автоматически генерируемые CRUD-модули и модули для админки</li>
</ul>
<p>Вот, пожалуй, и всё на сегодня. Жду ваших комментариев.</p>
<p>Давно у меня таких больших статей не было…</p>
<p><a href="http://habrahabr.ru/blog/webdev/36551.html">Запостил</a> на Хабрахабр.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/02/26/symfony-how-to-begin/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Zend Framework Library</title>
		<link>http://blog.fxposter.org/2007/10/18/zend-framework-library/</link>
		<comments>http://blog.fxposter.org/2007/10/18/zend-framework-library/#comments</comments>
		<pubDate>Thu, 18 Oct 2007 13:10:05 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend-Framework]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2007/10/18/zend-framework-library/</guid>
		<description><![CDATA[Те, кто читают меня довольно давно, знают, что я отношусь к той категории программистов, которые любяят и умеют использовать то, что было сделано раньше - фреймворки, библиотеки и т.д. Так вот, сегодня я поведу разговор о целесообразности использования Zend Framework при построении сайта по схеме MVC и о целесообразности его использования вообще. Zend Framework в [...]]]></description>
			<content:encoded><![CDATA[<p>Те, кто читают меня довольно давно, знают, что я отношусь к той категории программистов, которые любяят и умеют использовать то, что было сделано раньше - фреймворки, библиотеки и т.д. Так вот, сегодня я поведу разговор о целесообразности использования Zend Framework при построении сайта по схеме MVC и о целесообразности его использования вообще.</p>
<h4>Zend Framework в MVC</h4>
<p>Для начала - моя цитата:</p>
<blockquote><p>А я все больше склоняюсь к Django. :)<br />
А по поводу ZF меня все больше посещают такие мысли: стройным и красивым он кажется только на первый взгляд и именно из-за того, что у нас по сути получается набор классов, которые нам самим предложено связывать. Другие фреймворки нам предоставляют уже готовую структуру каталогов и некоторые “настройки по умолчанию”, а в Zend’е это все нужно делать самому. И в итоге после настройки фреймворка под себя он все больше становится “некрасивым” и похожим на другие фреймворки. :)</p></blockquote>
<p>Вот это моя позиция. Могу добавить еще одно - для того, чтобы юзать этот фреймворк, прийдется еще достаточно много всего под него дописать.</p>
<h4>Zend Framework как библиотека классов</h4>
<p>А вот как библиотеку классов ZF использовать не только можно, но и нужно. Я вот на себе прочувствовал, насколько удобно работать с почтой через Zend_Mail по сравнению со стандартными функциями imap_*. Да и Zend_Db и Zend_Log юзать достаточно удобно.</p>
<p>Писал недавно скрипт, который загружает файлы с POP3-сервера, парсит их и загружает в бд. Сначала написал просто функциями стандартными, а потом переписал с использованием ZF - код стал намного боле красивым, более легким в понимании и сократился в 2 раза. Так что в этой ипостаси ZF, на мой взгляд, идеальное замена многих модулей стандартной библиотеки PHP. Также радует наличие во фреймворке работы со всякими Web-сервисами - Amazon, del.icio.us, Flickr, и это еще не полный список, к тому же разработчики ZF планируют развивать фреймворк именно в этом направлении.</p>
<p>Для себя я вывод относительно ZF сделал такой - иметь на своем серваке однозначно. Даже если если я не буду его использовать для MVC - я буду использовать отдельные его части внутри самого сайта, благо, с этой задачей ZF справляется на отлично.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2007/10/18/zend-framework-library/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Zend Framework 0.9.3</title>
		<link>http://blog.fxposter.org/2007/05/07/zend-framework-093/</link>
		<comments>http://blog.fxposter.org/2007/05/07/zend-framework-093/#comments</comments>
		<pubDate>Sun, 06 May 2007 22:08:43 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend-Framework]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2007/05/07/zend-framework-093/</guid>
		<description><![CDATA[Сравнение CakePHP и Zend Framework немного откладывается. Я за него еще даже не садился, вкратце - на данный момент Cake поудобнее, в некоторых случаях сильно, но структура, модульность, расшияемость, продуманность, напичканность у Zend не идут с Cake&#8217;овскими ни в какое сравнение, но&#8230; это еще бета и многого того, что хотелось бы видеть, пока нет. Теперь [...]]]></description>
			<content:encoded><![CDATA[<p>Сравнение CakePHP и Zend Framework немного откладывается. Я за него еще даже не садился, вкратце - на данный момент Cake поудобнее, в некоторых случаях сильно, но структура, модульность, расшияемость, продуманность, напичканность у Zend не идут с Cake&#8217;овскими ни в какое сравнение, но&#8230; это еще бета и многого того, что хотелось бы видеть, пока нет.</p>
<p>Теперь о Zend&#8217;е - 6-го числа <a href="http://devzone.zend.com/node/view/id/2002">вышла</a> новая версия (а на офсайте нагло <a href="http://framework.zend.com/">врут</a>, что 4-го!). Опять дофига изменений по сравнению с предыдущей версией: планомерно дорабатывают Model, представленную здесь Zend_Db_Table, добавили, пока еще не вьехал зачем, helper&#8217;ы к Controller&#8217;у, и <a href="http://framework.zend.com/changelog">целая куча других изменений</a>.</p>
<p><em><strong>PS</strong>. До утра попробую накатать небольшой расказ про Zend_Db_Table и возможные способы его улучшения.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2007/05/07/zend-framework-093/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: blog.fxposter.org @ 2012-02-10 05:06:14 -->
