<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0" xml:base="http://cherenkevich.com/stuff/blog">
  <channel>
    <title>Блог Алексея Черенкевича</title>
    <link>http://cherenkevich.com/stuff/blog</link>
    <description />
    <language>ru</language>
          <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/cherenkevich" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="cherenkevich" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
    <title>Выступление Вадима Скротского на «Деловом интернете» в Гомеле</title>
    <link>http://cherenkevich.com/stuff/blog/2012/124</link>
    <description>&lt;p&gt;
	Большая концентрация хороших мыслей.&lt;/p&gt;
&lt;p&gt;
	&lt;object data="http://www.tut.by/uppod/auppod.swf" height="360" id="player" type="application/x-shockwave-flash" width="640"&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="movie" value="http://www.tut.by/uppod/auppod.swf" /&gt;&lt;param name="FlashVars" value="st=http://www.tut.by/uppod/frameid406/ads0/mp4/params.php?uid=swf1287745849388&amp;amp;banner=http://www.tut.by/i/logo640x360.swf&amp;amp;auto=none&amp;amp;m=video&amp;amp;file=http://uploader.tut.by/program/2012/2012-01-20_ProDI_Skrotskiy_35-54.mp4&amp;amp;debug=0&amp;amp;poster=http://img.tyt.by/i/16x16.png&amp;amp;comment=o:&amp;amp;duration=0&amp;amp;id=http://uploader.tut.by/program/2012/2012-01-20_ProDI_Skrotskiy_35-54.mp4" /&gt;&lt;/object&gt;&lt;/p&gt;
</description>
     <comments>http://cherenkevich.com/stuff/blog/2012/124#comments</comments>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%B1%D0%B8%D0%B7%D0%BD%D0%B5%D1%81">Бизнес</category>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD">Дизайн</category>
 <pubDate>Mon, 23 Jan 2012 12:47:23 +0000</pubDate>
 <dc:creator>cherenkevich</dc:creator>
 <guid isPermaLink="false">124 at http://cherenkevich.com</guid>
  </item>
  <item>
    <title>Новый раздел на сайте</title>
    <link>http://cherenkevich.com/stuff/blog/2012/123</link>
    <description>&lt;p&gt;
	На сайте появился &lt;a href="/stuff/inspiration"&gt;новый раздел с красивыми чужими картинками&lt;/a&gt;. Назвается он Snatch.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Я каждый день просматриваю в интернете много картинок. Некоторые из них мне очень нравятся, и я их сохраняю к себе на винчестер. С винчестера картинки автоматом попадают в эту ленту. Чаще всего я понятия не имею, кто автор той или иной картинки. Но если я разместил здесь вашу картинку, и это вам не нравится, вы можете мне &lt;a href="mailto:cherenkevich.com@gmail.com"&gt;написать письмо&lt;/a&gt; об этом.&lt;/p&gt;
&lt;p&gt;
	Основные темы: сайты, интерфейсы, простые интерьеры, шрифтовые работы, простые плакаты. Реже &amp;mdash; иллюстрации и логотипы.&lt;/p&gt;
&lt;p&gt;
	&lt;a href="/stuff/inspiration/feeeed"&gt;&lt;span class="acronym"&gt;RSS&lt;/span&gt;-лента имеется&lt;/a&gt;.&lt;/p&gt;
</description>
     <comments>http://cherenkevich.com/stuff/blog/2012/123#comments</comments>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%BA%D0%BC%D0%B3%D0%BF">КМГП</category>
 <pubDate>Fri, 20 Jan 2012 01:06:46 +0000</pubDate>
 <dc:creator>cherenkevich</dc:creator>
 <guid isPermaLink="false">123 at http://cherenkevich.com</guid>
  </item>
  <item>
    <title>Дизайн для эгоиста</title>
    <link>http://cherenkevich.com/stuff/blog/2012/122</link>
    <description>&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Мне почему-то показалось, что людям нравится смотреть, как написано их имя. Да, по любому смотреть на свое имя им нравится больше, чем смотреть на чужие имена. И фоточки свои они любят. А уж как свое имущество любят.&lt;/p&gt;
&lt;p&gt;
	Я к тому, что в последние время при проектировании сайтов я стал уделять особое внимание страницам с информацией о пользователе и страницам, на которых может быть предмет гордости пользователя. Скажем, если бы мы делали социальную сеть филателистов, имеет смысл позаботиться о страницах, связанных с их коллекцией. Сделайте там супер-пупер лэйаут, чтобы после того, как они загрузят свои марочки на сайт, они полвечера любовались на свое имущество.&lt;/p&gt;
&lt;p&gt;
	Это можно связать с тезисом о том, что люди хотят покупать эмоции, а не сам сферический товар в вакууме.&lt;/p&gt;
&lt;p&gt;
	Может быть с филателистами и не очень удачный пример. Или я непонятно рассказал. Но сам принцип мне нравится, я его практикую и мне очень хотелось донести это до коллег.&lt;/p&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
</description>
     <comments>http://cherenkevich.com/stuff/blog/2012/122#comments</comments>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD">Дизайн</category>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%BA%D0%BC%D0%B3%D0%BF">КМГП</category>
 <pubDate>Thu, 19 Jan 2012 16:58:07 +0000</pubDate>
 <dc:creator>cherenkevich</dc:creator>
 <guid isPermaLink="false">122 at http://cherenkevich.com</guid>
  </item>
  <item>
    <title>Блоки — отдельно, котлеты — отдельно</title>
    <link>http://cherenkevich.com/stuff/blog/2012/121</link>
    <description>&lt;p&gt;
	Очень давно все разработчики поняли, что картинки, хоть они по своей сути и являются просто графическим файлом, но они могут быть абсолютно разными по назначению. Какая-то картинка является частью интерфейса, и ее нужно делать бэкграундом у дива. А вот какая-то другая картинка &amp;mdash; это часть контента и она будет вставлена как тег img.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Однажды я делал проект на Друпале, и в некоторой его области страницы было очень много блоков с текстом, который должен был оставаться редактируемым через админку. Представьте себе футер с десятью такими разными блоками. Самый простой путь &amp;mdash; создать десять регионов и запихнуть их в темплейт. Но представьте тогда страницу управления блоками: куча регионов. Фу-фу-фу!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Давайте посмотрим на блоки, как на картинки из примера выше. Есть блоки, которые являются частью интерфейса. Например, адрес или телефон в шапке. А есть блоки, которые представляют собой кусок контента.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Я для себя вывел правило: через регионы оформлять только те блоки, которые относятся к контенту. Все остальные блоки я вывожу напрямую в темплейте средствами &lt;span class="acronym"&gt;АПИ&lt;/span&gt;.&lt;/p&gt;
&lt;pre&gt;
$block = module_invoke&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;&amp;#39;block&amp;#39;, &amp;#39;block&amp;#39;, &amp;#39;view&amp;#39;, 3);
print $block[&amp;#39;content&amp;#39;]; &lt;/pre&gt;
&lt;p&gt;
	Последним параметром я передаю айди блока. Функция возвращает массив. Выводим $block[&amp;#39;content&amp;lsquo;].&lt;/p&gt;
&lt;p&gt;
	Такой подход можно использовать не только для простых блоков. Выводите все, что угодно. Например, праймари-линкс:&lt;/p&gt;
&lt;pre&gt;
$block = module_invoke&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;&amp;#39;menu&amp;#39;, &amp;#39;block&amp;#39;, &amp;#39;view&amp;#39;, &amp;#39;primary-links&amp;#39;);
print $block[&amp;#39;content&amp;#39;]; &lt;/pre&gt;
&lt;p&gt;
	Или вьюз:&lt;/p&gt;
&lt;pre&gt;
$block = module_invoke&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;&amp;#39;menu&amp;#39;, &amp;#39;block&amp;#39;, &amp;#39;view&amp;#39;, &amp;#39;menu-first-footer&amp;#39;);
print $block[&amp;#39;content&amp;#39;]; &lt;/pre&gt;
&lt;p&gt;
	Плюсы метода&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		На странице редактирования блоков только нужные регионы.&amp;nbsp;&lt;/li&gt;
	&lt;li&gt;
		Проще создавать редактируемые части сайта: не нужно размечать регион и чистить кэш.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Хорошая функция, блеать!&lt;/p&gt;
&lt;p&gt;
	&lt;span class="acronym"&gt;PS&lt;/span&gt;. Если кто еще не видел &amp;mdash; &lt;a href="http://cherenkevich.com/stuff/blog/2012/120"&gt;вот еще одна моя статья&lt;/a&gt; о том, что иногда лучше использовать язык программирования вместо графического интерфейса.&lt;/p&gt;
</description>
     <comments>http://cherenkevich.com/stuff/blog/2012/121#comments</comments>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%B4%D1%80%D1%83%D0%BF%D0%B0%D0%BB">Друпал</category>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0">Разработка</category>
 <pubDate>Thu, 12 Jan 2012 15:29:56 +0000</pubDate>
 <dc:creator>cherenkevich</dc:creator>
 <guid isPermaLink="false">121 at http://cherenkevich.com</guid>
  </item>
  <item>
    <title>Свобода от Views</title>
    <link>http://cherenkevich.com/stuff/blog/2012/120</link>
    <description>&lt;p&gt;
	Views &amp;mdash; очень классный модуль. Он позволяет сэкономить километр времени, когда нужно сделать простые сборные страницы. Но в нем иногда не хватает гибкости. Например, для темизации. Либо для построения нужной структуры адресов. Либо в случае, когда нужно сделать сложную логику какого-нибудь каталога. Не важно. Суть в том, что зачастую проще написать простой модуль, чем извращаться с Views и темизацией полей.&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;С таксономией та же ерунда, между прочим.)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Я хочу показать, как просто создавать сборные страницы&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;и не только) программно &amp;mdash; через модули. Достаточно знать пару хуков. Снипеты, которые я приведу ниже, я сохранил себе в Эверноуте &amp;mdash; очень удобно.&lt;/p&gt;
&lt;p&gt;
	Скажем, модуль, который мы напишем, будет называется catalog. Создаем папку catalog в sites/all/modules. В нем &amp;mdash; два файла: catalog.info и catalog.module.&lt;/p&gt;
&lt;p&gt;
	В файле catalog.info &amp;mdash; служебная информация о модуле:&lt;/p&gt;
&lt;pre&gt;
name = &amp;quot;Catalog&amp;quot;
description = &amp;quot;Catalog module&amp;quot;
package = &amp;quot;Custom&amp;quot;
core = 6.x&lt;/pre&gt;
&lt;p&gt;
	Открываем файл catalog.module и добавим в реестр меню пока только главную страницу каталога:&lt;/p&gt;
&lt;pre&gt;
/**
&amp;nbsp;* Implementation of hook_menu&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;).
&amp;nbsp;*/

function catalog_menu&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;) {
&amp;nbsp;&amp;nbsp;$items[&amp;#39;catalog&amp;#39;] = array&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;title&amp;#39; =&amp;gt; t&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;&amp;#39;Catalog&amp;#39;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;page callback&amp;#39; =&amp;gt; &amp;#39;catalog_catalog&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;access callback&amp;#39; =&amp;gt; &lt;span class="acronym"&gt;TRUE&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;);
&amp;nbsp;&amp;nbsp;return $items;
} 

function catalog_catalog&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;) {
&amp;nbsp;&amp;nbsp;$output = &amp;#39;Hello, world!&amp;#39;;
&amp;nbsp;&amp;nbsp;return $output;
}&lt;/pre&gt;
&lt;p&gt;
	Русским языком: функция catalog_menu&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;) возвращает массив элементов меню $items. Ключ каждого нового пункта меню есть его адрес. В данном случае, мы добавили страницу с адресом /catalog. У страницы каталог будет заголовок Catalog&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;либо его перевод, если доступен). Содержимое страницы будет определятся тем, что вернет функция catalog_catalog&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;), которую мы указали в качестве page callback. У этого хука может быть много параметров. Эта заметка их не освещает. Подробнее об этом хуке вы можете узнать в &lt;span class="acronym"&gt;API&lt;/span&gt; Друпала или, например, в книге Pro Drupal Development Джона Вандюка.&lt;/p&gt;
&lt;p&gt;
	Идем на страницу со списком модулей admin/build/modules и включаем наш модуль.&lt;/p&gt;
&lt;p&gt;
	Страница готова. Это основа. Будем усложнять путь аргументами.&lt;/p&gt;
&lt;h2&gt;
	Аргументы&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;
	Допустим. Наша задача &amp;mdash; построить каталог изданий с возможностью выборки за год, за месяц и страница издания. Не будем спорить о том, что это можно сделать с помощью Вьюс. Цель этой заметки совсем другая.&lt;/p&gt;
&lt;p&gt;
	Итак. Для газеты&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;Три топора&amp;raquo; возможные страницы каталога будут такими:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		/catalog&lt;/li&gt;
	&lt;li&gt;
		/catalog/tri-topora&lt;/li&gt;
	&lt;li&gt;
		/catalog/tri-topora/2012&lt;/li&gt;
	&lt;li&gt;
		/catalog/tri-topora/2012/01&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Добавляем в catalog_menu&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;) новые элементы массива, заменяя аргументы знаком процента %:&lt;/p&gt;
&lt;pre&gt;
/**
&amp;nbsp;* Implementation of hook_menu&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;).
&amp;nbsp;*/

function catalog_shelves_menu&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;) {

&amp;nbsp;&amp;nbsp;$items[&amp;#39;magazines&amp;#39;] = array&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;title&amp;#39; =&amp;gt; t&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;&amp;#39;Catalog&amp;#39;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;page callback&amp;#39; =&amp;gt; &amp;#39;catalog_catalog&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;access callback&amp;#39; =&amp;gt; &lt;span class="acronym"&gt;TRUE&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;);

&amp;nbsp;&amp;nbsp;$items[&amp;#39;catalog/%/%&amp;#39;] = array&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;title&amp;#39; =&amp;gt; t&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;&amp;#39;Catalog&amp;#39;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;page callback&amp;#39; =&amp;gt; &amp;#39;catalog_catalog&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;access callback&amp;#39; =&amp;gt; &lt;span class="acronym"&gt;TRUE&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;page arguments&amp;#39; =&amp;gt; array&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;1, 2),
&amp;nbsp;&amp;nbsp;);

&amp;nbsp;&amp;nbsp;$items[&amp;#39;catalog/%/%/%&amp;#39;] = array&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;title&amp;#39; =&amp;gt; t&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;&amp;#39;Catalog&amp;#39;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;page callback&amp;#39; =&amp;gt; &amp;#39;catalog_catalog&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;access callback&amp;#39; =&amp;gt; &lt;span class="acronym"&gt;TRUE&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;page arguments&amp;#39; =&amp;gt; array&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;1, 2, 3),
&amp;nbsp;&amp;nbsp;);    

&amp;nbsp;&amp;nbsp;return $items;
} &lt;/pre&gt;
&lt;p&gt;
	Отмечу, что любые изменения hook_menu&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;) требуют очистки друпаловского кэша.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Все, что в адресе может меняться, мы заменяем % и определяем их как аргументы, которые передаются функции catalog_catalog&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;). Кстати, она тоже теперь измениться:&lt;/p&gt;
&lt;pre&gt;
function catalog_catalog&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$edition = &lt;span class="acronym"&gt;NULL&lt;/span&gt;, $year = &lt;span class="acronym"&gt;NULL&lt;/span&gt;, $month = &lt;span class="acronym"&gt;NULL&lt;/span&gt;) {

&amp;nbsp;&amp;nbsp;$output = &amp;#39;&amp;#39;;
   
&amp;nbsp;&amp;nbsp;$edition;
&amp;nbsp;&amp;nbsp;$year;
&amp;nbsp;&amp;nbsp;$month;

&amp;nbsp;&amp;nbsp;if&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;is_numeric&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$month)) {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//страница выпусков за месяц
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//делаем запрос к базе, который вернет все выпуски газеты за месяц                      
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$query = &amp;#39;...&amp;lsquo;;    

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;is_numeric&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$year)) {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//страница выпусков за год
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//делаем запрос к базе, который вернет все выпуски газеты за год
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$query = &amp;#39;...&amp;#39;;    

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//страница выпусков всего издания
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//делаем запрос к базе, который вернет все выпуски газеты за все время
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$query = &amp;#39;...&amp;lsquo;;    

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;while&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$result = db_fetch_object&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$query)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//рендерим по очереди все выпуски
&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;return $output;    
}&lt;/pre&gt;
&lt;p&gt;
	Все страницы каталога у нас обращаются к одной и той же функции &amp;mdash; catalog_catalog&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;). Определяем типа страницы исходя из аргументов. Делаем нужный запрос к базе. Рендерим в &lt;span class="acronym"&gt;HTML&lt;/span&gt; результаты запроса.&lt;/p&gt;
&lt;p&gt;
	На данном этапе ядро каталога уже готово. Осталось заморочится с мелочами.&lt;/p&gt;
&lt;h2&gt;
	Рендеринг&lt;/h2&gt;
&lt;p&gt;
	Хорошо будет, если мы не будем мешать логику приложения с отображением. Через hook_theme&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;) создадим новый элемент темизации issue и воспользуемся им в теле цикла while функции catalog_catalog&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;):&lt;/p&gt;
&lt;pre&gt;
while&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$result = db_fetch_object&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$query)) {
&amp;nbsp;&amp;nbsp;//рендерим по очереди все выпуски
&amp;nbsp;&amp;nbsp;$output .= theme&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;&amp;#39;issue&amp;#39;, $result);
}&lt;/pre&gt;
&lt;p&gt;
	Для этого нужно зарегистрировать в реестре элемент issue:&lt;/p&gt;
&lt;pre&gt;
function catalog_theme&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;) {
&amp;nbsp;&amp;nbsp;return array&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;issue&amp;#39; =&amp;gt; array&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;arguments&amp;#39; =&amp;gt; array&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;&amp;#39;form&amp;#39; =&amp;gt; &lt;span class="acronym"&gt;NULL&lt;/span&gt;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;),
&amp;nbsp;&amp;nbsp;);
}&lt;/pre&gt;
&lt;p&gt;
	И, наконец, определить функцию, которая и будет отвечать за рендеринг issue:&lt;/p&gt;
&lt;pre&gt;
function theme_issue&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$issue) {
&amp;nbsp;&amp;nbsp;$output = &amp;#39;&amp;lt;div class=&amp;quot;b-issue&amp;quot;&amp;gt;&amp;#39; . l&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$issue-&amp;gt;title, &amp;#39;node/&amp;#39; . $issue-&amp;gt;nid) . &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;;    
&amp;nbsp;&amp;nbsp;return $output;
}&lt;/pre&gt;
&lt;p&gt;
	Чистим кэш. Обновляем страницу.&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;
	Манипулирование заголовком&lt;/h2&gt;
&lt;p&gt;
	Заголовки можно изменять прямо в теле функции-колбэка. Так, в зависимости от типа страницы, мы можем определять заголовок страницы через функцию drupal_set_title&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;);.&lt;/p&gt;
&lt;h2&gt;
	Страница издания. Почему ее нет в хуке меню&lt;/h2&gt;
&lt;p&gt;
	Внимательный читатель мог заметить, что в hook_menu&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;) мы не зарегистрировали путь страницы издания &amp;mdash; catalog/%.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Давайте для интереса рассмотрим случай, если бы мы определили издание как самостоятельный тип контента Edition. Делаем у Edition алиас catalog/[title]. Тогда нужный нам адрес catalog/% &amp;mdash; это страница ноды типа Edition.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Создаем файл &amp;nbsp;node-edition.tpl.php. В файле пишем:&lt;/p&gt;
&lt;pre&gt;
if&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$page) {
&amp;nbsp;&amp;nbsp;echo catalog_catalog&lt;span class="sbrace"&gt; &lt;/span&gt; &lt;span class="hbrace"&gt;(&lt;/span&gt;$issue_title);
}&lt;/pre&gt;
&lt;p&gt;
	$issue_title &amp;mdash; это аргумент пути. Не путать с $node-&amp;gt;title.&lt;/p&gt;
&lt;p&gt;
	Готово. На странице ноды будет выводиться то, что мы определим для страницы выпусков всего издания в модуле catalog.&lt;/p&gt;
&lt;p&gt;
	Каталог изданий готов. Это простейший случай. Но у вас в руках есть очень гибкий инструмент &amp;mdash; непосредственно язык программирования, а не ограниченный в возможностях графический интерфейс. Я считаю, что это здорово!&lt;/p&gt;
&lt;p&gt;
	Успехов!&lt;/p&gt;
</description>
     <comments>http://cherenkevich.com/stuff/blog/2012/120#comments</comments>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%B4%D1%80%D1%83%D0%BF%D0%B0%D0%BB">Друпал</category>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%BB%D0%B0%D0%B9%D1%84%D1%85%D0%B0%D0%BA%D0%B8">Лайфхаки</category>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0">Разработка</category>
 <pubDate>Mon, 09 Jan 2012 10:16:39 +0000</pubDate>
 <dc:creator>cherenkevich</dc:creator>
 <guid isPermaLink="false">120 at http://cherenkevich.com</guid>
  </item>
  <item>
    <title>Пять шотов всё</title>
    <link>http://cherenkevich.com/stuff/blog/2011/118</link>
    <description>&lt;p&gt;
	Сайт&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;&lt;a href="http://5shots.ru"&gt;Пять шотов&lt;/a&gt;&amp;raquo; больше обновляться не будет.&lt;/p&gt;
&lt;p&gt;
	Причины две. Во-первых, у меня это отнимало слишком много времени. Во-вторых, ответы на вопросы стали схожими. Как правило, у всех лучшие проекты впереди, а читать нужно Огилви :)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Я не отрицаю, что проект может переродиться. Может быть появятся идеи, которые вдохнут в сайт новую жизнь и снова сделают его интересным.&lt;/p&gt;
&lt;p&gt;
	Сайт остается доступным в таком виде, в каком он находится сейчас. Удалять ничего не собираюсь.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="/sites/default/files/images/projects/blog/5shots-dead.png" style="width: 622px; height: 622px; " /&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
</description>
     <comments>http://cherenkevich.com/stuff/blog/2011/118#comments</comments>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%BA%D0%BC%D0%B3%D0%BF">КМГП</category>
 <pubDate>Thu, 22 Dec 2011 12:30:12 +0000</pubDate>
 <dc:creator>cherenkevich</dc:creator>
 <guid isPermaLink="false">118 at http://cherenkevich.com</guid>
  </item>
  <item>
    <title>Зопа. Анонс</title>
    <link>http://cherenkevich.com/stuff/blog/2011/117</link>
    <description>&lt;p&gt;
	Мне очень нравится Бэйскемп. И я с удовольствием веду проекты в нем.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Еще мне очень нравится Друпал. И мне на глаза попались пару презентаций, где ребята рассказывают, как просто на Друпале собрать аналог Бэйскемпа. Разумеется, без хорошего&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;напильника&amp;raquo; получается дешевая подъебка.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Таким образом, я однажды сел и собрал каркас Бэйскемпа на Друпале за вечер. Потом я нарисовал простой интерфейс к этому всему, помозговал и начал&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;допиливать&amp;raquo; то, что дали на выходе &lt;span class="acronym"&gt;CCK&lt;/span&gt; + Views + &lt;span class="acronym"&gt;OG&lt;/span&gt; + Calendar. Мне нравится то, что получается. Сегодня я решил, что это занятие, которое я начал из спортивного интереса, уже переросло в нормальное веб-приложение.&lt;/p&gt;
&lt;p&gt;
	После Нового года я собираюсь опробовать эту штуку внутри студии, потестить, пофиксить баги и в итоге опубликовать этот проект в Сети. Бесплатно, конечно же.&lt;/p&gt;
&lt;p&gt;
	Рабочее название проекта &amp;mdash; Зопа.&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;Где &lt;span class="acronym"&gt;ТЗ&lt;/span&gt;?&amp;raquo; &amp;mdash;&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;В Зопе&amp;raquo;.&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;Я тебе в Зопе таски оставил&amp;raquo;.&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;Все проекты у нас в Зопе&amp;raquo;. И так далее. Перед публикацией в Сеть, думаю, название сменится на что-нибудь по-серьезнее :)&lt;/p&gt;
</description>
     <comments>http://cherenkevich.com/stuff/blog/2011/117#comments</comments>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%B1%D0%B8%D0%B7%D0%BD%D0%B5%D1%81">Бизнес</category>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0">Разработка</category>
 <pubDate>Sat, 17 Dec 2011 17:06:20 +0000</pubDate>
 <dc:creator>cherenkevich</dc:creator>
 <guid isPermaLink="false">117 at http://cherenkevich.com</guid>
  </item>
  <item>
    <title>Сайт «Перемотки»</title>
    <link>http://cherenkevich.com/stuff/blog/2011/115</link>
    <description>&lt;p&gt;
	Мы сделали &lt;a href="/portfolio/peremotka"&gt;сайт журналу&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;Перемотка&amp;raquo;&lt;/a&gt;. Редакторы этого журнала смотрят зарубежные фильмы и сериалы на разных мобильных девайсах. А затем они пишут клевые публикации на сайте,&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;подшивая&amp;raquo; их затем в выпуски журнала.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="/sites/default/files/images/projects/blog/peremotka-blog.jpg" style="position: relative; left: -20px; width: 662px; height: 917px; " /&gt;&lt;/p&gt;
&lt;p&gt;
	В&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;Перемотке&amp;raquo; редакторы настолько крутые, что не обламываются каждый пост оформить с уникальной версткой. Я не удивлюсь, если эти ребята каждый пост сначала верстают в Ин Дизайне. На сайте все так и дышит любовью к делу и профессионализмом.&lt;/p&gt;
&lt;h3&gt;
	Фичи&lt;/h3&gt;
&lt;p&gt;
	Для того, чтобы объединять публикации в выпуск под одной обложкой, мы разработали для&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;Перемотки&amp;raquo; систему а ля системы&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;Отметить человека на фото&amp;raquo; в соц. сетках. Админ загружает обложку, выделяет область на этой картинке и назначает этой области ссылку.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="/sites/default/files/images/projects/blog/peremotka-admin.jpg" style="width: 622px; height: 374px; " /&gt;&lt;/p&gt;
&lt;p&gt;
	В результате &lt;a href="http://peremotka.co/covers/109"&gt;все выглядит так&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
	Для &lt;span class="acronym"&gt;CK&lt;/span&gt; Editor было сделано пару фич, которые сделали из него еще более удобный визуальный редактор.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;
	Что учесть на будущее&lt;/h3&gt;
&lt;p&gt;
	Если в &lt;span class="acronym"&gt;CSS&lt;/span&gt; Reset Эрика Мейера убрать строку vertical-align: baseline, то можно сэкономить около двух часов времени при верстке : )&lt;/p&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
</description>
     <comments>http://cherenkevich.com/stuff/blog/2011/115#comments</comments>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B">Работы</category>
 <pubDate>Mon, 05 Dec 2011 08:54:51 +0000</pubDate>
 <dc:creator>cherenkevich</dc:creator>
 <guid isPermaLink="false">115 at http://cherenkevich.com</guid>
  </item>
  <item>
    <title>Главная страница</title>
    <link>http://cherenkevich.com/stuff/blog/2011/113</link>
    <description>&lt;p&gt;
	Очень часто главная страница на сайте не самая главная страница на сайте. В том плане, что индексная страница не самая важная. Гораздо важнее спроектировать сперва страницу профиля или страницу продукта, потому что они могут оказать влияние на особенности модульной сетки или на стилистику&amp;nbsp;сайта.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Если начать проектировать и рисовать сайт с главной страницы, как это очень часто практикуют молодые дизайнеры и дизайнеры местечковых говностудий, то можно просто не узреть многих мелочей и столкнуться с проблемами, которые заставят начать работу с чистого листа.&lt;/p&gt;
&lt;p&gt;
	Я начинаю делать сайт с проектирования самых сложных страниц. Простите, если эта заметка очевидна.&lt;/p&gt;
</description>
     <comments>http://cherenkevich.com/stuff/blog/2011/113#comments</comments>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD">Дизайн</category>
 <pubDate>Mon, 28 Nov 2011 11:17:53 +0000</pubDate>
 <dc:creator>cherenkevich</dc:creator>
 <guid isPermaLink="false">113 at http://cherenkevich.com</guid>
  </item>
  <item>
    <title>Логотип и сайт студии</title>
    <link>http://cherenkevich.com/stuff/blog/2011/112</link>
    <description>&lt;p&gt;
	&lt;a href="http://dsgn.by"&gt;Денис Серебряков&lt;/a&gt; нарисовал нам логотип.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	По этому поводу привел сайт в порядок. Большое спасибо Денису за советы по редизайну сайта.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Добавил раздел &lt;a href="/studio"&gt;о студии&lt;/a&gt;. К счастью, я больше не работаю один. В этом разделе мы опубликовали некотрые тезисы и принципы нашей работы.&lt;/p&gt;
&lt;p&gt;
	Для меня очень важно, чтобы мои клиенты перестали воспринимать меня как фрилансера-одиночку, поэтому я убрал все личное в раздел&lt;span class="slaquo"&gt; &lt;/span&gt; &lt;span class="hlaquo"&gt;&amp;laquo;&lt;/span&gt;&lt;a href="/stuff"&gt;Каша, мед, говно и пчелы&lt;/a&gt;&amp;raquo; &amp;mdash; подальше от всего, что связано с работой.&lt;/p&gt;
&lt;p&gt;
	Преобразилась &lt;a href="/process"&gt;страница о процессе&lt;/a&gt;&amp;nbsp;и &lt;a href="/"&gt;портфолио&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
	Всех с пятницей!&lt;/p&gt;
</description>
     <comments>http://cherenkevich.com/stuff/blog/2011/112#comments</comments>
 <category domain="http://cherenkevich.com/category/%D1%82%D0%B5%D0%B3%D0%B8/%D0%BA%D0%BC%D0%B3%D0%BF">КМГП</category>
 <pubDate>Fri, 25 Nov 2011 12:08:14 +0000</pubDate>
 <dc:creator>cherenkevich</dc:creator>
 <guid isPermaLink="false">112 at http://cherenkevich.com</guid>
  </item>
  </channel>
</rss>

