Drupal Россия http://www.drupal.ru Drupal (Друпал) — голландское "druppel" («капля») в английском произношении. Drupal — платформа для создания сайтов и управления ими (CMF). Посредством данной системы можно строить сайты различного назначения и сложности, для управления созданным на Drupal сайтом не требуется владение вебвёрсткой и знание программирования. Drupal создан международной командой разработчиков, как программное обеспечение с открытыми исходными текстами, защищенными общественной лицензией GNU. Международный сайт проекта — drupal.org, а наш сайт предназначен для общения и координации работ русскоговорящих участников проекта. Сообщества проекта Drupal доступны также на других языках. ru С 8 марта! http://www.drupal.ru/node/41328 <p>Поздравляем <a href="/profile/gender/%D0%B6%D0%B5%D0%BD%D1%81%D0%BA%D0%B8%D0%B9">представительниц прекрасного пола</a> с 8 марта и вообще с весной! Красивых вам сайтов! :)<br /> <img src="/files/landyshi2.jpg" alt="8 марта" align="left" /></p> http://www.drupal.ru/node/41328#comments весна праздник Mon, 08 Mar 2010 08:50:33 +0000 admin 41328 at http://www.drupal.ru 48 советов для программистов от Lullabot [перевод] http://www.drupal.ru/node/41087 <h2>48 Essential Drupal Development Tips From Lullabot</h2> <p>Оригинал статьи<br /> <a href="http://www.missingfeatures.com/2010/02/16/48-essential-drupal-development-tips-from-lullabot/" title="http://www.missingfeatures.com/2010/02/16/48-essential-drupal-development-tips-from-lullabot/">http://www.missingfeatures.com/2010/02/16/48-essential-drupal-developmen...</a></p> <p><em>От переводчика:</em><br /> Автор статьи принимал участие в 4-х дневном курсе обучения Drupal от Lullabot по таким направлениям как: темизация, API форм, API меню, разработка модулей, jQuery и лучшие практики.</p> <p>Все советы от Lullabot были аккуратно записаны и опубликованы в данной статье. От себя замечу, что некоторые советы даже для меня, матерого программиста, были в новинку.</p> <p>UPD: для хабралюдей: <a href="http://habrahabr.ru/blogs/drupal/86073/" title="http://habrahabr.ru/blogs/drupal/86073/">http://habrahabr.ru/blogs/drupal/86073/</a></p> <p><strong>1.</strong> Выводите переменную $body_classes в атрибут "class" тега "body" в вашем файле page.tpl.php для того, что бы иметь возможность использовать различные классы страничек, например “front” - главная, “not_front” - не главная, “logged-in” - для залогиненных и пр.</p> <p><strong>2.</strong> Страничка "/admin/build/block" это единственная админская страница, на которой не используется администраторская тема оформления. Это сделано для того, что бы вы имели представление о местонахождении своих блоков на сайте.</p> <p><strong>3.</strong> Чаще всего в шаблон page.tpl.php забывают вставлять переменные $closure и $tabs.</p> <p><strong>4.</strong> Наиболее распространенным методом темизации является копирование файлов шаблонов из модулей или тем оформления и редактирования их под свои потребности.</p> <p><strong>5.</strong> Для решения проблем с различным порядком слов в различных языках используйте плейхолдеры. Например:$variables['submitted'] = t('On @date', array('@date'=&gt;format_date($variables['created'],'custom','F jS')));</p> <p><strong>6.</strong> <strong>[Лучшая практика]</strong> В случае обновления системы лучшей практикой является стирание и создание заново тех темизирующих функций, которые вы переопределяете. Таким образом вы можете включить любые изменения кода, которые вы не захватили.</p> <p><strong>7.</strong> Если вы не хотите использовать переменную $content в шаблоне node.tpl.php, то не используйте. Вы можете выводить различные поля отдельно друг от друга.</p> <p><strong>8.</strong> <strong>[Производительность]</strong> Во вьюс предпочитайте использовать стиль ряда "Fields" (поля), а не "Nodes" (ноды). В режиме "Nodes" происходит вызов node_load() на каждой ноде в вашем виде, что может стоить вам более 50 запросов на каждую ноду. В режиме "Fields" происходит просто сбор необходимой информации в одном запросе.</p> <p><strong>9.</strong> Обратите внимание на функцию dsm() - это что то типа функции pr() в CakePHP (<a href="http://cakephp.org/" title="http://cakephp.org/">http://cakephp.org/</a>). Эта функция может выводить на страницу сложные структуры данных в удобном для восприятия виде. Требуется модуль <img src="/sites/all/modules/romka_bbcode/icons/astrologer.gif" class="bbcode_image">&nbsp;<a href=http://drupal.org/project/devel target=_blank>devel</a> (<a href="http://drupal.org/project/devel" title="http://drupal.org/project/devel">http://drupal.org/project/devel</a>).</p> <p><strong>10.</strong> Группируйте кастомные модули в одной и той же "группе" (“package”) и тогда Вам не придётся рыскать по странице со списком модулей в поисках того или иного модуля.</p> <p><strong>11.</strong> Для отслеживания изменений в API между D6 и D7 используйте модуль <img src="/sites/all/modules/romka_bbcode/icons/astrologer.gif" class="bbcode_image">&nbsp;<a href=http://drupal.org/project/coder target=_blank>coder</a> (<a href="http://drupal.org/project/coder" title="http://drupal.org/project/coder">http://drupal.org/project/coder</a>)</p> <p><strong>12.</strong> <strong>[Лучшая практика]</strong> Переменная $user относится к пользователю, который залогинен на сайте в момент исполнения кода, переменная $account относится к любому пользователю вне зависимости от того, залогинен он на сайте или нет.</p> <p><strong>13.</strong> <strong>[Производительность]</strong> На каждой странице происходит загрузка всей таблицы переменных (variable), поэтому имеет смысл следить за этой таблицей и удалять ненужные значения.</p> <p><strong>14.</strong> <strong>[Производительность]</strong> Функция variable_get() не вызывает запросов к базе данных т.к. все переменные хранятся в памяти в момент исполнения кода.</p> <p><strong>15.</strong> Не вызывайте функцию t() для названий и описаний пунктов меню. Они сохраняются в кеше в момент билда меню. Это значит, что язык, установленный в момент создания кеша меню будет использоваться для всех пользователей.</p> <p><strong>16.</strong> Используйте MENU_LOCAL_TASK для пунктов меню, которые Вы хотите сделать табами. Например, таким образом можно добавить табы для таких страниц как "node/*" или "user/*"<br /> <strong><br /> 17.</strong> <strong>[Производительность]</strong> Используйте для Ваших коллбэк функций из меню отдельные файлы *.inc с помощью задания аттрибута "file" в массиве, определяющем элемент меню. Это приведет к более эффективному распределению памяти т.к. файл модуля *.module загружается на каждой странице, а заданные файлы *.inc загружаются только при вызове данного пункта меню.</p> <p><strong>18.</strong> При использовании %user или %node в определении пункта меню Drupal автоматически запускает функции node_load() или user_load() передавая этим функциям в качестве аргумента то, что стоит на их месте в url (обычно это ID) и возвращают объект - ноду или объект - пользователя</p> <p><strong>19.</strong> Вы можете определить свой собственный хендлер % в определении меню. Например, %example будет вызывать Вашу функцию example_load(). Эта функция должна находиться в главном файле модуля *.module а не в файлах *.inc</p> <p><strong>20.</strong> В своем модуле Вы можете использовать $GLOBALS['conf']['cache'] = false . В этом случае будет отключено кеширование данной страници. Обратите внимание на то, что если эта страница была закеширована ранее, то потребуется скинуть кеш.</p> <p><strong>21.</strong> Вы без труда определите, что данный сайт работает на Drupal если посмотрите в заголовках "page expire date" дату устаревания страницы. У Drupal это 11/19/1978 - дата рождения создателя Drupal. (<a href="http://drupal.org/user/1" title="http://drupal.org/user/1">http://drupal.org/user/1</a>)</p> <p><strong>22.</strong> Использовать "маршрутизацию" (перенаправление) в Drupal можно с помощью функций custom_url_rewrite_inbound() и custom_url_rewrite_outbound()</p> <p><strong>23.</strong> К вопросу выбора правильного типа поля "дата" в CCK:<br /> - Дата (ISO) - хорошо подходит для не точных дат (например, только год)<br /> - "Datestamp" ( штамп даты, кол. секунд с момента начала эры Unix) - тот же формат используется в ядре Drupal<br /> - Лучше всего использовать "Datetime", этот формат имеет ту же точность что и "Datestamp". Кроме того, "Datetime" сохраняет данные в родном формате базы данных, что позволяет проводить различные манипуляции прямо на уровне базы данных (что очень быстро).</p> <p><strong>24.</strong> <strong>[Лучшая практика]</strong> Разбивайте Вашу папку "sites/all/modules" на две дополнительные папки "contrib" и "custom", для скачанных и своих модулей соответственно.</p> <p><strong>25.</strong> <strong>[Лучшая практика]</strong> Если Вам необходимо модифицировать код чужих модулей, то отслеживайте все изменения и сохраняйте их в специальных файлах патчей. Создайте отдельную директорию для сохранения всех файлов патчей. Каждый раз, когда Вы обновляете модуль, удостоверьтесь, что Ваш патч все ещё необходим. Примените совой патч к новой версии модуля (если это требуется), либо удалите патч из Вашей папки (если патч уже включен в модуль).</p> <p><strong>26.</strong> <strong>[Лучшая практика]</strong> Хук hook_menu() должен быть первой функцией в Вашем модуле, потому что он играет роль "индекса" для модуля, который описывает что делает Ваш модуль и когда он это делает. (Имеется ввиду не программная сторона, а девелоперская. Любой разработчик глядя на Ваш hook_menu() может легко начать ориентироваться в Вашем модуле).</p> <p><strong>27.</strong> Причина по которой аттрибуты форм начинаются со знака "#" в массиве $form заключается в возможности создавать вложенности форм в массиве.</p> <p><strong>28.</strong> Атрибут "clicked_button" используется для управления сабмитом кнопок, которые являются картинками. Т.к. интернет эксплорер не использует при сабмите имена кнопок, как это делают другие браузеры.</p> <p><strong>29-30.</strong> Вы обычно устанавливаете ошибку в поле во вложенной форме используя формат parent][child (Например "home][street")? А Вы знаете, что form_error() позволяет устанавливать ошибку в поле с использованием более логичного форматирования чем form_set_error()<br /> form_set_error('home][street','You must enter the street address.');<br /> form_error($form['home']['city'], ‘You must enter the street address.’);</p> <p><strong>31.</strong> Если в переменной $form_storage находится хотя бы что то, в этом случае Drupal будет игнорировать любые редиректы и будет просто делать ребилд формы при сабмите. Что бы избежать этого, в некоторых случаях придется делать unset $form_storage.</p> <p><strong>32.</strong> <strong>[Лучшая практика]</strong> Вы можете использовать любой HTML код в Ваших функциях темизации потому, что система темизации построена таким образом, что она может переопределять HTML в своих собственных функциях.</p> <p><strong>33.</strong> Drupal будет автоматически рендерить любые неотрендеренные части массива $form. Поэтому Вам совсем не обязательно рендерить вручную каждую часть. Только если вы хотите управлять этой частью индивидуально и отдельно от остальных. </p> <p><strong>34.</strong> Для быстрого переключения между базами данных используйте db_set_active(). Эта функция позволяет переключаться между соединениями с базами, которые Вы указали в своем файле settings.php.</p> <p><strong>35.</strong> Модуль <img src="/sites/all/modules/romka_bbcode/icons/astrologer.gif" class="bbcode_image">&nbsp;<a href=http://drupal.org/project/tw target=_blank>Table Wizard</a> (<a href="http://drupal.org/project/tw" title="http://drupal.org/project/tw">http://drupal.org/project/tw</a>) позволяет создать описание любой таблицы для views. Вы даже можете выбрать ключи таблицы, которые используются для джоинтов.</p> <p><strong>36.</strong> Если Вы установите для элемента формы атрибут "#value" (например, для скрытого поля), то Drupal при обработке сабмита всегда будет устанавливать значение этого поля в то, что Вы укажете в "#value" независимо от того, что будет получено от пользователя т.к. при сабмите происходит ребилд формы, а уже затем обработка.</p> <p><strong>37.</strong> Если тип элемента формы ("#type") это "value", то этот элемент формы не будет включен в HTML форму на пользовательской стороне. Пользователь вообще не увидит этих данных, но в обработчиках формы в Drupal эти данные будут доступны на ряду с другими данными формы.<br /> Например: $form['element_name'] = array("#type" =&gt; "value", "#value" =&gt; "My Value");<br /> My Value - будет доступен в $form_state['values']['element_name'], но не будет присутствовать на страничке с формой.</p> <p><strong>38.</strong> <strong>[HTML]</strong> Если в страницу включен JavaScript (инлайн, прямо в тексте страницы), то в этом месте будет происходить полная остановка загрузки всего, что идет после этого скрипта (HTML, JavaScript и др.) до тех пор, пока код не загрузится.</p> <p><strong>39.</strong> <strong>[JQuery]</strong> VisualjQuery.com это удобное, визуальное API к JQuery</p> <p><strong>40.</strong> <strong>[Firebug]</strong> можно запустить JavaScript прямо в консольном табе Firebug если использовать "&gt;&gt;&gt;" который находится внизу консоли.</p> <p><strong>41.</strong> <strong>[HTML]</strong> Некоторые браузеры будут вырезать теги "A" если для них не определен атрубут "href".</p> <p><strong>42.</strong> <strong>[Производительность JQuery]</strong> Если указать тег вместе с классом, то поиск этого элемента будет происходить намного быстрее чем если указать просто класс.<br /> Например:<br /> <em>Медленно:</em> $('.content');<br /> <em>Быстро:</em> $('div.content');</p> <p><strong>43.</strong> <strong>[Производительность JQuery]</strong> Использование $(this) внутри функций селекторов дает большую скорость чем использование селектора еще раз заново.</p> <p><strong>44.</strong> Самым удобным способом управления вьюсами является экспортирование необходимого вьюса и сохранение его в своем модуле. Это приводит к тому, что вы можете следить за изменением вида с помощью систем контроля версий. Еще ваш вид становится защищенным от случайных ошибок пользователей, Вы всегда можете сделать "revert" и возвратиться к исходному состоянию.</p> <p><strong>45.</strong> Управление патчами: Создайте пустой модуль и используйте хук hook_update() для того, что бы вносить в сайт большие изменения, например, в настройках и пр. Таким способом можно, например, после обновления модуля еще запустить update.php и накатить на новый модуль Ваш патч.</p> <p><strong>46.</strong> <strong>Безопасность данных</strong>: По большому счету, на уровне темизации все данные должны быть уже безопастны. Что бы обезопасить свой сайт от данных, введенных пользователем используйте check_plain (все теги вырезаются) или check_markup (текст проходит обработку фильтром ввода поумолчанию).</p> <p><strong>47.</strong> Вы можете создать drush_make скрипт для <img src="/sites/all/modules/romka_bbcode/icons/astrologer.gif" class="bbcode_image">&nbsp;<a href=http://drupal.org/project/Drush target=_blank>Drush</a> (<a href="http://drupal.org/project/drush" title="http://drupal.org/project/drush">http://drupal.org/project/drush</a>), который будет создавать чистую установку Drupal со свежими версиями модулей, которые будут скачаны с Drupal.org прямо в момент установки.</p> <p><strong>48.</strong> Как можно больше используйте функции cache_get() и cache_set() т.к. они уменьшат количество запросов к базе данных.</p> <h2>Из комментариев</h2> <h3>Советы по JQuery:</h3> <p>1. Если только возможно, то используйте ID для селекторов jquery.<br /> $(‘#block-menu-1") это очень быстро, примерно в 100 раз быстрее чем $(‘div.block’)<br /> а $(‘div.block’) всего лишь немного быстрее чем $(‘.block’)</p> <p>2. Кешируйте данные.<br /> Плохо:<br /> $(‘#wombat’).hide();<br /> $(‘#wombat’).remove();</p> <p>Хорошо:<br /> var wombat = $(‘#wombat’);<br /> wombat.hide();<br /> wombat.remove():</p> <p>Отлично:<br /> $(‘#wombat’)<br /> .hide()<br /> .remove();</p> <p>3. Вы можете передать переменную в Firebug с использованием console.log()<br /> var lemmeSee = $(‘#wombat’);<br /> console.log(lemmeSee)</p> <h3>Другие полезные функции модуля Devel</h3> <p>dpm() – впечатывает объект в сообщение.</p> <p>dargs($once = TRUE) – печатает аргументы текущей фукнции, $once = TRUE в этом случае печатает их только один раз.</p> <p>dd() – записывает объект в файл /tmp/drupal_debug.txt – очень полезно, когда нужно сделать дебаг Ajax запросов. если запросы идут из Flash плеера, то у них другой ID сессии. Можно так же использовать watchdog(‘debug’, print_r($object, TRUE)) , в этом случае объект будет записан в базу данных.</p> <p>dfb() – выводит информацию в firebug (нужно установить FirePHP в модуле Devel)</p> <h3>Как узнать какие переменные доступны в файлах шаблонов:</h3> <p>Это сделать очень легко вызвав dpm(get_defined_vars())<br /> или var_dump(get_defined_vars())</p> <h3>Еще немного советов:</h3> <p>Вы можете без труда создать схему базы данных для Вашего модуля по следующему алгоритму:</p> <p>1. Создайте необходимую таблицу (или таблицы) в Вашем любимом инструменте (например, в phpMyAdmin)<br /> 2. Экспортируйте таблицу с помощью модуля <img src="/sites/all/modules/romka_bbcode/icons/astrologer.gif" class="bbcode_image">&nbsp;<a href=http://drupal.org/project/Schema target=_blank>Schema</a> (<a href="http://drupal.org/project/schema" title="http://drupal.org/project/schema">http://drupal.org/project/schema</a>). Вы можете просто скопировать полученный массив в Ваш модуль, в хук hook_schema</p> <p>Вы можете экспортировать Ваш тип контента (CCK) с использованием модуля "CCK Content Copy" (который входит в пакет CCK) и вставить этот код к инсталяционный хук Вашего модуля.</p> http://www.drupal.ru/node/41087#comments Разработка модулей Drupal 6.* Tue, 02 Mar 2010 11:52:21 +0000 seaji 41087 at http://www.drupal.ru Возврат картинки AHAH-коллбеком http://www.drupal.ru/node/41033 <p><img src="http://jdrupal.ru/sites/default/files/drupalbook_1.gif" width="150" height="128" alt="Возврат картинки AHAH-коллбеком" align="left" /> Для получения картинки при клике по кнопке AHAH-запросом, нужна форма и AHAH-обработчик. Форма содержит текстовое поле (если нужно чтобы возвращаемая картинка содержала наш текст), кнопку submit, div для вывода сгенерированной картинки.<br /> Текстовое поле для отправки текста. Текст отправлять не обязательно. Можно возвращать картинку или текст просто по кнопке submit, но это более простой случай, потому его рассматривать не будем. Кнопка содержит обязательные для AHAH-запроса массив <strong>#ahah</strong>, с параметром <strong>path</strong>, с информацией о AHAH-коллбеке - <strong>mymodule_message_js()</strong> (функцией, отвечающей за возврат результата в форму).<br /> <a href="http://jdrupal.ru/node/13" title="Возврат картинки AHAH-коллбеком">Кросс-пост</a> с моего блога <a href="http://jdrupal.ru" title="http://jdrupal.ru">http://jdrupal.ru</a> | <a href="http://habrahabr.ru/blogs/drupal/85915/">На хабре</a> только ссылкой</p> <p><div class="geshifilter"><pre class="drupal6_ru geshifilter-drupal6_ru" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> mymodule_form<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span> <a href="http://www.php.net/global"><span style="color: #000066;">global</span></a> <span style="color: #0000ff;">$user</span>; <span style="color: #0000ff;">$form</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'title'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'#type'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'textfield'</span>, <span style="color: #ff0000;">'#title'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'My text'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'#default_value'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$node</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">title</span>, <span style="color: #ff0000;">'#size'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">60</span>, <span style="color: #ff0000;">'#maxlength'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">60</span>, <span style="color: #ff0000;">'#required'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #000000; font-weight: bold;">TRUE</span>, <span style="color: #66cc66;">&#41;</span>; &nbsp; <span style="color: #0000ff;">$form</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'submit'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'#type'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'submit'</span>, <span style="color: #ff0000;">'#value'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'click me'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'#ahah'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'event'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'click'</span>, <span style="color: #ff0000;">'path'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'mymodule/message_js/'</span>, <span style="color: #ff0000;">'wrapper'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'target'</span>, <span style="color: #ff0000;">'effect'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'fade'</span>, <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>; &nbsp; <span style="color: #0000ff;">$form</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'target'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'#type'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'markup'</span>, <span style="color: #ff0000;">'#prefix'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'&lt;div id=&quot;target&quot;&gt;'</span>, <span style="color: #ff0000;">'#value'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'This text will be replaced by a picture'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'#suffix'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'&lt;/div&gt;'</span>, <span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$form</span>; <span style="color: #66cc66;">&#125;</span></pre></div></p> <p>AHAH-коллбек должен вернуть картинку, и, возможно, текст. Картинка удобно генерируется отдельным запросом (который не забываем прописать в хуке mymodule_menu). Функция <strong>drupal_json()</strong> возвращает скомпанованные данные. Будет ли картинка рисоваться с нуля или создаваться на основе заранее подготовленного изображения не важно. AHAH-коллбек возвратит ее в &lt;<strong>div id="target"&gt;</strong>. </p> <p>Переменная $str нужна для передачи текста в скрипт генерации изображения. Это не лучший вариант, но если особые требования не оговорены можно использовать его. Альтернативой может быть сохранение текста в БД и генерация картинки на основе значений из БД (генерация баннеров, статистики).</p> <p><div class="geshifilter"><pre class="drupal6_ru geshifilter-drupal6_ru" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> mymodule_message_js<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$str</span> = <span style="color: #0000ff;">$_POST</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'title'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$output</span> = <span style="color: #ff0000;">'&lt;img src=&quot;myimage.png/'</span>.<span style="color: #0000ff;">$str</span>.<span style="color: #ff0000;">'&quot;&gt;&lt;/a&gt;'</span>;<span style="color: #66cc66;">&#125;</span> <a href="http://api.drupal.ru/api/function/drupal_json/6"><span style="color: #000066;">drupal_json</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'status'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #000000; font-weight: bold;">TRUE</span>, <span style="color: #ff0000;">'data'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$output</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #66cc66;">&#125;</span></pre></div></p> <p>Самая главная часть с <strong>hook_menu</strong>. Пункты в меню:</p> <ol> <li> $items['<strong>mypath</strong>'] отвечает за страницу где расположена описанная выше форма. </li> <li> $items['<strong>mymodule/message_js</strong>'] - AHAH-коллбек </li> <li> $items['<strong>myimage.png/%</strong>'] - генерация картинки</li> </ol> <p><div class="geshifilter"><pre class="drupal6_ru geshifilter-drupal6_ru" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> mymodule_menu<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> &nbsp; <span style="color: #0000ff;">$items</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'mypath'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'title'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'Custom caption'</span>, <span style="color: #ff0000;">'page callback'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'drupal_get_form'</span>, <span style="color: #ff0000;">'page arguments'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'stitch_form'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'access callback'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://api.drupal.ru/api/function/user_access/6"><span style="color: #000066;">user_access</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'myaccess'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #66cc66;">&#41;</span>; &nbsp; <span style="color: #0000ff;">$items</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'mymodule/message_js'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'page callback'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'mymodule_message_js'</span>, <span style="color: #ff0000;">'page arguments'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$form_state</span>, <span style="color: #ff0000;">'type'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://api.drupal.ru/api/constant/MENU_CALLBACK/6"><span style="color: #000000; font-weight: bold;">MENU_CALLBACK</span></a>, <span style="color: #ff0000;">'access callback'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://api.drupal.ru/api/function/user_access/6"><span style="color: #000066;">user_access</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'myaccess'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #66cc66;">&#41;</span>; &nbsp; <span style="color: #0000ff;">$items</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'myimage.png/%'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'page callback'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'mymodule_image'</span>, <span style="color: #ff0000;">'type'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://api.drupal.ru/api/constant/MENU_CALLBACK/6"><span style="color: #000000; font-weight: bold;">MENU_CALLBACK</span></a>, <span style="color: #ff0000;">'access callback'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://api.drupal.ru/api/function/user_access/6"><span style="color: #000066;">user_access</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'myaccess'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'page arguments'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #66cc66;">&#41;</span>; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$items</span>; <span style="color: #66cc66;">&#125;</span></pre></div></p> <p>Функция <strong>mymodule_image($str)</strong> реализуется с учетом основных требований для генерации картинки: отправка header-информации, генерации картинки, настройки кириллицы (если нужен кириллический текст), организации пути хранения файла шрифта на сервере.</p> <p><div class="geshifilter"><pre class="drupal6_ru geshifilter-drupal6_ru" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">function</span> mymodule_image<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$str</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span> <a href="http://api.drupal.ru/api/function/drupal_set_header/6"><span style="color: #000066;">drupal_set_header</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Content-type: image/png&quot;</span><span style="color: #66cc66;">&#41;</span>; &nbsp; <a href="http://www.php.net/putenv"><span style="color: #000066;">putenv</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'GDFONTPATH='</span> . <a href="http://www.php.net/realpath"><span style="color: #000066;">realpath</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'.'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$image</span> = imagecreate<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">88</span>, <span style="color: #cc66cc;">31</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$background_color</span> = imagecolorallocate<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">122</span>, <span style="color: #cc66cc;">198</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$text_color</span> = imagecolorallocate<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span>, <span style="color: #cc66cc;">255</span>, <span style="color: #cc66cc;">255</span>, <span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span>; imagefill<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span>, 0, 0, <span style="color: #0000ff;">$background_color</span><span style="color: #66cc66;">&#41;</span>; &nbsp; <span style="color: #0000ff;">$path_to_ttf</span> = <span style="color: #ff0000;">&quot;modules/mymodule/arial.ttf&quot;</span>; <span style="color: #0000ff;">$text_color</span> = imagecolorallocate <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span>, <span style="color: #0000ff;">$color_red</span>=<span style="color: #cc66cc;">255</span>, <span style="color: #0000ff;">$color_green</span>=<span style="color: #cc66cc;">255</span>, <span style="color: #0000ff;">$color_blue</span>=<span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span>; &nbsp; imagettftext<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span>, <span style="color: #0000ff;">$size</span>=<span style="color: #cc66cc;">8</span>, <span style="color: #0000ff;">$angle</span>=0, <span style="color: #0000ff;">$x</span>=<span style="color: #cc66cc;">20</span>, <span style="color: #0000ff;">$y</span>=<span style="color: #cc66cc;">10</span>, <span style="color: #0000ff;">$text_color</span>, <span style="color: #0000ff;">$path_to_ttf</span>, <span style="color: #0000ff;">$str</span><span style="color: #66cc66;">&#41;</span>; &nbsp; imagepng<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span><span style="color: #66cc66;">&#41;</span>; imagedestroy<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$image</span><span style="color: #66cc66;">&#41;</span>; <a href="http://www.php.net/exit"><span style="color: #000066;">exit</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></p> <p> Функция <strong> imagepng($image)</strong> в этом случае выводит картинку в части <strong>$output </strong> функции <strong>mymodule_message_js()</strong><br /> Результатом работы модуля при введенном тексте "jdrupal.ru", будет картинка<br /> <img src="http://jdrupal.ru/sites/default/files/jdrupal.png" width="88" height="31" alt="Картинка сгенерированная AHAH-коллбеком " /></p> http://www.drupal.ru/node/41033#comments Разработка модулей AHAH Mon, 01 Mar 2010 08:55:03 +0000 sadmin 41033 at http://www.drupal.ru Патч к модулю Date - показываем месяцы в родительном падеже http://www.drupal.ru/node/41002 <p>Вывод даты в виде "<em>27 февраль 2010</em>" это <strong>уродливо</strong>. Ни в русском, ни в украинском, ни в польском - и, я думаю, что это касается большинства других славянских языков - так не говорят и не пишут.</p> <p><img src="http://drupal.ru/files/date_api_original.png" alt="НЕправильные даты в выводе ноды" /></p> <p>Понятно, что через какое-то время привыкаешь и просто не замечаешь, но есть ведь настойчивые заказчики, которые тыкают носом разработчика в эти "ляпы" и требующие исправления ошибок (по их мнению). Спасибо им за это. Это нужно, хотя и раздражает.</p> <h3>Вывод блока с кастомным обработчиком дат.</h3> <p>Итак, по требованию заказчика вывести в блоке нормальные даты я написал модуль. Модуль выводит блок, где определённым образом форматируется вывод анонсов и собственно исправляются даты. Точно такой же блок можно сделать во Views, если бы не кривые даты...</p> <p>Короче говоря код модуля я приводить не буду, а только функцию, которая исправляет даты. Этот код может очень пригодится тем, кто не сможет дочитать пост до конца.</p> <p>Ок. Код всего модуля приложен к статье, чтобы уменьшить соотношение код/текст, чтобы не объяснять как делается вызов фунции и в каком формате должна быть дата - изучайте сами, если это вам нужно. Даты начала события и конца хранятся в одном ССК-поле, которое называется field_event_date и имеет тип Date.</p> <p>Но этот модуль можно не использовать, а применить патч для модуля Date, но об этом ниже.</p> <p><div class="geshifilter"><pre class="drupal6_ru geshifilter-drupal6_ru" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// Функция преобразует даты в &quot;правильные&quot;, то есть в родительном падеже и ещё разные штучки делает.</span> <span style="color: #000000; font-weight: bold;">function</span> _calendar_list_conv_date<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$a</span>, <span style="color: #0000ff;">$format</span>=<span style="color: #ff0000;">'front'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <a href="http://www.php.net/global"><span style="color: #000066;">global</span></a> <span style="color: #0000ff;">$language</span>; <span style="color: #0000ff;">$date</span> = <a href="http://www.php.net/strtotime"><span style="color: #000066;">strtotime</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$a</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">switch</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$format</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'front'</span>: <span style="color: #0000ff;">$monthes</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'en'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'January'</span>,<span style="color: #ff0000;">'February'</span>,<span style="color: #ff0000;">'March'</span>,<span style="color: #ff0000;">'April'</span>,<span style="color: #ff0000;">'May'</span>,<span style="color: #ff0000;">'June'</span>,<span style="color: #ff0000;">'July'</span>,<span style="color: #ff0000;">'August'</span>,<span style="color: #ff0000;">'September'</span>,<span style="color: #ff0000;">'October'</span>,<span style="color: #ff0000;">'November'</span>,<span style="color: #ff0000;">'December'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'ru'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'января'</span>,<span style="color: #ff0000;">'февраля'</span>,<span style="color: #ff0000;">'марта'</span>,<span style="color: #ff0000;">'апреля'</span>,<span style="color: #ff0000;">'мая'</span>,<span style="color: #ff0000;">'июня'</span>,<span style="color: #ff0000;">'июля'</span>,<span style="color: #ff0000;">'августа'</span>,<span style="color: #ff0000;">'сентября'</span>,<span style="color: #ff0000;">'октября'</span>,<span style="color: #ff0000;">'ноября'</span>,<span style="color: #ff0000;">'декабря'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'uk'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'січня'</span>,<span style="color: #ff0000;">'лютого'</span>,<span style="color: #ff0000;">'березня'</span>,<span style="color: #ff0000;">'квітня'</span>,<span style="color: #ff0000;">'травня'</span>,<span style="color: #ff0000;">'червня'</span>,<span style="color: #ff0000;">'липня'</span>,<span style="color: #ff0000;">'серпня'</span>,<span style="color: #ff0000;">'вересня'</span>,<span style="color: #ff0000;">'жовтня'</span>,<span style="color: #ff0000;">'листопада'</span>,<span style="color: #ff0000;">'грудня'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$weekday</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'en'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Monday'</span>,<span style="color: #ff0000;">'Tuesday'</span>,<span style="color: #ff0000;">'Wednesday'</span>,<span style="color: #ff0000;">'Thursday'</span>,<span style="color: #ff0000;">'Friday'</span>,<span style="color: #ff0000;">'Saturday'</span>,<span style="color: #ff0000;">'Sunday'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'ru'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Понедельник'</span>,<span style="color: #ff0000;">'Вторник'</span>,<span style="color: #ff0000;">'Среда'</span>,<span style="color: #ff0000;">'Четверг'</span>,<span style="color: #ff0000;">'Пятница'</span>,<span style="color: #ff0000;">'Суббота'</span>,<span style="color: #ff0000;">'Воскресенье'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'uk'</span> =<span style="color: #66cc66;">&gt;</span> <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Понеділок'</span>,<span style="color: #ff0000;">'Вівторок'</span>,<span style="color: #ff0000;">'Середа'</span>,<span style="color: #ff0000;">'Четвер'</span>,<span style="color: #ff0000;">'П’ятниця'</span>,<span style="color: #ff0000;">'Субота'</span>,<span style="color: #ff0000;">'Неділя'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">switch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$language</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">language</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'ru'</span>: <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'uk'</span>: <span style="color: #0000ff;">$output</span> = <a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;j&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span> .<span style="color: #ff0000;">' '</span>. <span style="color: #0000ff;">$monthes</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$language</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">language</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;n&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> .<span style="color: #ff0000;">', '</span>. <span style="color: #0000ff;">$weekday</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$language</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">language</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;N&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'en'</span>: <span style="color: #000000; font-weight: bold;">default</span>: <span style="color: #0000ff;">$output</span> = <span style="color: #0000ff;">$monthes</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$language</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">language</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;n&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> .<span style="color: #ff0000;">' '</span>. <a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;j&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span> .<span style="color: #ff0000;">', '</span>. <span style="color: #0000ff;">$weekday</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$language</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">language</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;N&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #66cc66;">&#125;</span> &nbsp; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'short'</span>: <span style="color: #0000ff;">$output</span> = <a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'d.m.Y'</span>, <span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//20.02.2010</span> <span style="color: #b1b100;">break</span>; <span style="color: #000000; font-weight: bold;">default</span>: <span style="color: #0000ff;">$output</span> = <a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;j&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">' '</span>.<span style="color: #0000ff;">$monthes</span><span style="color: #66cc66;">&#91;</span><a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;n&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span>.<span style="color: #ff0000;">' '</span>.<a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Y&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">' '</span>.<a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;H&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">':'</span>.<a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;i&quot;</span>,<span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$output</span>; <span style="color: #66cc66;">&#125;</span></pre></div></p> <p>После созерцания блока с "хорошими" датами заказчик успокоился и потребовал сделать "правильно" в остальных местах сайта...</p> <p>Я понял, что нужно кардинально другое решение - универсальное и системное. Очень много времени ушло на то, чтобы понять какой именно модуль и как меняет даты - возможно сказалось то, что температура была большая.<br /> Сам код решения был написан и оттестирован где-то за полдня. </p> <p><img src="http://drupal.ru/files/date_api_patched.png" alt="Исправленные даты - месяц в родительном падеже" /></p> <h3>Патч модуля Date, чтобы получить корректную обработку дат для всего сайта</h3> <p>Изменяются только 3 функции в файле <em>date_api.module</em> модуля <a href="http://drupal.org/project/date" title="Страница модуля Date">Date</a>:</p> <ul> <li>date_t</li> <li>date_t_strings</li> <li>date_format_date</li> </ul> <p>Ниже код уже изменённых функций - его можно использовать, если вы не можете применить патч, который прилагается к статье.<br /> Этот <strong>патч добавляет названия месяцев в родительном падеже</strong>.</p> <p><div class="geshifilter"><pre class="drupal6_ru geshifilter-drupal6_ru" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/** * A function to translate ambiguous short date strings. * * Example: Pass in 'Monday', 'day_abbr' and get the translated * abbreviation for Monday. * * @param string $string * @param string $context * @param int $langcode * @return translated value of the string */</span> <span style="color: #000000; font-weight: bold;">function</span> date_t<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$string</span>, <span style="color: #0000ff;">$context</span>, <span style="color: #0000ff;">$langcode</span> = <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">//static $replace = array();</span> &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/empty"><span style="color: #000066;">empty</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">// The function to create the date string arrays is kept separate</span> <span style="color: #808080; font-style: italic;">// so those arrays can be directly accessed by other functions.</span> date_t_strings<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$replace</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">switch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$context</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'day_name'</span>: <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'day_abbr'</span>: <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'day_abbr1'</span>: <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'day_abbr2'</span>: <span style="color: #0000ff;">$untranslated</span> = <a href="http://www.php.net/array_flip"><span style="color: #000066;">array_flip</span></a><span style="color: #66cc66;">&#40;</span>date_week_days_untranslated<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'month_name'</span>: <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'month_genitive'</span>: <span style="color: #808080; font-style: italic;">//Добавляем в обработку новый контекст</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'month_abbr'</span>: <span style="color: #0000ff;">$untranslated</span> = <a href="http://www.php.net/array_flip"><span style="color: #000066;">array_flip</span></a><span style="color: #66cc66;">&#40;</span>date_month_names_untranslated<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'ampm'</span>: <span style="color: #0000ff;">$untranslated</span> = <a href="http://www.php.net/array_flip"><span style="color: #000066;">array_flip</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'am'</span>, <span style="color: #ff0000;">'pm'</span>, <span style="color: #ff0000;">'AM'</span>, <span style="color: #ff0000;">'PM'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'datetime'</span>: <span style="color: #0000ff;">$untranslated</span> = <a href="http://www.php.net/array_flip"><span style="color: #000066;">array_flip</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Year'</span>, <span style="color: #ff0000;">'Month'</span>, <span style="color: #ff0000;">'Day'</span>, <span style="color: #ff0000;">'Week'</span>, <span style="color: #ff0000;">'Hour'</span>, <span style="color: #ff0000;">'Minute'</span>, <span style="color: #ff0000;">'Second'</span>, <span style="color: #ff0000;">'All Day'</span>, <span style="color: #ff0000;">'All day'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'datetime_plural'</span>: <span style="color: #0000ff;">$untranslated</span> = <a href="http://www.php.net/array_flip"><span style="color: #000066;">array_flip</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Years'</span>, <span style="color: #ff0000;">'Months'</span>, <span style="color: #ff0000;">'Days'</span>, <span style="color: #ff0000;">'Weeks'</span>, <span style="color: #ff0000;">'Hours'</span>, <span style="color: #ff0000;">'Minutes'</span>, <span style="color: #ff0000;">'Seconds'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'date_order'</span>: <span style="color: #0000ff;">$untranslated</span> = <a href="http://www.php.net/array_flip"><span style="color: #000066;">array_flip</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Every'</span>, <span style="color: #ff0000;">'First'</span>, <span style="color: #ff0000;">'Second'</span>, <span style="color: #ff0000;">'Third'</span>, <span style="color: #ff0000;">'Fourth'</span>, <span style="color: #ff0000;">'Fifth'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'date_order_reverse'</span>: <span style="color: #0000ff;">$untranslated</span> = <a href="http://www.php.net/array_flip"><span style="color: #000066;">array_flip</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span>, <span style="color: #ff0000;">'Last'</span>, <span style="color: #ff0000;">'Next to last'</span>, <span style="color: #ff0000;">'Third from last'</span>, <span style="color: #ff0000;">'Fourth from last'</span>, <span style="color: #ff0000;">'Fifth from last'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'date_nav'</span>: <span style="color: #0000ff;">$untranslated</span> = <a href="http://www.php.net/array_flip"><span style="color: #000066;">array_flip</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Prev'</span>, <span style="color: #ff0000;">'Next'</span>, <span style="color: #ff0000;">'Today'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #66cc66;">&#125;</span> <span style="color: #0000ff;">$pos</span> = <span style="color: #0000ff;">$untranslated</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#93;</span>; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$context</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$pos</span><span style="color: #66cc66;">&#93;</span>; <span style="color: #66cc66;">&#125;</span> &nbsp; <span style="color: #808080; font-style: italic;">/** * Construct translation arrays from pipe-delimited strings. * * Combining these strings into a single t() gives them the context needed * for better translation. */</span> <span style="color: #000000; font-weight: bold;">function</span> date_t_strings<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span><span style="color: #0000ff;">$replace</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'day_name'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!day-name Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!day-name'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'day_abbr'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!day-abbreviation Sun|Mon|Tue|Wed|Thu|Fri|Sat'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!day-abbreviation'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'day_abbr1'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!day-abbreviation S|M|T|W|T|F|S'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!day-abbreviation'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'day_abbr2'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!day-abbreviation SU|MO|TU|WE|TH|FR|SA'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!day-abbreviation'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'ampm'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!ampm-abbreviation am|pm|AM|PM'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!ampm-abbreviation'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'datetime'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!datetime Year|Month|Day|Week|Hour|Minute|Second|All Day|All day'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!datetime'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'datetime_plural'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!datetime_plural Years|Months|Days|Weeks|Hours|Minutes|Seconds'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!datetime_plural'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'date_order'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!date_order Every|First|Second|Third|Fourth|Fifth'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!date_order'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'date_order_reverse'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!date_order |Last|Next to last|Third from last|Fourth from last|Fifth from last'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!date_order'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'date_nav'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!date_nav Prev|Next|Today'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!date_nav'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; &nbsp; <span style="color: #808080; font-style: italic;">// These start with a pipe so the January value will be in position 1 instead of position 0.</span> <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'month_name'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!month-name |January|February|March|April|May|June|July|August|September|October|November|December'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!month-name'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//Строка с названиями месяцев, которую ещё нужно будет перевести на нужные языки:</span> <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'month_genitive'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!month-genitive |January|February|March|April|May|June|July|August|September|October|November|December'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!month-name'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$replace</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'month_abbr'</span><span style="color: #66cc66;">&#93;</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'|'</span>, <a href="http://www.php.net/trim"><span style="color: #000066;">trim</span></a><span style="color: #66cc66;">&#40;</span><a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!month-abbreviation |Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'!month-abbreviation'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span> &nbsp; <span style="color: #808080; font-style: italic;">/** * Reworked from Drupal's format_date function to handle pre-1970 and * post-2038 dates and accept a date object instead of a timestamp as input. * * Translates formatted date results, unlike PHP function date_format(). * * @param $oject * A date object, could be created by date_make_date(). * @param $type * The format to use. Can be &quot;small&quot;, &quot;medium&quot; or &quot;large&quot; for the preconfigured * date formats. If &quot;custom&quot; is specified, then $format is required as well. * @param $format * A PHP date format string as required by date(). A backslash should be used * before a character to avoid interpreting the character as part of a date * format. * @return * A translated date string in the requested format. */</span> <span style="color: #000000; font-weight: bold;">function</span> date_format_date<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span>, <span style="color: #0000ff;">$type</span> = <span style="color: #ff0000;">'medium'</span>, <span style="color: #0000ff;">$format</span> = <span style="color: #ff0000;">''</span>, <span style="color: #0000ff;">$langcode</span> = <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/empty"><span style="color: #000066;">empty</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">return</span> <span style="color: #ff0000;">''</span>; <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">switch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$type</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'small'</span>: <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'short'</span>: <span style="color: #0000ff;">$format</span> = <a href="http://api.drupal.ru/api/function/variable_get/6"><span style="color: #000066;">variable_get</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'date_format_short'</span>, <span style="color: #ff0000;">'m/d/Y - H:i'</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'large'</span>: <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'long'</span>: <span style="color: #0000ff;">$format</span> = <a href="http://api.drupal.ru/api/function/variable_get/6"><span style="color: #000066;">variable_get</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'date_format_long'</span>, <span style="color: #ff0000;">'l, F j, Y - H:i'</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'custom'</span>: <span style="color: #0000ff;">$format</span> = <span style="color: #0000ff;">$format</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'medium'</span>: <span style="color: #000000; font-weight: bold;">default</span>: <span style="color: #0000ff;">$format</span> = <a href="http://api.drupal.ru/api/function/variable_get/6"><span style="color: #000066;">variable_get</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'date_format_medium'</span>, <span style="color: #ff0000;">'D, m/d/Y - H:i'</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #66cc66;">&#125;</span> <span style="color: #0000ff;">$max</span> = <a href="http://www.php.net/strlen"><span style="color: #000066;">strlen</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$format</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #0000ff;">$datestring</span> = <span style="color: #ff0000;">''</span>; <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$i</span> = 0; <span style="color: #0000ff;">$i</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #0000ff;">$max</span>; <span style="color: #0000ff;">$i</span>++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$c</span> = <span style="color: #0000ff;">$format</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$i</span><span style="color: #66cc66;">&#93;</span>; <span style="color: #b1b100;">switch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$c</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">// Use date_t() for ambiguous short strings that need translation.</span> <span style="color: #808080; font-style: italic;">// We send long day and month names to date_t(), along with context.</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'l'</span>: <span style="color: #0000ff;">$datestring</span> .= date_t<span style="color: #66cc66;">&#40;</span>date_format<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span>, <span style="color: #ff0000;">'l'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'day_name'</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'D'</span>: <span style="color: #0000ff;">$datestring</span> .= date_t<span style="color: #66cc66;">&#40;</span>date_format<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span>, <span style="color: #ff0000;">'l'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'day_abbr'</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'F'</span>: <span style="color: #808080; font-style: italic;">//Собственно логика вывода названия месяца в зависимости от ситуации:</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/strpos"><span style="color: #000066;">strpos</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$format</span>, <span style="color: #ff0000;">'d'</span><span style="color: #66cc66;">&#41;</span> === <span style="color: #000000; font-weight: bold;">FALSE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/strpos"><span style="color: #000066;">strpos</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$format</span>, <span style="color: #ff0000;">'j'</span><span style="color: #66cc66;">&#41;</span> === <span style="color: #000000; font-weight: bold;">FALSE</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$datestring</span> .= date_t<span style="color: #66cc66;">&#40;</span>date_format<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span>, <span style="color: #ff0000;">'F'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'month_name'</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$datestring</span> .= date_t<span style="color: #66cc66;">&#40;</span>date_format<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span>, <span style="color: #ff0000;">'F'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'month_genitive'</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'M'</span>: <span style="color: #0000ff;">$datestring</span> .= date_t<span style="color: #66cc66;">&#40;</span>date_format<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span>, <span style="color: #ff0000;">'F'</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'month_abbr'</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'A'</span>: <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'a'</span>: <span style="color: #0000ff;">$datestring</span> .= date_t<span style="color: #66cc66;">&#40;</span>date_format<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span>, <span style="color: #0000ff;">$c</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">'ampm'</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #808080; font-style: italic;">// The timezone name translations can use t(). </span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'e'</span>: <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'T'</span>: <span style="color: #0000ff;">$datestring</span> .= <a href="http://api.drupal.ru/api/function/t/6"><span style="color: #000066;">t</span></a><span style="color: #66cc66;">&#40;</span>date_format<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span>, <span style="color: #0000ff;">$c</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #808080; font-style: italic;">// Remaining date parts need no translation.</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'O'</span>: <span style="color: #0000ff;">$datestring</span> .= <a href="http://www.php.net/sprintf"><span style="color: #000066;">sprintf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'%s%02d%02d'</span>, <span style="color: #66cc66;">&#40;</span>date_offset_get<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> 0 ? <span style="color: #ff0000;">'-'</span> : <span style="color: #ff0000;">'+'</span><span style="color: #66cc66;">&#41;</span>, <a href="http://www.php.net/abs"><span style="color: #000066;">abs</span></a><span style="color: #66cc66;">&#40;</span>date_offset_get<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">3600</span><span style="color: #66cc66;">&#41;</span>, <a href="http://www.php.net/abs"><span style="color: #000066;">abs</span></a><span style="color: #66cc66;">&#40;</span>date_offset_get<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">%</span> <span style="color: #cc66cc;">3600</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">60</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'P'</span>: <span style="color: #0000ff;">$datestring</span> .= <a href="http://www.php.net/sprintf"><span style="color: #000066;">sprintf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'%s%02d:%02d'</span>, <span style="color: #66cc66;">&#40;</span>date_offset_get<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> 0 ? <span style="color: #ff0000;">'-'</span> : <span style="color: #ff0000;">'+'</span><span style="color: #66cc66;">&#41;</span>, <a href="http://www.php.net/abs"><span style="color: #000066;">abs</span></a><span style="color: #66cc66;">&#40;</span>date_offset_get<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">3600</span><span style="color: #66cc66;">&#41;</span>, <a href="http://www.php.net/abs"><span style="color: #000066;">abs</span></a><span style="color: #66cc66;">&#40;</span>date_offset_get<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">%</span> <span style="color: #cc66cc;">3600</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">60</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'Z'</span>: <span style="color: #0000ff;">$datestring</span> .= date_offset_get<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\\</span>'</span>: <span style="color: #0000ff;">$datestring</span> .= <span style="color: #0000ff;">$format</span><span style="color: #66cc66;">&#91;</span>++<span style="color: #0000ff;">$i</span><span style="color: #66cc66;">&#93;</span>; <span style="color: #b1b100;">break</span>; <span style="color: #000000; font-weight: bold;">default</span>: <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/strpos"><span style="color: #000066;">strpos</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'BdcgGhHiIjLmnsStTUwWYyz'</span>, <span style="color: #0000ff;">$c</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">!</span>== <span style="color: #000000; font-weight: bold;">FALSE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$datestring</span> .= date_format<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span>, <span style="color: #0000ff;">$c</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$c</span> == <span style="color: #ff0000;">'r'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$datestring</span> .= <a href="http://api.drupal.ru/api/function/format_date/6"><span style="color: #000066;">format_date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$date</span>, <span style="color: #ff0000;">'custom'</span>, <span style="color: #ff0000;">'D, d M Y H:i:s O'</span>, <span style="color: #0000ff;">$langcode</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$datestring</span> .= <span style="color: #0000ff;">$c</span>; <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$datestring</span>; <span style="color: #66cc66;">&#125;</span></pre></div></p> <p>Я добавил комменты в код. Идея в том, что название месяца в родительном падеже должно выводиться <strong>только, если выводится рядом с числом</strong> месяца. Во всех остальных случаях - именительный падеж.</p> <h3>Пример:</h3> <p><em>23 февраля 2010</em>, а не <strike><em>23 февраль 2010</em></strike>.<br /> Но <em>март 2010</em>, а не <u><strike>марта 2010</strike></u></p> <h3>Как заставить все это работать?</h3> <ul> <li>Применить патч, который приложен к статье или скопировать уже изменённые функции вместо старых. Рецепт о том, как применить патч (есть варианты для Линукс, и для Винды): <a href="http://drupalcookbook.ru/recept/primenenie-zaplat-patch">Применение заплат (patch)</a></li> <li>Открыть страницу "<strong>Перевод интерфейса</strong>" (<em>admin/build/translate/search</em>) и найти строку:<br /> <span class="geshifilter"><code class="geshifilter-drupal6_ru"><span style="color: #66cc66;">!</span>month-genitive |January|February|March|April|May|June|July|August|September|October|November|December</code></span></li> <li>Сделать её перевод на нужный язык. Учтите, что для английского названия месяцев обычно пишутся с заглавной, а у нас - нет. Названия<br /> месяцев должны быть в родильном падеже. Для русского и украинского языков это выглядит так: <ul> <li>Русский:<br /> <span class="geshifilter"><code class="geshifilter-drupal6_ru"><span style="color: #66cc66;">!</span>month-genitive |января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря</code></span></li> <li>Украинский:<br /> <span class="geshifilter"><code class="geshifilter-drupal6_ru"><span style="color: #66cc66;">!</span>month-genitive |січня|лютого|березня|квітня|травня|червня|липня|серпня|вересня|жовтня|листопада|грудня</code></span> </li> </ul> </li> <li>Сохранить переводы и проверить отображение дат.</li> </ul> <h3>Будущее патча</h3> <p>Все эти манипуляции (применение патча и перевод вручную строк) нужно делать <strong>только пока патч не будет принят разработчиками модуля Date</strong> и не выпущен релиз с этими изменениями.<br /> Пока я не вижу причин, которые могут припятствовать, но всякое бывает и, даже, если патч будет принят, то дата выхода релиза может отодвигаться по другим причинам. </p> <p>Англоязычным товарищам этот патч не нужен, потому что в английском языке этой проблемы с датами нет и они могут счесть его не важным, поэтому я попробую опубликовать эту же статью на хабре и прошу поддержать также issue с патчем на drupal.org:</p> <ul> <li><a href="http://drupal.org/node/728350" title="http://drupal.org/node/728350">http://drupal.org/node/728350</a> - Multilanguage month support</li> <li><a href="http://vladsavitsky.habrahabr.ru/blog/85861/" title="http://vladsavitsky.habrahabr.ru/blog/85861/">http://vladsavitsky.habrahabr.ru/blog/85861/</a> - статья на хабре.</li> </ul> <table id="attachments" class="sticky-enabled"> <thead><tr><th>Прикрепленный файл</th><th>Размер</th> </tr></thead> <tbody> <tr class="odd"><td><a href="http://www.drupal.ru/files/calendar_list.zip">calendar_list.zip</a></td><td>2.25 кб </td> </tr> <tr class="even"><td><a href="http://www.drupal.ru/files/date_api.module.patch">date_api.module.patch</a></td><td>1.62 кб </td> </tr> </tbody> </table> http://www.drupal.ru/node/41002#comments Drupal 6.* date API patch вывод даты месяц модуль Date патч правильные даты родительный падеж Sun, 28 Feb 2010 14:58:02 +0000 VladSavitsky 41002 at http://www.drupal.ru Смените свой пароль на drupal.ru! http://www.drupal.ru/node/40919 <p>Ввиду инцидентов произошедших в команде модераторов сайта имевших доступ к базе данных сайта в целях безопасности была проведена полная замена паролей всех пользователей drupal.ru (а также groups.drupal.ru и drupalcamp.ru). Также принудительно завершены уже открытые сессии зарегистрированных пользователей. Для восстановления доступа вам следует пройти по ссылке <a href="/user/password">напоминание пароля</a> и указать свой логин или email вашей учетной записи. Ссылка на доступ будет выслана на указанный в учетной записи адрес, по ссылке вы сможете попасть в учетную запись и выбрать новый пароль. Настоятельно не рекомендуем выбирать старый пароль! Приносим огромные извинения за неудобства.</p> <p>Пожалуйста будьте внимательны: логины вида nickname и <a href="mailto:nickname@drupal.org">nickname@drupal.org</a> являются различными учётными записями! Вполне вероятно у вас могли быть заведены оба из них.</p> <p>При проблемах с получением пароля обращайтесь пожалуйста на адрес <a href="mailto:webmaster@drupal.ru">webmaster@drupal.ru</a> с обязательным указанием своего логина и/или регистрационого емейла. Внимание: ответы вебмастера отправляются на адрес указанный в вашей учетной записи, а не тот с которого придет письмо.</p> <p>См. также <a href="/password-howto">краткие рекомендации</a> по выбору паролей.</p> <p>&gt;&gt;&gt;&gt; <a href="/user/password">Получить новый пароль.</a></p> http://www.drupal.ru/node/40919#comments Сайт и проект Drupal.ru важные объявления работа drupal.ru Fri, 26 Feb 2010 01:49:31 +0000 admin 40919 at http://www.drupal.ru Помогите улучшить тариф для Drupal! http://www.drupal.ru/node/40896 <p>Добрый день!</p> <p>Я - Юрий Устинов, представитель Русоникса на этом форуме.</p> <p>Друзья, пожалуйста, помогите улучшить наш тарифный план Супер CMS.<br /> Тариф разрабатывался при участии Игоря Землянкина (Игорь, надеюсь, Вы не против такого упоминания), одного из активных участников Drupal-сообщества.<br /> Сейчас тариф запущен в эксплуатацию и я хочу попросить всех участников оценить потребительские качества нашего тарифа. Мы готовы его улучшать по вашим замечаниям.</p> <p>Что именно было сделано: мы увеличили время работы скриптов (max_execution_time = 120) и объем выделенной памяти (memory_limit = 64M). Также была проведена перенастройка хостинговой ноды для более оптимальной работы именно этого тарифа, все такие аккаунты будут стартовать отдельно от других тарифов виртуального хостинга. Помимо этого density (количество аккаунтов на одном физическом сервере) строго ограничено, т.е. в этот тариф заложена гораздо большая степень свободы (доступных процессорных и прочих ресурсов) в каждый конкретный промежуток времени, чем на обычном виртуальном хостинге.</p> <p>Тариф - старший в линейке виртуального хостинга, на нем можно стартовать до 30 динамических сайтов. Подробное описание у нас на сайте: <a href="http://www.rusonyx.ru/hosting/shared/super-cms.php" title="http://www.rusonyx.ru/hosting/shared/super-cms.php">http://www.rusonyx.ru/hosting/shared/super-cms.php</a></p> <p>Что мы можем предложить прямо сейчас:<br /> 1) <a href="http://www.rusonyx.ru/hosting/trial/" title="30 дней бесплатного тестирования хостинга">30 дней бесплатного тестирования</a> - мы будем очень благодарны за отзывы и пожелания! Обращаю ваше внимание на то, что все заявки обрабатываются менеджерами на адекватность (устали от спамеров, кардеров и прочих персонажей), поэтому старт тестов производится только в рабочее время.<br /> 2) Дополнительная скидка на услуги хостинга для участников сообщества: 10% по купону DRUPALBONUS.</p> <p>Заранее спасибо всем, кто откликнется! Надеюсь новый улучшенный тариф придется вам по вкусу :)</p> http://www.drupal.ru/node/40896#comments Хостинг хостинг Thu, 25 Feb 2010 15:36:36 +0000 rusonyx_admin 40896 at http://www.drupal.ru Кто виноват в том, что сайт не выполняет своих функций? http://www.drupal.ru/node/40880 <p><strong>Статья будет полезна всем без исключения фрилансерам, а тем более Друпаловцам, т.к. по моим личным ощущениям культура работы в нашем сообществе ниже среднего.</strong></p> <p>Знакомьтесь — Джон, владелец достаточно крупного сайта, маркетолог, считает себя умным, профессиональным, и к тому же уверен, что умеет четко излагать свои мысли. При всем этом, Джон не так уж много знает о веб-дизайне и разработке, поэтому ему нужна ваша помощь. Джон обращается к вам с целым набором четких маркетинговых целей и просит вас назвать цену своей работы. </p> <h2>Всегда объясняйте клиенту, зачем вы спрашиваете о бюджете</h2> <p>Перед тем, как назвать цену вы расспрашиваете Джона о его проекте. После пары минут разговора вы задаете вопрос о бюджете. По-вашему, это справедливый вопрос. Ведь подходов к решению задачи может быть так много. Не зная бюджета нельзя определить, с чего начинать работу. Вы считаете, что создание сайта – это как строительство дома – не зная бюджета, вы не сможете узнать, сколько комнат хочет клиент и какие материалы надо использовать. </p> <p>Джон, в свою очередь, с подозрением относится к вашему вопросу. Зачем вам знать о его бюджете? Единственная убедительная причина, которая приходит ему в голову – вы не хотите случайно назвать цену меньше той, которую он готов заплатить. Кроме того, он и сам не знает, какой у него бюджет. Откуда ему знать, сколько стоит сайт?</p> <p><img src="http://shvetsgroup.com/files/images/money-20100210-1629242.jpg" alt="" /><br /> <em>Клиент не должен думать, что вы выманиваете у него деньги.</em></p> <p>Джон уходит. Он решительно настроен найти честного веб-разработчика, который не собирается его обманывать. К счастью для вас, все остальные разработчики тоже не объясняют, зачем им знать о бюджете Джона, и, в конце концов, вы даже можете заполучить Джона обратно.</p> <h2>Все рекомендации выражайте понятным для Джона языком</h2> <p>Как только вы получили этот проект, вы организовываете встречу для того, чтобы согласовать все детали. Однако Джон сразу же жалеет о своем решении обратиться к вам, так как его страхи подтвердились. Он думает, что вы хотите выжать из него побольше денег, рассказывая всякую чепуху о юзабилити или доступности сайта. Джону наплевать на посетителей с ограниченными возможностями, он вообще не считает, что такие люди посещают его сайт. </p> <p>Что касается юзабилити, конечно веб-разработчик обязан сделать сайт легким в использовании. Зачем нужно дорогое тестирование юзабилити? Он думает, что такое тестирование подразумевает использование дорогого оборудования, например, камер, лабораторий и двухсторонних зеркал. Вы думали, что четко объяснили все эти вопросы. Вы говорили о WCAG 2 и вспомнили даже Якоба Нильсена. Вы начинаете подозревать, что Джон слегка туговат. </p> <p><img src="http://shvetsgroup.com/files/images/confused-20100210-1632551.jpg" alt="" /><br /> <em>Если вы хотите, чтобы клиент вас понял, избегайте технических подробностей.</em></p> <p>Наверное, он бы послушал вас, если бы вы говорили о доступности сайта, как о методе повышения позиций в поисковиках или увеличения прибыли, приносимой сайтом. А так, Джон упирается ногами и отказывается платить за все эти «ненужные дополнения».</p> <h2>Вовлеките Джона в рабочий процесс</h2> <p>Вы уходите с совещания, довольные тем, что удалось подписать контракт. Но какое-то предчувствие указывает вам на то, что это еще один из тех ужасных проектов, которые вам приходилось делать. Несмотря на это, вы сохраняете оптимизм и головой погружаетесь в рабочий процесс. Практически сразу же вы получаете звонок от Джона. Он спрашивает, готовы ли вы ему что-нибудь показать. Вы объясняете, что еще слишком рано что-то показывать, Джон разочарован но на время оставляет вас в покое.</p> <p>Немного позже вы готовы представить Джону дизайн. Результат вам очень нравится, и, несмотря на то, что времени он занял намного больше, чем предусмотрено в бюджете, оно того стоит. Конечный дизайн имеет очень высокую юзабилити и станет жемчужиной вашего портфолио. </p> <p><img src="http://shvetsgroup.com/files/images/hide-20100210-1637471.jpg" alt="" /><br /> <em>Не прячьтесь от клиентов. Показывайте им результаты работы на самых ранних стадиях и привлекайте их к процессу разработки.</em></p> <p>Джон видит дизайн и приходит в ужас. По его мнению, вы работали совсем не в том ключе. Дизайн противоречит оффлайновым маркетинговым материалам и не подчеркивает выгоды от услуг его компании. Кроме того, он уверен, что дизайн не понравится его поставщикам, и хотя они не являются конечными потребителями, их мнение очень важно. </p> <p>После напряженной конференции энтузиазм у вас, естественно, пропал, но вам удалось достичь компромисса, который возможно, осчастливит Джона. Вы начинаете думать, а не лучше ли было представить Джону свои первоначальные идеи и эскизы.</p> <h2>Расскажите Джону о дизайне</h2> <p>После долгих мучений и компромиссов вы готовы представить Джону новый макет. Джону новый дизайн нравится намного больше, и он считает, что вы двигаетесь в правильном направлении, но его кое-что не устраивает. Для начала, ему не нравится, что для того, чтобы увидеть весь контент приходится прокручивать окно вниз, а со всех сторон макета слишком много белого пространства. Он говорит вам подвинуть контент, и заполнить пустующее место. Также Джон думает об аудитории своего сайта, большую часть которой составляют молодые мужчины, и считает, что цветовая гамма сайта слишком нежная. Он просит добавить в нее синий цвет. </p> <p>В то время как Джон уже почти счастлив, вы чувствуете себя раздавленным. Вам кажется, что он хочет сделать работу вместо вас. Он постоянно просит что-то куда-то передвинуть или поменять цвет, как будто ваша обязанность – только двигать пиксели. </p> <p><img src="http://shvetsgroup.com/files/images/Teaching-20100210-164155.jpg" alt="" /><br /> <em>Просвещайте своих клиентов, чтобы они могли принимать правильные решения. </em></p> <p>К этому моменту вы уверенны в том, что клиент – дурак и единственное, чего вы хотите – побыстрее сбагрить ему этот дизайн. И вы не собираетесь спрашивать Джона, зачем ему эти изменения. Возможно, понимая его мышление, вы бы смогли объяснить, что такое разрешение экрана и предложили бы какую-то альтернативу скучному синему цвету, которым кишит интернет. </p> <p>Вместо этого, вы умываете руки и просто даете Джону то, чего он хочет. </p> <h2>Регулярно общайтесь с Джоном</h2> <p>Теперь, когда дизайн готов, вы переключаетесь на его верстку. Джону, естественно, нет никакого дела до вашего кода. Наконец-то вы сможете все сделать правильно. </p> <p>Это сложная работа и она занимает много времени. Несмотря на то, что вы потратили слишком много времени на дизайн, и, в конце концов, сдались и сделали все так, как хотел клиент, у вас еще осталась гордость. И вы не собираетесь халтурить с кодом. Как бы там ни было, другие дизайнеры могут увидеть и раскритиковать ваш дизайн! Вы работаете, не покладая рук, стараясь даже больше, чем нужно. По ходу дела Джону удается добавить вам головной боли, подсовывая дополнительные функциональные задачи. </p> <p>Джон интересуется, куда вы пропали. От вас уже несколько недель ничего не слышно. Сайт, конечно же должен быть готов к этому времени.<br /> Джон пишет вам на e-mail и спрашивает, как продвигается работа. Вы кратко отвечаете, что работа идет медленно, но верно. Вы никогда не любили проектный менеджмент, и считаете, что Джон хотел бы, чтобы вы тратили время на работу, а не на расписывание подробных отчетов. </p> <p>Джон получает ваш ответ и очень сильно расстраивается. Что значит «медленно, но верно»? Он пишет еще раз и спрашивает об ожидаемой дате завершения работ, вы даете примерную оценку.</p> <p>Дата наступает и проходит, а от вас ничего не слышно. Это же всего лишь примерная оценка, и некоторые осложнения отодвинули дату на пару дней! Джон выходит из себя и звонит вам. Он говорит, что уже организовал рекламную кампанию, начало которой должно было совпадать с окончанием работ. Так как от вас не было никаких новостей, он решил, что все идет по плану. </p> <p><img src="http://shvetsgroup.com/files/images/communication-20100210-1645141.jpg" alt="" /><br /> <em>Регулярно общайтесь с клиентом.</em></p> <p>Вы защищаетесь, рассказывая о неожиданных сложностях. Но отвечать становится трудно, когда Джон пишет: «Все, что мне было нужно – это быть в курсе происходящего, просто одно письмо в неделю!».</p> <h2>Объясните Джону его роль в дальнейшем развитии проекта</h2> <p>К этому моменту вы окончательно поссорились с клиентом. Вы заканчиваете работу и сайт запущен. Джон ворчит и таки оплачивает счет после длительной задержки. Вас удивляет то, что Джон выражает свое разочарование и недовольство результатом вашей работы. Как же так, вы сделали все, что он просил? Это парень не просто тугодум, он придурок!</p> <p>Естественно, Джон смотрит на все иначе. Он пришел к вам со списком маркетинговых задач, а сайт, который вы разработали, не выполняет ни одной из них. Он надеялся запустить сайт, достичь поставленных целей и приняться за новый проект. Но, после первоначального скачка интереса к сайту, количество посетителей и запросов упало, а сам сайт перестал работать. </p> <p><img src="http://shvetsgroup.com/files/images/seedling-20100210-164927.jpg" alt="" /></p> <p><em>Убедитесь, что клиент понимает, какая поддержка понадобится его проекту в будущем.</em></p> <p>Джон не понимает, что за сайтом нужен постоянный уход и поддержка. Нельзя создать сайт, а потом забросить его. Его нужно подпитывать новым контентом, который заинтересует посетителей. Кроме того, важно спланировать развитие сайта в будущем. </p> <p>Если бы ему кто-то об этом сказал…</p> <h2>Мораль истории</h2> <p>Невероятно, как быстро мы осуждаем наших клиентов, толком не разобравшись. Мы веб-разработчики, и наша работа заключается в том, чтобы передавать информацию и сопереживать. Наша задача – передавать послания наших клиентов пользователям их сайтов. Создавая сайты, мы ставим себя на место их посетителей, чтобы лучше понять их потребности. </p> <p>Почему же так часто нам не удается передать информацию и сопереживать нашим клиентам? Возможно, пора нам применить навыки, которые мы получили, работая веб-разработчиками, в общении с клиентами.</p> <p>—</p> <p><a href="http://shvetsgroup.com/ru/rss.xml"><img src="http://shvetsgroup.com/files/rss.png" alt="" /></a></p> http://www.drupal.ru/node/40880#comments Thu, 25 Feb 2010 11:51:05 +0000 neochief 40880 at http://www.drupal.ru Отрелизили Drupal 7.0 alpha2 http://www.drupal.ru/node/40755 <p><em>этот пост - копипаст с моего блога <a href="http://sidashin.ru/node/18">sidashin.ru</a></em></p> <p>Вот и вторая альфа, датированная 21 февраля 2010.<br /> В целом видно, что больной скорее еще под наркозом и операция продолжается - такие ключевые вещи, как возможность добавлять поля для комментариев, и некоторые хуки добавили только в этой версии.<br /> Тем не менее, по сравнению с пре-альфой, на которой работает мой блог в данный момент - шаг вперед большой, не одна сотня фиксов. Поэтому сегодня-завтра будем обновлять. Возможно, будет трясти, пристегнитесь.</p> <p>Подробнее по изменениям (оригинал на <a href="http://drupal.org/node/721114" title="http://drupal.org/node/721114">http://drupal.org/node/721114</a> ):</p> <ol> <li>Многочисленные исправления документации API.</li> <li>Много дополнительных автоматизированных тестов и фиксов для тестов.</li> <li>Много исправлений в пользовательском интерфейсе и разметке, и убранных опечаток.</li> <li>Jquery Form и Farbtastic обновлены до последних версий.<br /> Улучшение производительности, в том числе удалено кеширование prepared statement, что экономит оперативку,и улучшения в кроне, исправляющее двойную загрузку.</li> <li>Несколько важных багфиксов, в том числе в кэшировании блоков, проблем, связанных с потерями данных в модуле File и кроне, невозможностью удалить некоторые экземпляры полей, с фатальными ошибками PHP и странных багов по причине не работающего нормально error reporting'а.</li> <li>Мелкие изменения структуры бд, такие, как увеличение поля weight.</li> <li>Различные исправления в поддержке PostgreSQL и SQLite, приближающие нас к возможности пройти все автоматизированные тесты корректно на 100%.</li> <li>Несколько улучшений модулей Overlay, Contact, Shortcut, RDF, OpenID, Toolbar, и Dashboard.</li> <li>Дополнительные улучшения в системе обновлений (с Drupal6 на Drupal7 - прим. переводчика) (правда, все еще не работает на 100%...)</li> <li>Некоторые изменения API: хуки для вставки / удаления / обновления entity, поля теперь могут быть ограничены определенными типами entity, а обновления могут указывать зависимости.</li> <li>Комментарии теперь получили интерфейс для добавления к ним полей.</li> <li>Совершенствование Менеджера обновлений, чтобы разрешить закачку Zip и TGZ файлов.</li> <li>Требования Drupal обновлены - теперь для работы необходим MySQL &gt;=5.0.15.</li> <li>Некоторые улучшения доступности (accessibility).</li> <li>Безопасность: Добавлено поле 'текущий пароль' в форму смены пароля.</li> </ol> http://www.drupal.ru/node/40755#comments Программирование Drupal 7.* Mon, 22 Feb 2010 12:34:04 +0000 restyler 40755 at http://www.drupal.ru http://www.drupal.ru/node/40740 нет Thu, 01 Jan 1970 00:00:00 +0000 at http://www.drupal.ru Конвертим тему из Drupal 6 в семерку. Что новенького? http://www.drupal.ru/node/40712 <p><em>этот пост - копипаст с моего блога <a href="http://sidashin.ru">sidashin.ru</a></em></p> <p>Этот пост посвящен нескольким интересным моментам конвертации темы из Друпал 6 в Друпал 7. Как же это сделать наименее безболезненно? Итак:<br /> <a href="http://drupal.org/node/550722" title="http://drupal.org/node/550722">http://drupal.org/node/550722</a> - Drupal7 theme guide. На момент написания этого поста - пустая страничка. Ну, не очень то и хотелось :)<br /> <a href="http://drupal.org/update/theme/6/7" title="http://drupal.org/update/theme/6/7">http://drupal.org/update/theme/6/7</a> - конвертим темы из D6 в D7</p> <h3>Вскрытие D7 темы - Garland</h3> <p>Первое, что бросается в глаза - все вызовы типа</p> <p><span class="codeblock geshifilter"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$tabs</span><span style="color: #007700">;&nbsp;</span><span style="color: #0000BB">?&gt;</span></span></code></span></p> <p>превратились в </p> <p><span class="codeblock geshifilter"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">render</span><span style="color: #007700">(</span><span style="color: #0000BB">$tabs</span><span style="color: #007700">);&nbsp;</span><span style="color: #0000BB">?&gt;</span></span></code></span></p> <p>Что это значит? Это значит, что прямо в теме, в последнюю секунду перед выводом сайта, можно быстро и без плясок с бубном наложить изменения на большую часть данных.<br /> <span class="codeblock geshifilter"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">unset(</span><span style="color: #0000BB">$tabs</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]);&nbsp;</span><span style="color: #FF8000">//скрыли&nbsp;таб&nbsp;'edit'&nbsp;на&nbsp;ноде&nbsp;</span><span style="color: #0000BB">?&gt;</span></span></code></span></p> <p>Жалко, что многие элементы в темплейт попадают уже отрендеренными, и теперь надо помнить, что $breadcrumb, $title, $primary_nav надо выводить через print, а $tabs и все регионы - через print render();</p> <h3>Финт ушами - hide()</h3> <p>Вспомним, как в D6 удобнее и быстрее всего рендерить содержимое ноды.<br /> <span class="codeblock geshifilter"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">print&nbsp;</span><span style="color: #0000BB">$content?&gt;</span></span></code></span><br /> При малейших необходимых изменениях в выводе, например если какой-то элемент в $content нам на сайте показывать не нужно, обычно все скатывалось к работе с объектом $node:<br /> <span class="codeblock geshifilter"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">print&nbsp;</span><span style="color: #0000BB">$node</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">content</span><span style="color: #007700">[</span><span style="color: #DD0000">'body'</span><span style="color: #007700">][</span><span style="color: #DD0000">'#value'</span><span style="color: #007700">]&nbsp;</span><span style="color: #0000BB">?&gt;</span></span></code></span><br /> <span class="codeblock geshifilter"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$node&nbsp;</span><span style="color: #007700">-&gt;&nbsp;</span><span style="color: #0000BB">field_delivery</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">][</span><span style="color: #DD0000">'safe'</span><span style="color: #007700">];</span><span style="color: #0000BB">?&gt;</span></span></code></span></p> <p>Что нам предлагают в D7?<br /> Вот иллюстрация:<br /> <div class="geshifilter"><pre class="drupal6_ru geshifilter-drupal6_ru" style="font-family:monospace;">&lt;div class=&quot;content&quot;&gt; <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #808080; font-style: italic;">// Скрываем комменты и линки, рендерим $content, а комменты и линки - потом, ниже. </span> hide<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$content</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'comments'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>; hide<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$content</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'links'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>; <a href="http://www.php.net/print"><span style="color: #000066;">print</span></a> render<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$content</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #000000; font-weight: bold;">?&gt;</span> &lt;/div&gt; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span> <a href="http://www.php.net/print"><span style="color: #000066;">print</span></a> render<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$content</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'links'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #000000; font-weight: bold;">?&gt;</span> &nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span> <a href="http://www.php.net/print"><span style="color: #000066;">print</span></a> render<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$content</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'comments'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #000000; font-weight: bold;">?&gt;</span>. </pre></div></p> <p>посмотрим, будет ли это удобно в реальном использовании.</p> <h3>Больше блоков!</h3> <p>Ох, вот это мне по душе. Теперь нет переменной $mission, теперь нет переменной $footer_message, теперь нет переменной $search_box. Хочешь миссию сайта вывести - есть регион highlight, суем туда блок с миссией. Хочешь поисковую форму - суем в любой регион поиск.<br /> Теперь контент страницы - тоже, блок! И выводится он по умолчанию в регион content (который является обязательным регионом для всех тем). И можно теперь вывод главной страницы засунуть в левую колонку, а можно в регион content сверху и снизу насовать разных блоков. Гибко, единообразно.</p> <p>Появилось понятие "скрытых регионов". Они определяются в .info файле темы через regions_hidden[] = и не показываются на странице блоков в админке - но могут использоваться модулями для вывода какой-то информации. Пока полезность под вопросом, надо пробовать.</p> <p>остальные изменения (которых 32 штуки всего) - можно посмотреть здесь: <a href="http://drupal.org/update/theme/6/7" title="http://drupal.org/update/theme/6/7">http://drupal.org/update/theme/6/7</a><br /> upd: русский перевод всех изменений от adubovskoy: <a href="http://www.drupal.ru/node/37603" title="http://www.drupal.ru/node/37603">http://www.drupal.ru/node/37603</a></p> http://www.drupal.ru/node/40712#comments Программирование Drupal 7.* Drupal 6.* Sun, 21 Feb 2010 14:06:14 +0000 restyler 40712 at http://www.drupal.ru Каждый должен заниматься своим делом http://www.drupal.ru/node/40666 <p>Сайту нужны:</p> <ul> <li>модераторы</li> <li>редакторы <ul> <li>волонтёры-путеводители нубов (это те, кто будет новеньким регулярно писать -В ПОИСК!!!)</li> <li>отвественные за морду сайта</li> <li>отвественные за вики</li> </ul> </li> <li>менеджеры</li> </ul> <p>Тенический штаф насколько я понимаю есть. Здесь можно предложить принципы организации сайта, так и принципы работы подгрупп.</p> http://www.drupal.ru/node/40666#comments Сайт и проект Drupal.ru Sat, 20 Feb 2010 11:43:28 +0000 andron13 40666 at http://www.drupal.ru Правила сайта http://www.drupal.ru/node/40665 <p>Предлагается написать правила форума, правила поведения на форуме, правила для модераторов, правила публикации в раздел ищу/ предлагаю и всякие другие нужные правила.<br /> Все пожелания велкам.</p> http://www.drupal.ru/node/40665#comments Сайт и проект Drupal.ru Sat, 20 Feb 2010 11:40:05 +0000 andron13 40665 at http://www.drupal.ru Реклама на drupal.ru http://www.drupal.ru/node/40664 <p>На друпал.ру планируется ввести рекламу. Устное согласие на это и желание видеть коммерческую рекламу выразили многие, в том числе и Аксель. Так как рекламой заниматься буду я. То сразу с конкретным примером как я себе это представляю.<br /> Анонимы видят все блоки рекламы. Всегда.</p> <p><a href="http://www.drupal.ru/files/banners_drupal.jpg"><img src="http://www.drupal.ru/files/banners_drupal.jpg" alt="" width="101" height="121" /></a></p> <p>Залогиненные пользователи видят рекламу номер 1,2,3 по умолчанию. Реклама 4,5,6 для них по умолчанию будет отключена.<br /> Реклама 2,3 по желанию пользователя будет им самим и отключаться. Рекламу один отключить нельзя. Но она будет зарезервирована для друпалсуперевентов. И для суперрекламодателей. Например Интел, Мастерхост, Майкрософт и тд.<br /> Это в теории. Практика может немного отличаться.<br /> В теории будет контекстная реклама и банеротематическая. Порнухи, желтухи, девочек на час, доставки цветов, попандеров, кликандеров не должно быть.</p> <p>Теперь вопрос. Так как на друпал.ру теократичиская техно-демократия, надо проголосовать.<br /> Конструктивные и не конструктивные предложения велкам.</p> <table id="attachments" class="sticky-enabled"> <thead><tr><th>Прикрепленный файл</th><th>Размер</th> </tr></thead> <tbody> <tr class="odd"><td><a href="http://www.drupal.ru/files/banners_drupal.jpg">banners_drupal.jpg</a></td><td>793.9 кб </td> </tr> </tbody> </table> Attached poll "Реклама на друпал.ру".<br>Register or login to poll<br>Results:<br>Я за. В том варианте, как она предложена: <em>56 голосов</em><br> Я против любой рекламы на сайте: <em>23 голоса</em><br> Я за. Но только для анонимусов: <em>52 голоса</em><br> Я за. Вся реклама может быть показана всем: <em>34 голоса</em><br> Мне похер: <em>28 голосов</em><br> http://www.drupal.ru/node/40664#comments Сайт и проект Drupal.ru реклама Sat, 20 Feb 2010 11:10:55 +0000 andron13 40664 at http://www.drupal.ru Новые модули: Секс с WP http://www.drupal.ru/node/40597 <p><img width="200" height="150" align="left" src="http://drupal.org/files/images/SexyBookmarks.png" align="left" /><br /> Не подумайте ничего плохого ;)<br /> Это всего лишь порт WordPress плагина <img src="/sites/all/modules/romka_bbcode/icons/astrologer.gif" class="bbcode_image">&nbsp;<a href=http://drupal.org/project/sexybookmarks target=_blank>SexyBookmarks</a>.<br /> Позволяет делать <a href="http://www.deciphered.net" title="&#039;сексуальные&#039; закладки">'сексуальные' закладки</a> для социальных сетей.</p> http://www.drupal.ru/node/40597#comments 'новые модули' Thu, 18 Feb 2010 20:30:49 +0000 PVasili 40597 at http://www.drupal.ru Что необходимо сделать для участия в DrupalCamp? http://www.drupal.ru/node/40485 <p>Мы еще раз повторимся: благодаря нашим спонсорам, участие в мероприятии бесплатное. DrupalCamp Moscow будет проходить 16-17 апреля на территории пансионата Клязьма, в 12км от Москвы, на берегу Клязьминского водохранилища.</p> <p>У пансионата есть собственный регламент работы с гостями пансионата, и мы обязаны его придерживаться. Каждому участнику необходимо заполнить «Анкету гостя» (<a href="http://www.drupal.ru/files/Anketa.doc">скачать файл</a>), заполнить ее и отправить на почту <a href="mailto:drupalhotel@yahoo.com">drupalhotel@yahoo.com</a> . Распечатанные анкеты необходимо иметь при себе для регистрации перед началом мероприятия.</p> <p>Мы просим заполнить анкету заранее, как только у вас появится 1-2 минуты на это (она очень простая) — организаторам будет намного проще обрабатывать заявки задолго до конференции, нежели в последние дни перед проведением.</p> <p>Кроме того, наши иностранные / иногородние гости могут снять 1/2/3-х комнатные номера с завтраком или полным пансионом. С подробной информацией по съему комнат, условиям и тарифам вы можете ознакомиться, скачав файл <a href="http://www.drupal.ru/files/Primern_price.doc">Проживание в пансионате Клязьма</a>.</p> <p>Позднее мы опубликуем альтернативные варианты проживания для иностранных/иногородних гостей: иные пансионаты, находящиеся поблизости и гостиницы в Москве, с картой проезда к месту проведения DrupalCamp.</p> <p><strong><br /> Памятка по заполнению:</strong></p> <ul> <li>поле «Номер комнаты» оставляете пустым.</li> <li>для всех, кому не требуется проживание в пансионате, датами заезда/выезда будут даты проведения конференции (16-17 апреля). Снимающим в пансионате комнаты — даты въезда и выезда из пансионата.</li> <li>анкета заполняется в 2х экземплярах (они уже размечены в документе анкеты), один экземпляр останется у вас на руках, другой для администрации пансионата.</li> <li>для бронирования необходимо в сопроводительном письме написать тип номера (стандартный или улучшенный) и количество человек, которые будут проживать с вам. Если снимаете номер только на одного, обязательно пишите об этом.</li> </ul> http://www.drupal.ru/node/40485#comments DrupalCamp Moscow проживание регистрация Tue, 16 Feb 2010 19:05:08 +0000 gagaga 40485 at http://www.drupal.ru Сравнение способов оптимизации drupal http://www.drupal.ru/node/40193 <p><img src="/files/optimizing-drupal-performance.jpg" width="191" height="141" alt="Оптимизация производительности drupal" align="left" /> В <a href="http://www.zend.com/en/company/news/newsletter/call-windows-azure-api-from-zend-framework-optimize-drupal-performance-and-more-922010?showin=iframe#drupal" title="Первая статья">февральской рассылке Zend</a> первой строкой идет сравнение способов оптимизации drupal посредством выбора движка для кеширования op-code (фактически компиляция и кеширование php).</p> <p>Как и ожидалось, а также подтверждается личными сравнениями - лидер zend. Но он интересен не только опережением APC на 10-15%, а еще и кешированием пользовательских данных - <a href="http://files.zend.com/help/Zend-Server-Community-Edition/zenddatacache.html" title="API">Zend Data Cache</a>.</p> <p>Цифры из графиков говорят сами за себя, включение оптимизации не только экономит память, но ускоряет выполнение в 3-5 раз, windows немного отстает от linux, вероятно из-за типа файловой системы, но не сильно.</p> <p>Радуют результаты полного кеширования страницы - фактически страница отдается из памяти (shm) или диска (disk) не поднимая ядро drupal. Данный функционал реализован в presslow и портирован в drupal7 - в тестах прирост отдачи <strong>26</strong>, но это реализовано пока только в коммерческой версии Zend Server.</p> <p>Очень странно, что не учтен механизм page_fast_cache, доступный при использовании модулей <img src="/sites/all/modules/romka_bbcode/icons/astrologer.gif" class="bbcode_image">&nbsp;<a href=http://drupal.org/project/memcache target=_blank>memcache</a>, <img src="/sites/all/modules/romka_bbcode/icons/astrologer.gif" class="bbcode_image">&nbsp;<a href=http://drupal.org/project/cacherouter target=_blank>Cache Router</a> - он должен давать близкие результаты, так как страница отдается из кеша без поднятия drupal - исполняются всего несколько файлов.</p> <p>ЗЫЖ читающим только по-русски можно посмотреть диаграммы :)</p> <p>PS: Новый eAccelerator 0.96 перестал предоставлять пользовательские функции кеширования, xcache практически не развивается, APC завяз в beta версиях - ZDC, кстати, прекрасно эмулирует функции <a href="http://www.php.net/manual/en/ref.apc.php">apc</a></p> <table id="attachments" class="sticky-enabled"> <thead><tr><th>Прикрепленный файл</th><th>Размер</th> </tr></thead> <tbody> <tr class="odd"><td><a href="http://www.drupal.ru/files/Optimizing-Drupal-Performance-Zend-Acquia-Whitepaper-Feb2010.pdf">Optimizing-Drupal-Performance-Zend-Acquia-Whitepaper-Feb2010.pdf</a></td><td>516.6 кб </td> </tr> </tbody> </table> http://www.drupal.ru/node/40193#comments Разработка и установка Drupal 7.* Drupal 6.* APC Zend ZendDataCache Wed, 10 Feb 2010 11:46:20 +0000 andypost@drupal.org 40193 at http://www.drupal.ru DrupalCamp'у в Москве быть! http://www.drupal.ru/node/40145 <p>Буквально пару часов назад было официально <a href="http://moscow.drupalcamp.ru/">объявлено</a> о переносе даты проведения мероприятия, которого многие из нас ждали с большим нетерпением. Первоначально DrupalCamp планировали проводить в конце февраля 2010 года, и более 250 человек уже зарегистрировалось в качестве участников!</p> <h2>Для чего перенесли дату?</h2> <p>Это будет первый DrupalCamp в России, и мы хотим сделать его максимально интересным! Следующие «для чего» мы считаем наиболее значимыми:</p> <p> 1. Для увеличения количества докладчиков. Доклады — основа Camp'а, его соль и суть. Мы запускаем активную службу поддержки докладчиков. Что это значит? Если у вас возникают вопросы с выбором темы, лучшим форматом, оформлением слайдов — вы можете написать нам, и мы ответим на все вопросы будущих докладчиков.<br /> 2. Для увеличения комфорта гостей из других городов и стран. Мы ожидаем присутствия множества гостей из Украины, Белоруссии и других стран. Бронирование номеров в гостиницах/в пансионате, заказ авиабилетов, планирование командировок — все эти вещи гораздо комфортнее и экономнее делать, имея резерв времени более месяца, что было невозможно в указанные ранее сроки. На сайте в скором времени будут представлена полная информация по проживанию, транспорту и досугу.<br /> 3. Для привлечения большего количества информационных спонсоров. Это не только означает больший комфорт для всех участников, но и большие выгоды для докладчиков. Мы можем посмотреть зарубежные примеры DrupalCamp'ов, да и любых других конференций, где большее количество информационных спонсоров означает большее количество рекламных возможностей для докладчиков. Подготовьте доклад — и о вас будут писать на <a href="http://www.habrahabr.ru/">Habrahabr</a>, <a href="http://www.drupal.ru">Drupal.ru</a>, и в сотнях личных блогов и твиттер-лент.</p> <h2>Где и когда?</h2> <p>Новая дата: 16-17 апреля. Место проведения не изменилось - пансионат Клязьма в 12 км от Москвы на берегу Клязьминского водохранилища. В скором времени будет опубликована информация, связанная с проживанием, питанием, транспортом и досугом.</p> <h2>Будут ли еще изменения?</h2> <p>Будут — но только в лучшую сторону, больше никакой неопределенности в датах и расписании. Мы будем оповещать вас о всех дополнительных возможностях, о всех бонусах, которые может принести участие в конференции. Как быть в курсе событий? Для этого есть <a href="http://moscow.drupalcamp.ru/ru/news/feed">RSS</a>, <a href="http://twitter.com/DrupalConMoscow">Twitter</a> и <a href="http://moscow.drupalcamp.ru/">наш официальный сайт</a>.</p> http://www.drupal.ru/node/40145#comments Tue, 09 Feb 2010 16:42:02 +0000 gagaga 40145 at http://www.drupal.ru Новые модули: Телепортация в Drupal http://www.drupal.ru/node/40104 <p><img src="http://img1.liveinternet.ru/images/attach/c/0/36/314/36314502_Zemlya_s_Marsa.jpg" width="150" height="152" alt="" align="left" /><br /> Модуль <a href="http://drupaler.ru/module/remoteblocks" title="Remote blocks">Remote blocks</a> [<img src="/sites/all/modules/romka_bbcode/icons/astrologer.gif" class="bbcode_image">&nbsp;<a href=http://drupal.org/project/remoteblocks target=_blank>remoteblocks</a>], в отличии от <a href="http://www.drupal.ru/node/31371" title="черных дыр интернета">черных дыр интернета</a> позволяет не только засасывать, но и <strike>выплёвывать</strike> телепортировать блоки между Drupal сайтами. </p> <p>Краткая инструкция для UFOлогов всех степеней и званий <a href="http://www.pronovix.com/blog/remote-blocks">доступна для изучения</a>.</p> http://www.drupal.ru/node/40104#comments Remote blocks Новые модули Mon, 08 Feb 2010 20:49:55 +0000 PVasili 40104 at http://www.drupal.ru В ядро 7ки планируется добавить 3 новые темы http://www.drupal.ru/node/39688 <p>В ядро drupal 7 решили добавить 3 новые темы! И так, встречайте:</p> <p><img src="/files/BusyCore-v1.png" width="200" height="214" alt="Busy" title="тема Busy" align="left" /><br /> <img src="http://drupal.org/files/issues/bartik-screenshot.png" width="294" height="219" alt="Bartic" title="тема Bartic" align="left" /><br /> <img src="/files/KiwiCore-v1.png" width="200" height="322" alt="KiwiCore" title="тема KiwiCore" align="left" /></p> <div class="clear-block">&nbsp;</div> <p>Именно 3 темы для различной тематики (наверно, для аквия-садов) </p> <p>- Бизнес тема: Busy <a href="http://drupal.org/node/695292" title="http://drupal.org/node/695292">http://drupal.org/node/695292</a><br /> - Блого-тема: Bartik <a href="http://drupal.org/node/683026" title="http://drupal.org/node/683026">http://drupal.org/node/683026</a><br /> - Визитка: KiwiCore <a href="http://drupal.org/node/686410" title="http://drupal.org/node/686410">http://drupal.org/node/686410</a></p> <p>Все темы будут иметь расширеные настройки и поддерживать модуль color</p> http://www.drupal.ru/node/39688#comments Установка и настройка Drupal HEAD (разработка ветки 8.x) drupal themes themes Fri, 29 Jan 2010 00:38:37 +0000 andypost@drupal.org 39688 at http://www.drupal.ru Друпалогия — первый журнал про Drupal http://www.drupal.ru/node/39625 <p><img src="http://magazine.drupalogy.ru/files/imagecache/image330x250/magazine/covers/00_magazine.png" alt="Друпалогия - первый журнал про Drupal" title="Друпалогия - первый журнал про Drupal" align="right" /></p> <p>Вышел пилотный номер электронного журнала "Друпалогия", в котором мы собрали статьи, которые будут интересны как новичкам , так и профи Друпала.</p> <p>Вы можете <a href="http://magazine.drupalogy.ru/magazine/themes">обсудить</a> любую статью, <a href="http://magazine.drupalogy.ru/authors">задать вопросы</a> автору или просто поучаствовать в дискуссиях в интересных вам темах. Надеемся, что вы оцените труд авторов журнала, без которых он был бы невозможен и этот выпуск журнала будет интересен всем поклонникам этой <a href="http://drupal.org">CMS/CMF</a>!</p> <p>Спасибо <a href="http://magazine.drupalogy.ru/authors">всем авторам</a>, которые решили опубликовать свои статьи или переводы, надеюсь на дальнейшее сотрудничество.</p> <h4><a href="http://magazine.drupalogy.ru/magazine/00">Приятного прочтения!</a></h4> <p><a href="http://habrahabr.ru/blogs/drupal/82267/"><strong>Хабрапользователи могут поддержать</strong></a></p> http://www.drupal.ru/node/39625#comments FAQ Drupal 7.* Drupal 6.* Drupal 5.* drupal Drupalogy Друпалогия журнал про Друпал Wed, 27 Jan 2010 20:57:36 +0000 Stan.Ezersky 39625 at http://www.drupal.ru ModX и Drupal: разные истории http://www.drupal.ru/node/39577 <p><img src="http://shvetsgroup.com/files/images/modx_drupal.png" alt="" align="right" class="fright" />До знакомства с <a href="http://modxcms.com/" title="Официальный сайт CMS ModX">CMS ModX</a> планировалась статья сравнения этих двух систем, особенно после появления темы «Сравнение Drupal, MODx (и других систем) в рабочем проекте» на drupal.ru где предлагалось соревнования что выяснить какая система лучше.</p> <p>После небольшого знакомства с МодХ все вопросы отпадают сами собой и ни о каком сравнении не может быть и речи.</p> <p>Начнем с того что эти две CMS используются для различных целей и они не взаимозаменяемы. Друпал предназначен для сайтов мини-портал и выше, в то время как МодХ я классифицирую как хороший конструктор сайтов визиток. Область применения МодХ заканчивается на сайтах имеющих статьи и новости одновременно. И заводить спор о том что из МодХ можно создать сайты крупнее и даже крупный портал, тоже верно, но и с сопоставимыми временными затратами можно создать этот крупный портал с нуля.</p> <p>Зато МодХ отлично делает сайты визитки, имеет свой менеджер загрузки файлов, имеет встроенный редактор TinyMCE, многоязычный интерфейс администратора, понятный мастер установки и много чего другого. И в тоже время делать сайты визитки на Друпале немного неправильно, сам факт выделения 64Мб оперативной памяти для сайта визитки на 20 страниц и хостинг для этого «проекта» может вызвать истерический смех у многих веб-разработчиков.</p> <p>Вообщем как я уже и сказал выше никакого сравнения я делать не собираюсь, но МодХ достоин того что бы о нем написали.</p> <h2>Вступление и первый подход к системе</h2> <p>МодХ ориентирован на небольшие сайты, имеет: АПИ, Ajax, ЧПУ, мета теги, группы пользователей. Наличие некоторый технологий даже удивляет, например, встроенный аналог CCK, только под названием «переменные шаблона».</p> <p>Системные требования мы опустим, они не отличаются от большинства систем: PHP, MySQL, Apache/IIS, так как система рассчитана под сайты визитки то потребления ресурсов значительно ниже от Друпала/Джумлы.</p> <h2>Документация и сообщество</h2> <p>Я думаю уже понятно, что система больше чем простые визитки, но начинающие разработчики при освоении системы упираются в недостаток документации. Количество напечатанных книг под Drupal, Joomla, Wordpress измеряются десятками, а то и больше под МодХ толковых книг нет.</p> <p>Документация скудна и большей частью на английском языке, на русском языке я не нашел ни одного сайта который бы имел всю информацию для создания сайта, поиском через гугл можно найти пару-тройку десятков сайтов на которых есть по 5-7 небольших статей.</p> <p>Есть форум поддержки, но мне не понравилось его читать, знающих людей можно сосчитать по пальцам руки, а тех из них которые отвечают и того меньше. Могу привести мой вопрос и ответ на него что бы прояснить ситуацию. На мой вопрос «Как реализовать термины и категории материалов?» я получил ответ «Это вопрос к телепатам?». Правда чуть позже мне дали ссылку в какую сторону рыть что бы получить ответ, а закончилось обсуждение что я сам нашел в документации уже готовое решение (<a href="http://wiki.modxcms.com/index.php/Tagged_blogging_with_Ditto">использование тегов с помощью Ditto</a>). По ходу изучения ил использования будут всплывать еще подводные камни, но не больше чем в других системах, поэтому перейдем к хорошему.</p> <h2>Шаблон сайта глазами МодХ</h2> <p>Верстальщику под МодХ повезло куда больше чем друпалерам. Внедрение дизайна упрощено, но функционал при этом не страдает. Для верстки шаблона необходим только установленный сайт, шаблон и его части хранятся в базе данных поэтому создание редактирования шаблона делается прямо в админке что ускоряет процесс верстки, хотя преимущество внешнего редактора неоспоримо (с подсветкой проще писать).</p> <p>Следующее полезное упрощение это количество шаблонов – для одного сайта их может быть множество. Для каждого шаблона придумываем название и при создании страницы из списка выбираем подходящий шаблон, все просто.</p> <p>Сам шаблон может состоять из блоков и есть несколько видов этих блоков:</p> <ul> <li><span class="geshifilter"><code class="geshifilter-drupal6_ru"><span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#123;</span>Имя<a href="http://www.php.net/_"><span style="color: #000066;">_</span></a>чанка<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#125;</span></code></span><br /> <em>чанк (chunk)</em> – фрагмент HTML-кода (возможно использования JavaScript-кода). который может использоваться в шаблоне. </li> <li><span class="geshifilter"><code class="geshifilter-drupal6_ru"><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#91;</span>Имя<a href="http://www.php.net/_"><span style="color: #000066;">_</span></a>сниппета<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span></code></span> или <span class="geshifilter"><code class="geshifilter-drupal6_ru"><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">!</span>Имя<a href="http://www.php.net/_"><span style="color: #000066;">_</span></a>сниппет<span style="color: #66cc66;">!</span><span style="color: #66cc66;">&#93;</span></code></span><br /> <em>сниппет (snippet)</em> – фрагмент РНР-кода. Отличие этих вариантов в том что первый вариант кэшируется, второй нет.</li> <li><span class="geshifilter"><code class="geshifilter-drupal6_ru"><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">*</span>имя<a href="http://www.php.net/_"><span style="color: #000066;">_</span></a>элемента<span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#93;</span></code></span><br /> заменяется на соответствующий элемент документа MODx.</li> <li><span class="geshifilter"><code class="geshifilter-drupal6_ru"><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>Имя<a href="http://www.php.net/_"><span style="color: #000066;">_</span></a>переменной<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span></code></span><br /> заменяется на системную переменную MODx.</li> <li><span class="geshifilter"><code class="geshifilter-drupal6_ru"><span style="color: #66cc66;">&#91;</span>~ИД~<span style="color: #66cc66;">&#93;</span></code></span><br /> заменяется на ссылку на документ с соответствующим ид.</li> <li><span class="geshifilter"><code class="geshifilter-drupal6_ru"><span style="color: #66cc66;">&#91;</span>+Имя<a href="http://www.php.net/_"><span style="color: #000066;">_</span></a>подстановщика+<span style="color: #66cc66;">&#93;</span></code></span><br /> заменяется на подстановщик.</li> </ul> <p>Чанки и снипеты могут иметь многократные вложения.</p> <p>Теперь смотрим на наш главный шаблон:</p> <p><img src="http://shvetsgroup.com/files/images/modx_1.png" alt="" /></p> <p>и результат:</p> <p><img src="http://shvetsgroup.com/files/images/modx_2.png" alt="" /></p> <p>эта же страница в редакторе:</p> <p><img src="http://shvetsgroup.com/files/images/modx_3.png" alt="" /></p> <h2>Немного о внутренностях</h2> <p>Еще скриншоты можно увидеть здесь <a href="http://wiki.modxcms.com/index.php/MODx_0.9.5_in_screen_captures">http://wiki.modxcms.com/index.php/MODx_0.9.5_in_screen_captures</a></p> <p>Админка сделана с использованием Ajax и отлично справляется с возложенными на нее обязанностями. Ресурсов система потребляет меньше Друпала, кроме того как и любая современная CMS имеет систему кеширования. Кеш сохраняется в файлы, при этом файл кеша представляет собой сериализованный массив.</p> <p>Подробно рассматривать АПИ и делать статью о создании сайтом пока мы не будем, а только затронем процесс расширения сайта (добавление статей, новостей).</p> <p>При создании контента мы можем делать древовидную структуру с многократным вложением страниц. Называем одну из страниц корневой папки «новости» и все новости сохраняем в эту папку. Первая часть добавления новостей на этом закончена, теперь необходимо сделать вывод. Тут все просто сами создаем SQL запрос, сами следим за корректностью передаваемых данных и сами обрабатываем результат запроса.</p> <p>Навигацию страниц делаем тоже ручками старым "дедовским" методом, проверяем что нам передаю юзер в ГЕТ запросе и передаем это SQL запросе. Если программист забудет проверить, а юзер передаст «-1» в виде страницы, получим ошибку от мускула с завершением скрипта, таким нехитрым способом можно создать новости, блоги, форум и другой функционал портала.</p> <h3>Расширение функционала</h3> <p>Добавить функционал можно несколькими способами, это установка плагинов или снипетов. Как они устроены внутри понятно и так (см. выше про добавление новостей).</p> <p>Наиболее популярны:</p> <ul> <li><em>eForm</em> – создание и обработка форм</li> <li><em>Ditto</em> – снипет для организации информации (блоги, новости, статьи, каталоги)</li> <li><em>Breadcrumbs</em> – «хлебные крошки» путь текущий страницы</li> <li><em>AjaxSearch</em> - сниппет для организации поиска по сайту с применением Ajax</li> <li><em>Jot</em> – комментирование материалов</li> </ul> <h3>Итог</h3> <p>Данная система четко дает понять область своего применения и неплохо справляется со всеми задачами которые могут стать перед разработчиком. Система позволяет создавать как простые так и корпоративные сайты визитки. При этом отлично продумана система вывода информации, возможно использования нескольких шаблонов на одном сайте одновременно.</p> <p>Система позволяет разработчику манипулировать блоками и элементами сайта не привязываюсь к 2-х, 3-х колоночных шаблонов. После запуска сайта на сервере, все изменения можно проделывать через админку. Отдельно хочется выделить управление содержимым, на первых шагах мне как друпалеру было непривычно пользоваться админкой и все казалось не логичным, но через час освоения я бы оценил админку на 9 балов по десятибалльной шкале (один балл снимаю за отсутствие подсветки HTML/PHP кода, при том что правка его вложена в функционал).</p> <p>Ничего лишнего и в тоже время можно легко править любую часть сайта. Также хорошо продуман менеджер файлов, поэтому загрузка прайсов или медиа файлов легко осуществляется через админку.</p> <p>Вывод: ModX — отличная система для создание сайтов визиток. Drupal — отличная система для сайтов побольше.</p> <p>—</p> <p><a href="http://shvetsgroup.com/ru/rss.xml"><img src="http://shvetsgroup.com/files/rss.png" alt="" align="left" /></a><strong>via <a href="http://shvetsgroup.com/ru/blog">ShvetsGroup</a></strong><br /> <small>Автор: <a href="http://www.drupal.ru/user/orb">Олег Сидоренко</a></small></p> http://www.drupal.ru/node/39577#comments Tue, 26 Jan 2010 21:55:02 +0000 neochief 39577 at http://www.drupal.ru Нужны авторские статьи или переводы, касающиеся Drupal 6.x http://www.drupal.ru/node/39404 <p>Уважаемые пользователи и поклонники Drupal!</p> <p>В конце следующей недели выйдет пилотный номер pdf-журнала <a href="http://magazine.drupalogy.ru/">«Друпалогия»</a> (о Друпал и про Друпал), рассчитанный как на новичков, так и профи.</p> <p>В связи с этим, предложение авторам статей или переводов, связанных с Друпал: вы можете отправить свои материалы нам и ваша статья будет размещена. Вам почёт уважение от читателей, нам ещё больше оптимизма и альтруизма для хороших дел.</p> <p><strong>Сроки подачи заявки:</strong> до 24 января 2010 (касается пилотного номера). заявки с первого номера до 20 числа месяца.<br /> <strong>Объём:</strong> не менее 2 печатных листов формата А4 в форматах *otd, *doc, *rtf.</p> <p><strong>Будет доступен с:</strong> 28 января 2010.</p> <p><a href="http://magazine.drupalogy.ru/requirements">Условия и требования</a></p> <p>Если у вас есть учётная запись на сайте <a href="http://drupalogy.ru/">«Drupalogy.ru: выставка сайтов»</a>, то заново регистрироваться не надо. Просто авторизуйтесь и <a href="http://magazine.drupalogy.ru/add-theme">предложите тему</a>.</p> <p><strong>Контакты:</strong> Skype, Jabber, GMail: stan.ezersky</p> <p><small><strong>P.S.</strong> Функционал и внешний вид сайта временно не обсуждаются. Сайт делается</small></p> http://www.drupal.ru/node/39404#comments Drupal 7.* Drupal 6.* Друпал журнал Thu, 21 Jan 2010 16:58:40 +0000 Stan.Ezersky 39404 at http://www.drupal.ru Еще одна книга по Drupal на русском: Drupal 6. Бесплатная система управления сайтом (Томас Захреддин) http://www.drupal.ru/node/39345 <p><img src="http://covers.cnt.itdelo.com/o/om/ome/omega2648280big.jpg" alt="" align="right" /><br /> <h3>Drupal 6. Бесплатная система управления сайтом </h3> </p><p>Томас Захреддин<br /> Эксмо-Пресс, 432 стр., 2010 г. </p> <p><strong>Описание:</strong></p> <p>Drupal - это одна из самых популярных систем управления сайтом (CMS).<br /> Будучи бесплатной и написанной на популярном языке PHP, Drupal получила самое широкое распространение и признание. Архитектура Drupal позволяет применять данную систему для построения любых сайтов - от интернет-магазинов до блогов, а также произвольным образом оформлять их.</p> <p>Данная книга является простым и в то же время достаточно полным руководством по системе Drupal. Книга основана на практических примерах, однако в ее начале имеется достаточный для понимания дальнейшего материала объем сведений о технологиях CMS. Для изучения книги и последующего использования Drupal не требуется знания языков веб-программирования. Описание системы дополняет полный справочник по Drupal.</p> <p><a href="http://www.ozon.ru/context/detail/id/4881490/" title="http://www.ozon.ru/context/detail/id/4881490/">http://www.ozon.ru/context/detail/id/4881490/</a><br /> <a href="http://www.bolero.ru/books/9785699362196.html?terms=drupal" title="http://www.bolero.ru/books/9785699362196.html?terms=drupal">http://www.bolero.ru/books/9785699362196.html?terms=drupal</a></p> <p>P.S. Автор нашелся на drupal.org: <a href="http://drupal.org/user/118299" title="http://drupal.org/user/118299">http://drupal.org/user/118299</a></p> http://www.drupal.ru/node/39345#comments Установка и настройка Drupal 6.* документация книги книга Wed, 20 Jan 2010 05:39:31 +0000 Anton L. Safin 39345 at http://www.drupal.ru http://www.drupal.ru/node/39343 нет Thu, 01 Jan 1970 00:00:00 +0000 at http://www.drupal.ru Новая книга на русском языке: Drupal: создание и управление сайтом (Байрон Берри, Хог Уокер, Роббинс Итон) http://www.drupal.ru/node/39309 <p><img src="http://www.books.ru/imgnew/728178_1_150.jpg" alt="" align="right" /><br /> <div class="editor-center-button"><strong>Drupal: создание и управление сайтом (Байрон Берри, Хог Уокер, Роббинс Итон), содержание:</strong></div> </p><p>Оглавление<br /> Предисловие<br /> Введение</p> <p>Глава 1. Обзор системы Drupal</p> <p>Что такое Drupal?<br /> - Кто ею пользуется?<br /> - Возможности, которые поддерживает Drupal<br /> Краткая история систем управления содержимым<br /> - Исторический экскурс в процесс создания веб­сайта<br /> - Эпоха сценариев и баз данных<br /> - Революция в управлении содержимым<br /> Как работает Drupal<br /> - Модули<br /> - Пользователи<br /> - Содержимое (узлы)<br /> - Способы организации содержимого<br /> - Типы содержимого поддержки<br /> Получение справки<br /> В заключение</p> <p>Глава 2. Запускаем Drupal<br /> Задача<br /> Примечания к реализации<br /> - Основы<br /> - Простота редактирования и обработки изображений<br /> В центре внимания: управление содержимым<br /> - Содержимое<br /> - Комментарии<br /> - Навигация<br /> - Блоки<br /> Практика: управление содержимым<br /> - Создание содержимого<br /> - Управление навигацией по сайту<br /> - Настройка блоков<br /> В центре внимания: модули<br /> - Страница администрирования модулей<br /> - Поиск и установка модулей<br /> - Удаление модулей<br /> Практика: работа с модулями<br /> - Модуль Path<br /> - Модуль Administration Menu<br /> В центре внимания: права доступа<br /> - Настройка прав доступа пользователей<br /> - Профили пользователей<br /> - Настройки пользователей<br /> - Блокирование пользователей<br /> Практика: создание ролей<br /> Практика: настройка разрешений<br /> Практика: форма с контактной информацией<br /> В центре внимания: модуль Taxonomy<br /> Практика: блог<br /> В центре внимания: инструменты модерирования содержимого<br /> - Инструменты автоматизированного определения спама<br /> - Инструменты модерирования содержимого вручную<br /> В центре внимания: темы оформления<br /> - Поиск тем оформления<br /> - Установка тем оформления<br /> - Настройка тем оформления<br /> - Блоки и области<br /> - Настройка темы оформления<br /> административного раздела<br /> Практика: придание сайту неповторимого внешнего вида<br /> В центре внимания: редактирование содержимого и работа с изображениями<br /> - Редактирование содержимого<br /> - Работа с изображениями<br /> В центре внимания: форматы ввода и фильтры<br /> Практика: настройка модуля FCKeditor<br /> В заключение</p> <p>Глава 3. Каталог вакансий<br /> Задача<br /> Примечания по реализации<br /> - Нестандартные формы ввода<br /> - Отображение содержимого<br /> - Выгрузка файлов<br /> В центре внимания: CCK<br /> - Поля<br /> - Виджеты<br /> - Форматтеры<br /> Практика: CCK<br /> Практика: тип содержимого Job (вакансия)<br /> Практика: настройка отображения поля<br /> Практика: тип содержимого Job Application (заявка)<br /> В центре внимания: модуль Views<br /> - Отображения<br /> - Элементы представления<br /> Практика: модуль Views<br /> - Представление Jobs (вакансия)<br /> - Представление Job Applications (заявки)<br /> Дополнительно<br /> В заключение</p> <p>Глава 4. Обзоры продуктов<br /> Задача<br /> Примечания к реализации<br /> - Информация о продукте<br /> - Оценка продуктов<br /> - Реализация поиска<br /> Первый шаг: основные описания продуктов<br /> - Создание типа содержимого Product Review<br /> В центре внимания: модуль Amazon<br /> - Что включено?<br /> - Региональные настройки<br /> - Настройки ссылочной информации<br /> Практика: добавление поля Amazon<br /> - Добавление поля Product ID<br /> - Поиск идентификаторов продуктов<br /> В центре внимания: Voting API и Fivestar<br /> Практика: добавление оценок<br /> - Добавление поля Rating<br /> - Включение оценок посетителей<br /> Практика: создание представления со списком продуктов<br /> В центре внимания: модуль Search<br /> - Важность выполнения регулярных процедур<br /> - Поиск с помощью модуля Views<br /> Практика: добавление возможности поиска в список продуктов<br /> В центре внимания: модуль CSS Injector<br /> Практика: улучшение внешнего вида<br /> - Настройка параметров отображения полей CCK<br /> - Настройка модуля CSS Injector<br /> Дополнительно<br /> В заключение</p> <p>Глава 5. Wiki<br /> Задача<br /> Примечания к реализации<br /> - Функциональные возможности Wiki<br /> - Простота форматирования текста<br /> - Простота создания ссылок<br /> - Отслеживание изменений<br /> - Удобочитаемые адреса URL<br /> - Список изменений<br /> Практика: первые шаги<br /> - Создание типа содержимого Wiki<br /> - Удаление информации об авторе при отображении<br /> - Настройка прав доступа<br /> Практика: формат ввода wiki<br /> - Настройка фильтров<br /> - Создание формата ввода wiki<br /> - Настройка разрешений формата<br /> - Добавление содержимого<br /> В центре внимания: модуль Pathauto<br /> Практика: модуль Pathauto<br /> - Настройка параметров<br /> В центре внимания: отслеживание редакций в Drupal<br /> Практика: редакции и модуль Diff<br /> - Включение механизма редакций по умолчанию<br /> - Настройка разрешений<br /> - Просмотр редакций и переключение между ними<br /> - Использование модуля Diff<br /> Практика: создание представлений New pages и Recent edits<br /> - Список Recent posts<br /> - Список Recent edits<br /> Дополнительно<br /> В заключение</p> <p>Глава 6. Управление процессом публикации<br /> Задача<br /> Примечания к реализации<br /> - Процесс публикации<br /> - Извещение по электронной почте<br /> - Обзорные страницы<br /> Практика: первые шаги<br /> В центре внимания: действия и триггеры<br /> Практика: действия и триггеры<br /> - Настройка действий<br /> - Назначение триггеров<br /> В центре внимания: модуль Workflow<br /> Практика: определение процесса публикации<br /> В центре внимания: модуль Workspace<br /> Практика: создание рабочих пространств<br /> В центре внимания: модуль Views Bulk Operations<br /> Практика: создание страницы администрирования<br /> - Создание действий процесса публикации<br /> - Настройка представления<br /> Дополнительно<br /> В заключение</p> <p>Глава 7. Фотогалерея<br /> Задача<br /> Примечания к реализации<br /> - Выгрузка фотографий<br /> - Создание миниатюр<br /> - Фотогалереи<br /> В центре внимания: модуль ImageField<br /> - Настройка<br /> Практика: выгрузка фотографий<br /> - Тип содержимого Photo<br /> - Галереи изображений<br /> В центре внимания: модуль ImageCache<br /> - Наборы правил и операции<br /> - Использование наборов правил<br /> - Разрешение проблем с модулем ImageCache<br /> Практика: модуль ImageCache<br /> - Создание наборов правил для ImageCache<br /> - Настройка отображения поля Photo (Фотография)<br /> - Улучшение качества изображений<br /> Практика: представление gallery<br /> Практика: блок с последними фотографиями<br /> Практика: модуль Custom Pagers<br /> Дополнительно<br /> В заключение</p> <p>Глава 8. Многоязычные сайты<br /> Задача<br /> Примечания к реализации<br /> - Форумы<br /> - База знаний<br /> - Перевод пользовательского интерфейса<br /> - Перевод содержимого, созданного пользователями<br /> В центре внимания: средства интернационализации в ядре<br /> - Модуль Locale<br /> - Перевод содержимого<br /> Практика: установка перевода<br /> Практика: настройка модуля Locale<br /> - Настройка механизма выбора языка<br /> - Переключатель языка<br /> Практика: переводимое содержимое<br /> В центре внимания: модуль Localization Client<br /> Практика: перевод интерфейса<br /> - Использование модуля Locale<br /> - Использование модуля Localization Client<br /> Практика: перевод содержимого<br /> - Перевод<br /> В центре внимания: Internationalization<br /> - Выбор содержимого<br /> - Модуль Strings<br /> - Переменные сайта, зависящие от языка<br /> - Вспомогательные модули<br /> - Синхронизация<br /> Практика: особенности пакета Internationalization<br /> - Выбор содержимого<br /> - Переменные сайта<br /> - Типы содержимого<br /> - Таксономия<br /> Дополнительно<br /> В заключение</p> <p>Глава 9. Управление событиями<br /> Задача<br /> Примечания к реализации<br /> - Управление событиями<br /> - Слежение за численностью участников<br /> Практика: первые шаги<br /> - Создание типа содержимого Event<br /> - Права доступа<br /> В центре внимания: модуль Date<br /> - Модуль Date Timezone<br /> - Типы полей для хранения дат<br /> - Виджеты ввода дат<br /> - Настройки модуля Date<br /> Практика: Добавление дат<br /> - Настройка модуля Date<br /> - Добавление поля даты<br /> Практика: представление для отображения предстоящих событий<br /> В центре внимания: модуль Calendar<br /> - Тип представления Calendar<br /> Практика: представление Calendar<br /> В центре внимания: модуль Flag<br /> Практика: настройка модуля Flag<br /> Практика: представление Attendee<br /> Дополнительно<br /> В заключение</p> <p>Глава 10. Интернет­магазин<br /> Задача<br /> Примечания к реализации<br /> В центре внимания: пакет Ubercart<br /> - Ubercart - core<br /> - Ubercart - core (optional)<br /> - Ubercart - extra<br /> В центре внимания: панель администрирования Ubercart<br /> Практика: настройка магазина<br /> - Начальная настройка<br /> В центре внимания: модули Products, Product Classes и Attributes<br /> Практика: создание продуктов<br /> - Начальная настройка<br /> - Настройка классов продуктов<br /> - Настройка атрибутов продуктов<br /> - Настройка параметров продуктов<br /> - Настройка каталога<br /> В центре внимания: процесс оформления заказа<br /> Практика: обработка заказов<br /> - Покупательская корзина<br /> - Налоги<br /> - Доставка<br /> - Оплата<br /> - Размещение тестового заказа<br /> - Исполнение заказа<br /> - Управление доступом<br /> Дополнительно<br /> В заключение</p> <p>Глава 11. Оформление сайта<br /> В центре внимания: механизм поддержки тем оформления<br /> - Файлы .info<br /> - Области<br /> - Свойства<br /> - CSS<br /> - JavaScript<br /> - Файлы шаблонов<br /> - Файл template.php<br /> Практика: создание собственной темы<br /> - Создание копии темы<br /> - Изменение CSS<br /> В центре внимания: файлы шаблонов<br /> Практика: работа с файлами шаблонов<br /> - Модификация файла шаблона<br /> - Оформление отдельных типов содержимого<br /> - Переопределение файла шаблона модуля<br /> - Создание новой области<br /> В центре внимания: дополнительные возможности переопределения<br /> - Переменные шаблона<br /> - Функции темы оформления<br /> Практика: использование файла template.php для переопределения<br /> - Переопределение переменной шаблона<br /> - Переопределение функции темы оформления<br /> Дополнительно<br /> В заключение</p> <p>Ссылки<br /> Приложение A. Установка и обновление Drupal<br /> Приложение B. Выбор модулей<br /> Приложение C. Модули и темы оформления, использованные в этой книге<br /> Алфавитный указатель</p> <div class="editor-center-button"><strong>Думаю неплохая книга к 2 предшествующим: </strong></div> <ul> <li>CMS Drupal 6: Pro Drupal Development</li> </ul> <p><img src="http://www.ozon.ru/multimedia/books_covers/1000999894.jpg" alt="" /></p> <ul> <li>Drupal 6. Создание надежных и полнофункциональных веб-сайтов, блогов, форумов, порталов и сайтов-сообществ</li> </ul> <p><img src="http://www.ozon.ru/multimedia/books_covers/1001094711.jpg" alt="" /></p> <p><strong><br /> <div class="editor-center-button">Книги российских авторов не советую покупать, мало в них полезного.</div> <p></p></strong></p> http://www.drupal.ru/node/39309#comments Установка и настройка Tue, 19 Jan 2010 10:28:25 +0000 Irbis 39309 at http://www.drupal.ru