вторник, 6 декабря 2011 г.

How to send email notifications for comments in Drupal 7 with actions & triggers

How to send email notifications for comments in Drupal 7 with actions & triggers

Drupal 7 cms logo Do you have a Drupal 7 web site? Do you want to get an email when someone comments, so you don't have to check your site all the time? Don't panic! Here's how you do it.
You don't need to install any new modules to do this in Drupal 7. All that's needed is a little configuring and to copy and paste in a short bit of code.


Step 1: Getting started

Go to the Modules page, and make sure that you enable the Trigger module (at Modules > Trigger) and turn on Clean URLs (at Administer > Configuration > Search and metadata). These are core modules/settings in Drupal 7, so you don't have to install them, just turn them on.
enabled checkbox for Trigger on the Modules pagelocation of Clean URLs in administrative interface

Step 2: Taking action

Your next step will be to create an action, so that drupal can perform it when a comment is saved.
Go to Configuration > System > Actions.
Actions link shown on Configuration page
On the Actions page, choose the dropdown for Create an Advanced Action at the bottom of the page, and click on Send email and then Create.
create an advanced action dropdown with Send email highlighted
On the Configure an advanced action page, fill in the first 3 fields, as in these examples:
  • Label: Send an email notification to site owner upon comment save
  • Recipient: siteowner@adellefrank.com
  • Subject: New Comment at AdelleFrank.com
The trickiest part of this entire endeavor is filling in the Message field, but here's some easy sample code that you could just copy and paste in:
### Node
[comment:node:title] at: [site:url]node/[comment:node:nid]#comment-[comment:cid]

### Comment
[comment:author:name]
[comment:title]
[comment:body]

### Review
[site:url]admin/content/comment/approval

Those bits of code within square brackets are called tokens. Tokens are placeholders, little bits of code that represent commonly-used values. To find more tokens in Drupal 7, you must have two modules enabled. First, turn on the core Help module, which you should have enabled anyway...because it's helpful.  However, I find it bizarre that, even though you're only using tokens included in the Core, you must still install and turn on the Token module, too.
Only then can you point your web browser to the Help > Token page at http://www.yoursite.com/admin/help/token and get a list of all the tokens you can choose among.

Step 3: Triggering your action

At the top of the page, click on the Triggers link to go to the next step. This page can also be found underneath Structure > Triggers.
Triggers link shown at top of Actions page
Be sure to choose the comments tab on the Triggers page.
Comments tab shown at top of Triggers page
You have a number of choices, but since mine is a solo blog, Trigger: After saving a new comment seems most appropriate. Click on the dropdown instructing you to Choose an action and click underneath system on the name of the Action (Send an email notification to site owner upon comment save) you created in Step 2 and then click Assign.
action selected on dropdown for Trigger: After saving a new comment
successfully assigned action to trigger

Step 4: Testing your comments form

Now, as far as you know, your web site is set up to email you when someone saves a comment.  To be absolutely certain that your new action and trigger are working correctly, you need to test it.
Browse to any page, article, or blog post on your site and post a comment.
Check your email at the address you chose in step 2. Does this email give you the information you expected?
Remember to delete your test comment off of your site.

For more information

Теммзация формы коментариев в Drupal 7

 
 
 
 
function THEMENAME_form_comment_form_alter(&$form, &$form_state) {
  //dpm($form);  //shows original $form array
  $form['author']['#type'] = 'fieldset';
  $form['author']['#title'] = 'Your Information';
  $form['author']['#collapsible'] = FALSE;

  $form['your_comment'] = array(
    '#type' => 'fieldset',
    '#title' => t('Your Comment'),
    '#collapsible' => FALSE,
    '#weight' => 2,
  );

  //Subject
  $form['your_comment']['subject'] = $form['subject'];
  unset($form['subject']);
  $form['your_comment']['subject']['#weight'] = -10;

  //Comment
  $form['your_comment']['comment_body'] = $form['comment_body'];
  unset($form['comment_body']);

  $form['author']['homepage']['#access'] = FALSE;

  $form['author']['mail']['#required'] = TRUE;

  //dpm($form);  //shows $form array after our changes

}

Убрать подсказки по форматам в Drupal 7

function yourtheme_form_comment_form_alter(&$form, &$form_state, &$form_id)
{
  $form['comment_body']['#after_build'][] = 'configure_comment_form';
}

function configure_comment_form(&$form) {
  $form['und'][0]['format']['guidelines']['#access'] = FALSE;
  return $form;
}

понедельник, 5 декабря 2011 г.

Переопределить во views вывод страницы node/% только определенного тип материала

Решение:
Скопировать файлик node.tpl.php к себе в тему оформления, и там добавить в начало файлика следущее:


<?php if ($node->type=="product"): ?>
        <?php print views_embed_view('page_of_selling_item','page_1', $node->nid); ?>
<?php else: ?>
блаблабла - тут продолжается обычный файл.

Друпаловские табы и сообщения

По умолчанию не оформленные табы в друпале имеют ужасный вид. Чтобы их привести к красивым закругленно-бело-серым закладкам, нужно прописать следущее:


ul.tabs
{
    font-family: Tahoma, Arial, sans-serif;
    font-size: 11px;
    line-height: 17px;
    margin: 0 0 30px 0;
    padding: 0 0 0 4px;
}

ul.tabs li
{
    margin: 0 0 0 4px;
    padding: 0;
    border: 0;
}

ul.tabs li a:link,
ul.tabs li a:visited
{
    background: #F7F7F7;
    color: #BBBBBB;
    border: 1px solid #C5C5C5;
    border-top-left-radius: 3px; -moz-border-radius-topleft: 3px;
    border-top-right-radius: 3px; -moz-border-radius-topright: 3px;
    padding: 2px 9px 2px 10px;
    margin: 0;
}

ul.tabs li a:hover,
ul.tabs li a:active
{
    color: #5F5F5F;
    background: #F9F9F9;
}

ul.tabs li a.active:link,
ul.tabs li a.active:visited
{
    border-bottom-color: white;
    background: transparent;
    color: #515151;
}

ul.tabs.secondary
{
    position: relative;
    top: -10px;
}


Источник: http://xandeadx.ru/blog/drupal/252

Так же улучшаем вывод messages:

.messages {
        margin:15px 0px 15px 0px;
        font:bold 14px Arial,sans-serif;
        z-index:9999999;
}

.messages.status {
        background:#ccffcc;
        padding: 5px 5px 5px 15px;
        border: solid 1px green;
        color:black;
}

.messages.status a{
        color:#448844;
}

.messages.error {
        background:#ff8888;
        padding: 5px 5px 5px 15px;
        border: solid 1px red;
        color:black;
}

Добавление js-файла через drupal_add_js в template.tpl.php в Drupal 7

В 7й версии друпала добавление js-файла стало намного проще и производительнее.
Для этого надо использовать хук твоятема_preprocess_html(&$vars)

function adaptivetheme_mamaexpert_preprocess_html(&$vars) {
  if (drupal_is_front_page()) drupal_add_js(path_to_theme()  . '/js/frontpage-slideshow.js');
}

Для сравнения, в 6й версии необходимо было использовать хук твоятема_preprocess(&$vars, $hook), примерно так:
function твоятема_preprocess(&$vars, $hook) {
  if (drupal_is_front_page()) drupal_add_js(path_to_theme()  .

пятница, 26 августа 2011 г.

Drupal: Как подключить css файл только для IE6 | Drupal для новичков. Друпал для начинающих

Drupal: Как подключить css файл только для IE6 | Drupal для новичков. Друпал для начинающих: Drupal: Как подключить css файл только для IE6
сб., 20/08/2011 - 23:27 — admin

drupal_add_css(path_to_theme() . '/ie6.css', array(
'group' => CSS_THEME,
'browsers' => array('IE' => 'IE 6', '!IE' => FALSE),
'preprocess' => FALSE)
);

Вместо строчки IE 6 можно прописать любое условное выражение доступное в Conditional Comments.

Комментарии

Отправлено через панель инструментов Google:

воскресенье, 14 августа 2011 г.

CSS injection

Некоторые сайты работают на многотемности, хотя фактически вся проблема сводится к тому, что просто какие-то классы для каких-то страниц должны определятся по разному.
Например, на одной странице фон должен быть одного цвета, а на других(или другой) - другого цвета.
Использовать шаблоны типа page-node-id.tpl.php тут совсем не к месту, модуль Themekey решает задачу, но создает сложности из-за кучи практически одинаковых тем. На помощь пришла идея с css injection.
Почитав в интернете несколько статей стало ясно, что в зависимости от урла можно подгружать различные css. Для этого мы должны написать соответствующую функцию в template.php
Но, во-первых, не все программисты, а во вторых - мне показалось это не гибко.
И тут нашелся модуль CSS Injector.
Суть модуля такова: в административной панеле, в настройках модуля вы указываете какой css код должен прогружаться на каких страницах. Определение страниц для кода такое же как и у блоков, поэтому сложностей не вызовет. Указанные стили записываются в отдельный файл, который уже инклюдится в head на выбранной странице.
Знали бы вы сколько бы времени я сэкономил, если бы нашел это решение раньше...
Если у кого-то будет проблема, что в head поялвяется инклюд, но в то же время пути в созданному css не корректны, то рекомендую сразу же воспользоватсья патчем (в файле css_injector.module строки с - удаляем, с + вставляем):
function _css_injector_rule_path($crid) {
if (!empty($crid)) {
- $local_path = drupal_realpath(_css_injector_rule_uri($crid));
- // Now remove the part before the drupal root.
- // The +1 gets rid of the leading '/'.
- $local_path = substr_replace($local_path, '', 0, strlen(DRUPAL_ROOT) + 1);
- return $local_path;
+ return variable_get('file_public_path', conf_path() . '/files') . '/css_injector/css_injector_' . $crid . '.css';
}
return NULL;
}

вторник, 26 июля 2011 г.

Drupal & Ajax - как динамически обновить представление View

За основу статьи взят текст для Drupal 6 на английском (http://viziontech.co.il/tutorial2),
который был переведен на русский и адаптирован для Drupal 7.
(Примечание переводчика: Объект "View" оставлен без перевода для упрощения восприятия. Понятие "Display" в контексте View переведено как "Представление".)
Это руководство продолжает серию материалов о "Drupal & Ajax". Предыдущая часть Drupal & Ajax - базовое руководство описывает пошаговую реализацию основ Ajax в Drupal. В этом руководстве мы реализуем динамическое обновление Вашей страницы с результатами View. Так что если Вы не читали предыдущую статью, самое время сделать это сейчас, т.к. здесь мы будем усовершенствовать код предыдущего руководства.
Что мы попытаемся добавить в этом руководстве:
  1. Загрузку существующего view.
  2. Настройку параметров view для выполнения.
  3. Выполнение view.
  4. Загрузку темизированного view в объект JSON и выдачу его.
Как Вы увидите, нет больших различий между выдачей простого статического списка категорий (как это было в базовом руководстве) и выдачей результатов view. В конечном счете, и тот и другой являются HTML потоком, который загружается в объект JSON, возвращаемый клиенту.
Замечание: Если у Вас уже есть view, который Вы хотите искользовать, то можете пропустить шаги с 1 по 3 и использовать свой собственный view (перейти к Шагу 4).

Шаг 1 - Создание типа материала "Simple Product"

Давайте определим новый тип материала. Он будет использоваться для создания материалов, с которыми мы будем работать в этом руководстве.
Назовем наш новый тип материала "Simple Product". Определим для него следующие поля:
  • Description
  • Price
  • Category
Для простоты этого примера ограничимся таким набором полей. Тип для всех полей задайте "simple text".

Шаг 2 - Создаем материал

Сейчас самое время создать несколько материалов типа "Simple Product" для формирования списка продуктов (по меньшей мере 6 штук).
Значение поля "Category" для каждого продукта задайте "books" или "movies" (по 3 продукта на категорию). Эти значения помогут нам позднее формировать список продуктов по категориям.

Шаг3 - Создаем view

Теперь нам нужно создать view. Обучение созданию View выходит за рамки данного руководства, так что если Вы не знакомы с модулем Views, настоятельно рекомендую почитать об этом прежде чем продолжить.
Итак, создаем новый View следующим образом:
  • Имя нового view - "products_by_category".
  • Определяем поля, которые Вы хотите видеть в результате.
  • Определяем аргументы view (тип должен быть Content:Category).
  • Тестируем Ваш View для проверки, выдаются ли продукты в соответствии с заданной в аргументах категорией.

Шаг 4 - Выполнение view

Если Вы помните, в оригинальном коде .module, создан статический список, который загружался в объект JSON и возвращался в качестве результата работы функции:
function dynamic_products_get_by_category_id($cat_id){
$items = '';
switch(
$cat_id){
case
12:
$items = '

  • Product 1
  • Product 2
';
break;
case
20:
$items = '
  • Product 3
  • Product 4
'
;
break;
}
// создание объекта JSON. Объект будет содержать свойство с именем “products” которое задается переменной $items.
return drupal_json_output(array('products'=>$items));
exit;
}
?>
Следующий же код вызывает View, который мы хотим загрузить и в возвращает результат:
function dynamic_products_get_by_category_id($category){ $viewName = 'products_by_category'; // Имя нашего view $args = array($category); // Массив аргументов для view. В данном примере только один аргумент. Ваш реальный View может требовать дополнительных аргументов, которые Вам тогда необходимо будет задать
$displayId = 'page'; // ID представления для view.

//Вызов функции views_embed_view для возврата темизированной выдачи view

$res = views_embed_view($viewName, $displayId, $args); // Создаем объект JSON. Этот объект будет содержать свойство по имени “products”, которое будет задаваться с помощью темизированного результата, выполненного view.
return drupal_json_output(array('products'=>$res));
exit;
}
?>
Несколько замечаний по коду:
Эта строка задает аргументы, которые должны быть переданы во view. В нашем случае view принимает один аргумент, который содержит категорию.
= array($category); ?>
= views_embed_view($viewName, $displayId, $args);
return
drupal_json_output(array('products'=>$res)); ?>
Функция views_embed_view, подробнее о которой можно посмотреть здесь, вызывается для возврата темизированного результата.
Во входных параметрах функция принимает имя view, id представления (т.е. default, page, block, etc.) и массив аргументов для view.
На выходе функции html, содержащий результирующий view. Этот view любой темой по вашему желанию, если она была загружена динамически.
После того, как view получен, мы загружаем его в объект JSON, который будет возвращаться в качестве ответа на запрос AJAX.

Шаг 5 - Код обновленной страницы

Последнее изменение, которое необходимо сделать, - обновить код страницы. В прошлом руководстве наш HTML выглядел так:
Мы должны изменить его так, чтобы передать корректную категорию, которую определили на шаге 2 ("books" или "movies"):

среда, 13 июля 2011 г.

Способы повышения производительности высоконагруженных проектов на CMS Drupal - LVEE

Способы повышения производительности высоконагруженных проектов на CMS Drupal - LVEE: "350.org

Способы повышения производительности высоконагруженных проектов на CMS Drupal

Виталий Иоскевич, Минск, Беларусь

Drupal is a popular CMS/CMF used to power the different types of web-projects worldwide. The desire of developers to make their system competitive in terms of functionality and flexibility sooner or later leads to increase of server load and reduced performance. Extensive functionality, flexibility in configuration and extensibility through third-party modules are undoubtedly a huge advantage, enabling to carry out projects of varying complexity and purpose, but the price often is a poor performance of high loaded Drupal-powered sites. In our review we are going to revise existing standard methods of Drupal performance optimization (both server- and client-side) and demonstrate custom solutions that can be applied to some of the critical areas of Drupal-powered high-loaded website. In our real life example we are going to show how to build Google Map page, capable to show thousands of markers based on Drupal content nodes.

Drupal (7-ая, текущая версия) является достаточно развитой системой управления контентом. Стремление разработчиков сделать свою систему универсальной и более функциональной, чем у конкурентов, рано или поздно приводит к тому, что возрастают нагрузки на сервер, снижается быстродействие. Обширный функционал, гибкость в конфигурировании и расширяемость посредством сторонних модулей несомненно являются огромным преимуществом, благодаря которому позволяет выполнять проекты различной сложности и назначения, но плата за него — низкая производительность готового решения.

Чем больше число использованных на сайте сторонних модулей (в т. ч. собственной разработки), тем ниже производительность сайта при больших нагрузках (большом количестве посетителей), а именно при построении сайтов с предполагаемым большим числом посетителей никак не обойтись стандартным функционалом CMS. Таким образом, данная CMS оказывается весьма требовательной к ресурсам сервера, и в большинстве случаев проблема решается выбором специализированных дорогих хостингов — выделенный сервер или несколько серверов.

Но и при ограниченных возможностях сервера есть способы улучшения производительности сайта. Стандартной системы кэширования Drupal достаточно для нормальной работы среднего сайта при неинтенсивной посещаемости, однако для случая высокой нагрузки на сайт этой системы недостаточно.
Основные методы повышения производительности Drupal:

* включить кэш в модулях, позволяющих кэширование (таких как Views, Panels, Feeds, SWF Tools и т.п.);
* увеличить время жизни кэша для стандартной системы кэширования Drupal. При этом надо иметь ввиду, что посетители будут видеть обновления содержимого значительно позже;
* если нет большой необходимости в статистике, можно выключить стандартные модули statistics и database logging. Они используют дополнительные запросы к БД при загрузке страницы. Кроме того, можно найти альтернативу данным модулям;
* использовать модуль CSS Gzip. Уменьшает размер файлов и количество http-запросов;
* использовать модуль Global Redirect. Предотвращает кэширование дубликатов содержимого сайта по ссылкам псевдонимам (синонимам) в случае использования «Clean URL»;
* использовать модуль Javascript Aggregator. Настройки Drupal позволяют объединить js-файлы, однако этот модуль позволяет еще и уменьшить конечный размер передаваемого файла;
* заменить системный cron на более функциональный модуль Elysia Cron. В отличие от системного, Elysia Cron позволяет распределить задачи по времени одна за одной, а не все вместе, при этом снижая пиковую нагрузку на сервер;
* перенести вызов javascript вниз станицы;
* помещать сторонние библиотеки вне каталога модулей /sites/all/modules – например, в /sites/all/libraries. В таком случае Drupal не будет просматривать ненужные ему файлы;
* конвертировать таблицы MySQL в UTF8 InnoDB;
* создать индексы для медленных запросов Views. Желательно проанализировать такие запросы и увеличить производительность созданием индексов для полей;
* использовать ImageMagick вместо стандартной GD image
* library, т. к. он лучше использует ресурсы сервера и дает лучшее качество изображений;
* использовать модуль Content Delivery Network integration. Он позволяет распределить файлы на множество разделенных серверов. При этом снижается динамическая нагрузка на сервер, но требуется дополнительная плата за каждый сервер;

Наиболее продуктивный способ увеличения производительности – отдельная эффективная система кэширования.

Boost. Одна из лучших систем кэширования для shared hosts. Cоздает копии html-станиц, которые генерирует Drupal, и хранит их в каталоге cache. Используя правила «.htaccess», Boost проверяет, существует ли необходимый файл. Если да, то загружает статичный html, полностью избегая Drupal/PHP/MySQL. Если нет, генерирует файл. Старые файлы удаляются по cron для того, чтобы выводимое содержимое сайта оставалось свежим (актуальным).

Memcache. Серверная система кэширования, сохраняющая
страницы сайта в оперативной памяти сервера. Все что необходимо для эффективной работы в данном случае — быстрое ОЗУ большого объема. Его можно успешно использовать как для кэширования анонимных пользователей, так и для зарегистрированных. Но возможен и вариант, когда Memcache кэширует зарегистрированных пользователей, а Boost используется для кэширования анонимов. К преимуществам варианта можно отнести возможность кэширования анонимов и зарегистрированных пользователей, а к недостаткам — то, что нужен хотя бы VPS, c достаточной оперативной памятью и невозможность работы на shared hosting.

APC (Alternate PHP Cache). Система кэширования op-code для серверов Apache. Подход весьма эффективен при большом числе активных модулей на сайте. Суть системы заключается в кэшировании компилированного байт-кода PHP-скрипта для того, чтобы избежать расходов ресурсов сервера на разбор и компиляцию исходного кода при каждом запросе. Для дальнейшего повышения производительности кэшированный код хранится в общей памяти и непосредственно выполняется оттуда, тем самым сводя к минимуму количество медленных операций чтения файлов и копирования в памяти во время выполнения. К преимуществам относится ускорение компиляции скриптов Drupal и уменьшение использования ресурсов сервера, к недостаткам — необходимость произвести специальное конфигурирование сервера.

Varnish (reverse proxy http-accelerator). Данная система выступает на первом плане над сервером Apache, PHP и Drupal.
Varnish сохраняет кэшированное содержимое в оперативной памяти, и таким образом экономит ресурсы на загрузке Apache и Drupal. В результате этого Varnish предоставляет высокую производительность для кэшированных страниц для анонимных пользователей и является предпочтительным вариантом для сложных ресурсоемких сайтов, требующих значительной масштабируемости. Для работы с Drupal 6 необходима была отдельная «оптимизированная» сборка дистрибутива под названием PressFlow и установка модуля интеграции Varnish HTTP Accelerator Integration. Для текущей версии Drupal достаточно установки модуля.
Пример проекта с высокой нагрузкой — 350.org (Drupal 6)

К характеристикам проекта можно отнести следующие:

* 150 000+ уникальных посетителей в день
* 6000+ ивентов, созданных пользователями
* ок. 500 авторизованных пользователей постоянно на сайте
* самая посещаемая страница: карта ивентов (/map)

Кэширование критично как для анонимов, так и для авторизованных пользователей. Используется Pressflow/Varnish и специальные меры для повышения производительности:

* Отказ от Views для генерации больших массивов данных
* XML-файл на диск вместо DB-кэша (плюсы/минусы)
* Кэширование на диск всех RSS-фидов
* Ajax-запросы информации для маркеров на карте.

вторник, 12 июля 2011 г.

Чистые ссылки. Что это? Реализация. Проблемы и решения

"Чистыми" URL (или "чистыми" ссылками, в английском написании "clean URLs") называют URL вида: http://mysite.com/node/1. Т.е. в теле ссылки нет никаких знаков "?" или "&". Обычно ссылка в Drupal выглядит как: http://mysite.com/index.php?q=node/1, что согласитесь намного менее приятно. Именно поэтому придуман механизм "чистых" URL, которые более удобочитаемы и понятны.

Хотя в Drupal 5 "чистые" URL включались в админке Drupal, а в Drupal 6 предлагается включить "чистые" URL прямо при установке (если это возможно, конечно), сам Drupal к реализации "чистых" URL не имеет никакого отношения. Единственное, что делает Drupal, если включены чистые ссылки - это при формировании страницы учитывает это и показывает ссылки в "чистом" виде. А всю работу по корректному отображению страниц, адресованых по "чистым" URL, делает веб-сервер. Поскольку в большинстве случаев в качестве веб-севрера всё-таки работает Apache, то можно говорить, что всю необходимую для "чистых" URL работу проделывает модуль Apache mod_rewrite, а Drupal лишь предоставляет этому модулю необходимые настройки.

Где же хранятся эти настройки и что они из себя представляют? Настройки для модуля mod_rewrite находятся в файле .htaccess, который находится в корневом каталоге Drupal (т.е. там где лежит index.php). После установки Drupal со включенными "чистыми" URL они выглядят так:


RewriteEngine on

# RewriteBase /

# Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]


Я показал только интересующие нас строки из файла .htaccess, на самом деле их там намного больше!

Итак, поясняю, что же здесь написано. Как можно заметить весь блок находится между строками:


...


Эти строки служат для того, чтобы содержимое блока обрабатывалось веб-сервером только если установлен и включен модуль mod_rewrite. Вообще-то, поскольку этот модуль почти всегда установлен и включен, их можно было бы опустить. Однако, если по какой-то причине модуль не установлен или не включен, то без этих строк веб-сервер будет выдавать ошибку 500, потому что не знает, что делать с директивами внутри блока.

Далее, директива

RewriteEngine On

говорит о том, что для данного каталога (и всех его подкаталогов, если в них самих не указано отдельно) включена обработка URL с помощью модуля mod_rewrite. Если вам в каком-либо подкаталоге захочется выключить эту обработку или даже вообще захочется отказаться от "чистых" URL, то всё что вам нужно сделать это указать "Off" вместо "On", не удаляя собственно никаких правил преобразования URL.

Далее, обратите внимание на строку

# RewriteBase /

Вообще-то, строки, которые начинаются на "#" считаются комментариями и не рассматриваются как правила для модуля mod_rewrite. Но данная строка приведена мной, потому что она может играть важную роль, если ваш Drupal установлен не в корневой каталог вашего сайта, а является лишь его разделом (например, если он установлен в подкаталог drupal (http://mysite.com/drupal)). Об этом я расскажу ниже в разделе решения возможных проблем.

И вот, наконец, мы добрались до нужного нам правила, состоящего из нескольких строк:

# Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Как видите, правило снабжено английским комментарием "Rewrite URLs of the form 'x' to the form 'index.php?q=x'" (Преобразовать URL 'x' в конструкциях типа 'index.php?q=x'). Разьясняю подробно каждую строчку. Для начала обратите внимание, что сперва идёт три строки RewriteCond и только одна строка RewriteRule. Строки RewriteCond описывают условия срабатывания правила преобразования URL, а строка RewriteCond описывает собственно само правило. Последовательно следующие друг за другом строки RewriteCond обьединяются с уловием логического "И". Итак, первые три строки с RewriteCond говорят следующее: если указанное в URL имя не является существующим файлом И, при этом, указанное в URL имя не является существующим каталогом, И, при этом не совпадает с 'favicon.ico', то применить нижеследующее правило.... Т.е. если вы, например создадите на своём сайте файл или каталог с именем "node/1" и при этом наберёте в браузере http://mysite.com/node/1, то даже при включенных "чистых" URL правило не сработает и вам будет отдан существующий файл node/1 (если это файл) или индексный файл каталога node/1 (если это каталог и в нём есть индексный файл).

И в заключении, разберём собственно строку правила с преобразованием URL. Правило преобразования URL в строке RewriteRule говорит: заменить ВСЁ что указанно в пути URL, подставив вначале "index.php?q=", а затем весь путь.. Конструкция "^(.*)$" в первой части (части поиска) означает шаблон, который совпадает с полным путём в URL (т.е. всем, что находится за http://имя_сайта), а конструкция во второй (подстановочной части) "$1" означает первое найденное совпадение с шаблоном (т.е. в нашем случае весь путь). После выполнения данного правила, например над URL http://mysite.com/node/1, веб-серверу будет передан другой URL: http://mysite.com/index.php?q=node/1. И именно в таком виде данный URL будет обработан самим Drupal.

Вот, собственно, и весь секрет "чистых" URL и того как они работают
Возможные проблемы и пути их решения

Новички часто сталкиваются с тем, что у них не работают "чистые" URL. Начинаются судорожные поиски решения в самом Drupal, насилование админки и т.д. Но как вы уже поняли после прочтения данной статьи, сам Drupal не имеет к правильной работе "чистых" URL почти никакого отношения. Поэтому, для настройки "чистых" URL необходимо корректно настроить веб-севрер. Когда Drupal увидит, что веб-сервер настроен корректно, то легко начнёт работать с "чистыми" URL..

Итак не работают "чистые" ссылки:

1. Проверьте возможно ли их включить в административном разделе: /admin/settings/clean-urls (здесь и далее путь указан без указания: http://имя_сайта). Если они включаются значит и проблемы больше нет, работайте!
2. Проверьте наличие в файле .htaccess в корневом каталоге вашего Drupal строк, которые были описаны в статье. Если файла .htaccess нет или в нём нет означеных строк, то создайте файл и добавьте строки. Затем вновь переходите к п.1
3. Если есть .htaccess и в нём необходимые строки, а всё-равно ничего не работает, то убедитесь, что у вашего хостинг-провайдера в настройках вашего хостинга разрешено использовать файлы .htaccess. Некоторые хостинг-провайдеры отключают такую возможность по-умолчанию! Убедитесь также, что модуль mod_rewrite у вашего веб-сервера установлен и включен. Вы можете это выяснить также у вашего хостинг-провайдера (хостера).
4. Убедитесь, что в настройках вашего сайта, для каталога сайта, в директиве AllowOverride стоит как минимум значение Limit FileInfo Options Indexes, а лучше All. Если вам недоступен даже на чтение ваш файл с настройками сайта, обратитесь с этим вопросом к хостеру. Поскольку FileInfo контрлирует работоспособность директив mod_rewrite, то без включения этой опции чистые ссылки работать не будут.
5. Если вы прошли пукнты 2,3,4 и не работает, то убедитесь, что перед означеными строками нет других правил для mod_rewrite, которые могут конфликтовать с описанными в данной статье правилами.
6. Если и конфликтующих правил нет и не помогает, попробуйте заменить строчку

RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

на

RewriteRule ^(.*)$ /index.php?q=$1 [L,QSA]

7. Если не помогает и это, попробуйте поиграться с директивой RewriteBase. Возможно вам поможет установка в этой директиве либо относительного пути для вашего каталога с Drupal (например, если вы ставите Drupal не в корневой каталог сайта, а в подкаталог). Т.е. при названии подкаталога скажем drupal, попробуйте указать

RewriteBase /drupal

Возможно это и не все проблемы, которые случаются при неработающих "чистых" URL, однако в 99% написанное вам поможет. А если вы нашли новую проблему и решение, присылайте на указанный ниже адрес электронной почты для назидания потомкам.

среда, 27 апреля 2011 г.

Вопрос по форме обратной связи | Drupal в рунете

Вопрос по форме обратной связи | Drupal в рунете: "Отправлено через панель инструментов Google:"

Как вывести форму webform на всех нодах одного типа? | Drupal в рунете

Как вывести форму webform на всех нодах одного типа? | Drupal в рунете: "Отправлено через панель инструментов Google:"

Conditional recipients | drupal.org

Conditional recipients | drupal.org: "Conditional recipients

Отправлено через панель инструментов Google:"

понедельник, 25 апреля 2011 г.

Удаление "Войдите чтобы оставить комментарий" Drupal 6

Remove "Login to post comments" from Drupal 6 sites | drupal.org: "Settings Override

Вы можете использование произвольную строку для замены например так: /sites/default/settings.php:
$conf['locale_custom_strings_en'] = array(
'Добавить комментарий' => 'Обсудить',
'Войдите чтобы оставить комментарий' => '',
);


Если Вы хотите оставить возможность комментирования только зарегистрированным пользователям, и удалить "Войдите чтобы оставить комментарий" для анонимных пользователей, вы просто добавляете сниппет в конец template.php в папке вашей темы.
function phptemplate_links($links, $attributes = array()) {
global $user;
if (!$user->uid) {
unset($links['comment_forbidden']);
}
return theme_links($links, $attributes);
}

более подробно здесь: http://drupal.org/node/425332

Убрать сообщение только для анонса:
You can remove the links from teasers only enabling the following custom mini module
$link) {
if (strcmp('comment_forbidden', $module) == 0) {
unset($links[$module]);
}
}
}
}
?>

воскресенье, 24 апреля 2011 г.

Вывести заголовок текущего документа в цепочке навигации.

Главная » Создание сайта на Drupal » Навигация » Хлебные крошки (breadcrumbs)
Заголовок текущей страницы в цепочке навигации
07 Ноя 2008
Опубликовано VladSavitsky
Задача:

Вывести заголовок текущего документа в цепочке навигации. Заголовок не должен быть ссылкой.
Решение
Варианты решений

* Переопределить вывод $breadcrumb в теме

Переопределить вывод $breadcrumb в теме

В файле template.php текущей темы добавить код:
function phptemplate_breadcrumb($breadcrumb) {
if (!empty($breadcrumb)) {
$breadcrumb[] = drupal_get_title();
return ''. implode(' > ', $breadcrumb);
}
}
Совместное использование с модулем Taxonomy Breadcrumb

* В модуле нужно отключить вывод названия термина в цепочке навигации . См. параметр "Show current term in breadcrumb trail?" на странице /admin/settings/taxonomy-breadcrumb (Drupal 5.x)
* В "Расширенные настройки" включить (include) нужные типы материалов, которые должны также обрабатываться модулем Taxonomy Breadcrumb.
* Заменить "Главная" на ...

Полезные рецепты по этой теме
Использованные материалы

* Menu and breadcrumb customising

четверг, 17 марта 2011 г.

Модули

Default Content
Allows export of select nodes (along with attached images etc.) to a Features exportable.

More Comments
More Comments module replaces the default pager of comments with a button that loads the next page of comments using ajax.

Placeholder
This project adds an extra FAPI attribute called '#placeholder' to textfield field elements. Often textfields should have some text in them like "Enter your text here" until the user clicks on (or tabs to) the element in question. At that point, the text should disappear and the user can enter his or her desired input.

Blockify
This module exposes a number of core Drupal elements as blocks.

Hide Show Summary
This module allows users to remove the "hide show summary in full view" check box on selected node types.

IMCE Tools

Nice messages




Formatters for Node Reference fields
Allows for any non-Node Reference formatter to be used with Node Reference fields and passes the assumed appropriate field from the referenced node.

Panels Extras

воскресенье, 13 февраля 2011 г.

Повышаем защищённость CMS Drupal « Рецепты от Сеогада

Повышаем защищённость CMS Drupal « Рецепты от Сеогада:

Всем известно ,что одним из главных недостатков CMS Drupal является уязвимость от PHP скриптов, которые злоумышленник может загрузить на сервер без особых усилий.

Это также могут быть обычные Drupal модули, скачанные с порталов о создании сайтов. Установив данный модуль, Вы обречёт свой сайт на взлом.
Как же обезопасить себя от попадания вредных скриптом на сайт? Нанести вред подобные скрипты могут с папки, на которую разрешена запись на сервер. Таким папками являются templates и /uploads/.
Полностью запретить запись на эти паки не удастся, так как именно в них производится загрузка основного полезного графического и аудио контента сайта. Однако ,чтобы обхитрить злоумышленников, мы пропишем в файле .htaccess запрет на исполнение сторонних скриптов.
Делается это очень просто:Добавляем запись «php_flag engine off» (без кавычек). После проведения такой несложной операции заливка вредоносных скриптов становиться просто бесполезной, так как скрипты не смогут изменять файлы этих папок и вложенных в них.
Надеемся, наш совет поможет Вам избежать многих проблем.

вторник, 8 февраля 2011 г.

Drupal: Вывод кликабельного виджета Fivestar в представлении Views | Блог музицирующего веб-девелопера

Drupal → Вывод кликабельного виджета Fivestar в представлении Views

Создаём представление. Добавляем поля, фильтры, сортировку, меняем настройки по вкусу.
Добавляем новую взаимосвязь Материал: Votes:
Добавление взаимосвязи
В настройках взаимосвязи выбираем тег голосования Normal vote и отмечаем опцию Restrict to current user:
Настройки взаимосвзяи
Добавляем новое поле Голоса: Значение:
Добавление поля
Настройки поля: внешний вид — Звёзды (кликабельно, без текста), связь — Голоса, остальное по дефолту:
Настройки поля
Сохраняем представление. Результат:
Список материалов с возможностью проголосовать
Если в взаимосвязях вместо Материал: Votes выбрать Материал: Vote results, то в виджетах будет показываться общий рейтинг материала.

пятница, 4 февраля 2011 г.

Как сделать многоуровневый каталог с иконками разделов? | Drupal Россия

Как сделать многоуровневый каталог с иконками разделов? | Drupal Россия: "выводяться картинки дочерних терминов с ссылкой на страницу термина для этого необходим модуль taxonomy image, вставлял в представление taxonomy_term стандартное

Отправлено через панель инструментов Google:"

Вывод картинок дочерних терминов с ссылкой на страницу термина

<?php
$v 
views_get_current_view(); 
//Из аргументов получаем ID текущего термина
 $term_id intval($v->args[0]);
 //Выводим дерево потомков термина
 $terms taxonomy_get_children ($term_id);
foreach ($terms as $term) {
 $imag taxonomy_image_display($term->tid);
print l($imagtaxonomy_term_path($term), array('html' => array('html' => 'true')));
    }
 $t taxonomy_get_term($term_id);
 ?>

Простой каталог / Views / DruIT

Простой каталог / Views / DruIT: "Отправлено через панель инструментов Google:"