<?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>В лабиринте извилин &#187; framework</title>
	<atom:link href="http://www.charnad.com/blog/tag/framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.charnad.com</link>
	<description>Блог-центр им. CharnaD</description>
	<lastBuildDate>Wed, 18 Jan 2012 14:52:50 +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>Kohana и Formo</title>
		<link>http://www.charnad.com/blog/kohana-i-formo/</link>
		<comments>http://www.charnad.com/blog/kohana-i-formo/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 00:10:27 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[formo]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[kohana]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=609</guid>
		<description><![CDATA[Я взялся за изучение фреймворка Kohana. Подкупил меня размер - чуть меньше мегабайта. Я давно хотел найти быстрый и легкий фреймворк для небольших разработок. Пока я не настолько его изучил, чтобы делать глобальные выводы, но могу рассказать о процессе изучения. О том как установить Kohana легко найти в интернете. Вкратце: скачать, распаковать, запустить install, удалить [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/kohana_logo.png" alt=""/>Я взялся за изучение фреймворка Kohana. Подкупил меня размер - чуть меньше мегабайта. Я давно хотел найти быстрый и легкий фреймворк для небольших разработок. Пока я не настолько его изучил, чтобы делать глобальные выводы, но могу рассказать о процессе изучения.<span id="more-609"></span></p>
<p>О том как установить Kohana легко найти в интернете. Вкратце: скачать, распаковать, запустить install, удалить install. Про то, как убрать index.php из адреса тоже пару слов всего: переименовать example.htaccess в .htaccess и убрать index.php из $config['index_page'] в конфиге.</p>
<p>Собственно постороение приложения на Кохане я начал с того, что захотел переписать на этом фреймворке скриптик по удаленному управлению сайтами. И первая задача - формочка добавления сайта в БД. И тут возникли первые проблемы. Компоненты для построения форм, которые описаны в туториалах: Forge и Formation. Я выбрал Formation, скачал, установил. Не работает, выдает ошибки. Гуглил, читал форумы, боролся. От безысходности постучался в аську к одному парню, который имел дело с Коханой и получил ответ, что Forge и Formation блин уже deprecated. Как вам такое? На сайте я не видел об этом ни слова. Может не там искал?</p>
<p>
Ладно, пошел я дальше искать модуль для создания формочек. Посоветовали мне Morf. Зашел на страничку проекта. А там такой тухляк.. полгода код не обновляется, висит один тикет и еще два закрыто. Понятно все, не надо нам добра такого. В общем остался последний модуль на который были все надежды - Formo.</p>
<p>Formo завелся сразу, подключился без особых хлопот.  Только вот одна проблема, форму мне выводит с помощью P и DIV, а мне проще в TABLE запихать. Стал искать способы заставить генерить форму по-другому. Модифицировал объект, менял настройки - фиг. Нашел в мануале статью по темплейтам, переделал под темплейт. Не работает. Оказалось пример приведен с использованием шаблонизаторов, коими я не пользуюсь. В итоге кое-как заставил генериться форму как надо.</p>
<p>С валидацеий тоже номер. Искал как в валидацию передать $_POST, чтобы сверить с установками. Оказалось, что Formo сама жрет POST. Так же сама делает repopulation, основываясь на имени таблицы и hidden инпуте. Пока этого не знаешь - пугаешься и мучаешься, когда узнаешь - становится просто и легко. После чего за два дня доделал простейший CRUD.</p>
<p>Общие впечатления о фреймворке на этот момент:<br />
1. Наименования классов xxx_Core, когда вызываются они new xxx(); ломает автокомплит из-за чего надо совать IDE отдельный файлик, где прописаны "class xxx extends xxx_Core {}".<br />
2. Документация местами ужасна. Референс мануал нормальный, референс есть референс. Но вот тьюториалов мало, документация модулей слабая, коммьюнити маленькое. В общем въезжать тяжело.<br />
3. Местами все все-таки достаточно просто. За 10 минут добавил себе пару нужных хелперов, за полчаса написал плагин к Formo. И то, и другое я выложу чуть попозже.<br />
4. Дурацкие сообщения об ошибках. Если я ошибся и сунул не тот параметр, который ожидается - вылезает Fatal error где-то в глубине ядра. О том, что это я ошибся в параметре, а не Кохана концы отбрасывает можно только догадываться.<br />
5. ORM успел посмотреть на уровне CRUD одной таблицы. Удобно.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/kohana-i-formo/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Symfony: порядок записей в таблице</title>
		<link>http://www.charnad.com/blog/symfony-poryadok-zapisej-v-tablice/</link>
		<comments>http://www.charnad.com/blog/symfony-poryadok-zapisej-v-tablice/#comments</comments>
		<pubDate>Sat, 02 May 2009 10:17:27 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[работа]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=488</guid>
		<description><![CDATA[Этим постом я отвечаю на вопрос в комментариях о том, как я реализовал стрелки вверх и вниз для категорий. Перейдем к делу У меня в базе данных введен в таблице специальный столбик, называемый order_num. Он как раз и определяет порядковый номер записи в таблице. По нажатию на кнопке вверх (я называю эту процедуру promote), порядковый [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt=""/>Этим постом я отвечаю на вопрос в комментариях о том, как я реализовал стрелки вверх и вниз для <a href="http://www.charnad.com/blog/symfony-kategorii-i-podkategorii/">категорий</a>. Перейдем к делу<span id="more-488"></span></p>
<p>У меня в базе данных введен в таблице специальный столбик, называемый order_num. Он как раз и определяет порядковый номер записи в таблице. По нажатию на кнопке вверх (я называю эту процедуру promote), порядковый номер текущей записи меняется местами с порядковым ближайшим большим порядковым номером. Обратная процедура (demote) меняет с ближайшим меньшим.</p>
<p>Обращу ваше внимание на то, что этот пример сделан не для категорий а для контентных страниц (что сути не меняет), к тому же учитывается parent_id, то есть можно менять порядок внутри категории не затрагивая другие.</p>
<p><strong>Promote:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executePromote<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$page_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRequestParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'page_id'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$connection</span> <span style="color: #339933;">=</span> Propel<span style="color: #339933;">::</span><span style="color: #004000;">getConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$promoting_RS</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT order_num, parent_id FROM static_pages WHERE page_id='<span style="color: #006699; font-weight: bold;">{$page_id}</span>'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$promoting</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$promoting_RS</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span>PDO<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ASSOC</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$promoting_num</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$promoting</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'order_num'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$promoting_parent</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$promoting</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'parent_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$promoting_num</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'static_pages/index'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$demoting_num_RS</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT MAX(order_num) AS order_num, page_id FROM static_pages WHERE parent_id='<span style="color: #006699; font-weight: bold;">{$promoting_parent}</span>' AND order_num &lt; '<span style="color: #006699; font-weight: bold;">{$promoting_num}</span>' GROUP BY NULL&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$demoting</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$demoting_num_RS</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span>PDO<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ASSOC</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$demoting_num</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$demoting</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'order_num'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;UPDATE static_pages SET order_num = CASE
   WHEN page_id = '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$page_id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;' THEN '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$demoting_num</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'
   WHEN parent_id='<span style="color: #006699; font-weight: bold;">{$promoting_parent}</span>' AND order_num='<span style="color: #006699; font-weight: bold;">{$demoting_num}</span>' THEN '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$promoting_num</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'
   END
   WHERE page_id = &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$page_id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; OR (parent_id=<span style="color: #006699; font-weight: bold;">{$promoting_parent}</span> AND order_num=<span style="color: #006699; font-weight: bold;">{$demoting_num}</span>)&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'static_pages/index'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">return</span> sfView<span style="color: #339933;">::</span><span style="color: #004000;">NONE</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

</p>
<p>Мы берем id из запроса, потом запросом ищем максимальный order_num, который меньше текущего, и потом запросом меняем их местами. Не забудьте ставить WHERE в UPDATE. На основе этого, думаю demote легко дописать самому. <br /> P.S> Поле не должно быть UNIQUE, я так и не придумал как одним запросом менять значения между собой в UNIQUE поле. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-poryadok-zapisej-v-tablice/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony: переключатели</title>
		<link>http://www.charnad.com/blog/symfony-pereklyuchateli/</link>
		<comments>http://www.charnad.com/blog/symfony-pereklyuchateli/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 14:20:35 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[togglers]]></category>
		<category><![CDATA[переключатели]]></category>
		<category><![CDATA[работа]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=482</guid>
		<description><![CDATA[Давно я не брал в руки шашек. То есть не писал про symfony. А разработка продолжается. Сайт фактически готов, остаются мелкие доделки, доработка напильником и все такое. О "переключателях" или "тогглерах"(togglers), или не знаю как еще их назвать я уже давно хотел написать. Ну вот и пришло время, получайте. Итак что же за переключатели такие? [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt="" /> Давно я не брал в руки шашек. То есть не писал про symfony. А разработка продолжается. Сайт фактически готов, остаются мелкие доделки, доработка напильником и все такое. О "переключателях" или "тогглерах"(togglers), или не знаю как еще их назвать я уже давно хотел написать. Ну вот и пришло время, получайте.<span id="more-482"></span></p>
<p>Итак что же за переключатели такие? Допустим у нас есть сайт, а у него база данных, а в базе данных таблица, а в таблице поле, которое принимает только 2 значения - 0 и 1. Такие поля делаются типа TINYINT(1). Берем пример из жизни. Одно такое поле отвечает за то, разрешено ли пользователю входить в систему или нет. И если вдруг надо нам попереключать часть пользователей, то надо залезать в свойства каждого и менять, потом сохранять. А мне захотелось жить красивее и придумал я переключатели.</p>
<p><img style="margin-right: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/togglers/overview.png" alt="Список пользователей"/></p>
<p>Вот так примерно выглядит список пользователей. Зеленая галочка и красный крестик и есть переключатели. Что сделать чтобы переключить пользователя? Просто кликнуть на них! По клику отправляется AJAX запрос, меняет поле в базе данных и по результатам меняет картинку. Красиво, удобно, быстро. А теперь о том, как это сделано.</p>
<p>Для каждого пользователя в таблице нам надо вставить партиал (partial), который будет отображать картинку. Для формирования таблицы мы foreach перебираем пользователей и вот код partial для переключателя.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;div id=&quot;active_<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$user</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;
  <span style="color: #000000; font-weight: bold;">&lt;?php</span> include_partial<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'activity'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'state'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'is_active'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/div&gt;</pre></div></div>

<p>Как видно в него мы передаем 2 параметра, это id пользователя и его текущий статус. В самом партиалле находится следующий код:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> 
<span style="color: #000088;">$field</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'IsActive'</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;div align=&quot;center&quot; id=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$field</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
include_component<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'main'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'toggler'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
  <span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$id</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">'table'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'sfGuardUser'</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">'state'</span> <span style="color: #339933;">=&gt;</span> sfGuardUserPeer<span style="color: #339933;">::</span><span style="color: #004000;">retrieveByPK</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getIsActive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">'field'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$field</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/div&gt;</pre></div></div>

<p>Здесь $field - имя поля в базе данных. В партиалле создается div с названием $field_$id, куда будет присылаться ответ. Ну а дальше вызывается компонент main/toggler, который и будет собственно переключать. Компоненту мы передаем id пользователя, имя таблицы, текущее состояние и имя поля.
</p>
<p>На этом подключение переключателя к модулю завершено. То есть вам надо всего лишь вызвать partial из шаблона, а в partiall'e подправить названия поля и таблицы. Все очень просто и быстро. Ну а собственно что в компоненте main/toggler? А там вот что:<br />
<strong>components.class.php</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeToggler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//i just call _toggler.php partial</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>_toggler.php</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$update</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$field</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span><span style="color: #339933;">;</span>
sfApplicationConfiguration<span style="color: #339933;">::</span><span style="color: #004000;">getActive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadHelpers</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Javascript'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$image_name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$state</span><span style="color: #009900;">&#41;</span>? <span style="color: #0000ff;">'active.png'</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'inactive.png'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> link_to_remote<span style="color: #009900;">&#40;</span>image_tag<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/images/icons/admin/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$image_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
   <span style="color: #0000ff;">'url'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'main/toggle?id='</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&amp;table='</span><span style="color: #339933;">.</span><span style="color: #000088;">$table</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&amp;field='</span><span style="color: #339933;">.</span><span style="color: #000088;">$field</span><span style="color: #339933;">,</span>
   <span style="color: #0000ff;">'update'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$update</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Мы формируем $update - поле, куда вернем ответ. А в виде ответа мы возвращаем... переключатель. Нам надо подгрузить хелпер Javascript (обратите внимание, что надо с большой буквы писать, иначе ничего не получится. симфони требует соблюдения регистра). И с помощью хелпера генерим аяксовую ссылку на экшен, который уже и будет переключать.</p>
<p>Что же получается? Итак общая картинка такая. Мы подключаем partial, который вызывает компонент, который генерит шаблон выдавая нам аяксовую ссылку на действие (action). А экшен переключает нам поле, и рендерит тот же самый компонент.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeToggle<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isXmlHttpRequest</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">renderText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Error. XMLHttpRequests only.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$table</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'table'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$field</span> <span style="color: #339933;">=</span>  <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'field'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$peer</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">normalizeName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'Peer'</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$method</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ReflectionMethod<span style="color: #009900;">&#40;</span><span style="color: #000088;">$peer</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'retrieveByPK'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$object</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$method</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">invoke</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$setter</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'set'</span><span style="color: #339933;">.</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$getter</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'get'</span><span style="color: #339933;">.</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$setter</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$state</span> <span style="color: #339933;">=</span> <span style="color: #339933;">!</span><span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$getter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">renderPartial</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'main/toggler'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$id</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'state'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$state</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'table'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$table</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'field'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> normalizeName<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/[^a-zA-Z0-9]/'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ucwords</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Принимаем только аяксовые запросы, из запроса получаем таблицу, поле и имя Propel Peer-класса для управления таблицей. Имя таблицы мы "нормализуем", т.к. симфони не использует, например, подчеркиваний в названии Peer-классов. Ну а дальше, с помощью рефлексии мы вызываем метод для того, чтобы получить объект, над которым производим действия. Геттеры и сеттер имеют стандартные названия и их рефлексить нам не надо. После чего в ответ рендерим тот же самый компонент, который вернет нам картинку с аяксовой ссылкой на то же самое действие.
</p>
<p>Я догадываюсь, что это не так просто понять. Если будет совсем не в моготу - задавайте вопросы в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-pereklyuchateli/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Symfony: теги</title>
		<link>http://www.charnad.com/blog/symfony-tegi/</link>
		<comments>http://www.charnad.com/blog/symfony-tegi/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 15:24:00 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=416</guid>
		<description><![CDATA[Продолжаю серию постов про разработку на симфони. На этот раз задача состояла в том, чтобы сделать администрирование тегов. Задача:" все теги можно редактировать на одной странице, теги можно только редактировать и удалять, если тег после редакции совпадает с уже существующим - они склеиваются". Ну что ж, поехали. Почти сразу у меня возникла идея использовать input_in_place_editor. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt=""/>Продолжаю серию постов про разработку на симфони. На этот раз задача состояла в том, чтобы сделать администрирование тегов. Задача:" все теги можно редактировать на одной странице, теги можно только редактировать и удалять, если тег после редакции совпадает с уже существующим - они склеиваются". Ну что ж, поехали.<span id="more-416"></span></p>
<p>Почти сразу у меня возникла идея использовать input_in_place_editor. То есть табличка, в ней теги, тыкаешь на ячейку, появляется поле редактирования, изменения происходят аяксово. С самим in_place_editor возникло немало сложностей из-за его опций. Сделать табличку и насовать в каждую ячейку по эдитору несложно. Не забудьте, надо облачить это все в див, который будет обновляться. Мы же хотим показывать сохраненный тег.</p>
<p>Первое, с чем мне пришлось столкнуться - эффект затухания. Это очень красиво, когда наводишь на элемент, который можно редактировать, фон загорается цветом, и медленно затухает, когда уводишь мышку. Изначально фон загорается желтым, а так как админка у меня выдержана в цветах Админ-генератора, то есть синем, то и цвет надо поменять. Однако, изменив цвет на <span style="background-color: white;">'#eef'</span>, я обломался. Затухания не было. Фон сначала загорался, а потом через время менял свой цвет на изначальный. И только позже, случайно я догадался расписать цвет полностью на <span style="background-color: white;">'#efefff'</span>.</p>
<p>Следующим моментом стало изменение текстов сохранения. То есть тот текст, который написан на элементе пока идет аякс запрос. Нашел опцию, поставил значение, и... ничего не работает. Оказалось, что некоторые опции (а они задаются ассоциативным массивом) надо задавать особенно. Например опцию 'save_text' надо не просто заключать в кавычки (потому что это строка), а еще и добавлять кавычки внутри самой строки. Иначе это дело парсится без кавычек. Тупизм, неужели создаетли Protoype'а не могли сами ставить кавычки? Приходится теперь писать так:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #0000ff;">'savingText'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'\'Сохранение...\''</span></pre></div></div>

</p>
<p>Кнопочку удаления так же сделал дивом, но это просто. Position: relative, height: 0px, align: right; Надо заметить, что на время редактирования тега, кнопочку надо скрывать, иначе она уезжает вниз и портит вид. А делается это с помощью опции 'onEnterEditMode'. Вот так:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #0000ff;">'onEnterEditMode'</span> <span style="color: #339933;">=&gt;</span> 
<span style="color: #0000ff;">&quot;function(form, value) { $('delete_&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tag_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;').hide(); }&quot;</span></pre></div></div>

</p>
<p>Ну и наконец, сделать надо было системку, которая находит дубликаты тегов. А сделал я так: при сохранении тега, я нахожу ВСЕ теги с таким названием. Если такой тег один (которы мы только что сохранили), то все прекрасно, а если нет, тогда в цикле генерим 2 запроса. Один UPDATE, другой DELETE. UPDATE'ом, все товары, которые были привязаны к дубликату тега перепривязываем к самому первому найденному. Он в итоге остается у нас единственным. А DELETE'ом, удаляем дубликаты. Вот так вот:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>TagsPeer<span style="color: #339933;">::</span><span style="color: #004000;">TITLE</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$duplicates</span> <span style="color: #339933;">=</span> TagsPeer<span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//В качестве итогового тега берем самый первый</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$duplicates</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$original</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$duplicates</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$query_update</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;UPDATE tags_bouquets SET tag_id='{<span style="color: #006699; font-weight: bold;">$original-&gt;getTagId</span>()}' WHERE tag_id IN(&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$query_delete</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;DELETE FROM tags WHERE tag_id IN (&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$pass_first</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$duplicates</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$duplicate</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pass_first</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$pass_first</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$query_update</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$duplicate</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTagId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">','</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$query_delete</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$duplicate</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTagId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">','</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>   
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000088;">$query_delete</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rtrim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query_delete</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">','</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">');'</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$query_update</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rtrim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query_update</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">','</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">');'</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$conn</span> <span style="color: #339933;">=</span> Propel<span style="color: #339933;">::</span><span style="color: #004000;">getConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BEGIN; '</span><span style="color: #339933;">.</span><span style="color: #000088;">$query_update</span><span style="color: #339933;">.</span><span style="color: #000088;">$query_delete</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'COMMIT;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'notice_duplicated'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Были найдены и удалены дубликаты тега '</span><span style="color: #339933;">.</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</p>
<p>Результат на картинке. Легкая синева - это как раз затухание фона, я специально мышкой повозил.<br />
<img src="http://www.charnad.com/blog/wp-content/uploads/pictures/flower_tags.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-tegi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony: динамический роутинг</title>
		<link>http://www.charnad.com/blog/symfony-dinamicheskij-routing/</link>
		<comments>http://www.charnad.com/blog/symfony-dinamicheskij-routing/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 12:31:07 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=388</guid>
		<description><![CDATA[Продолжаю посты про symfony. Сегодня сделаем динамический роутинг. То есть будем добавлять правила роутинга из php, минуя routing.yml. Это нужно, например, если вы хотите делать страницы вида http://site.com/page1, где page1 может быть создана, может быть удалена и прочее. Дело в том, что указать какой-то общий шаблон нельзя, потому что иначе он будет конфликтовать с дефолтным [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin-right: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt="" align="left" /><br />
Продолжаю посты про symfony. Сегодня сделаем динамический роутинг. То есть будем добавлять правила роутинга из php, минуя routing.yml. Это нужно, например, если вы хотите делать страницы вида http://site.com/page1, где page1 может быть создана, может быть удалена и прочее. Дело в том, что указать какой-то общий шаблон нельзя, потому что иначе он будет конфликтовать с дефолтным /:module. Что делать? А вот что. <span id="more-388"></span><br />
Идею я подсмотрел на одном из забугорных блогов, за что большое <a href="http://www.dfwtek.com/blog/129-dynamic-routes-in-symfony12.html">автору</a> спасибо. </p>
<p>Собственно для тех, кто не хочет ждать, а хочет кода - кладем это дело в frontendConfiguration.php:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> frontendConfiguration <span style="color: #000000; font-weight: bold;">extends</span> sfApplicationConfiguration <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> configure<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dispatcher</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'routing.load_configuration'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'registerRoutes'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'listenToRoutingLoadConfigurationEvent'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> registerRoutes <span style="color: #009900;">&#123;</span>
  static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> listenToRoutingLoadConfigurationEvent<span style="color: #009900;">&#40;</span>sfEvent <span style="color: #000088;">$event</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$routing</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$event</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getSubject</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">clearSelectColumns</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addSelectColumn</span><span style="color: #009900;">&#40;</span>StaticPagesPeer<span style="color: #339933;">::</span><span style="color: #004000;">LINK_NAME</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$pages</span> <span style="color: #339933;">=</span> StaticPagesPeer<span style="color: #339933;">::</span><span style="color: #004000;">doSelectStmt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pages</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$routing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prependRoute</span><span style="color: #009900;">&#40;</span>
      <span style="color: #0000ff;">'static_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$link</span><span style="color: #339933;">,</span>
      <span style="color: #000000; font-weight: bold;">new</span> sfRoute<span style="color: #009900;">&#40;</span>
       <span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$link</span><span style="color: #339933;">,</span>
      <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
          <span style="color: #0000ff;">'module'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'main'</span><span style="color: #339933;">,</span> 
          <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'static'</span><span style="color: #339933;">,</span> 
          <span style="color: #0000ff;">'page'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//with slash</span>
     <span style="color: #000088;">$routing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prependRoute</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'static_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$link</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'_with_slash'</span><span style="color: #339933;">,</span>
        <span style="color: #000000; font-weight: bold;">new</span> sfRoute<span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$link</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span>
          <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'module'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'main'</span><span style="color: #339933;">,</span> 
          <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'static'</span><span style="color: #339933;">,</span> 
          <span style="color: #0000ff;">'page'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span>
     <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Тут я из базы выбираю поля link_name, и создаю правила на их основе. Каким образом это дело крепится к инициализации роутов - я не знаю. На остальные вопросы отвечу в комментариях.</p>
<hr />
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-dinamicheskij-routing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony: человеческое расположение админки</title>
		<link>http://www.charnad.com/blog/symfony-chelovecheskoe-raspolojenie-adminki/</link>
		<comments>http://www.charnad.com/blog/symfony-chelovecheskoe-raspolojenie-adminki/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 23:00:45 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=381</guid>
		<description><![CDATA[Тем, кто изучает симфони известно, что админку часто делают через "generate:app backend". То есть мы создаем приложение внутри нашего проекта. Это прекрасно, но есть одно НО. Чтобы нам зайти в админку требуется писать http://project/backend.php/some-admin-pages. Можно конечно обьяснять заказчикам, что мол понимаете, это другое приложение внутри проекта, другой фронт-контроллер, так надо. Но лучше сделать иначе. Скажу [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin-right: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt="" align="left" /></p>
<p>Тем, кто изучает симфони известно, что админку часто делают через "generate:app backend". То есть мы создаем приложение внутри нашего проекта. Это прекрасно, но есть одно НО. Чтобы нам зайти в админку требуется писать http://project/backend.php/some-admin-pages. Можно конечно обьяснять заказчикам, что мол понимаете, это другое приложение внутри проекта, другой фронт-контроллер, так надо. Но лучше сделать иначе. Скажу сразу, этот метод взят с официального форума симфони. Но найти его проблематично.</p>
<p>Метод таков:</p>
<ol>
<li>Создаем папку "admin" внутри папки "web". Копируем туда .htaccess из той же "web", и заменяем<br />
RewriteRule ^(.*)$ index.php [QSA,L]<br />
на<br />
RewriteRule ^(.*)$ ../backend.php [QSA,L]
</li>
<li>Идем в настройки роутинга для backend (app/backend/config/routing.yml) и добавляем папку /admin/ ко всем роутам. Например:
<p># default rules<br />
homepage:<br />
  url: /admin/<br />
  param: { module: default, action: index }
</li>
<li>Меняем no_script_name на "on" в настройках backend (app/backend/config/settings.yml):<br />
prod:<br />
.settings:<br />
no_script_name: on
</li>
<li>Чистим кеш и заходим в папку: http://project/admin/ без проблем.</li>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-chelovecheskoe-raspolojenie-adminki/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Документация Symfony</title>
		<link>http://www.charnad.com/blog/documentacia-symfony/</link>
		<comments>http://www.charnad.com/blog/documentacia-symfony/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 09:35:44 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=367</guid>
		<description><![CDATA[Сейчас по долгу службы я работаю над движком для одного сайта. И сделать я его решил с использованием фреймворка, о котором слышал много хорошего. Я говорю о Symfony. Заниматься копипастом хвалебных речей с других сайтов я не буду, сам писать подобное так же не буду. Скажу только, что поначалу мне было трудно разобраться. Я даже [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin-right: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt="" align="left" />
<p>Сейчас по долгу службы я работаю над движком для одного сайта. И сделать я его решил с использованием фреймворка, о котором слышал много хорошего. Я говорю о Symfony. Заниматься копипастом хвалебных речей с других сайтов я не буду, сам писать подобное так же не буду. Скажу только, что поначалу мне было трудно разобраться. Я даже хотел все бросить и писать на своей простой MVC системке, но в итоге не бросил. Упорно читал мануалы, стал понимать принципы построения приложения с использованием симфони. Собственно тут я хочу лишь выложить ссылки, которые могут помочь тем, кто будет изучать symfony.</p>
<p>Конечно, ссылка номер 1 это ссылка на главный сайт: <a href="http://www.symfony-project.org/">http://www.symfony-project.org/<br />
</a>Там большое количество документации, которые стоит осилить. Я пожалел времени, начал рубить сплеча, однако сейчас все равно пришел к тому, что надо читать мануалы и я их читаю. И всем придется, кто хочет понять всю мощь этого фреймворка.</p>
<p>
Ссылка номер 2 - это ссылка на главный гайд "симфонистов" <a href="http://www.symfony-project.org/book/1_2/">The Book</a> (<a href="http://www.symfony-project.org/get/pdf/book-1.2-en.pdf">PDF</a>). Книга на английском. Методично рассказывается о всех сторонах фреймворка.</p>
<p>
Ссылка номер 3 - это практическое руководство, так называемые <a href="http://www.symfony-project.org/askeet/1_0/en/">Askeet</a> (<a href="http://www.symfony-project.org/get/pdf/askeet-1.0-en.pdf">PDF</a>) и <a href="http://www.symfony-project.org/jobeet/1_2/Propel/en/">Jobeet</a> (<a href="http://www.symfony-project.org/get/pdf/jobeet-1.2-propel-en.pdf">PDF</a>). Они обе используют <a href="http://propel.phpdb.org/trac/">Propel</a> в качестве ORM вендора (на есть вариант и для Doctrine). Имейте ввиду, что Askeet был написан для Symfony 1.0, а Jobeet для 1.2. В сети есть <a href="http://symfony.artsofte.ru/theme/list/title/Переводы">переводы</a> некоторых глав на русский.
</p>
<p>Это то, что стоит читать в первую очередь. Возможно я найду время перевести некоторые главы на русский, но не обещаю. Удачи вам в изучении.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/documentacia-symfony/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

