Модуль Яндекс.Погода для Drupal 6 и 7

Скачать модуль для Drupal 6: yandex_weather-6.x-1.1.zip
Скачать модуль для Drupal 7: yandex_weather-7.x-1.1.zip

На прошлой неделе на сайте drupal.ru я увидел активное обсуждение топиков «Яндекс сервисы в одном проекте» и «Встреча по поддержке и продвижению Яндекс-сервисов в Drupal». В представленном списке существующих модулей для интеграции с сервисами Яндекса я не обнаружил модуля про погоду. Я доработал свой модуль, исправил ошибки, дописал дополнительный функционал и решил выложить на сайт для обсуждения сообществом.

Вот так выглядит блок с информером погоды от Яндекса в дефолтной теме.

В настройках блока можно:

указать город по умолчанию; разрешить/запретить отображать форму выбора города в блоке; выбирать размер информера.

Текстовые сообщения модуля написаны на английском языке и переведены на русский язык.

Если данный модуль вызовет интерес, то можно переписать его и для Drupal 7. Буду благодарен за любые конструктивные комментарии.

UPD 21.02.2012: Обновил модуль. На прошлой неделе Яндекс обновил свой сервис погоды, поэтому поломалась часть функциональности моего модуля. Сейчас исправил. А также сделал версию модуля под Drupal 7.

Скачать модуль для Drupal 6: yandex_weather-6.x-1.1.zip
Скачать модуль для Drupal 7: yandex_weather-7.x-1.1.zip

Прикрепленный файл Размер yandex_weather-6.x-1.1.zip 9.33 кб yandex_weather-7.x-1.1.zip 9.48 кб

Источник: http://www.drupal.ru/node/76316

Inner poll для Drupal 7. Прикрепляйте опросы к любому документу ;)

День добрый.

Портировал Inner poll для Drupal 7, для моего любимого www.drupal.ru. Прикрепляйте опросы к любому документу .

При портировании кое-где немного изменил логику и вывел количество воздержавшихся.
Поля в БД совместимы с версией для Drupal 6, только добавились новые индексы.
Перевод модуля содержится в архиве модуля.

Ищу тех кто поможет разместить модуль на drupal.org.

Особенности модуля

Все действия пользователей сохраняются без перезагрузки страницы (хмм, возможно, пора уже перестать считать AJAX фишкой); автор опроса может разрешить (или не разрешить) пользователям отменять свои голоса голоса; автор опроса может открывать/закрывать опрос, а так же устанавливать дату автоматического закрытия опроса; автор опроса может разрешить/запретить множественный выбор; автор опроса, если он не является модератором, может править вопрос опроса только до тех пор, пока в опросе нет ни одного голоса; автор опроса, если он не является модератором, может править ответ на вопрос только до тех пор, пока за этот ответ нет ни одного голоса; опрос может содержать до 999 вариантов ответа; пользователи не могут просматривать результаты опроса до тех пор пока не проголосуют, для неопределившихся с решением есть кнопка “Воздержаться”, после нажатия которой будут показаны результаты, но при этом пользователь потеряет возможность голосовать в этом опросе; администратор сайта может раздавать права на голосование, создание опросов, редактирование опросов, редактирование опросов даже в случае если в них уже есть голоса;

Пояснение к пунктам 5 и 6. Они нужны для того, чтобы авторы не вносили кардинальных изменений в опрос тогда, когда другие юзеры уже отдали в них свои голоса. Например, был опрос “Любите ли вы клубнику”, на который получены ответы “Да” — 95%, “Нет” — 5%, а затем ушлый автор сменил вопрос на “Смотрите ли вы порнографию”.

Примечания

Не стал прикручивать кэш, так как в кэш можно класть всю страницу сторонними средствами при необходимости (обработка AJAX живёт на своих URL). Не реализован файл тестов, если кто напишет, буду благодарен. Отсутствует шаблон вывода контента так как количество выводимых данных мало и многое можно темизировать с помощью *.css.

Загрузка

Ссылка: Inner poll для Drupal 7.

Источник: http://www.drupal.ru/node/74900

Видео и слайды с DrupalCamp Donetsk 2011

Мы наконец-то выложили обещанное и долгожданное видео докладов с DrupalCamp! Спасибо Петру Козаченко, Владимиру Колосу и Александру Даниленко за съемку и обработку. Результат их совместной работы вы можете увидеть здесь http://www.youtube.com/user/DrupalCampDonetsk.

Мы также выложили слайды презентаций сюда http://slideshare.net/DrupalCampDN, А еще, мы прикрепили эти видео и слайды к темам докладов на нашем сайте: http://donetsk.drupal.ua/ru/program/session-schedule. Пожалуйста, оставляйте ваши отзывы!

Источник: http://www.drupal.ru/node/74516

Яндекс сервисы в одном проекте

Предлагаю обсудить возможность объединить все Яндекс сервисы в одном проекте. На текущий момент на д.о. есть несколько различных модулей для интеграции с яндекс сервисами.

Поиск по сайту дал следующие результаты:

 Яндекс.маркет — 6.x.  Яндекс.маркет — 6.x и 7.x(dev). Яндекс.маркет — в песочнице.  Яндекс.видео — 7.x(dev) new!  Яндекс.метрика — 6.x и 7.x. Яндекс.метрика — в песочнице. Яндекс.вакансии — обсуждается.  Яндекс.новости — 6.x(dev) и 7.x(dev).  Яндекс.карты — 6.x(dev).  Яндекс.деньги — 5.x платёжный шлюз для уберкарт. Яндекс.сервер — в песочнице. Яндекс.поделиться — в песочнице. Яндекс.спеллер — в песочнице. Яндекс.почта — обсуждается. Яндекс.карты — почти готов. Яндекс.карты — во вложении.  Site verification — 6.x и 7.x. Яндекс.маркет — во вложении. Быстрый заказ — обсуждается. Яндекс.погода — во вложении.

Если что то забыл, поправьте.

Вот мои причины, для чтобы собрать все сервисы в один проект:

На данный момент большинство из этих модулей находятся «в стадии разработки», а многие попросту брошены без особых шансов получить стабильный релиз для D6 и D7. Я думаю ситуация измениться, если у проекта будет несколько разработчиков. Это поможет устранить дублирования проектов. Например, в приведённом списке представлено сразу 4 модуля для интеграции с Яндекс.маркет. Думаю, лучше всё таки будет объединить усилия. Помощь новым разработчикам. Несколько модулей находятся в песочницах из-за того, что некому сделать review кода. На д.о. яндекс мало кому интересен… Для многих яндекс сервисов интеграция с Друпалом полностью отсутствует. В том числе для самого главного, на мой взгляд сервиса — Яндекс.xml. Для одного общего проекта, легче найти спонсоров.

Attached poll “Нужно ли объединять все яндекс.модули в один проект?”.
Register or login to poll
Results:
Да: 43 голоса
Нет: 25 голосов

Источник: http://www.drupal.ru/node/74274

Вот такая штукенция получилась. Radios Select для Drupal 7.

История из разряда “Новая жизнь старых вещей”. Точнее – новая “шуба” для привычного элемента форм radios. Для тех случаев, когда элемент radios строится из модуля.

Собственно, началось всё с того, что искал способ отобразить в форме модуля некую таблицу символов с возможностью выбора любого одного символа. Символы должны быть достаточно крупные (шрифт где-то 18-20px). Для начала попытался приспособить обычный select, но не понравилось: во-первых, список слишком длинный и выбирать неудобно, а во-вторых, добиться единообразного отображения (размер шрифта, padding, выравнивание и т.д.) в разных браузерах оказалось совсем непросто.

В общем, нужно было искать более компактное решение, при котором таблица была бы именно таблицей. В процессе разных тестов случайно обнаружил, что метки (label) для элемента radios в большинстве браузеров обрабатывают клики как и родительский (связанный с меткой) сам radios-control (кружочек, по которому мы тыкаем мышкой). То есть – по клику на метку элемент устанавливается в состояние checked, как если б мы кликали на сам кружочек. Не бог весть какое открытие, но беглый поиск в гугле аналогичных развитых решений с использованием меток ничего не дал. И я приступил к работе.

После ряда тычков в неверных направлениях было выведено более-менее унифицированное и кроссбраузерное решение (CSS + jQuery). Я его назвал Radios Select. Вот оно, со скромной гордостью и удовлетворением представляю своё детище:

А вот что происходит по клику на элементе:

Код, формирующий вывод:

<?php
$values = preg_split('/[\s,\.]+/', ucwords('Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sodales congue velit. Duis commodo interdum ipsum.'));

$form['rs_example_1']['radios_select_1'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select word:'),
  '#default_value' => 1,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#description'   => t('Word to use in form.'),
);
?>

Собственно, Radios Select можно использовать не только, как таблицу символов, а для выбора любого значения: строки, числа. Родилась идея сделать модуль-хук, который бы темизировал элементы radios как Radios Select, если у элементов установлен соответствующий параметр, а иначе – выводил бы стандартный radios. В процессе работы над модулем элемент Radios Select “оброс” рядом параметров, позволяющих кастомизировать вывод этого псевдо-элемента (это действительно скорее псевдо-элемент, поскольку по факту строится обычный radios и последующая обработка в submit’е – типичная для radios).

Например, можно изменить свойства шрифта элемента:


<?php
$values = preg_split('/[\s,\.]+/', ucwords('Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sodales congue velit. Duis commodo interdum ipsum.'));

$form['rs_example_2']['radios_select_2'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select word:'),
  '#default_value' => 2,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'label'         => array(
      'font'         => 'Times New Roman',  // this sets font family (same as in CSS way)
      'font_size'    => 1.4,              // this sets font size (in "units" units)
      'font_color'   => '#339933',        // this sets font color (same as in CSS way)
      'line_height'  => 2,                // this sets line height (in "units" units)
      'units'        => 'em',             // can be em or px (default: px)
    ),
  ),
  '#description'   => t('Word to use in form.'),
);
?>

А вот и вариант для искомой таблицы символов:


<?php
$values = array();
for ($i = 33; $i < 256; $i++) {
  $values[] = '&#' . $i . ';';
}
$values = array_combine($values, $values);

// Replace Soft Hyphen symbol (&#173;) by non-breaking space
// (this symbol produces row break in Firefox and Opera)
$values['&#173;'] = '&nbsp;';

$form['rs_example_3']['radios_select_3'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select symbol:'),
  '#default_value' => '&#169;',
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'label'          => array(
      'width'          => 2,      // sets label width (in "units" units)
      'height'         => 2,      // sets label height (in "units" units)
      'line_height'    => 2,
      'padding_x'      => '3px',  // horizontal padding (we use px instead of units)
      'padding_y'      => '3px',  // vertical padding (we use px instead of units)
      'units'          => 'em',
    ),
  ),
  '#description'   => t('Symbol to use in form.'),
);
?>

Можно “подкрасить” оформление элемента (выбирается также светлая или тёмная стрелка):


<?php
$values = array_merge(range('A', 'Z'), range('a', 'z'));

$form['rs_example_4']['radios_select_4_1'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select character:'),
  '#default_value' => 2,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'element'        => array(
      'frame_color'    => '#d4d0c8', // this sets frame color
      'dark_arrow'     => TRUE,      // this sets dark arrow for this element
     ),
    'label'          => array(
      'width'          => 2,
      'height'         => 2,
      'padding_x'      => '3px',
      'padding_y'      => '3px',
      'units'          => 'em',
     ),
   ),
  '#description'   => t('Character to use in form.'),
);
?>

Или убрать фон выбранного элемента и объединить с селектором (так называемый hollow-режим):


<?php
$values = array_merge(range('A', 'Z'), range('a', 'z'));

$form['rs_example_4']['radios_select_4_2'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select character:'),
  '#default_value' => 2,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'element'         => array(
      'hollow'          => TRUE,   // this sets hollow mode
     ),
    'label'         => array(
      'width'           => 2,
      'height'          => 2,
      'padding_x'       => '3px',
      'padding_y'       => '3px',
      'units'           => 'em',
     ),
   ),
  '#description'   => t('Character to use in form.'),
);
?>

А можно и вставить картинки в селектор, причём выровнять по желанию – либо по верху (по умолчанию), либо по низу (как в этом примере):


<?php
$module_path = url(drupal_get_path('module', 'radios_select'));
$images_path = $module_path . '/examples/images/';

$values = array(
  '<img src="' . $images_path . 'image1.png" /><br />Some image 1',
  '<img src="' . $images_path . 'image2.png" /><br />Some image 2',
  '<img src="' . $images_path . 'image3.png" /><br />Some image 3',
  '<img src="' . $images_path . 'image1.png" /><br />Some image 4',
  '<img src="' . $images_path . 'image2.png" /><br />Some image 5',
  '<img src="' . $images_path . 'image3.png" /><br />Some image 6',
);

$form['rs_example_5']['radios_select_5_1'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select image:'),
  '#default_value' => 0,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'label'         => array(
      'valign'        => 'bottom', // this sets vertical alignment of labels to bottom
      'font_size'     => 12,
      'line_height'   => 14,
      'padding_x'     => 4,
      'padding_y'     => 4,
     ),
   ),
  '#description'   => t('Select horizontal or vertical image.'),
);
?>

Другой вариант с картинками – выравнивание “в ряд” с текстом метки (можно также задать произвольный vertical-align для изображения, как обычно в CSS, здесь, в примере – просто смещение от базовой линии):


<?php
$module_path = url(drupal_get_path('module', 'radios_select'));
$images_path = $module_path . '/examples/images/';

$values = array(
  '<img src="' . $images_path . 'ru.png" /> Russian Federation',
  '<img src="' . $images_path . 'us.png" /> USA',
  '<img src="' . $images_path . 'ca.png" /> Canada',
  '<img src="' . $images_path . 'fr.png" /> France',
  '<img src="' . $images_path . 'de.png" /> Germany',
  '<img src="' . $images_path . 'it.png" /> Italy',
  '<img src="' . $images_path . 'gb.png" /> United Kingdom',
  '<img src="' . $images_path . 'gr.png" /> Greece',
  '<img src="' . $images_path . 'tr.png" /> Turkey',
  '<img src="' . $images_path . 'ua.png" /> Ukraine',
  '<img src="' . $images_path . 'no.png" /> Norway',
);

$form['rs_example_5']['radios_select_5_2'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select country:'),
  '#default_value' => 0,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'label'         => array(
      'img_valign'    => '-4px',        // sets vertical alignment of images
      'nowrap'        => 'TRUE',        // disables word wrapping for text in labels
     ),
   ),
  '#description'   => t('Country from where you are.'),
);
?>

А можно упорядочить метки в колонки (любое количество колонок):

<?php
$module_path = url(drupal_get_path('module', 'radios_select'));
$images_path = $module_path . '/examples/images/';

$values = array(
  '<img src="' . $images_path . 'ru.png" /> Russian Federation',
  '<img src="' . $images_path . 'us.png" /> USA',
  '<img src="' . $images_path . 'ca.png" /> Canada',
  '<img src="' . $images_path . 'fr.png" /> France',
  '<img src="' . $images_path . 'de.png" /> Germany',
  '<img src="' . $images_path . 'it.png" /> Italy',
  '<img src="' . $images_path . 'gb.png" /> United Kingdom',
  '<img src="' . $images_path . 'gr.png" /> Greece',
  '<img src="' . $images_path . 'tr.png" /> Turkey',
  '<img src="' . $images_path . 'ua.png" /> Ukraine',
  '<img src="' . $images_path . 'no.png" /> Norway',
);

$form['rs_example_6']['radios_select_6'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select country:'),
  '#default_value' => 0,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'element'         => array(
      'columns'         => 4,       // this sets ordering by 4 columns
    ),
    'label'         => array(
      'img_valign'      => -4,      // px by default, so we can skip units
      'nowrap'          => 'TRUE',
     ),
   ),
  '#description'   => t('Country from where you are.'),
);
?>

Наконец, труъ-программисты могут полностью изменить вид Radios Select с помощью CSS (стили аттачатся “на лету”, при создании элемента):


<?php
$module_path = url(drupal_get_path('module', 'radios_select'));
$images_path = $module_path . '/examples/images/';

$values = array(
  '<img src="' . $images_path . 'ru.png" /> Russian Federation',
  '<img src="' . $images_path . 'us.png" /> USA',
  '<img src="' . $images_path . 'ca.png" /> Canada',
  '<img src="' . $images_path . 'fr.png" /> France',
  '<img src="' . $images_path . 'de.png" /> Germany',
  '<img src="' . $images_path . 'it.png" /> Italy',
  '<img src="' . $images_path . 'gb.png" /> United Kingdom',
  '<img src="' . $images_path . 'gr.png" /> Greece',
  '<img src="' . $images_path . 'tr.png" /> Turkey',
  '<img src="' . $images_path . 'ua.png" /> Ukraine',
  '<img src="' . $images_path . 'no.png" /> Norway',
);

$form['rs_example_7']['radios_select_7'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select country:'),
  '#default_value' => 0,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'element'         => array(
      'columns'         => 4,
      'css'             => array(
        'div.type-radios-current {background: #222 url("'. $images_path . 'custom_bg.png") bottom right no-repeat; border-color: #222 !important;}',
        'div.type-radios-current .inner {background: #a8a8a8;}',
        'div.type-radios-current label  {background: #ffc136 url("'. $images_path . 'custom_label_active.png") center center repeat-x !important; border: 1px solid #c35e22 !important; color: black;}',
        'div.rs_opened {background: #222 url("'. $images_path . 'custom_bg_active.png") bottom right no-repeat;}',
        'div.rs_opened .inner {background: none;}',
        'div.type-radios-select {background: #d0d0d0 url("'. $images_path . 'custom_select_bg.png") top center repeat-x !important; border-color: #222 !important;}',
        'div.type-radios-select label.selected {background: #ffc136 url("'. $images_path . 'custom_label_active.png") center center repeat-x !important; border: 1px solid #c35e22 !important; color: black;}',
        'div.type-radios-select label {background: #3a3a3a url("'. $images_path . 'custom_label.png") center center repeat-x !important; border: 1px solid #222 !important; color: white;}',
        'div.type-radios-select label:hover {background: #ffc136 url("'. $images_path . 'custom_label_active.png") center center repeat-x !important;}',
      ),
    ),
    'label'         => array(
      'img_valign'      => -4,
      'nowrap'          => 'TRUE',
     ),
   ),
  '#description'   => t('Country from where you are.'),
);
?>

Все эти примеры (рабочие и с исходным кодом) доступны из help’а модуля Radios Select (см. приложенный архив) по адресу: admin/help/radios_select

Internet Explorer.

В IE, как обычно, всё “не как у людей”. Начнём с того, что все “красивые” закругления в нём отсутствуют. Попытки прицепить JS-библиотеки типа PIE, curved-corner и пр. положительного результата не дали – эти надстройки ломают разметку inline-элементов.

Вторая проблема – IE единственный из браузеров, который не захотел “понимать” клики по меткам. Пришлось специально для него сделать эмуляцию клика по радиокнопке при клике на метке.

Ещё одна особенность конкретно IE6 – курсор почему-то не устанавливается в “hand” (pointer) при hover’е над метками, даже если явно указывать для него правило в CSS.

В общем, базовый функционал в IE всё же обеспечен (по крайней мере версии IE6, IE7, IE8 с Radios Select работают нормально). Но выглядит в нем всё чуть менее красиво.

Поведение при noscript.

При выключенном JS происходит следующее:

1. Скрывается контейнер выбранного (текущего) элемента – тот, который со стрелкой справа.

2. Делается видимым контейнер селектора (который содержит все элементы).

3. Становятся видимыми сами радиокнопки (слева от каждого элемента), таким образом пользователь может выбрать нужный пункт традиционным для radios образом – щёлкнув на элементе.

4. Таким образом, форматирование/оформление Radios Select в основном сохраняется, добавляются только input’ы.


Примечание: IE и здесь ведёт себя несколько отлично от других браузеров. При выключенном JS он не “признаёт” клики на вложенных в метку картинках (IMG) как клики на метке. Только если пользователь кликнул на текст метки или непосредственно на круглый элемент-радиокнопку.

Примечание: при выключенном JS input’ам присваивается свойство float: left (с тем, чтобы сохранить разметку и равные ширины при использовании колонок. Как следствие радиокнопка “уходит” с базовой линии контейнера и автоматически начинает позиционироваться от верха. Это в общем-то никак не сказывается на разных способах вывода элемента – за исключением, когда используется выравнивание по нижнему краю (как в примере с картинками выше). В этом случае кнопки будут расположены на разной высоте:

Желающие могут скачать и установить модуль. Модуль очень нуждается в тестировании под разными браузерами. Пока протестировано в GoogleChrome, Safari, Opera 11, Firefox 8, IE 6,7,8.

Если будете использовать/тестировать элемент под другими браузерами – просьба отписываться здесь о результатах (с указанием версии браузера).

Как бы и всё.

Скачать модуль Radios Select

Источник: http://www.drupal.ru/node/74267

MVC в Drupal. Внедряем Page Controller’ы.

Хочу поделиться с комьюнити модулем controller, который можно взять здесь. В чем смысл модуля?

Модуль позволяет для каждого УРЛа, который вы определяете в hook_menu() прописать действие контроллера. Для этого есть специальный новый элемент ‘action’:

<?php
/**
 * Implements hook_menu().
 */
function controller_menu() {
  $items = array();
  $items['admin/settings/controller'] = array(
    'title' => 'Controller settings',
    'action' => 'SettingsController::indexAction',
    'access arguments' => array('access administration pages'),
  );
  return $items;

?>

Здесь объявляется новый контроллер SettingsController и действие indexAction() которое будет вызывано для УРЛа ‘admin/settings/controller’.

По умолчанию контроллеры должны лежать в специальной папке controllers/. Которую можно создать в папке своего модуля. Имя файла будет таким же как и прописано в ‘action’, однако имя класса нужно дополнять префиксом, который будет равен имени модуля после применения СamelCase нотации (с первой большой буквой). Звучит сложно, чтобы понять какие префиксы добавятся для разных модулей, несколько примеров:

foo_bar станет FooBar my станет My test_my_super станет TestMySuper и т. д.

В примере выше, в хуке меню объявлен контроллер SettingsController, имя модуля controller, значит полное имя класса будет ControllerSettingsController, а имя файла SettingsController.php. Пример как все это дело работает можно найти в самом модуле.

Надеюсь, понятно описал, если есть вопросы, спрашивайте!

P.S. У темы появилось продолжение.

Источник: http://www.drupal.ru/node/74262

Урок один. Создаем модуль на Drupal. Как с Drupal создать форму и вывести данные из формы на этой или другой страници. Хук hook

Пример 1. Как с Drupal создать форму и вывести данные из формы на этой или другой страници.

————————
| Создаем форму |
————————
|
———————————————————————
| Выводим данные с помощью функции variable_get() |
———————————————————————-

Для этого:
Создаем модуль.
Для этого:

- создаем папку и называем ее по названию модуля, например urokone и сохраняем его в my_site/sites/all/modules

- в этой папке создаем в notepad++ два файла в формате utf-8 without BOM. Что такое BOM и где скачать notepad++ смотрим в википедии.

Создаем два файла в этой папке и называем их
urokone.info
urokone.module

1.1. Минимальное содержимое файла urokone.info

; $Id$ name = Urokone   description = Simple form one core = 6.x

; $Id$ //если вы будите выставлаять ваш модуль на Drupal.org то он добавит автоматически свои параметры
name = urokone // название вашего модуля
description = Simple form one //описание
core = 6.x //в нашем случае мы пишем для Drupal 6.

1.2. Минимальное содержимое файла urokone.module

Минимальное содержание этого файла, для того что бы открыть страницу с модулем (с формой), это функция меню.

<?php   function urokone_menu() { $items = array();   $items['urokone'] = array( 'page callback' => 'drupal_get_form', 'page arguments' => array('urokone_formone'), );   return $items; }

$items['urokone'] = array( ); // эта сторочка означает, что форму c названием (Form_ID) urokone_formone, которую я собираюсь вставить в этот модуль можно будет найти после активации если кликнуть на локальном сервере

127.0.0.1/my_site/urokone

Теперь активируем модуль
Для этого:
- кликните в администраривной панели на Administer -> modules
ваш новые модуль будет находится в разделе others. Кликаем чекбокс напроив нашего модуля.
У меня на локальном сервере это выглаядит так:


И кликаем на кнопку Save Configuration. Когда сделаем следующие изменения в модуле надо будет очистить кеш. Administer->Performance->Clear cashed data

2. Пишим весь модуль.

———————————–
2.1 | Создаем меню |
———————————–
|
————————————————————————-
2.2. | Создаем условия доступа для различных пользователей |
————————————————————————–
|
——————–
2.3. | Создаем help |
——————–
|
—————————————————————————-

2.4. | Создаем форму |
———————–
|
———————————————————————————————-
2.5. | Выводим содержиое, которое user вбил в форму на экран (в нашем
случае в блоке)
————————————————————————————————

2.1. Создаем меню.

Для создания меню используем hook – это функции дрюпала. Например hook
function hook_menu()
для нашего модуля мы должны измеить по названию нашего модуля на

function urokone_menu() { $items = array();   $items['urokone'] = array( 'title' => 'Как подтвердить факт отправленния ненулевых данных в форму?', 'description' => 'Urokone first form', 'page callback' => 'drupal_get_form', 'page arguments' => array('urokone_formone'), 'access arguments' => array('access administration pages'), 'type' => MENU_NORMAL_ITEM, );   return $items; }

2.2. Создаем условия доступа различных пользователей.
Используем хук hook_perm()

function urokone_perm() { return array('access urokone content', 'access administration pages'); } // function urokone_perm() 2.3. Создаем help

Используем хук hook_help()

function urokone_help($path, $arg) { $output = ''; //declare your output variable switch ($path) { case "admin/help#urokone": $output = '<p>'. t("Displays information about site") .'</p>'; break; } return $output; } // function urokone_help

Здесь можно сохранить модуль. Помните (Administrator-> modules -> Save configurations) и посмотреть появление строчки “Displays information about site” , если пойти Administer – > help -> urokone

Если на этой страницы кликнуть на urokone то увидим страницу со строкой “Displays information about site”. Мы в хуке help можем заменить эту строку на подробное описание нашего модуля.

———————————————————————————————
Теперь нам осталось
————————
| Создать форму |
————————
|
———————————————————————
| Выводим данные с помощью функции variable_get() |
———————————————————————-
———————————————————————————————-

2.4. Создаем форму

Используем функцию urokone_formone()

Например я хочу сделать такую форму:

Для этого в Drupla мы пишем функцию urokone_formone().

function urokone_formone($form_state) { $form = array();   $form['one_one'] = array( '#type' => 'checkbox', '#title' => 'if ($_REQUEST["text"]) {echo "Data was send";}', '#default_value' => variable_get('one_one', false),   );   $form['one_two'] = array( '#type' => 'checkbox', '#title' => t('if ($_REQUEST("text")) {echo "Data was send";}'), '#default_value' => variable_get('one_two', false), );   $form['one_three'] = array( '#type' => 'checkbox', '#title' => t('if {$_REQUEST["text"]} {echo "Data was send";}'), '#default_value' => variable_get('one_three', false), );       return system_settings_form($form); } // end urokone_formone

Заходим на 127.0.0.1/lesson/urokone

При этом в результате работы функции return system_settings_form($form); появляютя две кнопки “Save configuration” и “Reset to default”

2.5. Выводим содержиое, которое user вбил в форму на экран (в нашем
случае в блоке. Используем хук hook_block.

function urokone_block($op='list', $delta=0) {   if ($op == "list") { $block = array(); $block[0]["info"] = t('urokone'); return $block; } else if ($op == 'view') { switch ($delta) { case 0: $block_content = ''; $block['subject'] = 'urokone';   $one_one= variable_get('one_one', false); $one_two= variable_get('one_two', false); $one_three= variable_get('one_three', false);   if ($one_one or $one_two or $one_three) { if ($one_one) $block['content'] .= 'your answer is correct '; if ($one_two) $block['content'] .= 'your answer is not correct '; if ($one_three) $block['content'] .= 'your answer is not correct'; } break;   } return $block; } } // end urokone_block

Теперь надо активировать новый блок urokone который мы создали. Идем в Administer -> blocks.
Находим наш блок urokone в списке Disabled.

Меняю регион с “none” на другоe. Я например выбрала “Left sidebar”.
И нажимаю на кнопку внизу Save blocks.

Теперь зайдем еще раз на страницу с нащей формой 127.0.0.1/lesson/urokone и кликнми на какой нибудь чекбокс. Например на вророй чекбокс с правильным ответом.
У нас слева в блоке urokone появится сообщение о том на какой чекбокс мы кликнули.

Прикрепленный файл Размер tut1_1.png 29.72 кб tut1_2.png 24.68 кб tut1_3.png 23.3 кб tut1_4.png 47.17 кб tut1_5.png 14.56 кб tut1_6.png 33.72 кб tut1_7.png 56.37 кб tut1_8.png 40.71 кб

Источник: http://www.drupal.ru/node/74258

Урок 2. Создаем модуль на Drupal. Как с помощью хука hook_form_form _ID_ alter изменить любую форму в нашем или чужом модуле.

Я буду использовать модуль, который полностью аналагечен модулю из урока один. Я хочу добавить еще один чекбокс в форму и изменить title у первой страницы.

Изменить форму можно и без использования модуля. Смотрите в комметах sas@drupal.org: Как без использования модуля изменить форму.

Код двух файлов модуля uroktwo:
uroktwo.info

;$Id$ name = Uroktwo description = Tutorial Change form with form_alter core = 6.x

uroktwo.module

<?php ;$Id$ /***************************************************** * Implements hook_menu(). *******************************************************/ function uroktwo_menu() { $items = array(); $items['uroktwo'] = array( 'title' => 'What is the correct way to create MySql database? ', 'description' => 'lesson two form', 'page callback' => 'drupal_get_form', 'page arguments' => array('forma'), 'access arguments' => array('access content'), 'type' => MENU_NORMAL_ITEM, ); return $items; } /***************************************************** * Implements hook_perm(). *******************************************************/   function uroktwo_perm() { return array('access uroktwo content', 'access administration pages'); } // function uroktwo_perm()   /***************************************************** * Implements hook_help(). *******************************************************/   function uroktwo_help($path, $arg) { $output = ''; //declare your output variable switch ($path) { case "admin/help#uroktwo": $output = '<p>'. t("Displays information about site") .'</p>'; break; } return $output; } // function uroktwo_help   /***************************************************** * Implements function forma *******************************************************/   function forma($form_state) { $form = array();   $form['one'] = array( '#type' => 'checkbox', '#title' => t('create.databas()'), '#default_value' => variable_get('one', false), );   $form['two'] = array( '#type' => 'checkbox', '#title' => t('mysql_create_db()'), '#default_value' => variable_get('two', false), );   $form['three'] = array( '#type' => 'checkbox', '#title' => t('create_mysql()'), '#default_value' => variable_get('three', false), );   $form['four'] = array( '#type' => 'checkbox', '#title' => t('create_d()'), '#default_value' => variable_get('four', false), ); $form ['submit'] = array ( '#type' => 'submit', '#value' => t('Submit'), ); return $form; } // end forma   /***************************************************** * Implements hook_block(). *******************************************************/   function uroktwo_block($op='list', $delta=0) {   if ($op == "list") { $block = array(); $block[0]["info"] = t('uroktwo'); return $block; } else if ($op == 'view') { switch ($delta) { case 0: $block_content = ''; $block['subject'] = 'uroktwo';   $one= variable_get('one', false); $two= variable_get('two', false); $three= variable_get('three', false);   if ($one or $two or $three) { if ($one) $block['content'] .= 'your answer create.database() was incorrect '; if ($two) $block['content'] .= 'your answer mysql_create_db() was correct '; if ($three) $block['content'] .= 'your answer create_mysql_db() was incorrect'; } break;   } return $block; } } // end uroktwo_block

Для написания hook_form_FORM_ID_alter нам надо знать значение FORM_ID. Если это наш собственный модуль, то можно просто посмотреть на функцию формы.

function forma ($form_state)

forma в нашем случае и будет Form_ID, а hook будет называтся название_модуль_form_forma_alter. Для нашего модуля это будет uroktwo_form_forma_alter.

Второй способ найти Form_ID это посмотреть source code. Для этого я на локальном компьюторе открываю страницу с формой. В моем случае название сайта lesson. В хуке меню мы в этой строчке определили ($items['uroktwo'] = array()), что форму можно открыть, если набрать 127.0.0.1/lesson/uroktwo.

Откройте страницу с формой. Теперь в интернет эксплоурере идите Page -> view souce. С помощью ctrl – F ищим строчку в которой есть слово form. У меня это

То есть id = “forma”

Теперь собственно хук

<?phpfunction uroktwo_form_forma_alter(&$form,
    &$form_state) {
  $form['one']["#title"] = "I do do not know";
      
   $form['five'] = array(
  '#type' => 'checkbox', 
  '#title' => t('create_data()'),
  '#default_value' => variable_get('five', false),
);
}
?>

Получилась полностью функциональная форма, но кнопка сабмит расположенна выше нового чекбокса.

Давайте это исправим. Добавим строчку weght в хук, и у нас получится

<?phpfunction uroktwo_form_forma_alter(&$form,
    &$form_state) {
  $form['one']["#title"] = "I do do not know";
      
   $form['five'] = array(
  '#type' => 'checkbox', 
  '#title' => t('create_data()'),
  '#default_value' => variable_get('five', false),
  );
$form ['submit'] ['#weight'] = 1000;
}

?>


На этом все.
P.S. Создавать новые модули надо сначала на отдельном, выделенном для этого сайте, а потом уже переносить в реальный сайт.

Прикрепленный файл Размер tut2_1.png 35.34 кб tut2_2.png 31.79 кб tut2_3.png 20.71 кб

Источник: http://www.drupal.ru/node/74214

Новая тема для Drupal 7 – Drupalace Theme

Всем доброго времени суток.

Хочу поделиться радостной новостью – сегодня я наконец выпустил в массы официальный релиз темы с моего блога –  Drupalace Theme. Она представляет из себя блоговый шаблон с разнообразными настройками. Тема в течение пяти месяцев проходила тестирование на моём блоге и завоевала множественные симпатии со стороны посетителей. А так как я человек абсолютно не жадный, то я решил выложить тему в общественное пользование. Тема написана для седьмой версии Друпала.

Основные преимущества:

10 регионов под блоки. Есть даже регион для добавление рекламы под материалом (node bottom) Изменяемая разметка темы Возможность добавления материала в социальные сети (работает через сервис addthis) Навигация по материалам (ссылки на предыдущий и следующий материал) Логин во всплывающем окошке Настраиваемый текст для блока поиска Симпатичный дизайн Хорошая читабельность текста Тема проверялась во всех браузерах, кроме IE6 и ниже. Детальная прорисовка многих мелочей.

Тема, ушедшая в релиз – это улучшенная тема с моего блога. Добавлены настройки, поддержка IE7+, дополнительные иконки.

Почитать подробнее и посмотреть скриншоты вы можете здесь.
Скачать тему можно с официальной страницы  Drupalace Theme.

Всех с прошедшими и будующими праздниками!

Источник: http://www.drupal.ru/node/74022

Управление размерами изображений пользователя в Drupal 7

Одно из немногих оставшихся мест в Drupal 7, которые не получили Field API изменения – это профили пользователей. Вы можете добавлять поля в профили, но стандартные поля остались в старом виде. Это означает, что у вас меньше гибкости при теммизации их и использовании в пользовательском интерфейсе. На пример, в управлении отображением профиля вы не сможете изменить стиль отображения аватара пользователя для каждого дисплея. По умолчанию можно установить только стиль отображения из настроек учетных записей пользователей.

Это не так плохо, но к примеру, если вы используете в профилях пользователей картинки размером 250px, они так же будут использоваться в комментариях и нодах. Если посмотреть тему Batrik то можно увидеть, что там для комментарием используются изображения размером 75х75px, а для нод 20х20px. Но пользователю загружаются оригиналы изображений, а потом масштабируются браузером. Это может повлиять на время загрузки страницы.

К счастью, есть очень простое решение этой проблемы:

Модуль ImageCache Profiles

Этот модуль добавляет 3 новых опции в настройке аккаунта(см. рисунок выше): пресет который будет использоваться при показе аккаунта пользователя, комментариев и нод. На посещаемых сайтах с большим количеством страниц и контента использование этого модуля может значительно уменьшить размер страницы и время её загрузки.

Данный модуль очень прост в использовании. Его необходимо только включить и затем выбрать в настройках аккаунтов пресеты для каждого вида изображения пользователя.

Модуль можно скачать по ссылке – http://drupal.org/project/imagecache_profiles

Статья взята с сайта южного сообщества Drupal

Источник: http://www.drupal.ru/node/73758

Контактная форма, форма заказа в custom блоке

Иногда нужно быстро сделать контактную форму или форму заказа и поместить ее как блок на какой-нибудь странице, но нет времени на разработку модуля (или не хватает знаний). Предлагаю модуль simpleForm2. он позволяет создать практически любую форму и любое количество таких форм на сайте. Для построения формы нужно хотя бы поверхностное знание HTML.
Вот страница проекта на drupal.org: simpleForm2
Сразу скачать можно отсюда.

Источник: http://www.drupal.ru/node/73738

Импорт данных из одной формы в другую с помощью AJAX

При создании сайтов досок-объявлений, сайтов поиска работы, каких-либо сервисов, довольно часто встречается необходимость создать возможность динамического заполнения полей формы данными, которые уже были ранее введены, оставив возможность ручного пользовательского ввода.
Данная статья является примером реализации подобного функционала.

Статью можно прочитать на сайте южного Drupal-сообщества

Статья является переводом, первоисточник – Import form values from one form to another via AJAX и является полностью рабочим примером.

Источник: http://www.drupal.ru/node/73094

Custom page – Создание пользовательских страниц

Описание:
Модуль создан для создания пользовательских страниц с возможностью подмены контента, как всей страницы, так и только той части, что выводится в переменной $content.

Возможности:
Создание неограниченного числа пользовательских страниц
Создание сложных путей
Создание путей с именованными параметрами вида %param, %some итд
Создание путей с именованными зарезервированными параметрами вида %node, %user, %modulename_modulename
Создание путей с неограниченным числом параметров (ограничение только на длину URI)
Создание не явных параметров вида %
Создание страниц с указанием ролей, которые могут иметь доступ к этим страницам
Создание страниц с указанием темы
Создание шаблонов страницы как в отдельном файле темы вида [cid].tpl.php, так и в template.php вида [cid]()
Поддержка модуля features для экспорта/импорта страниц
Поддержка модуля context

Подробности тут: http://css.mirocow.com/projects/custom-page/wiki/Wiki
Скачать тут: http://css.mirocow.com/projects/custom-page/repository

Level: Profi

Источник: http://www.drupal.ru/node/73058

#states: Мощное улучшение для разработки интерфейса пользователя в Drupal 7

Изначальная идея #states заключается в том, что бы была возможность создания динамических форм без написания JavaScript как такого. #states разрешает без единой строчки кода JavaScript, только с помощью php и Form API Друпала изменять состояние одного елемента (видимость-visible/invisible, активность – enabled/disabled, необходимость – required/optional, состояние чекбоксов – checked/unchecked, expanded/collapsed сворачивать/разворачивать филдсеты) на основании состояния второго (или даже на основании нескольких елементов) после какого-то действия пользователя.
Полную версию статьи читать здесь

Источник: http://www.drupal.ru/node/72990

Сыграем вместе в мафию? Друпал-посиделки

Давайте в честь наступающего нового года соберемся и дружно сыграем в мафию.

в чем прелесть этой игры?
- каждый игрок интересно раскрывается;
- можно быстро познакомиться;
- просто это интересное, увлекательное и хитроумное занятие.

В общем, все, кто будут в Москве 25 декабря обязательно приходите:)

В 16.45 ждем всех желающих в Циферблате на Солянке (м.Китай-город, ул. Солянка, 11/6, на углу здания стеклянная дверь – звонить в домофон. Без вывески).

Приходить вовремя, так как ровно в 17.00 игра начнется – “город засыпает”, поэтому опоздавшим придется ждать начала следующей игры, чтобы присоединиться.

Если не умеешь играть? все равно приходи, мы тебя быстро научим!

Условия:
1. Оплата. Согласно формату Циферблата нужно платить поминутно – в первый час 2 рубля в минуту, каждый последующий час – 1 рубль в минуту. За это получаете чай (в неограниченном количестве), сладости, вкусное варенье, можно даже поджарить в тостере хлеб либо положить себе в тарелку понравившееся печенье и бублики.

2. Принеси подарок. Средняя цена подарка не больше 50 рублей – чисто символический. Каждый принесет с собой сюрприз, мы на месте вытянем бумажки с именами гостей и подарим свой подарок тому, чье имя вытянем. Это очень важная часть любого новогоднего праздника! Отговорки типа “не знал, что подарить”, “забыл”, “не успел купить” не принимаются. Принесите то, что самому было бы приятно получить, подумайте, чем удивить человека, которого даже не знаете)
Что дарить?
- что-нибудь вкусное
- что-нибудь сделанное своими руками
- то, что хотелось бы получить самому, но никто почему-то не дарит…
- все, что угодно
- приятную безделушку

3. Оденься красиво. Чтобы у нас было праздничное настроение нужно всем нарядиться:
- парни – поменяйте ради этого события привычные джинсы и свитер на рубашку (вы даже не представляете как нравятся девушкам ребята в белых рубашках – в этом определенно что-то есть:)) и брюки – чтобы нам, барышням, хотелось на вас побольше смотреть и заглядываться;)
- девушки – откажитесь на несколько часов от брюк и джинсов, давайте наденем платье или юбку)

Вот увидите, эти нехитрые хитрости помогут создать особенную атмосферу праздника… буквально на ровном месте.

И напоследок: так как выбранное нами помещение не резиновое, сделаем предварительную регистрацию. Все желающие сыграть в Мафию должны написать об этом в комментах к этой теме в группе вконтакте. Мы очень-очень будем вас ждать:)

Подробности http://vkontakte.ru/topic-32565125_25651784

Источник: http://www.drupal.ru/node/72928

Модуль блока календаря по материалам для Drupal 7

Наконец-то портировал модуль календаря по материалам на Drupal 7 (не без финансовой помощи, правда,  вот этого человека ( namli), а так бы ещё полгода, наверно, портировал)…

Итак, суть модуля:
Простой календарь по материалам, которые можно выбирать либо по дате создания материала, либо по полю типа date (если date установлен, конечно). Если выбор материалов идет по полю, то возможны множественные значения полей (несколько дат на один материал).

Модуль по-прежнему включается как блок и в нем ещё формируется страница типа /calendar/ГГГГ/ММ/ДД для отображения страницы с материалами за выбранный день. Все настройки модуля можно найти в параметрах блока из контекстного меню “Настроить блок”. Обновлены по сравнению с версией модуля для 6-ки выборки по типам материалов и поле с датой. Добавлено изменение заголовков событий. Если раньше все материалы назывались событиями, то теперь можно указать, что это будет (записи, новости, события и т.д.)

Добавлена возможность создания отдельных тем оформления календаря. Сейчас там три темы оформления: стандартная, vista и gridy. Стандартная тема тянется по ширине блока, а vista и gridy фиксированной ширины (198 и 182 точки соответственно).

В темы оформления добавлены симпатичные всплывающие подсказки. Добавлены два типа отображения подсказок
      Стандартный – при наведении указателя мыши на день отображается количество материалов
      Подгрузка ссылок – загружается список ссылок на материалы при наведении указателя мыши на день. Для этого типа можно выбрать количество показываемых ссылок.
В натройках блока:
      ● селектор типов материалов (не надо писать руками)
      ● селектор полей с датой (с проверкой на модуль date)
      ● список тем оформления
      ● изменение подписей к материалам
      ● ссылки во всплывающих подсказках
      ● настройка количества элементов на страницах и в подсказках

Пока только не доделал перевод на английский и файл перевода… а там и на drupal.org выложу

За спасибо, приму копеечки на яндекс.деньги 41001896059641 или заказ на разработку новых модулей )))

UPD от 15 декабря 2011:
обновлен модуль с замечаниями  RxB (все кроме темизации html через функцию, всё-таки считаю не нужным, но если найдутся те, кому позарез надо будет, сделаю), поэтому обязательно при обновлении модуля отключите старую версию, так как ряд функций был переименован.

Прикрепленный файл Размер russian_beauty_calendar.zip 35.73 кб

Источник: http://www.drupal.ru/node/72877

Ищем тех друпаллеров, кому интересно выступать перед публикой, делиться опытом, обучать

Для проведения в Москве семинаров по Drupal

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

Так же будем рады партнерству.

В данный момент особенно нужны:
- специалист по сео-оптимизации;
- специалист по jQuery;
- специалист PHP.

Новосозданная группа вконтакте http://vkontakte.ru/club32565125
Там есть афиша ближайших мероприятий. Приходите – смотрите)
Если интересно сотрудничать, пишите daredjana@gmail.com

В письме укажите, пожалуйста, 1) что вы умеете делать, 2) в чем видите свою роль при нашей совместной работе 3) и что вас мотивирует.

Источник: http://www.drupal.ru/node/72538

CommerceBox — бесплатный дистрибутив интернет-магазина на основе Drupal 7 и Drupal Commerce

Представляем вам сборку интернет-магазина CommerceBox на основе Drupal 7 и модуля Drupal Commerce.

На сегодня среди для Drupal 7 существует практическое единственное нормальное решение, позволяющее создать функциональный интернет-магазин — это модуль Drupal Commerce.

Проблематика заключается в том, что данный модуль является очень гибким решением для программиста. Но это не коробочный модуль, каковым раньше был Ubercart.

С Drupal Commerce все по другому. Этот модуль является более фрейморкным, он рассчитан на программиста. Программисты там могут творить чудеса. Но обычному пользователю либо начинающему программисту нужен легкий старт. Для этого и создана сборка CommerceBox.

В сборке CommerceBox мы пытаемся сделать сделать основу для развертывания интернет-магазина.

Модуль Drupal Commerce базируется на API Drupal, соответственно он автоматически использует все возможности, которые предоставляет ядро Drupal. Кроме того, Drupal Commerce сам по себе имеет довольно мощное API. Если Вы программист то можете без труда расширить функционал вашего магазина используя API как Drupal, так и Drupal Commerce.

Кратко и по сути в сборке сейчас реализованы:

Админка для управления товарами. Некоторые идеи позаимствованы у Мадженты Обертка интернет-магазина: главная, карточка товара, каталог Много визуальных плюшечек

Более детальный и маркетинговый перечень возможностей системы выглядит так (программистам не читать):

Корзина с возможностью управления количеством добавленных товаров Гибкая система прав доступа и администрирования пользователей Отзывы к товарам Социальные закладки Список желаний (WishList) Кнопки Share на Twitter, Google+, Facebook Фильтр поиска товаров Автоматическое создание материала для отображения товара при создании товара Товар с базовым набором полей с возможностью добавления новых полей (поля структурированные по категориям) Выбор пользователем вида представления товаров: списком или сеткой Полный контроль над выводимыми элементов каталога: размер превью, теги, заголовок и тд. Возможность добавления “сопутствующих товаров” Возможность сравнения товаров Новости магазина Последние просмотренные товары Похожие товары Контекстные статьи Контакты магазина Meta-теги для каждой категории или любой избранной страницы. XML карта сайта Пользователи онлайн Список возможностей мы будем наращивать. Наша цель создать сборку для быстрого старта интернет-магазина за минимум потраченного времени и ресурсов.

Сайт ресурса: http://commercebox.org/

Источник: http://www.drupal.ru/node/72159

Создание своего типа материала программно

Здравствуйте! Это aRpi.

Вот решил написать статью не тему “Создание своего типа материала программно”. На изучение этого вопроса, и написание статьи было потрачено 6 часов. В начале и сам не знал как это делать, так что если что то не так, поправьте.

Готовый модуль к статье можно скачать здесь.

Как правило операции по созданию и удалению типа материала выполняются при создании и удалении модуля. В функциях называемых modulename_install и modulename_uninstall, размещенных в файле modulename.install. Однако в нашем случаи, в приложенном к статье модуле, мы будем все делать напрямую. По нажатию кнопки, будет запускаться та или иная функция, создающая или удаляющая тип материала. У меня это функции: mtpn_cretypnod и mtpn_remtypnod.

Весь код модуля целиком приводить не буду.
Напишу лишь код, выполняющий непосредственно создание и удаление типа материала.
Прошу обратить внимание имя модуля у меня “mtpn”.

Кстати! Чтобы просто определить есть ли тип материала достаточно просто попытаться его загрузить, в случаи неудачи будет возвращен false.
Для этого нужно использовать функцию node_type_load передав в неё машинное имя типа материала.

<?php
$sta = node_type_load('mtpn');
?>

И так! Создаем свой типа материала программно:

Для того чтобы создать тип материала, необходимо вызвать функцию node_type_save.
Передав в неё контент материала, на основе которого и будет создан тип материала.

Создаем контент материала, это массив заполненный данными описывающими материал.

<?php
    $inf = array(
        'type' => 'mtpn',
        'name' => 'Наш тип материала',
        'base' => 'node_content',
        'description' => 'Наш тип материала, который был создан программно.',
        'custom' => true,
        'locked' => false,        //замок, если включен запрещает администратору сайта, удалять тип материала в ручную, по умолчанию включен
    );
?>

Затем мы окончательно формируем контент материала, заполнив неуказанные поля дефаултными значениями.

<?php
    $con = node_type_set_defaults($inf);
?>

Следующей функцией в контент материала добавляются поля по умолчанию, свойственные стандартному типу материала.
В частности это поле body, в котором как правило размещается текст любой ноды.

<?php
    node_add_body_field($con);
?>

Создаем тип материала. Этаже функция позволяет сохранить ранее созданный тип материала.

<?php
    node_type_save($con);
?>

Теперь наш тип материала добавлен в базу данных, в таблицу node_type.
Однако он ничем не отличается от типа материала созданного через админку.
И к сожалению, мы даже не можем создать ноду на основе этого типа материала, пункта добавления, на странице “/node/add” ещё нет.

Тип материала нужно ещё настроить.

Продолжаем…

Получаем инстанцию материала, специальный объект который позволяет настроить тип-материал.

<?php
    $ins = field_info_instance('node', 'body', 'mtpn');
?>

Добавляем пункт на страницу “/node/add”, позволяющий создать ноду, нашего типа материала.
Кстати если пункт не появился, возможно необходимо перестроить меню, что мы и сделаем немного позже.

<?php
    $ins['display']['mtpn_list'] = array(
        'label' => 'hidden',
        'type' => 'text_summary_or_trimmed',
    );
?>

Применяем внесённые изменения. Иначе все то что мы проделали с инстанцией материала не имеет смысла.

<?php
    field_update_instance($ins);
?>

Чтобы ноды нашего типа материала не были скучными, добавляем в него уникальные поля.
Создаются поля при помощи функции field_create_field.
Однако после создания их необходимо ещё связать с типом материала.
Связывание осуществляется созданием инстанции поля, функцией field_create_instance.

Создаем поля.

<?php
    //Добавляем поле mtpn_f1, 3 экземпляра текста длиной не более 60 символов.
    field_create_field(
        array(
            'field_name' => 'mtpn_f1',    //указываем префикс соответствующий типу материала, чтобы не запутаться, какое поле к кому относится
            'cardinality' => 3,            //количество элементов, данного типа
            'type' => 'text',
            'settings' => array('max_length' => 60),
        )
    );
    //Добавляем поле mtpn_f2, 1 экземпляр текста неограниченной длины и размера.
    field_create_field(
        array(
            'field_name' => 'mtpn_f2',
            'cardinality' => 1,
            'type' => 'text'
        )
    );
?>

Как только поля будут созданы, они будут добавлены в базу в таблицу field_config.

Создаем инстанции-полей, функцией field_create_instance.
Инстанция поля это такая вещь которая позволяет связать ранее созданное поле с указанным типом материала.
И определить как и в каком виде значение поля будет редактироваться на странице редактирования ноды.

Создаем инстанции полей.

<?php
    //Создаем инстанцию-поля, для поля mtpn_f1.
    field_create_instance(
        array(
            'entity_type' => 'node',
            'bundle' => 'mtpn',
            'field_name' => 'mtpn_f1',
            'label' => 'Значение поля mtpn_f1',
            'widget' => array('type' => 'text_textfield'),
            'display' => array(
                'mtpn_list' => array(
                    'label' => 'hidden',
                    'type' => 'hidden',
                ),
            ),
        )
    );
    //Создаем инстанцию-поля, для поля mtpn_f2.
    field_create_instance(
        array(
            'entity_type' => 'node',
            'bundle' => 'mtpn',
            'field_name' => 'mtpn_f2',
            'label' => 'Значение поля mtpn_f2',
            'widget' => array('type' => 'text_textfield'),
            'display' => array(
                'mtpn_list' => array(
                    'label' => 'hidden',
                    'type' => 'hidden',
                ),
            ),
        )
    );
?>

Перестраиваем меню чтобы пункт добавления ноды в “/node/add” был доступен.
К несчастью это долгая операция но к счастью, мы не так часто будем создавать свой собственный тип материала, так что все в порядке.

<?php
    menu_rebuild();
?>

Вот и все!
Да кстати.
Как только будет создана хотя бы одна нода нашего типа материала, в базе будут созданы таблицы соответствующие полям, в которых и будут храниться данные полей, из которых состоит нода.
В нашем случаи это таблицы field_data_mtpn_f1 и field_data_mtpn_f2.
Эти таблицы точно также будут удалены при удалении полей.

Удаление своего типа материала программно:

Для начала удалим абсолютно все узлы соответствующие нашему типу материала.

<?php
    //Выполняем запрос к базе данных выделив nid-ды узлов соответствующие нашему типу материала.
    $sel = db_query('SELECT nid FROM {node} WHERE type = \'mtpn\'');
    //Вытаскиваем из объекта выделения, массив nid-ов.
    $nid = $sel->fetchAllKeyed(0,0);
    //Удаляем те узлы, nid-ды которых перечислены в передаваемом массиве.
    node_delete_multiple($nid);
?>

Теперь можно приступить к удалению полей, инстанций-полей, и уже после этого удалить тип материала.

Удаляем поля.

<?php
    //Удляем поле mtpn_f1.
    field_delete_field('mtpn_f1');
    //Удляем поле mtpn_f2.
    field_delete_field('mtpn_f2');
?>

Удаляем инстанции полей.

<?php    
    //Получаем массив инстанций полей, принадлежащих тому, к кому они были прикреплены.
    $ins = field_info_instances('node', 'mtpn');
    //Удаляем инстанции полей перечисленные в массиве.
    foreach ($ins as $n => $i) {
        field_delete_instance($n);//здесь $n это имя инстанции
    }
?>

Удаляем тип материала.

<?php
    node_type_delete('mtpn');
?>

Перестраиваем меню чтобы пункт добавления ноды в “/node/add” был уничтожен.

<?php
    menu_rebuild();
?>

Чистка. Подчищает базу, удаляя всякие там уже казалось бы удаленные поля и таблицы.

<?php
    field_purge_batch(1000);
?>

Прикрепленный файл Размер mtpn.zip 3.62 кб

Источник: http://www.drupal.ru/node/71971

Платежный модуль для системы mainpay

Добрый день!
Во вложенных файлах модули для интеграции платежной системы Mainpay и Drupal, а также Drupal ubercart.

Принимают оплату с помощью карт, электронных кошельков (WebMoney, Яндекс.Деньги и прочие) и мобильной коммерции. Помимо этого есть SMS и терминалы.
Если возникнут вопросы или пожелания по модулю – пишите на support@mainpay.ru

Прикрепленный файл Размер mainpay_drupal.zip 10.66 кб uc_mainpay.zip 9.89 кб

Источник: http://www.drupal.ru/node/71718

Opendeals

Opendeals друпал сборка для электронной коммерции
http://drupal.org/project/opendeals

Состав модулей типовой commerce, views, rules, features. Cборка не самая легкая, но тем не менее шевелится. Удобно реализована панель для управления нодами-представлениями продуктов. Добалено несколько правил для управления магазином и демо-контент.

Источник: http://www.drupal.ru/node/71542

Обновляем мгновенно сайты через drush

Решил поделиться тем что узнал, пока в кратком виде как можно быстро обновлять редакции сайтов

Допустим мы имеем сайт ( придумаем ему синоним @SITE) в двух и более редакциях, например:
1) Сайт в интернете видят все люди – @site.live
2) Сайт на локальной машине – @site.dev

обновляем файлы сайтов вместе с модулями (откуда куда):
drush rsync –progress @site.dev @site.live

обновляем базы данных (при дополнительных параметрах, можно исключать/включать таблицы) (откуда куда)
drush sql-sync –no-cache @site.dev @site.live

обновляем только файловый контент сайтов (откуда куда)
drush rsync @site.dev:%files @site.live:%files
(по дефолту site/mysite.ru/files/ или sites/default/sites – кто любит плодить друпалы)

Хотим посмотреть список включенных модулей удаленного сайта
drush @site.live pml –status=enabled

Хотим включить модули удаленного сайта: admin_menu authcache
drush @site.live en admin_menu authcache -y

Через drush мы экономим много времени на эти операции, иначе эти операции можно выполнять вручную: ставить галочки, копировать файлы….

Теперь опишу как мы обозначаем синонимы, оригинал примера тут http://drupalcontrib.org/api/drupal/contributions–drush–examples–exam…
1. Создаем файл site.aliases.drushrc.php в любом из каталогов ~/.drush, /etc/drush, там где установлен drush, либо прописываем дополнительный путь для каталога синонимов
2. Приведу пример своего файла в котором описан сайт с двумя версиями live – живой сайт на хостинге, dev – сайт на локальной машине


<?php
$aliases['dev'] = array(
'root' => '/var/www/drupal7/',
'uri' => 'www.mysite.local',
);

$aliases['live'] = array(
'root' => '/home/user/projects/mysite',
'uri' => 'site.ru',
'remote-host' => 'mysite.ru',
'remote-user' => 'user-hosting',
'ssh-options' => '-p2222',

'path-aliases' => array(
      '%drush' => '/home/user/bin/drush/',
      '%drush-script' => '/home/user/bin/drush/drush',
      #'%root' => '/home/user/projects/site/sites/',
      '%dump-dir' => '/home/user/projects/site/dump/',
      '%dump' => '/home/user/projects/site/dump/sro.sql', 
      #'%files' => 'sites/site.com/files',
),
);
?>

ps Особеннно радует работа с мультисайтиногом, т.е. даже когда у вас сайты в sites/ на одной установке drupal

Синхронизируем сайты drupal через drush
от lullabot Более подробно на английском

работает ли под вендой – незнаю, т.к. не использую её

Единственное не получилось у меня обновить сайт с одно удаленного сервера на другой удаленный сервер (локальный удаленный – удаленный локальный = работает)

Источник: http://www.drupal.ru/node/71139

Plugin Detector – каталог и рейтинг плагинов jQuery

Всем привет.

Последние полтора месяца в основном занимался разработкой нового проекта – Plugin Detector.

скриншот:

Идея проекта – помочь разработчику (менеджеру, заказчику) определиться с выбором плагина для сайта. Вторая задача – показать новые и интересные плагины jQuery, которых возможно многие еще не видели и не знают о их существовании. На сайте есть как новые креативные плагины, так и заезжаные «ветераны» плагиностроения, типа Tablesorter, Lava lamp menu, попапы и д.р.

Сайт задумывался как очень узкоспециализированный, но с качественными материалами и продуманными выборками.

Идеи реализованные на сайте не новы. Решения, показавшиеся мне уместными, взяты и адаптированы под конкретную задачу.

Технические детали:

Версия друпала – 7

Рецензии
Вместо модуля nodereview были использованы обычные комментарии d7, расширенные дополнительными полями CCK, благо теперь на семерке это сделать не проблема.

Скриншот формы добавления рецензии:

примечание. форма выглядит брутально, но это временно

Модуль nodereview наверное, хороший, но первичная установка сразу показала, что работает он совсем не так как того требует изначально задуманный дизайн приложения. Его настройки не позволяли задать другую логику работы отзыва, а хакать модуль не хотелось.

Особенность рецензии в том, что пользователь может оставить только одну рецензию для плагина. Поэтому нужно было сделать ограничение кол-ва комментариев к ноде. Для того чтобы ограничить количество отзывов, пробовал использовать модуль Comment Limit, но он работал с ошибкой, запрещая редактировать отзыв (коммент). Модуль почему-то думал что нажимая кнопку сабмит (при редактировании коммента), пользователь пытается засабмитить второй коммент, и блокировал это действие. Его пришлось отключить и реализовать ограничение ручками.

Пока что комментариев на сайте нет. В будущем возможно сделаю (пока не уверен что они нужны). Т.к. обычные комменты уже заняты, нашел модуль commentfield, реализующий очень простые комменты (без древовидного обсуждения, без прикрепления полей и файлов к ним).

Голосования
Rate – голосование за ноду (up/down)
Поля в рецензиях с помощью CCK (Content Construction Kit), который в семерке в ядре (4 селекта для оценок и 3 текстовых поля)

скриншот CCK полей коммента (рецензии):

Сначала, голосование за ноду сделал на Fivestar. Звездочки меня уже утомили, их пихают везде с поводом, и без повода. Поэтому решил сделать что-то креативное, а-ля логотипы jquery вместо звездочек:

Однако в процессе последующей разработки было решено отказаться от логотипов jquery вместо звездочек, т.к. многие люди (дизайнеры, менеджеры и заказчики) просто не знают что это лого jquery и не способны не только оценить фишки, но что хуже – вообще теряются и не знают что делать с этим элементом. Звездочки я исключил, поэтому остался up/down, реализовал который я с помощью модуля rate.

С оценками в рецензиях все просто. При сохранении, удалении или редактировании комментария, вызываются соответствующие хуки (например hook_comment_insert), которые перехватывают системные действия, и привязывают к таким событиям мой произвольный код. Я сделал при вставлении и редактировании рецензии – вычисление общей оценки плагина. Сначала с помощью функции avg() в SQL запросе я узнаю среднее арифметическое для каждого критерия оценки (для всех рецензий, относящихся к одной ноде). Запрос выглядит примерно так:

SELECT avg(field_value) FROM field_table INNER JOIN comment...

потом таким выражением узнаю общую оценку плагина: ( a + b + c + d ) / 4

Вот хуки, которые вызываются при добавлении рецензии (или изменении ее оценок)

<?php
function mymodule_comment_insert($comment) {
}

function mymodule_comment_delete($comment) {
}

function mymodule_comment_update($comment) {
}
?>

Похожие плагины
SQL запрос от xandeadx: http://xandeadx.ru/blog/drupal/234

Пользовательский ввод
Для оформления контента плагинов:
СKeditor (из wysiwyg) + One click upload + Image resize filter

Не используются (выключенные модули):
menu
block
locale
views

Так как я не использую модуль menu, чтобы выделять текущий пункт меню, сделал примитивную функцию:

<?php

function lcustom($alias, $link_title ) {
        
    if($alias == arg(0)) {
        if($_GET['q'] == 'best' && isset($_GET['page'])){
            echo '<a href="/'.$alias.'">'.$link_title.'</a>';
    } else {
            echo $link_title;
        }    
    } else {
        echo '<a href="/'.$alias.'">'.$link_title.'</a>';
    } 
    
}
?>

Подобной функцией пользуюсь уже не на первом проекте. Вызов функции выглядит так:

<?php
<div class="fooerMenu">
    <span><?php lcustom('submit', 'Предложить плагин'); ?></span>
    <span><?php lcustom('flagged', 'Помеченные ссылки'); ?></span>
    <span><?php lcustom('reviews', 'Рецензии'); ?></span>
</div>
?>

Хостинг
IT-patrol – просто летает. Отклик в 50 мс – это вещь. Сервак отрабатывает очень быстро. Особенно заметно внутри админки – на служебных страницах, предыдущий хост тупил.

jQuery
Чтобы воспользоваться файлом jQuery, который использует ядро друпала, удалось найти такое решение. Все скрипты jquery, написанные для сайта, нужно завернуть в такую конструкцию:

(function ($) { ... })(jQuery);

Иначе эти скрипты не видят друпаловский jquery, а подключать еще один jquery показалось кощунственно. Интересно, что решение трудно было нагуглить, и в конечном итоге нашел его в исходниках друпаловских модулей.

jQuery, используемое в демках, в основном грузится с Google CDN

Дизайн
Делал сам. Готовые темы не использовались. Не всё в дизайне мне нравится. Есть вещи, которые сделаны грубо (например форма добавления рецензии или некоторые попапы), и они будут со временем исправлены. Есть вещи (дизайн, функционал), над которыми я много думал, несколько раз переделывал, но так и не достиг ощущения что они работают как надо. Постепенно буду подтачивать.

Кроссбраузерность
А нет ее. Плотно смотрю в хроме и фоксе, время от времени проверяю в опере. В ИЕ не смотрел, да в общем-то и не собираюсь. Данный сайт для разработчиков, а они не пользуются ИЕ (я надеюсь!). Во всяком случае, чтобы посмотреть работоспособность демки, можно скопировать ее адрес в ИЕ, и я считаю этого достаточным минимумом.

Флаги
Я не стал использовать модуль flag, хотя давно о нем знаю. Было проще написать один аякс-запрос, добавляющий ссылку в БД, чем связываться с многофункциональным модулем, который из коробки скорее всего не подойдет под мои задачи.

Авторизация
uLogin – рульная штучка, заработало сразу все как и хотел. Был сильно удивлен фактом работы из коробки, думал что минимум день придется потратить на вкуривание манов, и еще день на то чтобы настроить его под себя. А оказалось что установка заняла минут ну отсилы 10, а подкручивание под себя еще час-два.

Конечно, я фанат аватарок, но в данном случае аватарки мне кажутся лишними, т.к. будут отвлекать от самих рецензий и оценок. Поэтому я их не настраивал, не знаю насколько сложно.

При первой авторизации создается пользователь. Это мой первый сайт с авторизацией через соц. сети, поэтому ощущения необычные.

Друпаловскую регистрацию решил отключить вообще, чтобы не было путаницы в типах аккаунтов.

Для того чтобы показывать иконку социальной сети, через которую авторизован пользователь, я делаю так:


<?php if(strpos($user->init, '_google')){ ?>
    <span class="Google" title="Вы вошли через Google аккаунт"></span>
<?php } else if (strpos($user->init, '_vkontakte')){ ?>
    <span class="Vk" title="Вы вошли через аккаунт Вконтакте"></span>
...
?>

У меня есть далеко не все аккаунты, через которые можно авторизоваться в uLogin, поэтому я протестировал только некоторые способы авторизации. Если кто-то найдет баги в тех способах авторизации, которые я не тестировал, пожалуйста сообщите.

Да, еще пара моментов. Стандартный модуль для д7, который выложен на официальном сайте ulogin вставляет виджет авторизации только на странице авторизации (user/login, и наверное регистрации), однако совсем не сложно вставить этот виджет (по факту это iframe ) в любое место страницы. В модуле я строку с iframe (который выводит виджет авторизации на странице /user/register) закомментил.

Второй момент – редирект после авторизации. Из коробки, модуль ulogin после авторизации редиректит на главную, а если ты находишься на странице и уже хочешь что-то туда написать – это просто убивает. Поэтому чтобы сделать редирект на текущую страницу, (на которой пользователь нажал кнопку авторизации), пришлось немного подправить модуль. Если интересно что и как могу написать в комментах.

Кажись это все, что вспомнилось.

Прикрепленный файл Размер screen.png 69.67 кб review_add_form.png 7.72 кб review_fields.png 17.71 кб fivestar.png 5.95 кб users_table.png 34.31 кб

Источник: http://www.drupal.ru/node/70966

Интеграция Drupal Commerce & Robokassa

Предлагается для тестирования и использования новый модуль оплаты для  Drupal Commerce через шлюз Робокасса

Итак, тестируйте и пишите отзывы по Commerce Robokassa

ЗЫЖ модуль разработан в сотрудничестве с http://www.internet-marketing.by/

Источник: http://www.drupal.ru/node/70117

Корзина Ubercart в popup окне

Решил на сайте сделать корзину в сплывающем окне.
Прежде всего хочу сказать спасибо Splash за помощь по выковыриванию данных из корзины.
И за отличный модуль UC JS CART который очень был кстати.
Были использованы модули  uc ajax cart для добавления динамической корзины,  colorbox для попап окон, uc js cart для динамического подсчета товара, ну и немного допилены tpl и css.
Итак первое это uc ajax cart. В нем есть папка с тимплейтами, немного правим .tpl для реализации внешнего вида и некоторого функционала.
Сюда же добавим скрытый div с содержимым корзины и ссылку colorbox для показа этого содержимого в попап окне.
У меня это так:

<a href="?width=850&height=auto&inline=true#cartOpen" class="colorbox-inline">В корзине <?   $a = count(uc_cart_get_contents()); echo $a.' товар'.numberProduct($a, array('','а','ов'));       ?></a>   <div class="price-of-cart">на <strong><?php print $total ;?></strong></div> <div id="myCart" style="display:none;"> <div id="cartOpen"> <h2 class="cart_header">Корзина</h2> <?php print ubercart_popup(); ?>   </div> </div>

По внешнему виду так:

Там еще функция для склонения товар, товары, товаров есть:

<?php function numberProduct($number, $titles) { $cases = array (2, 0, 1, 1, 1, 2); return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[min($number%10, 5)] ]; } ?>

Далее как вы увидели в шаблоне есть вывод содержимого корзины <?php print ubercart_popup(); ?>
Это и есть функция которая выдирает содержимое корзины писать её нужно в template.php
Выглядит она так:

function ubercart_popup() { if (module_exists('uc_cart')) { $items = uc_cart_get_contents(); if (empty($items)) { return theme('uc_empty_cart'); } $output = ''; foreach (uc_cart_cart_pane_list($items) as $pane) { if ($pane['enabled']) { $output .= $pane['body']; } } return '<div id = "uc_popup">'. $output .'</div>'; } }

В общем содержимое уже выводится в попапе, только вот есть несколько моментов. Это не срабатывает яваскрипт для обновления позиций товара из модуля uc ajax cart(как решить не знаю). По этому поводу я отключил в настройках модуля фитчу “Ajaxify cart page”.
Далее установите модуль uc js cart – как раз он и позволяет динамически подсчитывать стоимость.
Вот практически и все. Остальное можно сделать средствами css.
Осталось одно, когда мы открываем корзину и добавляем или уменьшаем количество позиций, в самом блоке корзины при закрыти попап окна нихера не меняется. Скорее всего нужно дописать кусок яваскрипт кода для обновления.(займусь позже)
У меня это выглядит вот так все:

Если кто то из читателей решал этот воброс более изящно, корректно, быстро и еще как нить иначе расскажите плиз.
Всем спасибоу!

Источник: http://www.drupal.ru/node/69695

Мини-CRM своими ручками часть. 4 (Заключительная)

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

Глава 1

Как скрыть ноду от лишних глаз

Актуально при постройке структуры на основе нод, закрепление материала освещенного в части 2

Глава 2

Карточка компании

темизируем ноду

Глава 3

Типы материалов

Пробежимся по 3-ем основным материалам

Глава 4

Заключительная

За сим господа, я завершу писать на эту тему.
В скором времени постараюсь сделать дамп и выложить на суд общественности для допилки и закидывания помидорами.
Вместе все-таки легче делать. У меня уже глаза мылятся..

Глава 5

Заключительная 1 (нов 2)

И все-таки, а нахера оно надо?
Отвечу: помощь манагерам или персоналу без финансовых вливаний. Повышение личного экспириенса. Могу я, значит может и друпал, только четко поставить задачу.
Можно построить ледокол из обычной лодки. Все ограничено Вашей фантазией или конкретной задачей.

часть 1
часть 2
часть 3
————–
оригинал

————–
ДАМП
SQl дамп
Дамп сайта целиком

Импортируете SQL в свою базу ( мой префикс crm2_ ) Заливаете дамп сайта на хостинг (денвер) или еще куда. Дамп целиком, с модулями и т.д. Редактируете settingd.php под свои нужды Заходите на свой сайт через www Логин – cooper Пароль – cooper

Attached poll “Делать дамп?”.
Register or login to poll
Results:
нах: 4 голоса
давай: 15 голосов
давай, я помогу идеями и реализацией: 5 голосов
давай-давай, я его подшаманю и продам, а тебе шиш: 2 голоса
не-не-не, я с 1С останусь: 0 голосов

Источник: http://www.drupal.ru/node/69691

Размещение баннеров в теле view

Может кому пригодится http://druit.ru/blogs/views/203

Источник: http://www.drupal.ru/node/68935

Содержимое ноды в окне Colorbox


Не знаю было ли такое решение или нет, по крайней мере я не нашел.

Раскуривал эту тему очень давно. Решений на форуме приведено уйма, но не все по моему удачные (требуют лесть в код или создавать отдельные шаблоны). В общем есть “правильное” решение которое думаю и предлагал девелопер.

После установки Колорбокса лезем в его настройки и включаем опцию “Enable Colorbox inline” (а Enable Colorbox load поможет вам с разными формами)

После чего создаем ноду\блок и в его теле пишем такой код

<a class="colorbox-inline" href="?width=500&amp;height=500&amp;inline=true#myid">link</a> <div style="display: none;"><div id="myid"><?php print render (node_view(node_load(19)), FALSE, TRUE);?></div></div>

Где, width=500 – высота окна, height=500 – ширина окна, link – отображаемая ссылка на окно, myid – название вашего дива, 19 – ID ноды содержимое которой хотим вывести в окно.
Сохраняем в формате PHP code и радуемся)))

Источник: http://www.drupal.ru/node/68873

Модуль интеграции инструментария для работы с изображениями GraphicsMagick

Сделал модуль  ImageAPI GraphicsMagick интегрирующий инструментарий для работы с изображениями GraphicsMagick c ImageAPI. С помощью модуля можно применять GM для обработки изображений, например в модуле ImageCache и ImageCache Actions (вместо встроенного в php GD2 и ImageMagick).

На данный момент в нем интегрированы простейшие действия (изменения размеров, кадрирование и т.д.). Также реализовал поддержку наложения водяных знаков с помощью этого модуля в модуле ImageCache Actions: http://drupal.org/node/1284668 .

Больше всего модуль будет полезен программистам, способным написать свое действие (image action) но также подойдет и обычным пользователям для снижения нагрузки на хостинг и ускорения “тяжелых” операций с изображениями (естесственно, при условии, что вы можете установить сам GraphicsMagick – не на каждом хостинге это доступно).

Видел на Д.ру уже подобную тему, но там речь шла о модуле для D7. Этот модуль – только для D6.

Сравнение с ImageMagick ImageAPI инструментарием. Этот модуль не использует GM как IM (GM частично поддерживает команды IM). В целом, я считаю достоинством то, что это отдельный ImageAPI инструментарий. Например, этот модуль знает про существование gm утилиты и ее команд, и может запускать другие команды gm, а не только convert. Кроме того, GM на одних и тех же командах может вести себя не так, как IM, потому что его исходный код отличается. Этот модуль запускает каждое действие с изображением как отдельную операцию с временным файлом. Данное поведение необходимо, чтобы полноценно использовать различные команды (GM не умеет группировать _все_ команды в одну). Это несет в себе потенциальные недостатки (небольшое снижение производительности и возможную потерю качества результирующего изображения при многократных последовательных операциях с потерей качества), но обходится с помощью своего действия (image action). Этот модуль работает в “сыром” режиме – каждое действие имеет полный доступ к командной строке (на самом деле, действие само запускает GM) что позволяет делать с изображением все что угодно, включая запуск любых сложных операций и внешних программ обработки изображений.

Источник: http://www.drupal.ru/node/68783

Дру-Палки! Все в Ёлки-Палки!

Всем! Всем! Всем!

Желающим! Наблюдающим! И просто Сочувствующим!

Общение, общение, общение – активное, креативное, позитивное, попивательное, пожевательное, сногшибательное!

Место встречи: традиционное (м. Китай-город, Ёлки-палки – Москва, ул. Солянка, 1/2, стр. 1).
Время: известное (ориентировочно 24.09.2011 в 18:30).
Повестка: дружить, общаться, развлекаться.

Ждем всех! Не стесняйтесь! Присоединяйтесь!

Пишите в теме, кто постарается присутствовать.

Источник: http://www.drupal.ru/node/68719

[Решено] Пропал/исчез/отвалился CKeditor / IMCE

Весьма популярная проблема “пропавшего” CKeditor или его частей. Во время разработки своего последнего сайта столкнулся с ней раза три и все по разным причинам. Отпишусь, пожалуй. Сразу скажу, что решения проблем в большинстве случаев очевидные, но сразу в голову не всегда приходят.

Возможная проблема 1

Проблема: Установили модуль, но не закинули в него сам редактор.
Решение: Идем на страничку редактора, качаем и закидываем файлы и папки редактора в подпапку “ckeditor” папки модуля. В этой подпапке должен быть файл-подсказка COPY_HERE.

Возможная проблема 2

Проблема: Панелька просто не появляется. Или появляется, но не у всех пользователей.
Решение: Во первых правильно должны быть настроены разрешения ролей самого Drupal (mysite/admin/user/permissions). Во вторых CKeditor нужно вручную привязывать к новым ролям. Идем в настройки редактора (mysite/admin/settings/ckeditor), выбираем профиль, например Default и напротив него нажимаем “изменить”. В первой группе настроек “Основные настройки” выставляем галочки нужным новым ролям.

Возможная проблема 3

Проблема:

У меня такое произошло после выгрузки сайта на хостинг.
Решение: Помогло удаление модуля и переустановка+перенастройка прямо на хостинге. Корень проблемы так и не нашел.

Возможная проблема 4

Пробелма: не открывается файловый менеджер IMCE или нет кнопки “Browse” при попытке добавить картинку в сообщение.
Решение: идем в настройки редактора (mysite/admin/settings/ckeditor), выбираем профиль, нажимаем напротив него “изменить”. Далее в группе Настройки файлового браузера, в File browser type (Link dialog) выбираем IMCE.

Возможная проблема 5

Проблема: При работе с IMCE нет кнопки “загрузить” и “Создать дирректорию”.
Решения: Во-первых, чтобы создать поддиректории нужен модуль IMCE mkdir. Кнопки у меня пропали из-за конфликта с “modernizr”, который использовал при вертске.

UPD: предложенные решения помогли именно мне, в то время как не помогли другие. Таких “других” очень много. Смотрите и их, напрмиер кликнув по тегу ckeditor.

Источник: http://www.drupal.ru/node/68678

Тормозит трекер ? Есть решение – Views Tracker !

Сделал модуль  Views Tracker, позволяющий создавать высокопроизводительную замену родному трекеру из ядра. Модуль основан на идеях модуля Tracker 2, но по сути является абсолютно новым, написанным с нуля проектом.
Актуальность модуля можно почувствовать на своей шкуре здесь, на Drupal.ru, где трекер, похоже, кешируется, что убивает основную идею – быстрое отслеживание изменений.

Чтобы получить максимальный прирост производительности от использования модуля, нужно создать view по аналогии с tracker, встроенным в Views, но использовать поля, аргументы, фильтры и критерии сортировки из групп модуля Views Tracker везде, где это возможно:

для общего трекера используйте группу Views Tracker для трекера пользователя используйте группу Views Tracker User

Список дополнительных фич и различий между Views Tracker и Tracker2:

В отличие от Tracker 2, Views Tracker имеет индекс по типу материала. За счет этого можно создавать разные трекеры для разных групп материалов без потерь скорости. В отличие от модуля Tracker 2, Views Tracker имеет поддержку модуля Node Comments Views Tracker содержит значительно меньше кода, чем Tracker 2. Tracker 2 не поддерживается – значительные изменения происходят за кадром. Видимо, сказывается то, что модуль используется на Drupal.org Tracker 2 имеет интерфейс пользователя, а Views Tracker нужно использовать вместе с модулем Views (или написать свой интерфейс). Поддержка Views в Tracker 2 тоже есть, но почему-то отсутствует в релизе (те самые изменения “за кадром”).

Модуль только выложен, возможно имеет баги. Приглашаю желающих к тестированию.

Источник: http://www.drupal.ru/node/68023

Ajax Microblog – стремимся реализовать Twitter.com

Рад общественности представить новый модуль. Это Ajax microblog. Данный модуль реализует функционал Twitter и будет развиваться в этом направлении. Целью модуля или пакета модулей является организация полной копии функционала предоставляемой всеми известной системой микроблогинга Twitter.com

Ссылка на проект: http://css.mirocow.com/projects/microblog
скачать тут: http://css.mirocow.com/projects/microblog/repository

Спонсор модуля: www.ruh.kz

Прикрепленный файл Размер e6674f3201affd625334c0d00cb96301.jpg 71.2 кб

Источник: http://www.drupal.ru/node/67970

Нам пора задуматься(неделя вежливости на портале)

На одном очень популярном ресурсе посвященном различным ЦМС, в комментах о друпале нашел следующую запись о минусах системы:”Грубое русское сообщество”.
Это ведь мы с вами. И правда грубим и хамим новичкам. И я в том числе( Давайте будем добрей и терпеливее.
п.с. такое вот сегодня лирическое настроение

Источник: http://www.drupal.ru/node/67917

Как сделать e-mail рассылку дайджестов любых материалов сайта в автоматическом режиме

Только что опубликовал новость как комментарий в посте о модуле рассылок.

Здесь для удобства обсуждения еще раз расскажу как настроить автоматическую e-mail рассылку практически любых материалов с вашего сайта.
Настроить так, чтобы вебмастер не тратил время на составление рассылки и ее отправку.

Материалы публикуются на сайте и тут же попадают в рассылку, на основе определенных правил. Эти правила задаются через views.

Как это делается – всего 3 простых шага:

Берете мой модуль подписки – он нужен для набора подписчиков. Или используете “ручную” форму подписки от сервиса Настраиваете любой фильтр через views на отдачу материалов в виде rss Скармливаете один, два или сколько вам нужно вариантов rss сервису рассылок и… вуаля: письма уходя автоматически.

Подробнее о том как скормить и настроить rss для отправки писем.

Это не просто банальное транслирование rss на e-mail. Вы получаете:

Возможность настроить дизайн рассылки под свой корпоративный стиль; Гибкую настройка правил отправки сообщений; Полное отсутствие рекламы; Использование языка Smarty для ветвлений и циклов; Возможность импорта списка подписчиков. Полный контроль режима отправки (моментальный автоматический, по расписанию или ручной); Плюс остальные возможности сервиса рассылок.

Предпоследний и последний пункты требует отдельного пояснения.

Благодаря режиму отправки по расписанию, вы фактически можете организовать регулярные дайдежесты материалов сайта на e-mail. Или, наоборот, отправлять каждый новый материал “моментально” (раз в час).

Из остальных возможностей сервиса, если ваш проект коммерческий вам может пригодиться возможность персонализации и сбора любого количества дополнительных данных о подписчике. Это затем можно использовать для сегментирования списка рассылки.

Добавьте к этому всю мощь модуля views по формированию rss лент и в ваших руках очень гибкий и мощный инструмент для автоматизации работы с базой подписчиков.

Появились вопросы, спрашивайте – отвечу.

P.S. Если у вас уже собрана база подписчиков легально (!), то вы можете ее импортировать.

Источник: http://www.drupal.ru/node/67894

Мини-CRM своими ручками часть. 3

Продолжаем разгребать Вьюсы, Флаги и панели.
В данной статье рассмотрим блок (views) Часть Б нашего интерфейса и его работу.
Под катом трафик 1,3 мб.

Здесь мы рассмотрели только одну вьюху. Дальше больше! Когда протрезвею тогда посмотрим настройки флагов, настройки Rules и много еще чего вкусного.

часть 1
часть 2
часть 4
————–
оригинал

Источник: http://www.drupal.ru/node/67879

Таблицы в друпале – очень краткий обзор модулей

Сабж!

Задался вопросом “Как грамотно вставить таблицу в друпал, с использованием полей и т.д.?“, в поиске здесь наткнулся на топик “Вывести таблицу excel на страницу“. Вспомнил, что раньше видел пару модулей на drupal.org по теме, поискал и нашел.

Итак…

 Tables Filter Module

Самый, наверно, простой табличный модуль. Ставите его, включаете в Форматах Ввода этот фильтр и, используете токены вида [table ] для редактирования таблицы. Пример построения таблицы – здесь.

Никакого импорта файлов и т.д.

Дешево и сердито.

 Slickgrid

Более продвинутый вариант.

Удобные средства редактирования таблицы, приличное количество фич. Импорта файла с таблицей, похоже нет.
Имхо, удобен, если таблицы приходится добавлять нечасто и небольшие.

 Sheetnode

Самый продвинутый модуль.
Для импорта использует http://phpexcel.codeplex.com/ и https://github.com/infojunkie/socialcalc
Некоторые возможности (на сейчас, модуль развивается):
Экспорт-импорт CSV, XLS, XLSX, OOCalc, Google Docs Spreadsheets (в разработке), etc.
Экспорт, помимо перечисленного, в PDF.
Значения таблиц могут раскидываться по (cck)полям.
… и многое другое.

Стабильная версия – только для 6ки, и разработка – для 7ки.
За подробностями лучше на страницу модуля.

Источник: http://www.drupal.ru/node/67684

Commerce Webmoney – интеграция мерчанта Webmoney для Drupal Commerce

*** Модуль нуждается в тестировании ***

Написал фактичеки “вслепую”, нет возможности протестировать в реальных условиях

Установка

В настройках своего аккаунта вебмани:

УРЛ результата: ВАШДОМЕН/webmoney/result
УРЛ успешной оплаты: ВАШДОМЕН/webmoney/success
УРЛ неуспеха: ВАШДОМЕН/webmoney/fail

Тип подписи: MD5

Настройки модуля тут admin/commerce/config/payment-methods => Webmoney => Enable payment method: Webmoney

кошелёк при расчёте выбирается по дефолтной валюте магазина

Прикрепленный файл Размер commerce_webmoney.zip 19.3 кб

Источник: http://www.drupal.ru/node/67677

«Сделайте мне красиво»: User:Name в качестве аргумента Views

Я думаю, каждый друпалер использует на своих сайтах модули  Views и  Pathauto. Да, на некоторых сайтах можно без них обойтись, но, фактически, оба этих модуля давно входят в джентльменский набор при запуске нового сайта, поэтому нет нужды объяснять, для чего они используются. Некоторое время назад я столкнулся с проблемой, которая не то, чтобы была критичной, но беспокоила моё эстетическое чувство и не давала мне считать свою работу выполненной. Дело было связано с тем, что views и pathauto по-разному представляют пользователю одни и те же вещи — как-то заголовки материалов и имена пользователей.

До некоторых пор это не особенно бросается в глаза, но представим себе следующую ситуацию — у вас есть вьюс, с помощью которого вы выводите список материалов по адресу example.net/content. Если задан аргумент, вьюс выводит только материалы за авторством конкретного пользователя. Самый простой способ сделать это — указать в качестве аргумента User:Uid. В результате получается, что при запросе вида example.net/content/1 будут отображаться все материалы, созданные суперпользователем, при запросе example.net/content/150, пользователем с uid 150 и так далее. Это хороший способ, у которого есть один минус — URL example.net/content/150 «некрасив» и мало, о чём говорит стороннему наблюдателю (хотя я часто использую такие конструкции для вьюсов, «закрытых» для пользователя).

Сделать URL «более говорящим» можно достаточно легко, если использовать в качестве аргумента не User:Uid, а User:Name. В результате мы получаем красивые адреса вроде example.net/content/ingumsky, едва взглянув на которые можно понять, что содержимое страницы будет иметь отношение к тому или иному пользователю (другое дело, какое отношение они к нему имеют . В принципе, такого решения уже вполне достаточно, если бы не одно «но»…

Например, представим, что на нашем сайте есть пользователи с именами Ingumsky, John Smith, jack_brown, S.White, He is Awesome, Паша. Мы включаем на сайте модуль pathauto и с его помощью создаём для каждого пользователя красивые адреса страниц профилей: example.net/users/ingumsky, example.net/users/john-smith и так далее. и здесь обнаруживается, что в адресах страниц пользователей, на страницах блогов и так далее синонимы имён пользователей отличаются от того, что принимает views в качестве аргумента. Сравните, как выглядят аргументы во Views и синонимы Pathauto [в квадратных скобках] для каждого из перечисленных выше пользователей (обращаю внимание, что в настройках аргумента включены опции «lowercase» и «turn spaces into dashes»:

example.net/content/ingumsky — материалы пользователя Ingumsky [ingumsky]
example.net/content/john-smith — материалы пользователя John Smith [john-smith]
example.net/content/jack_brown — материалы пользователя jack_brown [jackbrown]
example.net/content/s.white — материалы пользователя S.White [swhite]
example.net/content/he-is-awesome — материалы пользователя He is Awesome [he-awesome]
example.net/content/паша — материалы пользователя Паша [pasha]

Как видно, Views принимает в качестве аргумента именно имя пользователя, которое при указанных чуть выше настройках, просто переведено в нижний регистр и избавлено от пробелов (они заменены на дефисы). Но Pathauto при создании синонима вносит больше изменений в исходный текст. В результате в тех случаях, когда в именах пользователей встречаются знаки подчёркивания, точки, кириллица или даже некоторые английские слова, которые неважны для SEO (is, are и тому подобное), аргумент отличается от того синонима, который нам предлагает Pathauto.

Как я написал в самом начале записи, это не критичная проблема, но она… м-м-м… раздражает. Хочется, чтобы всё было красиво и «единообразно». Вопрос состоял в следующем: Как добиться того, чтобы скармливаемый вьюсу аргумент всегда выглядел так же, как выглядит ник в URL, созданном Pathauto?

Первоначальный поиск по этим вашим энтернетам не дал нужного мне результата, и я даже обратился за помощью к сообществу. Тот вариант решения, который мне посоветовали, показался мне излишне сложным для данного случая — к тому моменту я уже понял, в каком направлении нужно копать, и вскоре решение было найдено. Так как я уверен, что данная задача наверняка интересовала не только меня, предлагаю своё решение и вам:

1. В качестве аргумента мы будем использовать не User: Name, а User: Uid, пусть это прозвучит и несколько странно Теперь нам надо сделать так, чтобы из аргумента, который принимает наш вьюс, мы смогли вытащить uid;
2. В качестве «Что делать, если аргумент не указан» ставим «Показывать всё»;
3. Проверять аргумент мы будем с помощью php, поэтому смело выбираем в списке валидаторов «PHP Code»;
4. В текстовом поле пишем:

<?php
// Проверяем, не число ли дано в качестве аргумента
// Если число, аргумент подходит.
// Это особенно удобно, чтобы проверять, работает ли ваш вьюс с таким валидатором
if (is_numeric($argument)) {
  return TRUE;
}
// Смотрим, не указано ли в качестве аргумента «all»
// Если указано, аргумент подходит, и мы покажем все материалы 
elseif ($argument == 'all') {
  return TRUE;
} else {
// У меня синонимы профилей пользователей выглядят как users/username
// Здесь мы подставляем наш аргумент, чтобы получить такой же синоним
// В вашем случае может потребоваться заменить 'users/' на что-то другое
  $dru_alias = 'users/'.$argument;
// С помощью функции drupal_lookup_path ищем, каков внутренний адрес,
// соответствующий синониму — в нашем случае получится 'user/uid'
  $dru_path = drupal_lookup_path('source',$dru_alias);
// Разбираем внутренний адрес, вытаскивая из него uid 
  $uid = substr($dru_path, strrpos($dru_path, '/') + 1);
// Отдаём uid в качестве аргумента и сообщаем, что всё верно.
  $handler->argument = $uid;
  return TRUE;

?>

5. Profit!

В результате мы получаем views, который правильно обрабатывает аргументы, если они выглядят так же, как наши синонимы. Этот вьюс принимает так же и непосредственно uid в качестве аргумента. Это удобно, но, если у вас есть пользователи с числовыми именами, лучше избавиться от первой части условия в if.

Возможно, гуру Друпал засмеют меня и скажут, что решение было очевидным. Что ж, возможно и так. Я до этого решения дошёл далеко не сразу да и то только по наводке комментаторов с drupal.org, благодаря которым я понял, что надо смотреть в сторону валидатора аргумента. Надеюсь, что это решение поможет кому-нибудь ещё.

Источник: http://www.drupal.ru/node/67625

Требуются активные люди для поддержания светлого начинания

Здравствуйте, уважаемые! Нужна Ваша помощь!

Тему обучения Drupal кто только не начинал… Мы решили заняться этим всерьёз и надолго. При поддержке сильнейших сего ресурса (Александра Графова, Андрея Постникова), не без поддержки со стороны чудо-хостинга it-патруля (безвоздмездной!), мы (небольшая инициативная команда) накидали прототип, который в последствии будет частью портала drupal.ru. Адрес этого ресурса по понятным причинам мы сейчас не разглашаем. Торжественное открытие этого раздела состоится в тот момент, когда не останется ни одного известного нам бага.

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

Вот список специалистов, которые нам остро необходимы:

Люди, умеющие писать толковые интересные технические тексты (aka копирайтер); Люди, умеющие программировать на Drupal 7 (установка, настройка модулей. Дописывание и кастомизация модулей – приветствуется!); Люди, умеющие профессионально тестировать интернет-проекты (обязательное требование – внимание к мелочам, ибо, дьявол в деталях!).

Территориальная принадлежность специалиста – не имеет значения. Крайне желательно наличие Skype (текстовой версии достаточно).

Господа и дамы! Присоединяйтесь к нам и станьте у истоков большого начинания!
В отместку за Ваши усилия, мы обещаем почет, уважуху и мегареспект со стороны русскоязычного сообщества начинающих друпал-разработчиков (собственно, для кого этот ресурс и делается ).

Присылайте Ваши заявки на почту 4drupal.ru@gmail.com , мы обязательно Вам ответим!

Источник: http://www.drupal.ru/node/67169

Фотогалерея ImageFlow для D7


Статья на http://drupal.in.ua/content/fotogalereya-imageflow-dlya-d7

Что это ?
~~~~~~~~
Это порт для галереи изображений на основе http://finnrudolph.de/ImageFlow в Drupal 7. Галерея может формироваться для любого типа
материала с полем типа “Image” и привязкой через словарь таксономии в конкретную галерею.

Тестовый ссылка: http://gallery.drupal.in.ua/imageflow

Установка
~~~~~~~~
1) Распаковать архив в папку в sites/all/modules

2) Создать папку sites/all/libraries (если еще нет) и скопировать в нее содержимое архива из dimageflow/libraries/imageflow.zip
Это библиотека галереи (http://finnrudolph.de/ImageFlow), с несколькими закомментированными строками, для совместимости.

3) Вы можете использовать для галереи любой тип материала с:
- Полем типа “Image” (Обязательное);
- Полем типа “Term reference” (Обязательное, для названия галереи).

Примечание: Если такого нет – создайте новый тип с обязательными двумя типами полей.

4) Зайти на страницу с настройками модуля admin/config/content/dimageflow и выполнить настройки.
- Для организации галереи у материала xxx, надо выбрать поле которое будет использоваться при показе в галереи;
- Обязательно выбрать поле словаря таксономии, термины которого будет использоваться в качестве названий галерей;
- Тип миниатюрного изображения используется для первичного показа;
- Для того, чтобы при нажатии на миниатюрное изображение Вы попали на страницу изображения, а не материала в “путь для просмотра фото” – [image_path]
- Можно задать другой путь для страницы галереи по умолчанию он – dimageflow;

25/08/11
Добавлены настройка параметров (см. http://finnrudolph.de/ImageFlow/Documentation ) на страницу admin/config/content/dimageflow
1) imagesHeight – Height of the images div container in percent
2) imageFocusM – Multiplicator for the focussed image size in percent
29/08/11 12 Версии
Добавлены настройка параметров (см. http://finnrudolph.de/ImageFlow/Documentation ) на страницу admin/config/content/dimageflow
1) imageFocusMax – Maximum number of images on each side of the focussed one, default value: 4
2) Captions – Disables / enables the captions

План развития:
~~~~~~~~
1) Сделать массовую загрузку изображений из локальной папки в галерею с заданным именем.
2) Сделать страницу для views, пока по крайне мере под D7 нет адаптированного решения на org.
3) imagesM – Multiplicator for all images in percent

ВНИМАНИЕ ВАЖНО:
Права на хостинге на папки в т.ч. libraries/imageflow – 755 , на файлы .php, в том числе libraries/imageflow/reflect2.php – 644

Прикрепленный файл Размер dimageflow_12.zip 44.88 кб

Источник: http://www.drupal.ru/node/66476

Модуль Промокодов для клуба

Кто помнит или не помнит – я писал когда то, что под заказ пишу модуль для Промокодов (пруфлинк).
Собственно постепенно я его дописываю и сегодня ударным темпом закрыл одну из хотелок.

В чем профит модуля, спросите вы?
Все просто. Если вам нужно пользователю присвоить уникальный номер из заданного диапазона и присвоить ему роль – этот модуль предназначен именно для этого. Администратор генерит промокоды через админку, выдает людям. При регистрации или при редактировании профиля пользователь может указать в специальном поле промокод и получить номер и роль. Полученный номер можно использовать, к примеру, для выдачи значков или футболок и т.п. На роль можно повесить специфические права и доступы.

Для проекта открыл sandbox http://drupal.org/sandbox/softovick/1190802 – если кто желает, может поучаствовать в тестировании и фидбеке. На всякий случай прикрепил к посту архив с модулем.

UPD:
+ добавлен выбор роли, которая присваивается при активации промокода
+ сделан прототип более детального списка промокодов в виде таблицы с ссылкой на профиль пользователя.

Прикрепленный файл Размер promocode.zip 49.19 кб

Источник: http://www.drupal.ru/node/66200

Загрузка поля cck ajax-запросом.

На главной странице есть лента новостей. Она состоит из:
1. Дата новости;
2. Анонс новости;
3. Ссылка на саму новость.

Захотелось мне реализовать ajax-загрузку основного текста новости на место ссылки.
Изучив “как создать свой модуль”, основы javascript, jquery и вспомнив основы php-программирования я все таки реализовал свою идею. Возможно для профи это 5 минутное дело, у меня ушло около 5 дней в совокупности. Работу модуля можете посмотреть на www.appri.ru.
Модуль назвал loadnews. Здесь обноленный код.
Файл loadnews.module: <?php
/*
 * Implementing hook_init
 */

function loadnews_init() {
    drupal_add_css(drupal_get_path('module', 'loadnews') . "/loadnews.css");
  drupal_add_js(drupal_get_path('module', 'loadnews') ."/loadnews.js");
}

/*
 * Implementation hook_perm
 */
function loadnews_perm() {
  return array('access onthisdate content');
}

/**
 * Implementation hook_menu()
 */
function loadnews_menu() {
  // Элемент меню с соответствующим путем
  $items['loadnews'] = array (
    // Функция, которая будет "обрабатывать" путь
    'page callback' => 'loadnews_ajax',
    // Права на доступ к пути
    'access arguments' => array('access content'),
    // Элемент не будет отображаться в меню сайта
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/* Функция обработки запроса */
function loadnews_ajax() {
    /*
     * Ссылка на на новость передается методом GET в переменной 'url'
     * В БД алисы адресов хранятся без первого слеша, поэтом удаляем его
    */
    $url = substr($_GET['url'], 1);
    // По полученному алиасу ищем в таблице url_alias соответствующий системный адрес
    $sys_url = db_result(db_query("SELECT n.src FROM {url_alias} n WHERE dst = '%s'", $url));
    /* Адрес получаем в виде "node/nid". Нам нужно получить параметр nid.
     * Для этого разбиваем строку на массив из 2-х элементов, второй который наш nid
    */
    $sys_url_array = explode('/',$sys_url);
    // Сохраняем наш nid в переменную
    $nid = $sys_url_array['1'];
    // Выбираем поле основного текста новости "field_news_text_value" из таблицы "content_type_news"
    $result = db_result(db_query("SELECT n.field_news_text_value FROM {content_type_news} n WHERE n.nid = '%d'", $nid));
    // Наш ответ клиенту
    drupal_json(array('status' => 1, 'data' => $result));
}
?>

Файл loadnews.js: Drupal.behaviors.loadnews = function(context) { // Добавляем для всех ссылок в блоке новостей class =loadnews $('#block-views-news-block_news', context).find('a').addClass('loadnews') // Реагируем на клик .bind('click', function() { // Передаем с методом get адрес ссылки var href = $(this).attr('href'); // Переменная, это куда мы будем выводить ответ var target = $(this).parents(".field-content"); // Прячем ссылку $(this).hide(); // Вместо нее выводим анимацию $(target).append("<div class=loading></div>"); // Получаем данные с сервера $.get(Drupal.settings.basePath + 'loadnews', {url:href} , function(response) { // Сохраняем ответ в переменной var result = Drupal.parseJson(response); // Прячем анимацию $(target).find(".loading").hide(); // Вместо нее ставим "Свернуть" $(target).append("<span class=hidenews>Свернуть</span>"); $(target).append("<span class=shownews>Подробнее...</span>"); $(target).find(".shownews").hide(); // Создаем блок для вывода текста новости $(target).append("<div class='newstext'></div>"); // Изначально блок будет скрыт, чтобы потом красиво его развернуть $(target).find("div.newstext").hide(); // Загружаем текст из переменной в блок $(target).find("div.newstext").html(result.data); // Красиво раскрываем наш блок $(target).find("div.newstext").slideDown("fast").addClass("active"); // Реализация скрытия и раскрытия блока (нужно оптимизировать код) $(target).find(".hidenews").click(function() { $(target).find(".hidenews").hide(); $(target).find("div.newstext").slideUp("fast").removeClass("active"); $(target).find(".shownews").show(); }); $(target).find(".shownews").click(function() { $(target).find(".shownews").hide(); $(target).find("div.newstext").slideDown("fast").addClass("active"); $(target).find(".hidenews").show(); }); }); return false; }); }

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

Прикрепленный файл Размер loadnews_v6.x-1.6.zip 3.62 кб

Источник: http://www.drupal.ru/node/66172

Как добавить ленту сообщений Google+ на сайт, сделанный на CMS Drupal

Давно хочу прикрепить свою ленту сообщений из новой социальной сети Google plus на свой же хоумпейдж. Официального пути это сделать пока нет. Вот один из “неофициальных” вариантов:
1) создать RSS-поток ваших сообщений на сайте http://plusfeed.appspot.com/. В общем-то для этого просто надо добавить ваш ID на сайте G+ к адресу Plusfeed’а. Вот так, например – http://plusfeed.appspot.com/116910563308964275374
2) включить модуль Feed aggregator (есть в стандартном дистрибутиве Drupal) на странице ВАШСАЙТ/admin/build/modules/list.
3) добавить полученный на шаге 1 адрес фида в настройках на странице ВАШСАЙТ/admin/content/aggregator/add/feed
4) и, конечно, настроить cron (если он у вас еще не настроен) и не забыть установить права для просмотра ленты (на ВАШСАЙТ/admin/user/permissions).

И все…
По желанию можно задать адрес для этой страницы, добавить ссылку в меню сайта, сделать более внятное оформление и т.п.
Получится что-то вроде такого: http://vadimbarsukov.com/aggregator/sources/1
Не скажу, что меня все устраивает (например, не показываются фото и видео), но все же это лучше, чем ничего.

Источник: http://www.drupal.ru/node/66099

Hashtags в друпале

Приветствую.

Как оказалось, есть модуль, позволяющий отказаться от необходимости прописывать теги страницы в отдельном поле –  Hashtags, теги как в твиттере, отмечаются непосредственно в тексте. И для seo лучше.

Единственный минус в том, что он есть только под 6-ю версию, и с портом D7 совершенно не ясно… аналогов модуля не нашел.

Источник: http://www.drupal.ru/node/66069

Дополнение к модулю Node Gallery: галереи по умолчанию

 Default Node Gallery – дополнение к модулю  Node Gallery – создает галерею по умолчанию для каждого юзера (и для каждой пары тип_галереи – тип_изображения) при входе его на сайт.
Так же позволяет управлять доступом к галерее по умолчанию, чтобы юзер случайно ее не удалил.
В общем, это должно работать как функция “неразобранные фотки” на многих фотосайтах.
Модуль пока сыроват – возможны ошибки, о которых прошу сообщать в issue queue модуля.

Источник: http://www.drupal.ru/node/66060

Вышел Drupal 7.7. (Drupal 7.7 released.)

Вышел drupal 7.7., который является 7.6, но с поправленными строками в “версии”

7.5 содержит фиксы безопасности.

Короче говоря. Качать и ставить надо 7.7.

Drupal 7.5, a maintenance release which fixes security vulnerabilities is now available for download. Drupal 7.6 7.7 also fixes other issues reported through the bug tracking system.

Note: Drupal 7.7 is just Drupal 7.6 with a fixed VERSION string (7.6 was reporting itself as 7.5). No other changes.

читаем, качаем тут

Источник: http://www.drupal.ru/node/66057

Eclipse pdt

Долго капашилась, вроде что-то получилось, а вдруг кому-нибудь пригодиться.
Для быстрой и удобной работы с использованием хуков может пригодиться Eclipse PDT. После его установки, необходимо сделать следующее – скачать файл http://drupal.org/project/eclipse, его содержимое Drupal.xml импортировать в Preferences > PHP > Editor > Templates. Зайдите в Help menu, потом Install New Software введите
Name: XTND.US
Location: http://xtnd.us/downloads/eclipse.
У меня установилось, но почему-то в пункте Php Content Type не отобразились Drupal Module и Drupal Themes. Поэтому я ввела в ручную следующее -
# *.module
# *.install
# *.test
# *.info
# *.po
# *.theme
# *.engine
(для того, чтобы пхп их распознавал).
После данных действий, при наборе hook появляется выборка всевозможных хуков, а после выбора конкретного, его код отображается на странице. (Или же надо при наборе нажать ctrl+space)

Источник: http://www.drupal.ru/node/66000

Drupal SMS24X7 Module (SMS Framework Gateway)


Всем привет, презентую модуль-шлюз http://sms24×7.ru для SMS Framework.

Модуль очень простой, меньше 100 строк, использует их библиотеку, подробное описание api нашел тут.

Ссылка на модуль – https://github.com/stan-kondrat/drupal-sms24×7

PS. Никакого отношения не имею к sms24×7, была нужда в русском шлюзе, его нагуглил первым.

PPS. Если хотите по тестить стандартный модуль SMS User (Provides integration between the SMS Framework and Drupal users), но есть один момент. Он отсылает четырех значный код подтверждения, на что шлюз отвечает: “Сообщение содержит указание на платный номер“, самое простое решение:

diff --git a/sms_user.module.orig b/sms_user.module index 799ec7f..403b609 100644 --- a/sms_user.module.orig +++ b/sms_user.module @@ -264,7 +264,7 @@ function sms_user_settings_sleep_form_submit($form, &$form_s }   function sms_user_send_confirmation($account, $number, $options) { - $code = rand(1000, 9999); + $code = rand(100, 999); $data[0] = array( 'number' => sms_formatter($number), 'status' => 1,

Источник: http://www.drupal.ru/node/65940

Отображение PDF-файла

Статья для тех, у кого возникнет необходимость отобразить прикрепленный PDF документ на странице просмотра содержимого. Реализуется это довольно просто…

Полная статья »

Источник: http://www.drupal.ru/node/65269

Замена названий скачиваемых файлов

Замена названий скачиваемых файлов:

Цель: при сохранении файла по умолчанию подставлять в название содержимое атрибута title
т.е. например, чтобы по нажатию на ссылку
<a href="proba.zip" title="Пробный архив">скачать</a>
, предлагало сохранить “Пробный архив.zip”
и так для любого интересующего расширения (doc, pdf, jpg ..)

Решение: на самом деле решение к друпалу имеет очень небольшое отношение, т.к. почти не знаю его. Поэтому, наверняка, оно не оптимальное и я буду рад любым советам по его улучшению. С другой стороны, им могут воспользоваться такие же новички (и не только для друпала).

Краткий алгоритм:

Пройтись по все ссылкам в интересующем месте, выбрать те, что ссылаются на файлы типа zip, rar, doc и т.п. Отлавливать клики по ним, отменяя стандартное действие, вместо которого отправлять в php-файл путь ссылки и нужное название В php-файле настроить header-ы на загрузку Привязать все это к друпалу

Первый пункт (javascript):

window.onload = function(){   //взять все ссылки, из содержимого статьи var links = document.getElementById("content").getElementsByTagName("a");   //перебрать все найденные ссылки for(var i=0;i<links.length;i++){ $href= links[i].getAttribute("href");   //если у ссылки есть путь if($href!=null && $href!=""){   var ext = $href.substr($href.lastIndexOf('.') + 1);   //перекрыть ссылки на документы и архивы if(ext.match(/zip|rar|doc|docx|pdf/)){   links[i].onclick = saveFile; } } } }   function saveFile(tag){   $path = this.getAttribute("href"); $label = this.getAttribute("title");   //если нет title, взять название файла if($label==null || $label==""){ $label=$path.match(/(?:^|\/|\\)([^\\\/]+)$/)[1]; $label = $label.substr(0,$label.lastIndexOf('.')); }       //создать временную форму для отправки методом post var submitForm = document.createElement("FORM"); document.body.appendChild(submitForm); submitForm.method = "POST"; submitForm.action= "/php/download_file.php"; createNewFormElement(submitForm, "file", $path); createNewFormElement(submitForm, "label", $label);   submitForm.submit(); submitForm.parentNode.removeChild(submitForm);   //////////////////////////////////////////////////////////     return false;//отменить переход по ссылке }   //вспомогательная функция для создания полей в форме function createNewFormElement(inputForm, elementName, elementValue){   var newElement = document.createElement("INPUT"); newElement.name = elementName; newElement.type="hidden"; inputForm.appendChild(newElement); newElement.value = elementValue; }

Здесь обрабатываются все ссылки, лежащие в контейнере с id=”content”. Чтобы не зверствовать c post-отправкой, и не подключать jquery используется простой трюк с временным добавлением формы.

Второй пункт (php):


<?php
if(isset($_POST["file"]))
{
// путь к файлу
$filename = $_SERVER['DOCUMENT_ROOT'].$_POST['file'];

//заменитель
if(isset($_POST["label"]))$label = $_POST["label"];
else $label = basename($filename);

//расширение файла
$fileextn = end(explode('.', $_POST['file']));

switch($fileextn)
{
  case "pdf": $ctype="application/pdf"; break;
  case "exe": $ctype="application/octet-stream"; break;
  case "zip": $ctype="application/zip"; break;
  case "doc": $ctype="application/msword"; break;
  case "xls": $ctype="application/vnd.ms-excel"; break;
  case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  case "gif": $ctype="image/gif"; break;
  case "png": $ctype="image/png"; break;
  case "jpeg":
  case "jpg": $ctype="image/jpg"; break;
  default: $ctype="application/force-download";
}

//Проверка, на то, можно ли отдавать запрашиваемый файл (спасибо  xxandeadxx)
//например, выдавать только с указанными расширениями
if($ctype!="application/force-download"){

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"$label.$fileextn\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));

readfile("$filename");

exit();
}
}
?>

Третий пункт:
php-скрипт положить в \sites\all\libraries\ download_file.php
js-скрипт положить в \sites\all\themes\infopark\js\download_file.js (не забыть изменить путь к php)
В файле \sites\all\themes\тема\тема.info добавить scripts[] = js/download_file.js (для того, чтобы подгружать этот скрипт на все страницы).

Пример прилагается.

Прикрепленный файл Размер download_files.zip 5.87 кб

Источник: http://www.drupal.ru/node/65058

Лишний пейджер в D7

Небольшая подсказка новичкам куда глядеть, в случае, если под единственным комментарием к ноде вы внезапно обнаружили пейджер и вот уже 2 часа вспоминаете что вы перед этим делали и какие модули подключали.

Досконально в процесс не вникал, но суть в том, что если на данной странице у вас есть вьюха с пейджером (а она скорее всего есть, может быть и в блоке), то оба этих пейджера получают один и тот же ид, и по сути выполняют одни и те же действия.

По этому идем в настройки пейджера этой самой вьюхи и в поле “Pager ID” ставим, допустим, единичку вместо нолика, или двоечку, в зависимости от количества используемых пейджеров на странице.
Там же можно прочитать описание ин инглиш:
Unless you’re experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible.

Источник: http://www.drupal.ru/node/65047

Цены за обучение Drupal

Интересный твит пробегал в недавно от «детроидца», известного своими скринкастами… гугл переводит это: «Я думаю, что когда-нибудь люди поймут, что цены за обучение #Drupal нелепы.», полагаю, что речь идёт о прошедших курсах:

Drupal 7 Site Building
June 27, 28, 29 $1,350

Drupal 7 Theming
June 30 & July 1 $900

Entire Week of Workshops
June 27 – July 1 $2,000

Предлагаю проголосовать всем заинтересованным и предлагать свои варианты решения об образовании Drupalista в коментах.

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

Один из найденных тренингов по конкурирующей платформе выставил на начальное обучение ценник (4500 вебинар и от 6500 за очное посещение), в ближайшее время на Drupal.Ru появится раздел посвященный обучению людей премудростям Drupal, пока полагаю в виде подобного ресурса от Acquia. Но об этом позже

PS: … на пути к Друпал-центру обучения и не только

Attached poll “Сколько Вы готовы платить за повышение квалификации, работая с Drupal?”.
Register or login to poll
Results:
Я нищий..: 38 голосов
20 000 – 15 000: 11 голосов
10 000 – 5 000: 23 голоса
не более 5 000: 32 голоса

Источник: http://www.drupal.ru/node/65015

[Модуль] Advanced sphinx

Сделала на базе  sphinxsearch небольшой поисковый модуль. Предложения и тестирование весьма желательны. Первоначально модуль делала под свои нужды, так что все лишнее, на мой взгляд, отсутствует . Если понадобятся какие-то доработки, буду рада помочь. На d.org будет выложен позднее. Портирование на 7 будет, после отлова мелких багов, при наличии таковых.

Основные отличия от базового:

возможность автоматической генерации файла конфигурации; mysql вместо xmlpipe2; минимальные настройки файла конфигурации через админку (работает при автоматической генерации); UPD. Добавлено управление индексацией и демоном через админку. Функции внедрены по просьбе IT-patrol; может еще что-то…

Настройка:

Копируем модуль в “sites/all/modules”. Включаем в админке. Настройка модуля на странице “admin/settings/advanced_sphinx”. Если вы хотите автоматически сгенерировать конфиг, то поставьте галочку “Generate a configuration file”. Далее необходимо указать полный путь к папке, в которой храниться sphinx.conf или папку в которой могут быть созданы конфиг и другие папки. Права на запись обязательны. Также на этой странице можете выбрать типы материалов по которым будет осуществлен поиск, если не выбрано, то ищет по всем. Обратите внимание, что при каждом сохранении настроек модуля конфиг будет обновлен, если включена его генерация. запускаем индексатор /usr/bin/indexer –config /home/user/sphinx/config/sphinx.conf –all . Потом демон сфинкса /usr/sbin/searchd –config /home/user/sphinx/config/sphinx.conf . Все пути подставляйте свои. проверяем работоспособность на странице “admin/settings/advanced_sphinx/check-connection”. Добавляем для нужных ролей право на использование страницы поиска (”use advanced_sphinx”) в “admin/user/permissions”

Страница Advanced sphinx на github.

Источник: http://www.drupal.ru/node/65009

Обновление сайта Drupal с 6 до 7 на мультисайтинге

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

0. Составить полный список модулей, которые используются сайтом. Выяснить на drupal.org наличие версий этих модулей под Drupal7. Возможно, функционал некоторых модулей перекочевал в ядро Drupal, как например, произошло с модулем CCK. Некоторые модули прекратили свое развитие на версии 6 и их функционал выполняют другие модули под новыми названиями для версии 7. На этом этапе нужно принять взвешенное решение о необходимости обновления. Нужно иметь ввиду, что хорошие шансы на простое обновление только у тех сайтов, которые создавались по принципу “не написав ни строчки кода”. Ибо Drupal6 и Drupal7 – это не две версии одной и той же СМС, а две разные СМС, т.к. у них разные API. В Drupal7 нет многих функция API Drupal6, а те, что сохранились по названию имеют другой набор входных параметров. Чаще всего, список параметров, передаваемых через запятую в Drupal6, заменен в Drupal7 массивом параметров [каждый из которых тоже зачастую является массивом]. Кроме модулей нужно позаботиться о новой версии темы оформления. Если все необходимые модули и тема оформления для новой версии есть, либо от непортированных под семерку можно отказаться, переходим к следующим пунктам.

1. Если действующая версия инсталляции Друпал не самая последняя (на сегодня это 6.22), то нужно сначала обновиться до последней версии (не забывая про резервные копии).

2. Рядом с каталогом установки Друпал шестой версии создаем другой каталог для версии 7. Например, шестая версия размещалась на хостинге в каталоге “/home/my_login/drupal”, здесь “/home/my_login/” – домашний каталог на хостинге; “drupal” – каталог инсталляции Друпал6. Тогда создаем каталог “/home/my_login/drupal7”.

3. Копируем последнюю версию Drupal7 со страницы http://drupal.org/project/drupal

4. Устанавливаем как обычно Drupal7 в новый каталог. Для этого можно временно создать поддомен одного из рабочих доменов, либо использовать какой-то свой тестовый домен. В любом случае, нужно на хостинге подключить этот домен/поддомен, указав для него в качестве домашнего каталога вновь созданный. В данном примере это – “/home/my_login/drupal7”. На этом шаге нам нужно убедиться в том, что данный хостинг поддерживает работу с Drupal7. Например PDO (расширение PHP), как показала приктика, присутствует не на всех хостингах. А без PDO Drupal7 не работает.

5. Устанавливаем и тестируем в Drupal7 все модули, которые необходимы для нашего сайта.

6. Делаем архив каталога “/home/my_login/drupal/sites/нашсайт.ru”.

7. Делаем копию БД нашего сайта и сохраняем к себе на ПК (с пометкой “рабочая 6” или другой понятной нам). Можно использовать phpMyAdmin хостера, но лучше воспользоваться скриптом – http://sypex.net/ru/ или аналогичным. Это быстрее, проще и удобнее.

8. Регистрируемся на сайте в Drupal6 под именем пользователя с ID=1 (который создается при установке).

9. Переводим сайт в режим техобслуживания (на странице admin/settings/site-maintenance)

10. Переходим на страницу admin/build/themes и назначаем тему по умолчанию – Garland.

11. На странице admin/build/modules отключаем все модули, которые не входят в раздел “Ядро – обязательное”. Возможно, отключение придется делать в несколько этапов из-за зависимостей между модулями. Весьма кстати было бы на этом этапе читать далее

Источник: http://www.drupal.ru/node/64863

Построение запросов с использованием Database API

Одним из весомых преимуществ Drupal 7 над его предшественниками есть его гибкость к настройкам и системам. Разработчики не обошли стороной и запросы к БД. В этом релизе они стали объектно-ориентированными и не привязанными к конкретной базе дынных, поскольку теперь сам Drupal генерирует синтаксис запроса. Задачею программиста остается лишь указать условия выборки. Эту статью я посвящаю анализу Database API, где приведу примеры как именно изменилось “общение” с БД.

Полная статья »

Источник: http://www.drupal.ru/node/64860

Drupal + КЛАДР

Всем привет,

была нужда сделать в таксономии базу всех регионов и городов.

Взял Классификатор адресов России (КЛАДР) здесь и сделал.

Выглядит примерно так – [img]

Использование:

Устанавливаем Выбираем куда заливать /admin/settings/kladr Нажимаем кнопку LOAD /admin/build/kladr , если не всё заливается сразу (там 200000 строк), нажимаем ещё раз

Если решили заливать в другой vocablary:

Создаем или Выбираем куда заливать /admin/settings/kladr Нажимаем кнопку “Начать загрузку сначала” Нажимаем кнопку LOAD /admin/build/kladr , если не всё заливается сразу (там 200000 строк), нажимаем ещё раз

Теперь подробнее:

Требуется “extension=dbase.so” Вставляет два уровня терминов, первый – level1 из KLADR.DBF, второй населенные пункты от туда же. Использует Batch API (Загрузку базы можно прерывать)

Версия 0.1
Возможны планы развития: интеграция с http://drupal.org/project/location , http://drupal.org/project/addresses и т.п.

Ну, и как обычно, disclaimer, используйте только на Ваш страх и риск.

Прикрепленный файл Размер drupal-kladr.png 543.36 кб

Источник: http://www.drupal.ru/node/64769

Тема Blogsmith для Drupal 6

Blogsmith – простая и удобная тема для Drupal 6 в зеленых тонах. Если используете FCKeditor, то в его настройках CSS нужно выбрать define.css дабы избежать косяков с фоном в поле редактирования ноды.

- Две колонки
- Оптимизированная для SEO
- Простая и легкая в редактировании тема

Учусь верстать под Drupal и создал сайт cmsdrupal.org.ua на который буду выкладывать свои темы. Сейчас на нем можно посмотреть демо этой темы.

Прикрепленный файл Размер blogsmith.rar 39.98 кб

Источник: http://www.drupal.ru/node/64336

Создание простого модуля с использованием Field API в Drupal 7

В этой статье я расскажу и распишу как оперировать основными хуками из раздела Field API.

Field API – один из разделов Drupal 7 API, которые позволяют нам:

создавать настраиваемые поля для данных,
хранить данные в этих полях,
взаимодействовать с любым видом контента.
Проще говоря Field API – средства для полей контента.

Полная статья »

Источник: http://www.drupal.ru/node/64326

Модуль ссtags под Друпал 7

На днях перевел свой модуль cctags с шестой версии на седьмую.
Сctags – это альтернатива широко известного модуля tagedelic. Т.е. модуль формирует блок и/или страницу облака тэгов таксономии с атрибутом (классом) зависящим от частоты употребления данного термина в опубликованных нодах.
В чем преимущество данного модуля перед tagedelic.

Tagedelic – формирует ровно столько блоков (и страниц) сколько определено словарей в вашей системе причем не позволяет смешивать словари, т.е. один словарь – одно облако.
В модуле Cctags мы имеем:
Гибкие настройки и расширенные возможности по темизации вывода облака (отдельные файлы шаблонов для тэгов, названия словаря, страницы облака).
Возможность (через настройки включать несколько словарей (а для словарей с древовидной структурой – кроме этого включать/выключать нужный уровень)) вывода тэгов.
Автоматическая генерация нужного количества блоков и/или страниц.
Помимо этого вы можете сформировать практически одинаковые по содержанию блоки и разместить их в разных регионах для разных страниц сайта.

Концепция модуля Cctags основана на понятии элемента cctags.
Элемент cctags – это совокупность настроек для отображения одного блока и/или страницы терминов.
Вы можете добавить необходимое количество элементов и настроить каждый из них отдельно, причем разные элементы могут содержать один и тот же словарь или словари в любой комбинации.

Отличия модуля от версии для Друпал 6.
Убран не характерный и малоиспользуемый для данного модуля функционал:
1. Построение блока и страницы облака пользователей.
2. Построение блока материалов по связанным терминам.
3. Очистка словарей от не используемых терминов.
Проведена работа по совместимости кода модуля с версией PHP >= 5.3

Сам модуль можно пока взять тут (см. прикрепленный файл), чуть позже дев версия появится на д.о.

Источник: http://www.drupal.ru/node/64157

Коротко о Batch API

Пакетные операции дают возможность обрабатывать формы в течении нескольких запросов. Это предотвращает обрыв обработки изза тайм-аута РНР. Также пользователю предоставляется информация о ходе осуществления текущих операций.

Утверждают, что в первую очередь batch был разработан для гармоничной интеграции с Forms API, хотя часто его используют в обычных скриптах таких как update.php.
Представим, что нам необходимо осуществить обработку большого количества данных. Для начала мы создадим страницу в hook_menu.

Читать полностью…

Источник: http://www.drupal.ru/node/64097

Курс по Drupal 7 в Санкт-Петербурге

Привет, Коллеги!

Наконец-то мы решились на проведение учебного курса для Drupal!

Главная идея курса: человек приходит с самыми базовыми знаниями о сайтах, уходит с реализованным проектом.
Да, первый курс из серии рассчитан на новичков. Всем известно, что на Drupal сложнее всего сделать простые вещи Курс поможет новичкам преодолеть входной порог в удивительный и безграничный мир Drupal.

Я вижу, здесь много просьб помочь сделать сайт. Курс, который мы предлагаем – хороший ответ на эти просьбы. Инвестировав немного средств и времени можно научиться достаточно быстро и качественно делать функциональные сайты на Drupal под свои задачи …и наконец-то слезть с крючка веб-студий, которые выставляют счёт не меньше 1000 рублей за каждую новую кнопочку на сайте.

Площадка для проведения курса – широко известный Учебный Центр ЭКОС: http://ekos-spb.ru/
Да, он должен быть знаком тем, кто занимается 1С. Это 4-й по количеству слушателей из 241 сертифицированного УЦ: http://1c.ru/rus/partners/training/cso/cso-list.jsp

Страничка курса: http://ekos-spb.ru/kursy-1s/kurs.php?id=21

Начало ближайших занятий: 18 июля 2011 года.
Формат: 4 дня по 8 часов в рабочее время.
Цена: 9000 рублей.

Бывают вечерние и выходные группы. Если больше подходит другое время обучения, да, можно будет подобрать соответствующую группу: (812) 610 05 05, Зоя. Или пишите semp@ekos.spb.ru, Семён.

Спасибо и удачи в освоении этой прекрасной технологии!

Источник: http://www.drupal.ru/node/64094

Отчет о конференции DrupalConf’2011

Всем доброго времени суток. Пришло время предоставить отчет о конференции DrupalConf, которая прошла 23 апреля 2011 года в Москве.

Цифры:

Зарегистрированных участников конференции (заполнивших анкеты перед конференцией) – 224 участника.
География участников: Россия, Беларусь, Украина, Германия.

Инфы много, далее под катом.

Профессиональный состав:

Уровень владения Drupal:

Потребность в проф.консультациях:

Мы можем смело сказать что конференция получилась международной. За пару недель перед конференцией стало понятно, что количество участников придется как-то ограничивать – количество заявок к организатором намного превысило возможности зала. Как показала конференция – это был оправданный шаг, зал был заполнен полностью, но давки/неудобств не было, всем были обеспечены сидячие места.

На заметку гостям будущих конференций – заблаговременно регистрируйтесь на сайте конференции.

Результаты

На наш взгляд первая в России большая конференция по Drupal удалась. Это было бы невозможно, без активного сообщества. Наверное, основной вывод из всей конференции – сообщество в России есть, мы собрали более 240 участников, 30% участников работают с Drupal профессионально – по характеру вопросов к докладчикам было видно, что это представители студий и коллективов разработчиков, которые видят значительный рост в сфере Drupal-разработок, эта сфера притягивает все большие бюджеты, Drupal как CMS интересует все большее количество заказчиков. Что гарантирует – регулярные встречи Drupal-разработчиков неизбежны.

Организаторы Артем Паньков Андрей Постников Маша Таран HelpTeam Сергей Бабушев Дубовской Александр Спонсоры Информационные системы для бизнеса – Генеральный спонсор Fast Lane Ventures Radon InternetDevels Информационная поддержка РАЭК itmozg.ru Интернет в цифрах RMA CMS Magazine Системный администратор Drupal.ru Рейтинг Рунета Докладчики:

Хотим выразить благодарность всем докладчикам конференции. Вы можете просмотреть видео докладов.

1. Вступительный доклад от Постникова Андрея (andypost): Drupal 7 и Drupal 8.

2. Доклад Вячеслава Касихина (Irbis), Ubercart — немного примеров из жизни.

3. Доклад Дубовского Александра (adubovskoy), Drupal для ленивых – как мы делаем больше за меньшее время.

4. Доклад от Алексея Костина (kostin), Drupal & SEO

5. Доклад Анны Федорук, Как построить разработку на Drupal

6. Доклад Антона Житарева (NaZg), Системы Электронного Документооборота на Drupal

7. Доклад Тараса Савчука и Романа Архарова (Romka), Forbs.ru

8. Доклад Клеры Виленской (Klera), Концепция единого модуля интеграции с соцсетями

9. Доклад Влада Савицкого (vladsavitsky), Сайт на Drupal за 15 минут

10. Доклад Александра Швеца (neochief), Разработка Drupal дистрибутивов

По предварительному расписанию у нас было 10 докладов, однако осталось время на экспромт-доклад (без предварительной подготовки), который вызвался рассказать Кинзябулатов Рамиль, посвященный интеграции Ubercart и 1C, ознакомиться с докладом вы можете на данной странице http://video.yandex.ru/users/vaspi/view/44/user-tag/drupalconf/

Отзывы

Вы можете ознакомиться с неформальными отзывами о конференции, которые разместили участники на своих сайтах и блогах:

http://www.drupal.ru/node/61188 http://graker.ru/news/2011/04/24/drupalconf_2011 http://prodrupal.ru/ru/node/89 http://shvetsgroup.com/ru/blog/drupalconf-moscow http://www.ys1.ru/blog/otchet-o-drupalconf-moscow-2011

Следующий шаг

Данная конференция возымела большой резонанс в среде Drupal-разработчиков. Начали появляться региональные встречи, такие как Встреча DrupalSib в Новосибирске, встреча Южного Друпал сообщества в Краснодаре.
Есть потребность в организации регулярных небольших встреч в Москве – Drupal-кафе. В данный момент вы можете помочь с организацией Drupal-кафе, присоединяйтесь к обсуждению и ждем вас на встречах.

Слухи и домыслы

Хотим сказать, что нас воодушевило, какой отклик вызвала конференция DrupalConf. Есть решения о повторении конференции осенью/зимой 2011 или весной 2012. Каждый из вас может оказать значительную помощь и ускорить повторение DrupalConf в Москве. Как это можно сделать:

Вы можете просто опубликовать ссылку на этот отчет у себя на сайте или в блоге. Прежде всего конференция – это люди и потребность в обмене опытом. Мы можем совместными усилиями поддерживать резонанс о конференции. Уже сейчас готовить доклад. Поверьте, написание качественного доклада занимает значительное время. В следующей конференции возможно разделение на потоки или на дни, необходимо больше хороших и интересных докладов.

Спасибо всем: читателям, слушателям, докладчикам, спонсорам. Будем рады встретиться на следующем DrupalConf!

Источник: http://www.drupal.ru/node/63916

Скринкасты Drupal 7

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

Локализация интерфейса Drupal 7 Media Gallery в Drupal 7

Планируются новые скринкасты. Выгружаю на YouTube и у себя в блоге.

Принимается критика, пожелания и прочие уместные комментарии.

Источник: http://www.drupal.ru/node/63785

Ускоряем переводы

Сделал модуль  Locale Cache, ускоряющий переводы строк в Drupal.

Известно, что родной язык Drupal – английский. При каждом запросе к сайту движок берет английские строки в интерфейсе и заменяет их переводами для текущего выбранного языка. Данный модуль оптимизирует и ускоряет этот процесс. В результате ускоряется загрузка страниц, снижается количество запросов к базе и (в зависимости от настроек модуля) снижается потребление сайтом оперативной памяти.
Более подробное описание модуля на  странице проекта.

Для работы требует патч ядра, так что прошу детей и беременных женщин отойти от монитора.
Пробуем, тестируем, и т.д. (снапшот скоро будет готов). Настройки модуля описаны в README.

14.06.11 Добавлена опция обновления кеша локалей с помощью cron
24.06.11 Создал первый релиз. Всем, кто использовал dev версию, рекомендуется обновится

Источник: http://www.drupal.ru/node/63680

Страшная правда о техническом задании

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

1. Подготовить четкий и конкретный Договор между заказчиком и исполнителем;
2. Разработать техническое задание.

По п. 1. Образец договора заточен под техническое документирование, но может быть легко “перелицован” на создание сайта, программирование модулей и иную другую задачу. Впервые он был подготовлен для производства и поставки мебели в сеть магазинов Рамстор – успешно отработали по 8-ми таким договорам. Юристы заказчика морщили носики, но подписывали, поскольку все права и обязанности сторон прописаны четко (нарушил п. такой-то – отвечай по п. такому-то), какая-либо юридическая казуистика отсутствует.

По п. 2. Собственно статья, опубликованная пять с небольшим лет назад в киевском журнале “Мир автоматизации”. В статье расписаны подходы к разработке техзадания: кто и что должен делать, как с помощью ТЗ прикрыть себе заднюю полусферу, как с помощью ТЗ поиметь заказчика, если он идиот или просто “мошенник”, упомянуты вопросы стоимости ТЗ, учтен человеческий фактор.

Договор в прикрепленном файле. Статья здесь – http://tdocs.su/6740 Тот, кто осилит, гарантирован от неприятностей с заказчиком (исполнителем), прочих непредвиденностей, а также от “слезных” постов в форуме

Прикрепленный файл Размер dogovor_kratkosrochnyy.doc 119.5 кб

Источник: http://www.drupal.ru/node/63383

Создание пользовательского формата представления стоимости товара в Drupal Commerce

При создании интеренет-магазина с помощью модуля Drupal Commerce может возникнуть потребность в конфигурировании формата представления стоимости товара.
По умолчанию стоимость товара отображается в формате:

1,234.25 UAH (на примере украинской гривны)

Для русскоязычного пользователя такой формат представления не совсем удобен. В текущей версии beta 3 функционал для изменения формата представления цены товара через пользовательский интерфейс отсутствует.

Задать правильное отображение стоимости товара можно с помощью небольшого модуля, который включает в себя вызов всего одного хука:


<?php
function mymodule_commerce_currency_info_alter(&$currencies, $langcode) {
  $currencies['UAH']['symbol'] = 'грн.'; //задаем символ валюты, который нужно отображать
  $currencies['UAH']['code_placement'] = 'hidden'; //прячем буквенный код валюты, который отображается по умолчанию вместо символа валюты
  $currencies['UAH']['symbol_placement'] = 'after'; //указываем отображение символа валюты после стоимости
  $currencies['UAH']['thousands_separator'] = ''; //убираем разделитель сотен, по умолчанию это символ ","
}
?>

Хук должен выполнятся после того, как отработают хуки модуля commerce currency, для этого задаем соответствующий вес нашему модулю в таблице system

Настройку формата отображения стоимости товара с помощью UI обещают включить в одно из следующих обновлений модуля, но пока этого функционала нет, можно пользоваться таким временным решением.

Источник: http://www.drupal.ru/node/63235

Ajax: очередной перевод статьи

Даю полный перевод обучалки по использованию Ajax (на нее, кстати, ссылались здесь). Это дубль перевода с моего сайта, который я выложил более недели назад.
Следующее руководство шаг за шагом научит вас быстрому применению Аякса в Друпале. Мы динамически обновим страницу контентом, прочитанным с сервера, без необходимости обновлять страницу. Я постараюсь сделать это по возможности просто, описывая самые основные блоки, требуемые для внедрения Аякса. Я предлагаю вам двинуться дальше и попытаться вставить более сложные вещи, исходя из нужд вашего сайта.
Давайте начнем. Как-то я создал сайт электронной коммерции, основанный на Drupal 6 & Ubercart и теперь хочу улучшить его, применив для отображения товаров Аякс. Я хочу, чтобы пользователи выбрали категорию товаров из списка, и основываясь на этом выборе, получили список товаров для данной категории.
Замечание: я рекомендую, чтобы вы познакомились с разработкой модулей в Друпале (руководство можно найти здесь http://drupal.org/node/231276)

Шаг № 1 – Создание вашего «Модуля данных»

Для того чтобы получить данные от клиента, мы должны начать с создания модуля, который будет возвращать данные с сервера. Давайте назовем наш новый модуль “dynamic_products”. Прежде всего создади каталог для нашего нового модуля. Он должен находиться в каталоге “modules” вашего сайта (обычно /sites/default/modules). Все файлы, описанные далее в этом разделе, должны создаваться в этом каталоге. Затем создадим файл .info вашего модуля. Этот файл предоставляет информацию Друпала о вашем файле, которая нужна для его активации.
Больше информации о создании .info файла можно найти здесь http://drupal.org/node/231036
Для нашего .info файла мы будем использовать следующее:

  ; $Id$ name = "Dynamic Products" description = "Returns a list of products according to category." core = 6.x package = Example Ajax Modules

Копируем, вставляем  и сохраняем верхний код в “dynamic_products.info”. После того как мы создадим наш .info файл, мы продолжим далее создание нашего файла .module. Этот файл включает рабочий код со стороны сервера. Вернемся вверх и создадим файл “dynamic_products.info” в каталоге нашего модуля..
Для того чтобы создать вызов сервера и получить некоторые данные, нам нужен menu_hook, который будет использован для «перехвата» вызова аякса. В нем будет использоваться следующая функция:

function dynamic_products_menu() {   $items = array();   $items['products/get'] = array( 'title' => 'Dynamic Products', 'page callback' => 'dynamic_products_get_by_category_id', 'access arguments' => array('access dynamic_products content'), 'type' => MENU_CALLBACK );   return $items; }

Эта функция заставляет перехватывать все обращения по адресам “http://www.example.com/?q=products/get” или http//www.example.com/products/get и вызывать функцию обратного вызова dynamic_products_get_by_category_id.
Далее мы сообщим Друпалу, кто имеет разрешения на использование нашего модуля. Для этого мы применим Друпаловский hook_perm().

  function dynamic_products_perm() { return array('access dynamic_products content'); }

Теперь пришло время создать функцию обратного вызова, которая вернет нам данные с сервера. С этой целью в этом руководстве мы создадим простой список товаров. В реальной жизни данные могут быть получены со стороны или любым другим удобным вам путем.

function dynamic_products_get_by_category_id($cat_id){ $items = ''; switch($cat_id){ case 12: $items = '<ul><li>Product 1</li><li>Product 2</li></ul>'; break; case 20: $items = '<ul><li>Product 3</li><li>Product 4</li></ul>'; break; } // создаем объект JSON. Он будет содержать свойство под названием “products”, которое является набором переменных $items. return drupal_json(array('products'=>$items)); exit; }

Наша функция обратного вызова принимает один параметр ($cat_id). В зависимости от его значения возвращаются разные списки товаров.
Функция может иметь столько параметров, сколько нам нужно. Для передачи их в функцию мы используем Url вызова Аякса
Как вы помните, ранее мы определили функцию menu_hook (dynamic_products_menu), и настроили наш модуль на перехват обращений, сделанных по адресу “http://www.example.com/products/get”. 
Для того чтобы добавить id категории к нашей функции обратного вызова, мы просто добавим его к url запроса.
Например, если мы хотим использовать значение 12 как id категории, мы просто используем следующий url http://www.example.com/products/get/12. 
Мы почти закончили делать наш файл dynamic_products.module. Позже мы вернемся к нему, а сейчас сохраним его и пойдем далее.

Шаг № 2 – Создание файла javascript

Теперь мы создадим файл javascript, который будет включать клиентскую часть, создающую вызов аякса. Создадим новый файл в каталоге модуля и назовем его dynamic_products.js. Представленный код задает обработку события нажатия кнопки одного из html-элементов на нашей странице.

// $Id$ Drupal.behaviors.dynamic_products = function (context) { $('a.categoryLink:not(.categoryLink-processed)', context).click(function () { // Эта функция будет выполняться после того, как ajax запрос на сервер был выполнен успешно var updateProducts = function(data) { // Параметр "data" является объектом JSON. Свойство “products” является списком товаров, который возвращается с сервера в ответ на запрос ajax. $('#divProducts').html(data.products); } $.ajax({ type: 'POST', url: this.href, // Which url should be handle the ajax request. This is the url defined in the <a> html tag success: updateProducts, // The js function that will be called upon success request dataType: 'json', //define the type of data that is going to get back from the server data: 'js=1' //Pass a key/value pair }); return false; // return false so the navigation stops here and not continue to the page in the link }).addClass('categoryLink-processed'); }

Копируем, вставляем  и сохраняем верхний код в “ файл dynamic_products.js ”. С ним мы работу закончили.

Шаг № 3 – загрузка файла javascript

Для того чтобы загрузить .js файл со стороны клиента, нам нужно вернуться и отредактировать наш файл .module. Для этого нам при инициализации модуля нужно использовать init_hook. Для того чтобы это сделать добавим следующие строки к файлу .module:

  function dynamic_products_theme() { return array( 'dynamic_products_javascript' => array( 'arguments' => array(), ), ); }   function dynamic_products_init() { theme('dynamic_products_javascript'); }   function theme_dynamic_products_javascript() { drupal_add_js(drupal_get_path('module', 'dynamic_products') . '/dynamic_products.js'); }

Сохраняем файл.
Замечание: не забудем активировать наш новый модуль на странице "admin/build/modules".

Шаг № 4 – Создание Html

Мы почти закончили. Нам нужно только создать на нашей странице код html, который будет делать вызов аякса. Чтобы упростить работу, давайте создадим 2 раздела div вверху страницы. Верхний div будет включать 2 ссылки, по одной для каждой категории товара. После щелчка на одной из этих ссылок будет отправляться запрос на сервер, а загруженный контент будет вставляться в нижний div.

  <div id=”topDiv”> <a class="categoryLink" href="/products/get/12">Cat. 1</a> <a class="categoryLink" href="/products/get/20">Cat. 2</a> </div> <div id="divProducts"></div>

Создайте страницу Друпала, скопируйте и вставьте верхний код, и это все. При просмотре страницы при щелчке на одной из ссылок категорий на сервер будет отправляться запрос, и на странице будет отображаться список товаров выбранной категории.

Источник: http://www.drupal.ru/node/63094

Тема Infotech

Простой и чистый шаблон под Друпал 6. Подойдет для блогов разной тематики.
Валидность XHTML и CSS
Включены ZEN tabs
Ссылки для редактирования блоков.

Демо можно посмотреть здесь http://infotech.org.ua
Скачать можно ниже

Прикрепленный файл Размер infotech.rar 42.87 кб

Источник: http://www.drupal.ru/node/63068

Фотогалерея для Drupal 7 (ajax)

Статья здесь – http://drupal.in.ua/content/fotogalereya-dlya-drupal-7-ajax
Тестовый сайт – http://gallery.drupal.in.ua
Реализует функционал фотогалереи с просмотром фото при наведение «мыши» на миниатюру и листанием миниатюр с использованием технологии ajax.

Особенности:

Модуль создает свой тип материала для галереи; Создает свой тип стиля изображения ( Image style ) для миниатюр; Не требует дополнительных модулей (contributed modules); Просмотр фото, при наведение указателя «мыши» и при клике на миниатюру; Плавное появление изображения при просмотре; Ссылка на полное изображение с возможностью открытия в окне (window.open) Работает при отключенном js; Дополнительные настройки (admin/config/content/drig) не обязательны; Проверена совместимость с браузерами IE6/…, FireFox, Opera, Chrome, Safari.

27/05/2011: версия 2 – устранены визуальные искажения при медленной загрузке картинок.
28/05/2011:

Во время процесса загрузке image навигация отключается “Бегунок” загрузки помещен на image При навигация превью появляются плавно после полной подгрузки (ajax)

31/05/2011

Добавлена проверка корректности навигационной ссылки, при ручном вводе; Добавлена обработке ajax status error

01/06/2011
Добавлена возможность использование в любом материале с полем типа image. ( настройка на странице admin/config/content/drig )

Прикрепленный файл Размер drig.zip 22.43 кб

Источник: http://www.drupal.ru/node/62902

Модуль cczoom как альтернатива cloud zoom

Работая над вялотекущим проектом под Drupal 7, понадобилось мне показывать масштабируемые превьюхи. Поиск дал несколько результатов, но под D7 был выбран, более менее приемлемый модуль Cloud zoom, основанный на одноименном jQuery плагине jQuery Cloud zoom.
Но к сожалению автор модуля , использовал возможности jQuery плагина лишь на 10%, а точнее через данный модуль практически невозможно настроить плагин, а там, тем не менее достаточно много такого, с чем можно «поиграться»(приведу спецификацию параметров без перевода, кому надо надеюсь сами переведут).

Parameter Description (from V1.0.0) Default Value zoomWidth The width of the zoom window in pixels. If ‘auto’ is specified, the width will be the same as the small image. ‘auto’ zoomHeight The height of the zoom window in pixels. If ‘auto’ is specified, the height will be the same as the small image. ‘auto’ position Specifies the position of the zoom window relative to the small image. Allowable values are ‘left’, ‘right’, ‘top’, ‘bottom’, ‘inside’ or you can specifiy the id of an html element to place the zoom window in e.g. position: ‘element1′ ‘right’ adjustX Allows you to fine tune the x-position of the zoom window in pixels. 0 adjustY Allows you to fine tune the y-position of the zoom window in pixels. 0 tint Specifies a tint colour which will cover the small image. Colours should be specified in hex format, e.g. ‘#aa00aa’. Does not work with softFocus. false tintOpacity Opacity of the tint, where 0 is fully transparent, and 1 is fully opaque. 0.5 lensOpacity Opacity of the lens mouse pointer, where 0 is fully transparent, and 1 is fully opaque. In tint and soft-focus modes, it will always be transparent. 0.5 softFocus Applies a subtle blur effect to the small image. Set to true or false. Does not work with tint. false smoothMove Amount of smoothness/drift of the zoom image as it moves. The higher the number, the smoother/more drifty the movement will be. 1 = no smoothing. 3 showTitle Shows the title tag of the image. True or false. true titleOpacity Specifies the opacity of the title if displayed, where 0 is fully transparent, and 1 is fully opaque. 0.5

Решил таки исправить данную ситуацию и написал модуль интегрирующий тот же самый jQuery плагин, но позволяющий гибко настроить все используемые параметры.

Примеры работы модуля можно посмотреть на моей тестовой площадке.
Сам модуль можно взять здесь (см. прикрепленные файлы) …
Модуль в пре-дев версии, только для тестирования … если кого заинтересует, то будет время доведу до ума и выложу на д.о.

Устанавливается стандартно, т.е. распаковываете архив в папку sites/all/modules

забираете с сайта jQuery Cloud zoom скрипты и распаковываете их в папку sites/all/libraries/cloud-zoom

Включаете модуль.

Настраиваете тип материала (поле типа Изображение (Image) на закладке “Отображение” устанавливает формат – cczoom и далее уже настраиваете параметры вывода)

Скриншоты настройки поля:

Источник: http://www.drupal.ru/node/62581

Модуль для синхронизации 1С 8.x Предприятие + 1С управление торговля (УТ) с магазином Ubercart 2

English
This is module implements import/export for the application 1c 8.x. It`s a complementary solution for 1C 8.x handler. It`s use Commerce ML 2 format such XML. Else this module work as batch process and use cron for the queue.

Russian
Данный модуль позволяет синхронизировать 1С 8.x Предприятие + 1С управление торговлей (УТ) с магазином Ubercart 2. В синхронизации участвуют:

1C -> Ubercart 2 (Прайс – лист с ценовыми предложениями) 1C -> Ubercart 2 (Категории) 1C <- Ubercart 2 (Ордера от магазина) 1C <- Ubercart 2 (Информационные данные о покупателях)

Настройки

старая глючная версия

beta 4

Прикрепленный файл Размер cmlservice.2.09.jpg 32.08 кб cmlservice.2.09-settings.jpg 49.03 кб 2011_05_22_17-06-16-130.jpg 54.43 кб

Источник: http://www.drupal.ru/node/62395

Список блоггеров в блоке.

Доброго времени суток, уважаемые! Хочу поделиться проблемой решением проблемы:
Стала задача – вывести в блок список самых активных блоггеров. Вывести имя пользователя и количество нод типа Blog post, оставленных им. Сортировка по убыванию по количеству постов. И имя каждого пользователя в добавок ко всему должно было выводиться ссылкой на его блог.

В итоге получилось следующее:

Как получилось? Под катом.

Итак, по порядку. Что я имел для достижения цели:
Drupal 7.x
Views 3.0-beta3

Рецепт получения блока:

Делаем новую вьюшку и делаем дисплей Block.
Мы будем выводить поля. По сему ставим Show:Fields
Фильтр: по типу содержимого Blog entry. Ставим Content: Type (= Blog entry)

Какие мы выводим поля:
- User: Name (ставим галку на Exclude from display, так как нам нужно просто взять из базы данных значение, но фактически не показывать его в данном поле. Почему – опишу ниже.)
- User: Uid (ставим галку на Exclude from display по той же причине)
- Content:Nid. При добавлении поля Views спросит о группировке, укажите Count. Таким образом мы получаем количество постов в блоге от определённого пользователя. После указания группировки Count, поле Content:Nid будет содержать только количество записей блога на каждого пользователя.
Вот тут и начинается самое интересное: нужно вывести имя блоггера, рядом показать счётчик постов, и это поле сделать ссылкой на блог пользователя. Я долго ломал голову как это реализовать, но Dealancer подсказал отличное решение: переписать поле. Действительно: у нас есть имя пользователя, его uid и количество его постов. Почему бы не вывести это в таком порядке, в каком нам это необходимо?
Есть замечательная опция у большинства полей: REWRITE RESULTS. Это свойство поля заменять свой текст по определённым правилам, которые описаны в разделе Replacement patterns, если раскрыть свойство REWRITE RESULTS.
В свойствах поля Content:Nid раскроем REWRITE RESULTS:

Поставим галочки на
[x] Rewrite the output of this field
[x] Output this field as a link
Что даст нам возможность изменять содержание поля и ссылку поля.

После расстановки галочек появятся дополнительные опции Text и Link path. Эти поля определяют текст поля и его ссылку соответственно. Они-то нам и нужны.
Нам необходимо вывести в следующем порядке: Автор (кол_во_постов постов), если сказать по-человечески: Admin (25 постов)
Мы помним, что количество постов у нас хранит поле Content:Nid. По этому дадим имя нашему полю:
[name] ([nid] постов)

Чтобы попасть на страницу блога пользователя, нужно перейти по адресу example.com/blog/user_id
А значит ссылка у нас будет вида blog/[uid]

Сохраняем, и вуаля! Осталось только сделать сортировку по убыванию количества постов. То есть чем больше постов, тем выше в списке будет показываться блоггер.

Для этого поставим сортировку по убыванию значения поля Content:nid. Напоминаю, Content:nid хранит количество постов.
COUNT(Content: Nid) (desc)

В конечном итоге вьюшка преобретает следующий вид

Надеюсь мой опыт будет кому нибудь полезен
Спасибо пользователю Dealancer за неоценимую помощь!

Источник: http://www.drupal.ru/node/62109

Google и скорость загрузки страниц Вашего сайта

В конце апреля этого года в своем официальном блоге представители Google Analytics объявили об запуске бета-тестирования нового интерфейса.

В этой же статье я хочу рассказать об использовании новой очень интересной возможности – анализ скорости загрузки страницы.

О включении такой возможности, пример анализа данных по скорости загрузки страниц Вашего сайта относительно разных браузеров, операционных систем, континентам и тд, а так же о анализах скорости загрузки страницы с помощью Google WebMaster Tools можно прочитать здесь:
http://internetdevels.ru/blog/google_and_pagespeed

Источник: http://www.drupal.ru/node/62055

Интеграция модуля с views. Работа с обработчиками

2я часть, теперь про стандартные обработчики views.
плюсуем, комментим

Источник: http://www.drupal.ru/node/62047

Диалоговая кнопка BUEditor + стандартная drupal-форма для внутреннего линкинга

Вашему вниманию предлагается статья, в которой описывается способ встраивания стандартного функционала форм Drupal в редактор BUEditor для удобного добавления ссылок на внутренние материалы сайта.

Начну с дисклеймера. К сожалению, не имею возможностей разбирать весь процесс создания по косточкам, т.к. было потрачено немало времени и допущено и исправлено множество ошибок прежде, чем получился результат, достойный публикации. Тратить это время здесь смысла большого не имеет, лучше идти дальше. Вот решение – пользуйтесь, экспериментируйте, дорабатывайте, делитесь. Здесь же постараюсь описать все, что необходимо для реализации задуманного функционала. Описание дается для блоками, а не построчно.

Инструменты Module API Drupal form API Ajax JQuery BUEditor Предыстория

Основным редактором на нашем научном портале является BUEditor, т.к. есть твердая необходимость форматировать текст с использованием модуля  DruTeX. Ну и просто постараться сохранить предсказуемый вид для исходных текстов (в отличие от wysiwyg-редактора) для их дальнейшего использования по-жизни. По мере наполнения появилась необходимость для кросс-линкинга между статьями, терминами словаря и другими видами материалов. Все это осложнялось отсутствием таких возможностей для BUEditor, в отличие от других редакторов, для которых есть такой модуль как  Linkit. Потратив некоторое время на изучение матчасти (Drupal form API), было принято решение, что во что бы то ни стало нужно прикрутить стандартную форму Drupal к диалогам BUEditor. Ведь autocomplete уже реализован, стили сделаны, а пока форма ждет ответа, там бегает кружёк и выпадет готовая менюха – вообщем просто и красиво.

Первым делом начал искать, что было сделано. Например – http://www.drupal.ru/node/12619, но по делу там ничего не нашел. Начал экспериментировать с маленьким неофициальным модулем ajax-demo и его autocomplete-возможностями. Все быстро встало на свои места. Дальше появился вопрос – как заставить друпаловскую форму залезть в диалог редактора?

Кстати, бился с поиском до последнего, т.к. не сторонник, чтобы на сайте был такой hand-made. Но готовых решений нет и был вынужден изменить своим же принципам.

Hands on

Итак, приступаем.

Первым делом надо сделать свой модуль (назвал его callbacks), в который войдет основной функционал, а именно:

Описание формы Описание функций обращения к базе Клиентский js-функционал Стили ответа

callbacks.info

; $Id$   name = callbacks module core = "6.x" version = "6.x-1.1"

callbacks.module


<?php
// $Id$

/**
 * Implementation of hook_init().
 */
function callbacks_init(){
    variable_set('callbacks_link_form_var', drupal_get_form('callbacks_link_form'));
}

/**
 * Implementation of hook_menu().
 */
function callbacks_menu() {
  return array(
    'callback/link' => array(
      'access arguments' => array('access content'),
      'page callback' => 'callbacks_link_func',
      'type' => MENU_CALLBACK,
    ),
  );
}

/**
* Retrieve a pipe delimited string of autocomplete suggestions for existing users
*/
function callbacks_link_func($string) {
  $matches = array();
  $dst = "";
  $result = db_query_range("SELECT nid, language, type, title FROM {node} n WHERE LOWER(n.title) LIKE LOWER('%s%%')", $string, 0, 10);
  while ($node = db_fetch_object($result)) {

    $get_alias = db_query("SELECT dst FROM {url_alias} WHERE src = 'node/%s'", $node->nid );
    if( $alias = db_fetch_object($get_alias) )
      $dst = $alias->dst;
    else
      $dst = "node/" . $node->nid;

    $matches[$node->nid] = array(
      'type' => check_plain($node->type),
      'title' => check_plain($node->title),
      'alias' => check_plain($dst),
      'lang' => check_plain($node->language),
    );
  }

  $results = array();
  if (count($matches)) {
    foreach( $matches as $key_nid => $values ) {
      $text = '<div class="clear-block">';
//      $text .= '<div class="callbacks-nid">['. $key_nid .']</div>';
      $text .= '<div class="callbacks-title">'. $values['title'] .'</div>';
      $text .= '<div class="callbacks-type">['. $values['type'] . ':' . ( $values['lang'] ? $values['lang'] : 'any' ) . ']</div>';
      $text .= '<div class="callbacks-alias">'. $values['alias'] .'</div>';
      $text .= "</div>";
      $dst = $values['alias'];
      $results[$dst] = $text;
    }
  }

  drupal_json($results);
}

/**
 * Defines a form.
 */
function callbacks_link_form() {

  drupal_add_js(drupal_get_path('module', 'callbacks') . '/js/callbacks.js');
  drupal_add_css(drupal_get_path('module', 'callbacks') . '/css/callbacks.css');

  return array(
    'link-path-ac' => array(
      '#autocomplete_path' => 'callback/link',
      '#title' => t('URL or Title'),
      '#description' => t('Start type title to get its internal URL'),
      '#type' => 'textfield',
      '#required' => TRUE,
    ),
    'link-text' => array(
      '#title' => t('Link text'),
      '#description' => t('Select text in editor or enter link text'),
      '#type' => 'textfield',
    ),
    'cancel' => array(
      '#value' => t('Cancel'),
      '#attributes' => array('class' => 'callbacks-button'),
      '#type' => 'button',
    ),
     'add-link' => array(
      '#value' => t('Add link'),
      '#attributes' => array('class' => 'callbacks-button'),
      '#type' => 'button',
    ),
  );
}
?>

hook_init() – нужен, чтобы заранее подготовить форму, иначе BUEditor ее не съест.

hook_menu() – это осознанная необходимость для autocomplete в Form API.

callbacks_link_func($string) – стандартный функционал для json-ответов. Здесь можно выбирать из базы любые поля и отдавать их для отображения, в данном случае поиск ноды в базе происходит по заголовку, но этим, как вы понимаете, можно не ограничиваться. Тут же происходит стилевое оформление – дело вкуса прячется в конце функции. Да, кстати, здесь приходится делать двойной запрос к базе, т.к. все, что мы делаем, мы делаем для живых людей и поэтому подставлять красивый alias вместо ссылки вида node/435 насущная необходимость. Для красоты (см. картинку в конце) выводится название, алиас, тип материала и язык.

callbacks_link_form() – описываем форму по-друпаловски: быстро, просто, удобно, с аутокомплитом.

JS часть. Файлик js/callbacks.js

Drupal.behaviors.callbacks = function(){   $('#edit-add-link').unbind().click(   function(){ var url = $('input#edit-link-path-ac').val(); var text = $('input#edit-link-text').val(); E = BUE.active; E.replaceSelection( '[url'+ (text ? ('='+ url) : '') +']'+ (text || url) +'[/url]' ); E.dialog.close('fadeOut'); return false; }   );   $('#edit-cancel').unbind().click( function(){ BUE.active.dialog.close('fadeOut'); return false; } );

$(’#edit-add-link’).unbind().click() – отцепляем стандартный submit и говорим форме, что же нам от нее нужно.

$(’#edit-cancel’).unbind().click() – то же самое, но для кнопочки Cancel, для порядка.

CSS часть. Файлик css/callbacks.css

.form-radios .form-item { display: inline; }   .callbacks-nid { float: left; }   .callbacks-title { float: left; }   .callbacks-alias { color: #333; font-size: 0.9em; clear: both; margin-bottom: 5px; font-weight: bold; }   .callbacks-type { float: right; font-size: 0.8em; }   .callbacks-button { float: right; }

Тут самая скука, расставить цвета и отступы.

Вторым делом добавить php-кнопку в BUEditor.

<?php
php:
$button_form = drupal_to_js(variable_get('callbacks_link_form_var', ''));

return "js:
var S = E.getSelection();
E.dialog.open('Internal linking', $button_form, 'fadeIn');
$('input#edit-link-text').val( S );
Drupal.attachBehaviors($button_form);
";
?>

variable_get() – важен, т.к. вариант с drupal_get_form() в данном случае приводит к непредсказуемым результатам и его использовать нельзя.

drupal_to_js() – важен, т.к. иначе форма выдается в неадаптированном для js виде.
Drupal.attachBehaviors() – важен, т.к. без этой функции форма не слушается и плохо себя ведет.

Все

По идее, этого достаточно, чтобы начать экспериментировать. В оригинальном виде у меня используются две формы и, соответственно, все описанное сделано дважды в одном модуле. Если все это после доведения до ума выльется в новый модуль для BUEditor – будет приятно, и, надеюсь, не только мне.

Буду рад получить отзывы и предложения, а так же все сообщения об ошибках. В моем случае некоторые из них проявлялись через месяц-другой использования. Но в целом все довольно стабильно. Если нужен исходник – выложу или пришлю, но там почти все так же как описано.

Выглядит форма таким образом:

А результат ее использования не менее красив:

Прикрепленный файл Размер callbacks_form.png 6.79 кб callbacks_form_2.png 34.29 кб

Источник: http://www.drupal.ru/node/61991

Запретить просмотр определенного типа контента

Есть тип материала ‘diary’. Нужно разрешить доступ к нему только автору ноды.

Создаем простой модуль ‘diaryaccess’, в котором выполняем хук hook_node_access.

<?php
/**
 * Implements hook_node_access().
 *  
 */
function diaryaccess_node_access($node, $op, $account) {
  // If $node is a string, the node has not yet been created. We don't care
  // about that case.
  if (is_string($node)) {
    return NODE_ACCESS_IGNORE;
  }
  if ($node->type == 'diary' and $node->uid != $account->uid) {
    return NODE_ACCESS_DENY;
  }

  return NODE_ACCESS_IGNORE;
}?>

Источник: http://www.drupal.ru/node/61958

Модуль uc_sberbank

Модуль выставления счета “сбербанка”

функциональность

Создание платежки на базе шаблона
Защита платежки от просмотра третьими лицами
Сохранение платежки в личном кабинете.
Отправка платежки на почту клиента.
Отправка платежки на почту компании, на адрес. куда поступают письма с заказами.

Скачать http://css.mirocow.com/projects/sberbank/files

Реализация

1. Создание платежки на базе шаблона

Платежка формируется из JPG темплэйт файла. Заполнение платежки происходит с помощью imagettftext.
Данные платежки имеют защищенный вид хранения. Принцип формирования платежки аналогичен ImageCache.
Защита платежки строится след принципом. Создается каталог хранения платежек sites\default\files\sberbank.
В нем создаются каталоги с именем UID пользователя, в которых лежат хеши платежек вида 55_fe8a0ea4ce326398482061ad5eb1e58d.jpg.
Где fe8a0ea4ce326398482061ad5eb1e58d строится из md5(номера ордера + drupal_private_key), благодаря чему, хеши всегда будут иметь уникальный вид. (подбор хеша невозможен – защита от просмотра третьими лицами)

2. Сохранение платежки в личном кабинете

Для доступа к платежам используется URI вида http:// имя_сайта /sberbank/номер ордера.jpg. Данная ссылка и сама картинка выводится в управляющем меню счета и доступна владельцу счета или администратору магазина.

3. Отправка платежки на почту клиента
Для шаблона писем формируются токены след вида: защищенный и прямой
Примеры:

* http:// имя_сайта /sites/default/files/sberbank/58.png – защищенный
* http:// имя_сайта /sites/default/files/sberbank/5/55_fe8a0ea4ce326398482061ad5eb1e58d.jpg – полный путь до файла платежки

4. Отправка платежки на почту компании, на адрес. куда поступают письма с заказами

Данные формируются аналогично пункту 4
Требования

* Используемые модули (зависимости): Token
* Необходимые библиотеки: GD

Модуль настроен и работает тут http://motodart.ru

Подробнее тут: http://css.mirocow.com/projects/sberbank/wiki/Wiki

Прикрепленный файл Размер sberbank.gif 2.82 кб

Источник: http://www.drupal.ru/node/61778

Ubercart Alter Price

Сделал обещанный модуль.
что он себе представляет:
Модуль называется Ubercart Alter Sell Price. Находиться во вкладке ubercart – extra. Копируем – Включаем. Дальше в материале типа Product появляется возможность писать текст вместо Sell Price причем остается и сам Sell Price. Во вьесе есть дополнительное поле, которое выводит представление альтернативной цены, так и называется – Alter Sell Price.
Как работает во вьесе product – заменяем поле Product: Sell price на поле Product: Alter Sell Price. Нажимаем саве и будет нам щасье.
Product: Alter Sell Price – выводит текст продукта и если в настройках продукта снята галочка “Использовать Alter Sell Price” – то выводит реальную цену продажи.
В чем отличие от других: Альтернативную цену можно писать для каждого продукта разную.

p/s/ Это первый модуль – поэтому прошу строго не судить .. конструктивную критику приветствую..
Все всем спасибо.

Прикрепленный файл Размер ubercart_alter_price.zip 8.37 кб

Источник: http://www.drupal.ru/node/61512

Модуль FormSave: сохраняем отправки для любой формы

Всем привет!

Написал модуль для логирования отправок любых форм. Вы просто указываете id формы, и модуль прицепляется к ней сам. После этого, любая отправленная в форму информация будет сохранена в отдельной таблице базы данных, и в любое время ее можно будет посмотреть.

Зачем это нужно?

Вариант 1. Отслеживание введенных значений. Не всегда вся введенная в форму информация сохраняется. Бывает, что на ее основе делаются какие-либо вычисления, и в базу сохраняются только результаты этих вычислений. Если вы хотите посмотреть, что же было введено в качестве исходных данных, то этот модуль для вас.

Вариант 2. Вы разрабатываете большую, сложную форму, многоступенчатую да с аяксом. А то и не одну и не две, в рамках какого-либо проекта. Или нескольких проектов. Чтобы не писать для каждой из этих форм свой отдельный submit-хендлер, который может быть просто огромным, да и во многом одинаковым для подобных форм, вы просто прицепляете этот модуль, и всю работу по сохранению введенной информации он берет на себя. В модуле предусмотрено API для этого.

Немного подробнее можно прочитать на странице модуля  formsave (он пока в песочнице).

Немного скриншотов:

Скриншот экрана настроек

Скриншот списка отправок

Скриншот одной отправки

Если вы хотите видеть этот модуль в качестве полноценного проекта на drupal.org, отпишитесь, пожалуйста, в этой заявке на получение статуса Full project. то добро пожаловать на страницу проекта  formsave

Источник: http://www.drupal.ru/node/61297

NewsMaker: инсталляционный профиль для перекрестного кросспостинга из LiveJournal в Drupal и обратно

Социальные сети в последнее время становятся всё более популярными и LiveLournal является одним из лидеров по числу пользователей.

Но известные события, в результате которых недавно ЖЖ был недоступен достаточно продолжительное время, обнажили суровую правду жизни: livejournal.com – это обычный сайт, с которым может произойти всё, что угодно и нет никаких гарантий, что Ваш блог на этой площадке или его содержимое “внезапно” не уйдет в небытие. Подобное встречается в ЖЖ сплошь и рядом.

Впрочем, вылететь может и Ваш stand-alone блог. К примеру, можно элементарно забыть продлить регистрацию домена (что случилось недавно с хаброй) или, не дай Бог забыть продлить хостинг. При этом в лучшем случае Ваш сайт будет недоступен некоторое время, а в худшем случае хостер может вообще снести его со всем содержимым.

Запасной аэродром для сохранения контента и юзеров в этом случае придется как нельзя кстати. Данный факт и был одним из мотивов для создания этой сборки.

Инсталляционный профиль NewsMaker предназначен как для ЖЖ блогеров, так и для владельцев независимых сайтов. Он позволяет в автоматическом режиме дублировать сообщения из Вашего stand-alone блога, сделанного на Drupal в Ваш блог или комьюнити на площадке LiveJournal. Аналогично Вы можете сохранять сообщения из Вашего ЖЖ в Ваш блог на Drupal, то есть зеркалить их.

Установка и настройка

Несмотря на то, что в этом профиле применен нестандартный инсталлятор, разработанный и реализованный моим партнером Валентином Ворониным http://shaman.asiadata.ru, его установка не отличается от стандартной друпальской.

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

На первом этапе установки сайта выберите инсталляционный профиль “NewsMaker”

Дальше установка происходит как обычно.

Если Вы хотите не только отправлять сообщения из своего блога на Drupal’e в LiveJournal, но и импортировать посты и комментарии, публикуемые в Вашем ЖЖ, на Ваш друпал-сайт, то на Вашем сервере должны быть установлены Perl модули, необходимые для правильной работы модуля LJsync.
Если же Вам нужен только кросспостинг в ЖЖ, то после инсталляции и входа на сайт просто отключите LiveJournal Sync в /admin/build/modules.

Дальнейшая настройка сводится к следующему:

Зайдите в свой профиль /user и укажите там свой логин и пароль доступа в LiveJournal

Зайдите в настройки модуля LiveJournal Sync /admin/settings/ljsync (если Вы решили его использовать) и нажмите кнопку “Вернуться к исходным” Здесь же Вы можете выбрать нужный формат импорта данных, словарь для импортируемых тегов и тип материала для импорта.

Зайдите по ФТП в папку Вашего сайта /sites/default/files/ljsync и создайте там файл вида логин_жж-lj.xml (тот, что Вы указывали в своем профиле).

На этом процесс установки и настройки можно считать завершенным. Да, и не забудьте установить права доступа 777 к папке /tmp в корне сайта.

Возможности, которые Вы получаете

Помимо перекрестного кросспостинга, о котором написано выше, Вы получаете еще ряд дополнительных возможностей:

Домашнюю страницу aka igoogle c возможностью включения, сворачивания, перетаскивания блоков

Удобный Wysiwyg текстовый редактор для добавления и редактирования материалов, с возможностью внутренней перелинковки и мультизагрузкой файлов любых типов, причем не только изображений (расширения загружаемых файлов, их размеры, объемы можно настраивать через админку). При изменении размера изображения автоматически формируется ссылка от уменьшенной копии к исходному изображению.


Простой способ подключения неограниченного количества лент новостей, причем не только из LJ, но с любого другого сайта, имеющего RSS ленту. При этом в анонсах новостей автоматически ограничивается количество символов, изображения уменьшаются, дубли новостей удаляются. Впрочем, есть возможность просмотра новостей в исходном виде или в виде заголовков.

В сборке предварительно настроены роли, которые вы можете давать своим пользователям.

Роли позволяют вам настроить безопасность и администрирование Вашего сайта на Drupal. Роли определяют группы пользователей, которые имеют некоторые привилегии, определяемые правами доступа.

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

Зарегистрированный пользователь: автоматически назначается всем пользователям, вошедшим на сайт со своим именем и паролем или по OpenID. По умолчанию имеют возможность только добавлять комментарии.

Автор: имеет возможность добавлять записи в свой блог и управлять ими. Владельцу блога рекомендуется создать для себя дополнительный аккаунт с этой ролью и постить из него.

Модератор: может удалять записи всех авторов.

Редактор: помимо удаления может редактировать все записи.

Администратор: имеет расширенные права для управления настройками сайта.

Разработчик: кроме доступа к настройкам имеет возможность работать с PHP скриптами на сайте.

User#1: Назначает права доступа для ролей и имеет доступ ко всем настройкам.

Имеющиеся проблемы

Так и не решена окончательно проблема в модуле LJsync с дублями записей, отправляемых из ЖЖ в Drupal. Пока что дубли удаляются постфактум самописным модулем, запускаемым по крону. В дальнейшем постораемся решить эту проблему более корректно.

Не публикуются комментарии к записям, изначально публикуемыемым в сайте на Drupal, а потом отправляемым в ЖЖ.

Буду благодарен, если сообщество поможет с решением этих проблем.

Пример работающего на этой сборке сайта: http://newsmaker.su/

Скачать инсталляционный профиль можно у меня в блоге

Там же будут размещаться все модификации и обновления этого профиля.

UPD Во второй версии сборки добавлена интеграция на уровне API c социальными сетями Vkontakte, Мой Мир @ Mail.ru, Facebook, Twitter. Теперь Вы можете отправлять свои сообщения не только в ЖЖ, но и в вышеперечисленные соц.сети. В отличие от стандартного кросспостинга в Facebook и Twitter через LJ, в случае применения этой сборки вы можете добавлять свои комментарии и хэш-тэги к своим записям. Решены проблемы с дублями постов и комментариев.

Актуальная версия

newsmaker-6.x-2.0-rc1.tar.gz (10.32 Мб).

http://ipload.ru/file/9113

или

newsmaker-6.x-2.0-rc1.zip (12.85 Мб).

http://ipload.ru/file/9113

————предрелизы————————

newsmaker-6.x-1.0-beta3.tar.gz (10.78 Мб).

http://www.ipload.ru/file/9095

или

newsmaker-6.x-1.0-beta3.zip (13.1 Мб).

http://www.ipload.ru/file/9094

newsmaker-6.x-1.0-beta2.tar.gz (10.38 Мб).

http://ipload.ru/file/9082

или

newsmaker-6.x-1.0-beta2.zip (12.61 Мб)

http://ipload.ru/file/9081

newsmaker-6.x-1.0-beta1.tar.gz (10.34 Мб)

http://ipload.ru/file/9073

или

newsmaker-6.x-1.0-beta1.zip (12.57 Мб)

http://ipload.ru/file/9074

Источник: http://www.drupal.ru/node/60990

Я люблю Drupal 7 (создаем кататалог для drupal commerce)

Поставил drupal commerce, потыкал несколько дней, понял – весч! Все круто, все легко и гибко настраивается, легко имортируется из csv и xml при помощи модуля feeds. Вообщем то что надо! за одним НО, как мать его создать каталог?

Пробовал ставить разные модули, искать решение на d.org – ничего толового не нашел, побился головой об стену, и полез во …. views

Приступаем:
1) идем на страницу admin/structure/taxonomy и созадем словарь catalog
– на странице admin/structure/taxonomy/catalog/fields добавляем поле c изображением, например, imagecatalog
– добавляем термины, загружая и зображения и создавая иерархию словаря
2) идем на страницу admin/structure/views и включаем представление Taxonomy term
3) идем на страницу admin/structure/views/add и создаем новое представление

выбираем показатель – термины таксономии, и тип – наш словарь catalog

задаем заголовок страницы
путь ставим taxonomy/term/%
отображение ставим grid (сетка)
элементов для отображения ставим 12 – так как по умолчанию в grid 4 столбца, соответственно указываем значение кратное 4

нажимаем “продолжить и редактировать”

4) начинаем редактировать представление:
4a) в блок “Fields” добавляем поле изображение “imagecatalog”, настраиваем его по своему вкусу
расскрываем правую колонку ‘Advanced’
4б) добавляем Contextual filters

указываем значение – Таксономия: вложение

и добавляем ставим галлку – чтобы при не существующем термине показывалась 404 ошибка (этого можно не делать)

Сохраняем фильтр

таким образом мы перекрыли отображение страницы термина. Теперь по адресу taxonomy/term/id_термина будут отображаться его дочерние термины с их изображениями в виде сетки.
Но если у термина не будет дочерних терминов – ничего отображаться не будет. Такая ситуация нас не устраивает, поэтому делаем следующее:
5) Добавляем no results behavior

ставим галку возле views area

нажимаем далее и указываем какое представление может будет выводиться если у термина нет дочерних терминов, а именно taxonomy_term Dispaly: default
не забываем отметить inherit cotextual filters – это означает что аргумент (id термина) будет передаваться представлению, которое будет вызываться.

сохраняем поле, сохраняем представление.

Как это работает?
если у термина есть дочерние термины – грузится вид catalog
если нет – грузится вид taxonomy term
если использовать с модулем taxonimy menu – получается каталог как на сайте ситилинка

Как сделать пункт меню?
вариант 1: делаем все термины таксономии дочерними какого-то одного, и указываем в меню ссылку на этот термин
вариант 2: берем модуль taxonomy menu, и выводим в блоке ссылки на категории

Ожидаемые проблемы:
1) На странице термина не отображаются его дочерние термины
Причина: представление taxonomy term перекрывает по весу наше представление
Выход: отключить отображение page у представления taxonomy term

2) Помимо словаря catalog есть другие словари, для них должно быть свое отображение
Выход: ждем, иди сами портируем модуль taxonomy redirect
- задаем разные пути для разных словарей
- клонируем представление taxonomy term, меняем в нем путь на заданный в taxonomy redirect
- меняем представление catalog – указываем новые пути, и меняем no results behavior на новое представление

Прикрепленный файл Размер 1.png 10.72 кб 2.png 14.02 кб 3.png 14.1 кб 4.png 8.96 кб 5.png 8.25 кб 6.png 13.07 кб 7.png 6.52 кб 8.png 6.65 кб

Источник: http://www.drupal.ru/node/60911

Потестим кнопочку? (Простой вариант интеграции elFinder в CKEditor)

UPD. Как выяснилось из комментариев, модуль ckeditor с версии 6.x-1.3 официально поддерживает elfinder. Таким образом, всё написанное относится к возможному способу вывода “быстрой” кнопки elfinder’a на тулбар.

UPD2(08/05/2011). Плагин доработан до автоматического определения типа файла, возвращаемого elFinder

Нужен был файлменеджер/мультизагрузчик для редактора CKeditor (именно для drupal-модуля).

Я обычно использую IMCE и стал искать дополнения к IMCE, поддерживающие мультизагрузку.
Нашёл только IMCE Swfupload, но он ещё в бета-стадии и требует установки дополнительных модулей. В общем, не устроил.

Зато как-то неожиданно открыл для себя elFinder.

Менеджер показался очень удобным (на мой взгляд, даже получше IMCE).
Мультизагрузка, drag&drop, создание-удаление директорий, файлов. Автоматические тамбы картинок, ну и в целом как-то юзабельнее выглядит.

CKEditor (по крайней мере 6.x-1.3) позволяет интегрировать IMCE как “быструю” кнопку на тулбар (отдельно от диалога выбора ссылки/картинки/файла). Просто нужно раскомментировать соответствующие определения в ckeditor.config.js и убедиться что присутствует папка imce в /modules/ckeditor/plugins

Я стырил это решение и наскоро адаптировал его под elFinder в виде скромного плагина-кнопки (elFinder).
Результат: на тулбаре имеется самодельная кнопочка, по клику на которой сразу открывается окно этого файлового менеджера (т.е. минуя диалог выбора адреса).

После выбора файла (двойной щелчок или команда меню и т.д.) в менеджере, он закрывается и ссылка возвращается в CKeditor в обвязке тегов.

В общем, почти всё как в “обычном” elFinder или IMCE.

Желающие могут пойти дальше и доработать решение плагина. Для примера сравните код приложенного плагина и стандартного плагина кнопки IMCE (функция setFile()): /modules/ckeditor/plugins/imce/plugin.js

Потребуются модули:

- модуль CKEditor
- модуль elFinder
- сам файлменеджер elfinder (он отдельно от модуля).

Плагин кнопки в архиве приложен к посту. Описание установки – в файле README.TXT архива.

После установки не забыть установить необходимые разрешения ролям для доступа к elFinder, CKEditor (если вы это ещё не сделали).

Отображение кнопки не зависит от разрешений.
То есть – если вы запретили какой-то роли использовать elFinder, то кнопка не исчезнет с панели. Просто по клику на ней будет обычный “У вас нет прав для просмотра и т.д.”.

ps. И это… Отписывайтесь, пожалуйста, у кого что получилось. Будут доработки – велкам + респект и уважуха

Прикрепленный файл Размер elfinder.zip 2.72 кб

Источник: http://www.drupal.ru/node/60796

Правильная установка FCKeditor!

Так раз и навсегода.
Во первых модуль FCKeditor 6.x-2.1 работает с FCKeditor 2.6.6
УСТАНОВКА НА DRUPAL

скачать Drupal модуль управления FCKeditor 6.x-2.1 скачать распаковать папку “fckeditor” из архива в папку “/modules”

(на вашем сайте в папке “modules” должна появится папка fckeditor)

качать FCKeditor 2.6.6 скачать распаковать содержимое папки fckeditor архива в /modules/fckeditor/fckeditor

(не перепутайте и не создавайте еще одну папку, а копируйте содержимое архива)

ВКЛЮЧАЕМ FCKeditor

Заходим в ваш сайт как администратор выбираем пункт меню администратора модули в открывшемся разделе ищем одноименный модуль включаем модуль (выбираем галочкой и жмем сохранить) заходим в меню управление пользователями/роли выбираем роль Зарегестрированный пользователь, отмечаем галочкой fckeditor – использовать fckeditor, сохраняем права доступа заходим в меню настройки сайта, там выбираем fckeditor, если нет никаких сообщений идем к 9му пункту, если есть к следующему если выходит сообщение:

The FCKeditor component appears to be not installed correctly, because modules/fckeditor/fckeditor/fckconfig.js could not be found.
Please go to the Домашняя страница FCKeditor to download the latest version. After that you must extract the files to modules/fckeditor/fckeditor and make sure that the directory modules/fckeditor/fckeditor/editor and the file modules/fckeditor/fckeditor/fckeditor.js exist. Refer to the readme.txt for more information.
ПРОВЕРЬТЕ ПУНКТЫ 3 и 4 раздела установки, причем внимательно!!

ИДЕМ в ПРОФИЛИ (внизу написано крупно) к профилю Autorezed Зарегистрированный пользователь-(тот самый которому мы настроили роль в п.5 и 6.)жмем изменить, появляется окно настройки FCKeditor

И ТАК НАСТРОЙКА FCKeditor

первая вкладка Основные настройки здесь задаем имя профиля FCKeditor, кому разрешено пользоваться (можно определенной группе ролей запретить пользоваться модулем, другой разрешить, третьей разрешить использовать только в определнных местах и т.п * вторая вкладка Безопасность здесь мы задаем условия безопаности, фильтровать или не фильтровать код в FCKeditor третья вкладка Настройки видимости здесь мы указываем для какой страницы, раздела или области сайта можно включить модуль (эта часть ограничивает доступ к FCKeditor указанным в первой вкладке ролям пользователей) четвертая вкладка это Внешний вид редактора здесь настраиваем стиль отображения, скин эдитора пятая вкладка Редактор ввода здесь мы управляем режимом ввода (первая выборка действия редактора на Enter, вторая выборка действия редактора на SHift+Enter и т.п) шестая вкладка Настройки файлового браузера здесь выбираем через ккакой ф.б вы хотите загружать файлы, изображения и flash-ролики. седьмая вкладка Стиль и файлы шаблонов здесь управляем шаблонами отображения редактора и стилями

Ну вот вроде все..
единственно незнаю как настроить содержимое панели FCKeditora…

Attached poll “У вас получилось установить и включить:?”.
Register or login to poll
Results:
с первого раза: 1 голос
со второго раза: 2 голоса
с третьего раза: 1 голос
никак не получается: 1 голос

Источник: http://www.drupal.ru/node/60770

#autocomplete_path в элементах textfield

Иногда возникает необходимость для удобства ввода данных создать поле с автозаполнением(autocomplete field). Примерами таких полей могут быть виджеты для cck-полей Node reference i User reference.
Рассмотрим программное создание такого рода полей. Согласно Drupal Forms API reference свойство #autocomplete_path можно добавить только для элемента texfield. Это свойство определяет путь, по которому автоматически включенный JavaScript-код Друпала пошлет HTTP-запросы, используя JQuery.

Читать полностью…

Источник: http://www.drupal.ru/node/60563

Munin

Оглавление

Устанавливаем клиент и сервер

sudo apt-get install munin munin-node

переходим в каталог доступных плагинов munin

cd /usr/share/munin/plugins

скачиваем плагины для nginx

sudo wget -O nginx_request http://exchange.munin-monitoring.org/plugins/nginx_request/version/2/download sudo wget -O nginx_status http://exchange.munin-monitoring.org/plugins/nginx_status/version/3/download sudo wget -O nginx_memory http://exchange.munin-monitoring.org/plugins/nginx_memory/version/1/download

скачиваем другие плагины

sudo wget -O multimemory http://exchange.munin-monitoring.org/plugins/multimemory/version/3/download sudo wget -O sshd_log http://exchange.munin-monitoring.org/plugins/sshd_log/version/1/download sudo wget -O php5-fpm_status http://exchange.munin-monitoring.org/plugins/php5-fpm_status/version/1/download sudo wget -O mysql_connections http://exchange.munin-monitoring.org/plugins/mysql_connections/version/1/download sudo wget -O mysql_qcache http://exchange.munin-monitoring.org/plugins/mysql_qcache/version/1/download sudo wget -O mysql_qcache_mem http://exchange.munin-monitoring.org/plugins/mysql_qcache_mem/version/1/download

делаем плагины исполняемыми

sudo chmod +x nginx_request sudo chmod +x nginx_status sudo chmod +x nginx_memory sudo chmod +x multimemory sudo chmod +x sshd_log sudo chmod +x php5-fpm_status sudo chmod +x mysql_connections sudo chmod +x mysql_qcache sudo chmod +x mysql_qcache_mem

выходим из директории

cd ~

включаем плагины

sudo ln -s /usr/share/munin/plugins/nginx_request /etc/munin/plugins/nginx_request sudo ln -s /usr/share/munin/plugins/nginx_status /etc/munin/plugins/nginx_status sudo ln -s /usr/share/munin/plugins/nginx_memory /etc/munin/plugins/nginx_memory sudo ln -s /usr/share/munin/plugins/multimemory /etc/munin/plugins/multimemory sudo ln -s /usr/share/munin/plugins/sshd_log /etc/munin/plugins/sshd_log sudo ln -s /usr/share/munin/plugins/php5-fpm_status /etc/munin/plugins/php5-fpm_status sudo ln -s /usr/share/munin/plugins/mysql_connections /etc/munin/plugins/mysql_connections sudo ln -s /usr/share/munin/plugins/mysql_qcache /etc/munin/plugins/mysql_qcache sudo ln -s /usr/share/munin/plugins/mysql_qcache_mem /etc/munin/plugins/mysql_qcache_mem

Некоторые плагины имеет не unix формат, чтобы он заработал в Ubuntu открываем его

sudo vim /usr/share/munin/plugins/sshd_log

и пишем команду для vim редактора (не в документ пишем а именно команду)

:set ff=unix

Редактируем дефолтовый конфиг Nginx

sudo vim /etc/nginx/sites-available/default

Добавляем новые location для localhost

location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }   location /fpm-status { access_log off; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /fpm-status; include fastcgi_params; allow 127.0.0.1; deny all; }

Перезагружаем nginx

sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start

Далее, необходимо указать плагинам, куда ходить за статистикой и тому подобное

sudo vim /etc/munin/plugin-conf.d/munin-node

Добавляем следующее

[nginx*] env.url http://localhost/nginx_status env.ua nginx-status-verifier/0.1   [multimemory] env.os linux env.names nginx php5-fpm mysqld   [users] env.category users   [sshd_log] user root group root env.logfile /var/log/auth.log env.category users

Для работы статистики php5-fpm редактируем его конфиг

sudo vim /etc/php5/fpm/main.conf

Добавляем

pm.status_path = /fpm-status

Перезагружаем клиент Munin:

sudo /etc/init.d/munin-node restart

или

sudo service munin-node restart

Перезагружаем php5-frm

sudo /etc/init.d/php5-fpm restart

Добавляем хост

sudo vim /etc/nginx/sites-available/munin.example.ru

Вставляем примерно следующее

server { listen 80; server_name munin.example.ru; access_log /var/log/nginx/munin.example.ru.access.log;   auth_basic "Restricted"; auth_basic_user_file /etc/munin/.htpasswd;   location / { root /var/cache/munin/www; index index.html; } }

Включаем

sudo ln -s /etc/nginx/sites-available/munin.example.ru /etc/nginx/sites-enabled/munin.example.ru

Создаем файлик, где будут располагаться пользователи, для которых будет открыт доступ к графикам производительности (http://www.codeobsessed.com/encryption.php нужен пароль crypt(3)):

sudo vim /etc/munin/.htpasswd

Перезагружаем nginx

sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start

Теперь можно смотреть графики по адресу munin.example.ru

Прикрепленный файл Размер www_raven.zip 7.75 кб templates_raven.zip 28.68 кб

Источник: http://www.drupal.ru/node/60544

Почта

Оглавление

Содержать свой почтовый сервер, со всеми прибомбасами, такими как антивирусник, антиспам и так далее, оказалось слишком дорого в плане ресурсов, это будет плохо вписываться в имеющиеся 384М оперативки, даже при 512 я буду смотреть в сторону увеличения воркеров для fpm, увеличения памяти для скриптов (сейчас 1 воркер на 128М, что катострафически мало), также буду смотреть в сторону организации ускорителя и кеша… В общем только на конфигурации 1Gb оперативной памяти следует задуматься о развёртовании полноценного почтового сервера.

Я использую яндекс, т.к. в панели управления доменами у моего регистратора есть автоматическая привязка. Но можно пробовать завязывать на gmail или mail.ru

Меняем имя сервера (по умолчанию оно server), впринципе это нужно для полноценного почтового сервера, но пускай будет настроено правильно.

sudo vim /etc/hostname

Пишем название, например

sergei

Меняем хост

sudo vim /etc/hosts

Заменяем нули на реальный IP

0.0.0.0 sergei.example-d6.ru sergei

Перезагружаем ОС

sudo reboot

Смотрим на имя и хост

hostname hostname -f

Если после перезагрузки имя не сменилось, то надо идти в панель управления VDS если нет доступа к ней, то просить хостера сменить имя.

Установим нужные пакеты, которые настроены будут позже

sudo apt-get install postfix libsasl2-2 sasl2-bin

Отредактируем конфиг:

sudo vim /etc/postfix/main.cf

Исправляем:

mynetworks = 127.0.0.0/8, 192.168.0.0/16

Добавляем в этот же конфиг

smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/saslpass smtp_sasl_security_options = relay = smtp.yandex.ru relayhost = smtp.yandex.ru

Добавим файл /etc/postfix/saslpass:

sudo vim /etc/postfix/saslpass

smtp.yandex.ru admin@example-d6.ru:password

Закрепим изменения:

sudo postmap /etc/postfix/saslpass

Подправим php.ini:

sudo vim /etc/php5/fpm/php.ini

Находим строку sendmail_path и заменяем:

sendmail_path = sendmail -t -i -f admin@example-d6.ru

Перезагружаем fpm

sudo /etc/init.d/php5-fpm restart

Теперь должно всё работать, я проверял на контактной форме случайного сайта, т.е. не c example-d6.ru, а например example-d7.ru, чтобы убедиться что письма отсылаются с любого домена, а не только указанного в конфиге.

Источник: http://www.drupal.ru/node/60543

Cron

Оглавление

Нужно настроить cron для всех сайтов, в том числе и для технических. Периоды выбираются индивидуально для каждого сайта, но на технический я ставлю 1 раз в сутки, не смотря на то что в админке drupal’a ставлю проверять обновления раз в неделю…

Открываем для редактирования задачи cron’a

sudo crontab -e

Должно быть примерно так, третья строка (www.example-d6.ru) запускается каждую минуту чтобы убедиться сразу что работает, после чего надо выставить нормальное время, чтобы не завалить сервер если сайтов в мультисайтинге десяток, а то и не один…

45 2 * * * /usr/bin/wget -O - -q -t 1 http://technical.example-d6.ru/cron.php 15 3 * * * /usr/bin/wget -O - -q -t 1 http://technical.example-d7.ru/cron.php * * * * * /usr/bin/wget -O - -q -t 1 http://www.example-d6.ru/cron.php 35 3 * * /usr/bin/wget -O - -q -t 1 http://www.example-d7.ru/cron.php

Источник: http://www.drupal.ru/node/60542

D6 Установка

Оглавление

Создаём папочки в sites

www.example-d6.ru www.example-d6.ru/files www.example-d6.ru/modules www.example-d6.ru/themes www.example-d6.ru/tmp

Копируем в www.example-d6.ru из sites/default файл default.settings.php и переименовываем в settings.php
Также копируем в www.example-d6.ru robots.txt

Если сайт переносится, редактируется settings.php чтобы данные о базе были верны.
Если ставиться, новый сайт и он первый на связке, то настройки добавляются при установке, потом редактируются.
Если ставиться, новый сайт, но он уже не первый, то копировать settings.php удобнее из соседнего сайта связки, и изменить следующее

$db_url = 'mysqli: //и ваши данные о базе $db_prefix = array( 'default' => 'exampled6_', 'locales_meta' => 'shared_', 'locales_source' => 'shared_', 'locales_target' => 'shared_', ); $base_url = 'http://www.example-d6.ru'; ini_set('memory_limit', '128M');

Теперь остаётся только задать адрес

sudo vim /etc/nginx/sites-available/example-d6.ru

Заменяем на свой хост

server { listen 80; server_name example-d6.ru; rewrite ^ http://www.example-d6.ru$request_uri? permanent; #301 redirect }   server { listen 80; server_name www.example-d6.ru; access_log /var/log/nginx/example-d6.ru.access.log;   root /var/www/drupal6; index index.php;   if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?q=$1 last; }   error_page 404 index.php;   # hide protected files location ~* .(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(.php)?|xtmpl|svn-base)$|^(code-style.pl|Entries.*|Repository|Root|Tag|Template|all-wcprops|entries|format)$ { deny all; }   # hide backup_migrate files location ~* ^/sites/www.example-d6.ru/files/backup_migrate { deny all; }   # Static content location = /robots.txt { if (-f $document_root/sites/www.example-d6.ru/robots.txt) { rewrite . /sites/www.example-d6.ru/robots.txt; } break; }   location ~ ^(/sites/all|/sites/www.example-d6.ru)?/(modules|themes|libraries)/.*.(css|js|png|gif|jpg)$ { break; } location /misc/ { break; } location /sites/www.example-d6.ru/files/ { break; }   # Imagecache (http://drupal.org/project/imagecache) location /sites/www.example-d6.ru/files/imagecache/ { if (-f $request_filename) { break; } rewrite ^(.*)$ /index.php?q=$1 last; }   location ~ \.php$ { # fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php;   fastcgi_param SCRIPT_FILENAME /var/www/drupal6$fastcgi_script_name;   include fastcgi_params; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; }   ## Disable viewing .htaccess & .htpassword location ~ /\.ht { deny all; } }

Включаем

sudo ln -s /etc/nginx/sites-available/example-d6.ru /etc/nginx/sites-enabled/example-d6.ru sudo /etc/init.d/nginx restart

Источник: http://www.drupal.ru/node/60541

D6 Подготовка

Оглавление

Создаём пользователя drupal6

sudo /usr/sbin/adduser drupal6

Добавляем папки для ключей SSH

sudo mkdir /home/drupal6/.ssh

Генерируем ключи, сразу же предложит указать файл, он будет такой /home/drupal6/.ssh/id_rsa

sudo ssh-keygen -t rsa sudo mv ~drupal6/.ssh/id_rsa.pub ~drupal6/.ssh/authorized_keys sudo rm ~drupal6/.ssh/id_rsa sudo chown -R drupal6:drupal6 ~drupal6/.ssh sudo chmod 700 ~drupal6/.ssh sudo chmod 600 ~drupal6/.ssh/authorized_keys

Надо разрешить им доступ по SSH для заливки файлов по SFTP протаколу

sudo vim /etc/ssh/sshd_config

Должно быть примерно так

AllowUsers admin drupal6

Перезагружаем SSH

sudo /etc/init.d/ssh reload

Теперь создаём папку для сайта

sudo mkdir /var/www/drupal6 sudo ln -s /var/www/drupal6 ~drupal6/www sudo chown -R drupal6:drupal6 /var/www/drupal6

Логинимся от имени drupal6, например через FileZilla, и заливаем свежую версию ядра, создаём базу, пользователя базы и т.д через PhpMyAdmin

Теперь определяемся с адресами, у меня будет такая структура:
technical6.example-d6.ru – технический сайт который находится пожизненно в режиме “на обслуживании”. Здесь будут включены все модули которые есть в папочке all, следить за обновлениями модулей буду именно отсюда. Это позволит не включать вообще вообще ни на одном другом сайте в этой связке этот модуль, что несомненно ускорит админку этих сайтов. Будут ставиться переводы, таблицы для переводов будут шариться на все сайты связки. Так же на главную страницу будут выноситься ссылки на скрипт обновления каждого из сайтов мультисайтинга, что при установке обновлений ускорит работу.
www.example-d6.ru – первый сайт мультисайтинга, на шестёрке.

Источник: http://www.drupal.ru/node/60540

MySqlDumper

Оглавление

Ставим MySqlDumper (www.mysqldumper.net), его я использую для переноса баз данных, т.к. один сайт имеет запредельный размер, порядка 500М в несжатом виде, также ставлю на хостинг, там делаю экспорт, здесь импорт.

sudo mkdir /var/www/mysqldumper sudo ln -s /var/www/mysqldumper ~admin/mysqldumper sudo chown -R admin:admin /var/www/mysqldumper

Заливаем сюда скрипты, я например через FileZilla это делаю, а не через putty

Сразу поставим права, т.к. этого потребует скрипт установки.

chmod 777 /var/www/mysqldumper/config.php

Добавляем хост

sudo vim /etc/nginx/sites-available/mysqldumper.example.ru

Вставляем примерно следующее

server { listen 80; server_name msd.example.ru; rewrite ^ http://mysqldumper.example.ru$request_uri? permanent; #301 redirect }   server { listen 80; server_name mysqldumper.example.ru; access_log /var/log/nginx/mysqldumper.example.ru.access.log;   location / { root /var/www/mysqldumper; index index.php; }   location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/mysqldumper$fastcgi_script_name; include fastcgi_params; } }

Включаем

sudo ln -s /etc/nginx/sites-available/mysqldumper.example.ru /etc/nginx/sites-enabled/mysqldumper.example.ru

И перезагружаем nginx

sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start

Открыв в браузере mysqldumper.example.ru увидим install, проходим её. Нажимаем на “Create directory protection” например MD5. Для nginx нужен crypt(3) можно составить например здесь http://www.codeobsessed.com/encryption.php

Открываем файл с паролями и заменяем пароль на полученный через crypt(3)

vim /var/www/mysqldumper/.htpasswd

Но это не работает для nginx сервера, поэтому добавляем в конфиг

sudo vim /etc/nginx/sites-available/mysqldumper.example.ru

следующее

auth_basic "Restricted"; auth_basic_user_file /var/www/mysqldumper/.htpasswd;

т.е. получится примерно так

server { listen 80; server_name mysqldumper.example.ru; access_log /var/log/nginx/mysqldumper.example.ru.access.log;   auth_basic "Restricted"; auth_basic_user_file /var/www/mysqldumper/.htpasswd;   ...

И снова перезагружаем nginx

sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start

Источник: http://www.drupal.ru/node/60538

PhpMyAdmin

Оглавление

Устанавливаем нужные пакеты

sudo apt-get install phpmyadmin php5-mcrypt

В окошке не выбираем ничего просто жмём enter

Добавляем хост

sudo vim /etc/nginx/sites-available/phpmyadmin.example.ru

Вставляем примерно следующее

server { listen 80; server_name pma.example.ru; rewrite ^ http://phpmyadmin.example.ru$request_uri? permanent; #301 redirect }   server { listen 80; server_name phpmyadmin.example.ru; access_log /var/log/nginx/phpmyadmin.example.ru.access.log;   location / { root /usr/share/phpmyadmin; index index.php; }   location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin$fastcgi_script_name; include fastcgi_params; } }

Включаем

sudo ln -s /etc/nginx/sites-available/phpmyadmin.example.ru /etc/nginx/sites-enabled/phpmyadmin.example.ru

Забегая вперёд, после входа PhpMyAdmin будет жаловаться на установленный Suhosin, правим конфиг как рекомендовано в доках на PhpMyAdmin

sudo vim /etc/php5/conf.d/suhosin.ini

Должны быть следующие значения:

suhosin.sql.bailout_on_error = off suhosin.post.max_array_index_length = 256 suhosin.post.max_totalname_length = 8192 suhosin.post.max_vars = 2048 suhosin.request.max_array_index_length = 256 suhosin.request.max_totalname_length = 8192 suhosin.request.max_vars = 2048

так же логи не должны включать в себя sql

Далее отключаем предупреждение о возможных проблемах с suhosin

sudo vim /usr/share/phpmyadmin/libraries/config.default.php

В файле написано что мы не должны его менять, так что меняем только это значение, чтобы надпись не раздражала, так как мы выставили рекомендуемые параметры.

$cfg['SuhosinDisableWarning'] = true;

Перезагружаем php fpm и nginx

sudo /etc/init.d/php5-fpm restart && sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start

Теперь по адресу phpmyadmin.example.ru должна быть форма входа в PhpMyAdmin

Источник: http://www.drupal.ru/node/60537

MySQL

Оглавление

Устанавливаем нужные пакеты

sudo apt-get install mysql-server mysql-client php5-mysql

Правим конфиг чтобы уменьшить потребление памяти

sudo vim /etc/mysql/my.cnf

Находим раздел про InnoDB, и добавляем

skip-innodb

Перезапускаем mysql

sudo /etc/init.d/mysql restart

если не получится, то попробовать надо так

sudo service mysql restart

Потребление памяти уменьшилось, благодаря тому, что запущено теперь меньше процессов mysql

Перезапускаем php fpm т.к. мы поставили php5-mysql, который пока не работает

sudo /etc/init.d/php5-fpm restart

Источник: http://www.drupal.ru/node/60536

MemCache

Оглавление

Устанавливаем сам memcache

sudo apt-get install php5-memcache

Перезагружаем php5-frm

sudo /etc/init.d/php5-fpm restart

Источник: http://www.drupal.ru/node/60535

eAccelerator

Оглавление

Скачиваем во временную папку последнию версию и устанавливаем

cd /tmp/ sudo wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2 sudo tar xvjf eaccelerator-0.9.6.1.tar.bz2 cd eaccelerator-0.9.6.1 sudo phpize sudo ./configure --enable-eaccelerator=shared sudo make sudo make install cd ~

теперь редактируем и добавляем следующие строки, начиная после тега [PHP]:

sudo vim /etc/php5/fpm/php.ini

; eAccelerator configuration ; Note that eAccelerator may also be installed as a PHP extension or as a zend_extension ; If you are using a thread safe build of PHP you must use ; zend_extension_ts instead of zend_extension ;extension = "/usr/lib/php5/20090626/eaccelerator.so" zend_extension = "/usr/lib/php5/20090626/eaccelerator.so" eaccelerator.shm_size = "16" eaccelerator.cache_dir = "/var/cache/eaccelerator" eaccelerator.enable = "1" eaccelerator.optimizer = "1" eaccelerator.check_mtime = "1" eaccelerator.debug = "0" eaccelerator.filter = "" eaccelerator.shm_max = "0" eaccelerator.shm_ttl = "0" eaccelerator.shm_prune_period = "0" eaccelerator.shm_only = "0" eaccelerator.compress = "1" eaccelerator.compress_level = "9" eaccelerator.allowed_admin_path = "/var/www/eaccelerator"

Создаём директории с нужными права

sudo mkdir -p /var/cache/eaccelerator sudo chmod 0777 /var/cache/eaccelerator

Перезагружаем php5-frm

sudo /etc/init.d/php5-fpm restart

Источник: http://www.drupal.ru/node/60534

PHP

Оглавление

Нам понадобятся 2 библиотеки, закачаем последние версии и установим их

cd /tmp wget http://us.archive.ubuntu.com/ubuntu/pool/main/k/krb5/libkrb53_1.6.dfsg.4~beta1-5ubuntu2_i386.deb wget http://us.archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu38_3.8-6ubuntu0.2_i386.deb sudo dpkg -i *.deb cd ~

Обновим список репозиториев, для установки последней стабильной версии PHP

sudo vim /etc/apt/sources.list

Добавляем

deb http://php53.dotdeb.org stable all

Обновляемся и устанавливаем PHP с нужными пакетами.

sudo apt-get update sudo apt-get install php5-cli php5-common php5-suhosin sudo apt-get install php5-fpm php5-cgi sudo apt-get install php-apc php5-curl php5-dev

Редактируем конфиг для fpm, т.к. через него у нас будет запускаться FastCGI

sudo vim /etc/php5/fpm/php.ini

Вставляем следующий параметр

cgi.fix_pathinfo = 0

Правим конфиг для пакета php-apc

sudo vim /etc/php5/conf.d/apc.ini

Добавляем строку

apc.shm_size = 48

Чтобы не было падений php-fpm открываем этот конфиг

sudo vim /etc/php5/fpm/pool.d/www.conf

На самом деле динамические воркеры, это хорошо. Если мы даём каждому юзеру свой воркер это накладно при 2000 сайтов. Но у нас только VDS с 384М, а не сервак с 16 гигами, будет несколько юзеров, но с общими воркерами, для начала поставим 1, а когда будет всё настроено можно будет увеличивать если будут свободные ресурсы (На вторую конфигурацию с гигом памяти смело можно ставить 3, или вообще не трогать и оставить динамические). Так же хорошо для крона сделать отдельный воркер, это связано с тем что на моих сайтах долго выполняется cron, время каждого запуска расчитано, поэтому хватит и одного отдельного потока, для его бесперебойной работы, чтобы он не конкурировал с пользователями сайтов. Но всё это держим только в уме, а пока ставим 1 поток на всех.

pm = static pm.max_children = 1

Перезагружаем nginx и php5-frm.

sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start sudo /etc/init.d/php5-fpm stop sudo /etc/init.d/php5-fpm start

Создаём проверочный файл

sudo vim /var/www/index.php

И пишем такую строчку


<?php phpinfo(); ?>

Проверяем, должно всё работать.

Источник: http://www.drupal.ru/node/60533

Nginx

Оглавление

Смотрим установлен ли апач

dpkg -l | grep apache

Если установлен, то удаляем примерно так (будет зависеть от установленных пакетов):

sudo apt-get --purge remove apache2 apache2.2-bin apache2.2-common apache2-mpm-prefork apache2-utils apache2-doc

Устанавливаем nginx

sudo apt-get install nginx

Запускаем

sudo /etc/init.d/nginx start

Далее в браузере вводим IP своего VDS и видим надпись

Welcome to nginx!

* Если появилась ошибка 403, то на этом этапе не страшно, в одной из версий неправильный конфиг дефолтовый, что исправиться при установке PHP

Меняем дефолтовый конфиг

sudo vim /etc/nginx/sites-available/default

Заменяем содержимое файла на следующее

server { listen 80; server_name localhost; access_log /var/log/nginx/localhost.access.log;   ## Default location location / { root /var/www; index index.php; }   ## Images and static content is treated different location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ { access_log off; expires 30d; root /var/www; }   ## Parse all .php file in the /var/www directory location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; include fastcgi_params; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_intercept_errors on; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; }   ## Disable viewing .htaccess & .htpassword location ~ /\.ht { deny all; } }

Чтобы можно было добавлять много server_name в разных конфигах нужно добавить директиву server_names_hash_bucket_size в конфиге nginx в http блок

sudo vim /etc/nginx/nginx.conf

server_names_hash_bucket_size 512;

Источник: http://www.drupal.ru/node/60532

Подготовка ОС

Оглавление

Устанавливаем локаль

sudo /usr/sbin/locale-gen en_US.UTF-8 && sudo /usr/sbin/update-locale LANG=en_US.UTF-8

Обновляемся

sudo apt-get update

Ставим менеджер для обновлений

sudo apt-get install update-manager-core sudo do-release-upgrade

Ставим для обзора процессов и их потребления памяти ими, ставим htop

sudo apt-get install htop

используем очень просто

htop

Ставим утилиты разработки

sudo apt-get install build-essential

Если стоит 10.04 а не 10.10 то обновление делается так

Открываем файл менеджера обновлений для правки

sudo vim /etc/update-manager/release-upgrades

Заменяем

Prompt=lts

на

Prompt=normal

Обновляемся

sudo do-release-upgrade

Теперь должна быть версия 10.10

Источник: http://www.drupal.ru/node/60531

Подготовка сервера

Оглавление

Хостер установил уже Ubuntu Server 10.10 и даже поставил ssh и Apache 2.

Заходим через SSH как root, сразу меняем пароль на нормальный

passwd

Добавляем группу избранных, назовём её raccess

/usr/sbin/groupadd raccess

Открываем файл, для того чтобы нашу группу сделать “избранной”

/usr/sbin/visudo

Добавляем в конец файла, далее если не оговаривается, то всегда вставляется именно в конец.

## Allows people in group raccess to run all commands %raccess ALL=(ALL) ALL

Добавляем нового пользователя, пускай будет admin, но в теории хорошо как и группу называть по другому, это усложняет взлом подбором.

/usr/sbin/adduser admin

Добавляем его к ранее созданной группе

/usr/sbin/usermod -a -G raccess admin

Добавляем папку для ключей SSH

mkdir ~/.ssh

Генерируем ключи

ssh-keygen -t rsa

Делаем для нашего будущего аккаунта, где вместо нулей подставляем реальный IP адрес

scp ~/.ssh/id_rsa.pub admin@0.0.0.0: mkdir ~admin/.ssh mv ~admin/id_rsa.pub ~admin/.ssh/authorized_keys

Назначаем права нашему пользователю

chown -R admin:admin ~admin/.ssh chmod 700 ~admin/.ssh chmod 600 ~admin/.ssh/authorized_keys

Настраиваем SSH

vim /etc/ssh/sshd_config

Проверяем значения и меняем или добавляем строки если нет…

Port 10022 # Меняем на что нибудь между 1025 и 65536, это так же усложнит жизнь взломщикам. Protocol 2 PermitRootLogin no # отключаем запись для root пользователя UseDNS no AllowUsers admin # если пользователей несколько через пробел называем всех

В интернете предлагают сделать следующее, я пока не разобрался как потом залогиниться

PasswordAuthentication no

Создаём правила маршрутизации в файлике, чтобы после перезагрузки сервера настройки восстанавливались.

vim /etc/iptables.up.rules

Вставляем следующее, и меняем порт для SSH, который недавно ставили 10022, остальные не трогаем, в комментариях видно для чего они понадобятся.

*filter # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0 -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Accepts all established inbound connections -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Allows all outbound traffic # You can modify this to only allow certain traffic -A OUTPUT -j ACCEPT # Allows HTTP and HTTPS connections from anywhere (the normal ports for websites) -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT # Allows mysql -A INPUT -p tcp --dport 3306 -j ACCEPT # Allows fcgi -A INPUT -p tcp --dport 9000 -j ACCEPT -A INPUT -p tcp --dport 8521 -j ACCEPT # Allows SSH connections # # THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE # -A INPUT -p tcp -m state --state NEW --dport 10022 -j ACCEPT # Allows mail -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT # Allows ldap -A INPUT -p tcp -m state --state NEW -m tcp --dport 389 -j ACCEPT # Allows memcache -A INPUT -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT # Allows munin -A INPUT -p tcp -m state --state NEW -m tcp --dport 4949 -j ACCEPT # Allow ping -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # log iptables denied calls -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 # Reject all other inbound - default deny unless explicitly allowed policy -A INPUT -j REJECT -A FORWARD -j REJECT COMMIT

Чистим память

/sbin/iptables -F

Применяем наши правила

/sbin/iptables-restore < /etc/iptables.up.rules

Проверяем внимательно особенно наш порт SSH

/sbin/iptables -L

Для восстановления после перезагрузки создаём файл

vim /etc/network/if-pre-up.d/iptables

Вставляем следующее

#!/bin/sh /sbin/iptables-restore < /etc/iptables.up.rules

Разрешаем запускать этот файл

chmod +x /etc/network/if-pre-up.d/iptables

Перезагружаем ssh

/etc/init.d/ssh reload

Закрываем Putty, открываем заново поменяв порт. Заходим под admin

Теперь нельзя залогиниться как root…

Источник: http://www.drupal.ru/node/60530

Патч модуля для редиректа внешних ссылок Gotwo

Многим знаком модуль  gotwo. Он делает редирект внешних ссылок. Неудобство модуля в том что он использует нестандартный тег GO. Решил его поправить. Чтобы не было необходимости использовать нестандартные теги. Так-же в оригинальном модуле создавался новый элемент. Я же решил вносить изменения для редиректа в стандартный тег A если установлен класс GO.
Собственно сами изменения. Прошу указать на ошибки, если что не так.
Меняем только функцию _gotwo_link в файле gotwo.module
Было

<?php
function _gotwo_link($text, $filter) {
  $html_dom = filter_dom_load($text);

  $goNodesToRemove = array();
  foreach ($html_dom->getElementsByTagName('go') as $goNode) {
    // Clone <go> link to <a> link and keep all attributes intact.
    $linkNode = $goNode->ownerDocument->createElement('a');
    if ($goNode->attributes->length) {
      foreach ($goNode->attributes as $attribute) {
        $linkNode->setAttribute($attribute->nodeName, $attribute->nodeValue);
      }
    }

    // Clone all <go> child nodes inside the new <a> tag.
    while ($goNode->hasChildNodes()) {
      $childNodes = $goNode->childNodes;
      $linkNode->appendChild($childNodes->item(0));
    }

    // Verify if the url exists in the {gotwo} table. If the url is missing,
    // add the url with link title to the {gotwo} table.
    $href = $goNode->getAttribute('href');
    $title = $goNode->getAttribute('title');

    if (!empty($href)) {
      $linkNode->setAttribute('href', _gotwo_get_url($href, empty($title) ? NULL : $title));
    }

    // Insert the new $linkNode before the previous $goNode.
    $goNode->parentNode->insertBefore($linkNode, $goNode);

    // Save $goNode to remove array. We cannot remove the child here or the DOM
    // index will be cluttered and every second <go> link is not replacement.
    $goNodesToRemove[] = $goNode;
  }
?>

Стало

<?php
function _gotwo_link($text, $filter) {
  $html_dom = filter_dom_load($text);

  $goNodesToRemove = array();
  foreach ($html_dom->getElementsByTagName('a') as $goNode) {
    // Clone <go> link to <a> link and keep all attributes intact.
    if($goNode->getAttribute('class') == 'go') {
    $href = $goNode->getAttribute('href');
    $title = $goNode->getAttribute('title');
    if (!empty($href)) {
      $goNode->setAttribute('href', _gotwo_get_url($href, empty($title) ? NULL : $title));
    }
    
  }
  }

  // Now we are able to remove the child's without loosing the index.

  $text = filter_dom_serialize($html_dom);

  return trim($text);
}
?>

Источник: http://www.drupal.ru/node/60488

Экспорт в Яндекс.Новости

Сделал модуль для экспорта ленты сайта в Яндекс.новости.
Для views, с гибкими настройками маппинга полей. Под семерку.
Просьба потестить и рассказать про результаты проверки Яндексом ваших лент.
Баги – в issue tracker модуля, но можно и сюда.

http://drupal.org/project/ynews

Источник: http://www.drupal.ru/node/60373

Drupal, Ubercart, корзина и кеширование для анонимов

При выключенном кешировании аноним видит корзину как положено
При включенном кешировании и анониме с uid 0 корзина всегда показывается ссылкой
При включенном кешировании и анониме не 0 поведение корзины довольно непредсказуемо

Отключать кеш – не самая лучшая идея, не говоря уже о том, чтобы boost включить
вскрытие уберкарта показало, что uid 0 используется явно(кто бы сомневался) поэтому не 0 даёт такой результат

для начала запрещаем выдачу корзины анониму ссылкой
uc_cart.module

case 'view': // 0 = Default shopping cart block. if ($delta == 0) { $cachable = 0;

потом ставим модуль ajaxblocks и выводим блок корзины через него

теперь можно смело включать кеширование или даже ставить boost
uc_ajax_cart работает так же отлично

единственный минус – +1 асинхронный запрос к серверу, что при включенном бусте нивелируется полностью

UPDATE 0

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

и вариант для джедаев – написать свой модуль/php-код, который выводит блок правильно, можно даже сразу с аякс

также можно попросить разработчиков уберкарт вычислять $cachable с учётом флага админки, но когда это будет?

если активно кешировать, я не вижу способов обойтись без аякс

UPDATE 1
с мест подсказывают, uid анонима должен быть 0 всегда, при любых обстоятельствах, иначе поведение модулей, его проверяющих, может стать непредсказуемым
но случается, что при выливке дампа его срывает – причины лично для меня непонятные, исправляю специально для этого сделанным sql

UPDATE 2

с мест подсказывают, uc_ajax_cart 2.x-beta версии делает всё самостоятельно
если вы не боитесь, то можно использовать его

Источник: http://www.drupal.ru/node/60318

Новый модуль SMS v0.3

Обновил модуль SMS для отправки уведомлений через телефоны или GSM модемы
Добавил отсылку уведомлений при новых коментариях в авторской ноде, уведомления о ответах на комментари и уведомления о всём что происходит на сайте
Ссылка на настройки sms/subscribe/comment но почему то ни как табой ни как меню не отображается если кто сможет помочь – буду рад.
Версия 0.1 http://www.drupal.ru/node/60065
Версия 0.2 http://www.drupal.ru/node/60119

Прикрепленный файл Размер sms-0.3.zip 12.82 кб

Источник: http://www.drupal.ru/node/60206

Новый модуль SMS v0.2

Итак обновил модуль SMS – отправка сообщений через мобильный телефон или GSM модем с помошью GAMMU
Добавил следующее:
* Журнал смс
* Отправка про cron
* Вкыл/Выкл транслит – Соответственно 140 или 63 символа ограничиваю строку
* Модуль подписки на новые ноды
Собираюсь добавить:
* Включение определённой роли при привязке номера
* Уведомление о новых ЛС

Прошлая версия: http://www.drupal.ru/node/60065

Если кто то поможет выложить на drupal.org буду благодарен…

Прикрепленный файл Размер sms-0.2.zip 11.83 кб

Источник: http://www.drupal.ru/node/60119

On-Line видео через IP камеру

Возникло желание сделать трансляцию видео через IP-камеру.
Камера DSC-2121. Можно подключить напрямую к инету, в моем случае через домашний роутер DIR-320.
Далее пошли мучения с поиском и доработкой скрипта.
В результате получился такой код:

<DIV align=center> <object id="xplugApplet" classid="java:xplug.class" java_codebase="http://ХХХ.ХХХ.ХХХ.ХХХ" type="application/x-java-applet" archive="xplug.jar" name="xplugApplet" height="480" width="640"> <param name="archive" value="xplug.jar"> <param name="code" value="xplug"> <param name="codebase" value="http://ХХХ.ХХХ.ХХХ.ХХХ/dcsclictrl.cab#version=1,0,0,2609"> <param name="scriptable" value="true"> <param name="name" value="cvcs"> <param name="type" value="application/x-java-applet;version=1.6"> <param name="menuheight" value="40"> <param name="RemotePort" value="80"> <param name="Timeout" value="10000"> <param name="mayscript" value="true"> <param name="xmode" value="preview"> <param name="productID" value="DCS-2121"> <param name="profileid" value="3"> <param name="bg" value="0xd5dfea"> <param name="inittrigger" value="0"> <param name="imageWidth" value="640"> <param name="imageHeight" value="480"> <param name="webEvent" value="0"> <param name="pageContext" value="Basic Z3Vlc3Q6"> <param name="microphone" value="0"> <param name="speaker" value="0"> <strong> Ваш браузер не имеет встроенной поддержки Java Plug-in. <br> <a href="http://www.java.com/ru/download/manual.jsp"> Установите последнюю версию Java Plug-in отсюда. </a> </strong> </object> </DIV>

ХХХ.ХХХ.ХХХ.ХХХ – это IP Вашей камеры. Впрочем можно указывать и в “нормальном” виде – http://my_account.dlinkddns.com
На стороне клиента должна быть предустановлена Ява. Впрочем если ее не будет, появится сообщение с адресом закачки.
Проверял на ИЕ, Опере, Фоксе.
Пример реализации
(Не всегда работает. Для камеры нужен статический IP, а у меня псевдостатический, через www.dlinkddns.com)
В настройках камеры нужно создать пользователя guest с пустым паролем.

Источник: http://www.drupal.ru/node/60019

Видеозапись с веб камеры на сайте.

Как сделать возможность записи видео для сайта с Веб камеры

Пример модуля в работе

Задача:

Сделать для сайта, христианской направленности, возможность записи видео с Веб камеры для сохранения видео на сервере и автоматического создания страницы. Эта цель была поставлена для того, что дать возможность людям лишенных слуха (рукоговорящим), возможность рассказать о своей проблеме или о себе их родным языком – языком жестов. Часто на сайтах есть возможность использовать разные языки, но как быть, если твой родной язык – язык жестов, конечно можно сказать, что глухие (рукоговорящие) могут читать. Да это так, но не все глухие грамотные и они очень стесняются писать из за того, что они часто неправильно ставят или вовсе не ставят окончания. Поэтому и поставили цель, организовать видео для них. Ну, хватит объяснений, приступим к делу.

Как делали:
Во-первых, для разработки были предложены разные CMS (системы управления сайтом) и из всех возможных была выбрана CMS Drupal версии 7.
- она бесплатна
- подходит по требованиям
- и мы давно с ней работаем -)

И модуль Kaltura он как раз то, что нам нужно.

Теперь опишу процесс создания: Установили Drupal и необходимые стандартные модули, после этого включили все модули, из пакета Kaltura, но здесь мы встретились с определенной проблемой, а точнее, мы включили модули и ничего не произошло, оказывается

*! Модули нужно включать последовательно!

То есть, когда мы заливаем модуль в папку “modules/” на нашем сервере, в разделе “Модули” (”Modules”), мы увидим группу модулей, принадлежащих разделу Kaltura и
первым надо включить – Kaltura Module – это сам модуль,
сохраняем
затем – kaltura as CCK field позволяет создавать поле при создании материала(требует ССК),
сохраняем
и последний – Kaltura Media Views позволяет создавать просматриваемые видео, последние добавленные, лучшие.

Только после этих манипуляций мы увидели в разделе “Конфигурация” (”Configuration”), настройки этого модуля.

Внутренняя настройка модуля Kaltura:
Заходим в “Server Integration Settings”
* KALTURA TO DRUPAL NOTIFICATION SETTINGS – здесь настраиваем Адрес нашего сайта.
* Далее нам нужно зарегистрироваться идем на сайт www.Kaltura.org и регистрируемся, получаем наш Partner ID и пароль.
* Теперь в разделе Partner Info вводим наши данные ID, email и пароль. После этого должно произойти подключение. На этом с основными настройками разобрались.

Создаем тип материала для Видео Контента
Для удобства пользования, мы решили создать новый тип материала, в который и поместим поле для добавления видео, с помощью нашего установленного модуля. Конечно, можно было использовать уже имеющиеся типы материалов, добавив туда поле для загрузки видео файлов, но мы решили, что удобнее создать новый тип материала. И так приступим.

Для создания нового типа материалов нужно перейти в раздел “Структура” (”Structure”) -> “Типы материалов” (”Node Types”).
И мы увидим имеющиеся типы материалов, нажимаем на кнопку “Добавить тип” (”Add type”):
* В поле название вводим название данного типа, мы назвали “Видео контент” и в принципе можно сохранять.
* В разделе поля добавляем новое поле, которое называется “Kaltura Video Field” и в принципе все. Сохраняем.

Теперь мы имеем тип материала с возможностью добавить видео. Единственное, что нам нужно сделать это изменить права для того чтобы даже не зарегистрированный пользователь мог создать материал “Видео Контент” и вывести ссылку на создание этого материала, как это сделать я думаю вы поймете сами, если же нет – пишите.

Материал взят с сайта http://wde.kz

Источник: http://www.drupal.ru/node/59826

Модуль экспорта в ЯндексМаркет. Ещё один

Нацарапал свой модуль для экспорта в ЯндексМаркет. Причиной послужили жалобы народа на модуль yml_export, который был включён в мою бесплатную сборку интернет магазина OpenStore

yml_export прост и в этом, наверное, его сила, но он генерирует XML “налету”, что приводит к тому, что при большой товарной базе Яндекс не успевает забрать весь файл.

Кроме того у народа были некоторые проблемы с нулевыми родительскими категориями, что с точки зрения Яндекса неправильно. Не знаю, может это уже и пофиксилось Ну и наконец, у yml_export бедноваты настройки

Модуль Price Export тоже несложен, но обладает приятными фичами

1) Генерация статического .xml файла
2) Поддерживаются все теги упрощённого формата экпорта
3) Возможность выбора источника для тегов – словари или CCK поля
4) Возможность выбора включать только товары, которые активны на складе или всех их. В последнем случае корректно отрабатывается тег available – для товаров под заказ available=”false”
5) Возможность выбора пресета для картинки товара
6) Настройка пути, по которому доступен файл. Также можно качать напрямую с файловой директории

7) Рудиментная статистика: время последнего успешного создания, потраченное время на генерацию файла, количество обработанных товаров

3 режима генерации: вручную пымпочкой, по крону, при обновлении ноды

Файл проходит общую валидацию XML, Яша также ест его.

Ограничения:

не для большой товарной базы! Используется последовательный node_load() при формировании источника экпорта, что довольно затратно по ресурсам.

Качаем же

Источник: http://www.drupal.ru/node/59824

Видео уроки по Drupal

Доброго времени суток. Хочу представить наши видео уроки по Drupal 6, которые точно будут полезны начинающим
Ничего военного в них нет, но снималось с “душой” и стремлением перетянуть людей с других CMSок, в первую очередь с Joomla.

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

Источник: http://www.drupal.ru/node/59507

Кнопки ВКонтакте и Одноклассники для SexyBookmarks

Есть хороший модуль  SexyBookmarks, который позволяет сделать на сайте красивые кнопки для добавления материалов в различные сервисы. Но нет в нем особо популярных российских сервисов ВКонтакте и Одноклассники.
Решил добавить эти два сервиса.
Для этого нужно сделать небольшое изменение в файле sexybookmark.inc – добавить в массив, возвращаемый функцией sexybookmarks_sexybookmarks() следующие элементы:

<?php'vkontakte' => array(
      'title' => t('VKontakte'),
      'description' => t('Share this on !title'),
      'url' => 'http://vkontakte.ru/share.php?url={PERMALINK}',
    ),
    'odnoklassniki' => array(
      'title' => t('Odnoklassniki'),
      'description' => t('Share this on !title'),
      'url' => 'http://www.odnoklassniki.ru/dk?st.cmd=addShare&st.s=1&st._surl={PERMALINK}',
    ),?>

Плюс нужно скопировать два png файла (прилагаются) в папку images/icons
В результате в списке появятся иконки вышеупомянутых сервисов.

В действии можно увидеть здесь: http://www.happyho.ru/blog/2/11291

Если такой функционал кому-то интересен, а править модуль нет желания или умения, могу выложить модуль с изменениями.

Попробую написать на Drupal.org, может добавят эти кнопки в следующую версию модуля.

Прикрепленный файл Размер odnoklassniki.png 2.75 кб vkontakte.png 1.93 кб

Источник: http://www.drupal.ru/node/59299

Модуль простого календаря по материалам

В конце прошлого года (2010-го) для разработки одного сайта (вот он) потребовалось вставить туда календарь новостей. Требовалось что-то легкое, быстрое, что не будет грузить сайт сильно… Поискав по модулям и не найдя ничего путного, решил написать свой календарик с блекджеком и так далее…

В общем сделано было давно и уже позабылось, но приходит новое сообщение с drupal.ru с вопросом, как же реализован календарь на том сайте… Учитывая, что есть интерес к такому модулю, я сделал его его отдельным (раньше он был в связке с другими функциями сайта).

Собственно сейчас он отображает все типы материалов в календаре… Кому неудобно в файле модуля поменяйте $type на ваше условие для типа материала, например, $type = ’story’;. Лень было добавлять в настройку блока такое поле.

О, вспомнил. Модуль включается как блок и в нем ещё формируется страница типа /calendar/ГГГГ/ММ/ДД для отображения страницы с материалами за выбранный день

Темизация осуществляется через правку css-файла и спрайта со стрелками. Скрипт править не надо

Вот и всё, собственно… Юзайте на здоровье

Чуть не забыл! Файлик вот… Шестая версия друпала

UPDATE (01.04.2011)
Обновил модуль по просьбе  taru
Добавил выборку по типу материала и по полю CCK Date, для выбора материалов типа афиш
Добавил сохранение последнего месяца, чтобы не листать лишний раз.
Файл вот

За спасибо, приму копеечки на яндекс.деньги 41001896059641 или заказ на разработку новых модулей )))

Прикрепленный файл Размер russian_calendar.zip 7.78 кб russian_calendar_v02.zip 9.25 кб

Источник: http://www.drupal.ru/node/59020

Руководство по созданию draggable-интерфеса

Очень часто бывает нужно сделать сортировку нод по какому-то критерию. Для этого часто используются Views, Nodequeue, Flag и другие похожие модули. Но часто бывает так, что функционала этих модулей недостаточно для удовлетворения хитрых требований заказчика. Конечно можно сделать много nodequeue и рассказать заказчику, которая из них за что отвечает, но такая система с точки зрения юзабилити выглядит как минимум сомнительно. Другим вариантом решения может быть добавление cck-поля “weight” и вручную для каждой ноды выставлять ее вес и уже по нему сортировать. Но опять же при наличии тысяч нод данный способ не является решением проблемы.

Читать полностью…

Источник: http://www.drupal.ru/node/58883

Друпал 7 – шпаргалка по темизации

Источник: http://www.drupal.ru/node/58769

Drupal Install Profile

Наверняка все сталкивались с готовыми сборками сайтов на Drupal, когда после установки получаешь готовый сайт с набором необходимых модулей, своей темой и т.д. Существует большое количество таких сборок, среди них Open Atrium, Open Publish, Drupal Commons и т.п. Думаю возникал вопрос “А как это реализовано? или “Как это сделать?” Ответ на этот вопрос – Drupal Install Profile. И так, как создать свой установочный профиль. В основном инсталляционные профили создаются на основе существующего сайта.

Шаг 1. Подготовка файлов.

Создаем папку “modules”, в ней папку “contrib”, в которую копируем все необходимые для работы сайта модули. Создаем папку “themes”, в которой размещаем папку с нашей темой, например acquia_prosper, и набором .tpl.php и .js и .css файлов, созданных в процессе разработки сайта. Для включения некоторых особых элементов сайта в сборку, таких как views, типы контента, меню, роли, права доступа и т.д., используется модуль Features. Созданые “фичи” положим в папку “features” и разместим в папке “modules”.

Читать полностью…

Источник: http://www.drupal.ru/node/58705

Оптимизация изображений с помощью сервиса Smush.it

Smush.it использует методы оптимизации изображения  специфические для каждого формата, чтобы удалить ненужные байты из файлов изображений, а это значит что мы получаем оптимизацию изображений, не меняя их внешний вид или качество.

В интерфейсе нам доступны флешовый мультизагрузчик или загрузка по URL

После того как Smush.it обработает изображения,  на экране появится отчет

Все оптимизированые изображения потом можно сохранить в ZIP файле.Как видно из отчета, оптимизация для нашего примера составила 15.84%, что является потрясающим результатом, поскольку все изображения перед этим уже были оптимизированы другой программой. 

Источник

Источник: http://www.drupal.ru/node/58560

Drupal-day в Краснодаре в предверии 8 марта

Сегодня, точнее вчера, состоялся очередной Drupal Day в Краснодаре, основная тема – восьмое марта и заказчик из Омска.
Были два человека – я и Богдан. Женщин в нашем коллективе нет, поэтому праздник никто не испортил.
В программе мероприятиея были пиво и закуска, обсуждение важных вопросов таких как завышенные требования работодателей, XSS-уязвимости и то как порутать любой сервер.

Источник: http://www.drupal.ru/node/58552

XHprof – иерархический профайлер PHP от разработчиков Facebook


XHprof – это иерархический профайлер для PHP c HTML интерфейсом. Ядро написано на языке С (на уровне отчетов и интерфейса код уже весь на PHP), а для скачки доступно в виде экстеншина для PHP. Этот профайлер умеет собирать данные о использовании памяти, ресурсов процессора, количестве и последовательности вызовов функций, а так же inclusive time (время, потраченное на функцию и на все функции, вызванные из нее) и exclusive time(время, потраченное на функцию без учета времени на вложенные функции).

Дополнительно, XHprof поддерживает сравнение двух запусков (иерархический DIFF отчет) и умеет объединять несколько запусков для усреднения данных.

Читать полностью…

Источник: http://www.drupal.ru/node/58543

Заглушка для устаревших браузеров

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

Особенности и отличия от множества аналогичных модулей:
– Возможность изменить текст сообщения и ссылку на информационное видео
– Возможность изменить ссылки на сайты браузеров
– Поддерживает 5 основных браузеров: Opera, Safari, IE, Chrome, Firefox
– Возможность указать версии браузеров, начиная с которых браузеры не считаются устаревшими
– Не назойливое уведомление. После закрытия его “крестиком” больше не отобразится (cookie на период сессии)
– Автоматически обновляемая информация о браузерах. Очень точное определение версии.
– Поддерживает переводы

P.S. Дизайн взят отсюда и немного переработан. Надеюсь автор не обидится.
P.P.S. Буду рад помощи в выкладывании модуля (этого и еще нескольких) на drupal.org, что-то я никак не разберусь как это сделать.

Прикрепленный файл Размер oldbrowser-7.x-1.1-dev.zip 114.96 кб

Источник: http://www.drupal.ru/node/58413

10 Марта 2011 , Спб Друпал Кафей – Встреча друпалеров в Петербурге, просмотр презентаций, общение за чашкой Кофе, Чая, Пива

10 Марта в 19 часов в самом центре Петербурга, в удобном , уютном месте, состоится встреча представителей Друпал сообщества Санкт-Петербурга.

В программе
- Просмотр прямой трансляции друпал кафе из Киева презентации на тему как делать на друпал!
- презентации модуля для друпал, сделанного в Питере. Рассказ как вообще делать новые модули, и как делался тот что будет представлен.
- Свободная презентация – любой желающий может презентовать свой успех ( показать популярный модуль или проект)

- ЧАЙ КОФЕ, Пиво Музыка бар – поздравление представительниц прекрасного пола.

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

Встреча пройдет в баре ๏̯͡๏ БАР ФИЛИН ГУД/Feelin’Good!๏̯͡๏
Литейный пр., д.64/78. Тел. 907 53 56. Группа вконтакте: club8612867
( Угол Невского Литейного, во дворе напротив кофехауза , Можно приносить свой тортик пирожные Бар разрешил )

Источник: http://www.drupal.ru/node/58371

В помощь начинающим дизайнерам тем под Drupal


Заготовка в формате *.psd для создания дизайна под Drupal на базе 12-колоночной разметки по стандарту 960 Grid System. Надеюсь она окажется вам полезной. Файл к сожалению прикрепить не удалось, скачать его можно здесь

Источник: http://www.drupal.ru/node/58347

Модуль для подключения препроцессора Less

http://dl.dropbox.com/u/6717893/less.zip

Набросал модуль для автоматического подключения замечательного одноимённого препроцессора.
Поскольку в написании модулей и наглийском наречии слаб, прошу помощи в оформлении страницы помощи для него и readme.
Исправление идеологических ошибок тоже приветствуется.

Источник: http://www.drupal.ru/node/58323

Обновление с 6.x до 7.x версии

Перед тем как переходить на 7-ую версию друпала, ответьте на вопросы (самому себе):
Зачем вам это нужно? (если всё хорошо работает)
Настолько важен вам переход или стоит подождать? (к чему спешка..)
Возможно лучше пока остаться на 6-ой версии друпала? (Меньше проблем, всё более стабильно работает)

Обычно большинство разработчиков переходят на следующую версию через 6-12 месяцев (статистика приблизительная, по моим личным наблюдениям..). Например с 4-ой на 5-ую версию, составило примерно, от трёх до девяти месяцев, хотя кто-то, только через пару лет обновился

На данный момент, для 7-ой версии друпала имеется чуть более 1000 модулей. С одной стороны это много, с другой, ещё огромное количество модулей не адаптировано под 7-ую версию, а некоторые и не будут переделаны… (по разным причинам).

Перед тем как переходить на 7-ую версию, проверьте, чтобы были все нужные вам модули сделаны для 7-ой версии.

Скачайте все нужные вам модули и установите их локально вместе с 7-ой версией друпала! Проверьте на чистой установке, нормально они работают вместе или есть проблемы. Если есть возможность, сделайте чистую установку на своём хостинге (например, на поддомене), чтобы быть уверенным, что 7-ая версия друпала работает нормально на вашем хостинге и корректно работают модули.

Если есть проблемы, ищите решение (возможно надо поставить патч, для какого-нибудь модуля) или подождите с переходом.

Возможно это займёт час-два времени, но вы будете точно знать, что эти модули вместе работают на семёрке.

Список модулей перенесённых в ядро друпал 7.x – http://drupal.org/node/895314

Кстати, можно отследить по функциональности модулей, что нового в 7-ой версии…

Если вы используте свои модули, то здесь – http://drupal.org/update/modules (eng) можете прочитать как их обновить.

Так же можете прочитать, как обновить свой дизайн сайта – http://drupal.org/update/theme (eng)

Перед переходом на 7.x версию друпала, обновите до последней версии Друпала 6.x ваш сайт. Если вы используете версию 5.x, то обновите её сначала до 6-ой версии!

Обновление.

1) Создайте резервную копию базы данных и всех папок и файлов. Сохраните в таком месте, чтобы не удалить случайно Резервную копию базы данных делайте сторонней программой, а не модулем работающим в друпале! Используйте, например – http://sypex.net/ru/

2) Войдите на сайт под пользователем ID 1 (это первый пользователь который был создан, при создании сайта).

3) Перейдите в раздел – admin/settings/site-maintenance и переведите сайт в режим технического обслуживания.

4) Перейдите в раздел – admin/build/themes и включите по умолчанию дизайн сайта – Garland.

5) Перейдите в раздел – admin/build/modules и отключите все модули которые не входят в ядро друпала (обязательные и дополнительные).

Если есть модули, которые вы не будете использовать в 7-ой версии друпала, то можете их удалить на странице – admin/build/modules/uninstall (тем самым очистив базу данных от лишних таблиц). Чем больше удалите, тем лучше )

6) Удалите все файлы и папки, за исключением папки ’sites’ и входящих в неё файлов и папок. Другие файлы, которые вы создали в других местах, тоже сохраните на месте.

Если вы делали изменения в файлах .htaccess или robots.txt, то вам придётся повтороно внести изменения уже в новых файлах.

7) Если вы удалили какие-либо модули из базы данных на странице – admin/build/modules/uninstall то можете удалить файлы этих модулей из папки – sites/all/modules или в зависимости от того, где они у вас находятся…

Остальные модули оставьте на месте, даже если они несовместимы с Drupal 7.x.

Загрузите текущую версию друпал 7.x на ваш сервер.

9) Сделайте если нужно изменения в файлах .htaccess и robots.txt

10) Удалите файл – default.settings.php он находится в папке – sites/default/default.settings.php

11) Сделайте файл settings.php доступным для записи, чтобы в процессе обновления можно было внести изменения, под версию 7.x

Если для режима технического обслуживания вы прописывали строку – $conf['maintenance_theme'] = ‘ваш_дизайн’; – то удалите строку.

12) Запустите update.php он находится по адресу http://вашсайт.ru/update.php

Если вы не можете получить доступ к update.php, то выполните следующие действия:

– Откройте в текстовом редакторе файл settings.php
– Найдите строку – $update_free_access = FALSE;
– Замените её на – $update_free_access = TRUE;
– После того как обновление будет сделано, замените обратно TRUE на FALSE

13) Сделайте резервную копию вашей базы данных, после окончания процесса обновления.

14) Замените и обновите модули, которые не входят в ядро друпала (с запуском update.php до включения модулей и после включения).

15) Убедитесь, что в строке $update_free_access файла settings.php прописано FALSE. Можете прописать строку – $conf['maintenance_theme'] = ‘ваш_дизайн’; с вашим дизайном, для режима технического обслуживания.

16) Зайдите на страницу – admin/reports/status и убедитесь, что нет ошибок.

17) Включите по умолчанию свой дизайн сайта. (конвертированный под 7.x).

18) Сделайте резервную копию базы данных.

19) Зайдите на страницу – admin/config/development/maintenance и включите сайт в рабочий режим.

20) Проверьте настройки, правильный вывод блоков и тому подобное…

Если вы столкнулись с ошибками или проблемами во время обновления, то:
– Обратите внимание на любые сообщения об ошибках.
– Восстановите сайт в предыдущее состояние с помощью резервной копии базы данных, созданной до начала процесса обновления сайта. Не пытайтесь делать дальнейшее обновление сайта, если возникли проблемы при обновлении!

Более подробную информацию по обновлению сайта, можно найти на странице – http://drupal.org/upgrade (eng)

Если в вас живёт дух экспериментатора и новатора, если вы отличный специалист и любите исправлять ошибки, если ваш темперамент и характер не даёт вам спокойно спать или просто “не дала” жена, то можете смело обновляться до 7-ой версии друпала

В остальных случаях, подождите до лета…

P.S. Если будете обновляться, отпишитесь, как получилось..

Attached poll “Вы будете обновляться до 7-ой версии?”.
Register or login to poll
Results:
Хочу обновляться, но нет нужных модулей: 4 голоса
Хочу обновляться, но боюсь косяков: 3 голоса
Не хочу обновляться, геморроя с этим много: 3 голоса
Уже обновился: 2 голоса
А нафига вообще это нужно?: 2 голоса
Буду обновляться ближе к лету: 2 голоса
Буду обновляться примерно в конце года: 1 голос
Буду обновляться в ближайшее время: 4 голоса

Источник: http://www.drupal.ru/node/58265

Увеличения скорости загрузки странички: Content Delivery Network (CDN) и распараллеливание загрузки данных

Что такое CDN?

Кому и почему нужно использовать CDN?

Инфраструктура CDN & Drupal

Пример расширенной настройки CDN в друпале

Распараллеливания загрузки

читать

Источник: http://www.drupal.ru/node/58264

Disable vertical tabs (модуль для Drupal 7)

Привет всем! С переходом на Drupal 7 мне очень непонравилось то, что вертикальные закладки “vertical tabs” в наглую включили в ядро друпала и что самое ужасное – нигде в пользовательском интерфейсе это невозможно отключить. В то время как под D6 это был отдельный модуль, который можно было установить и включить по желанию.

После чего мною был сделан модуль, который при обработке форм везде где встречаются вертикальные закладки заменяет их на обычные поля “fieldset” как это было в Drupal 6 по-умолчанию.

http://drupal.org/sandbox/Dripman/1077122 – ссылка на сам модуль на drupal.org (качаем через GIT)

Или отсюда disable_vertical_tabs.zip

Прикрепленный файл Размер disable_vertical_tabs.zip 915 байтов

Источник: http://www.drupal.ru/node/58246

Модуль Elysia cron

Скрипт cron.php используется в Друпале для для работы поиска(индексация контента), отправки писем подписчикам, сбора rss-фидов и т.д. – модули сами могут давать задания для выполнения по расписанию.

На drupal.org присутствует немалое количество модулей, которые позволяют тем или иным образом взаимодействовать со скриптом крона. Наиболее популярными среди них являются: SuperCron и Poormanscron. Первый имеет неплохой набор настроек для автоматизации и планирования крон-задач и является очень перспективным, а второй из всех настроек может похвастаться только интервалом запуска скрипта cron.php. На мой взгяд наиболее правильным и удобным является модуль Elysia cron – этот модуль, благодаря своей исключительной гибкости и юзабельности серьезно уделывает конкурентов.

Полная статья »

Источник: http://www.drupal.ru/node/58184

Резервныe ApacheSolr серверa для Drupal’a

Во первых, что такое Apache Solr?
Apache Solr – это расширяемая поисковая платформа с открытым исходным кодом для от проекта Apache Lucene.

Почему Apache Solr?
Основными критериями выбора этой платформы для нас стало то, что Apache Solr оптимизирован для работы с большой нагрузкой и что репликация уже в составе ядра платформы, а это дает большие возможности для масштабирования.

На одном с проектов мы столкнулись с вопросом «А что будет если наш основной Solr сервер вдруг перестанет отвечать? Вся система поиска на сайте умирает?».

Полная статья »

Источник: http://www.drupal.ru/node/57760

Модуль для конвертации валют

Не так давно мной был написан один занятный модуль для быстрой конвертации валют между собой. Представляет из себя блок со списком валют и полем для ввода данных.

Модуль тянет по крону данные о валютах из банков на выбор – ЦБР или НБРБ (Российский и Белорусские центральные банки). Валюты можно включать или отключать, менять их местами. В качестве основной валюты можно использовать любую из представленных валют. В модуль встроены стили, который можно при необходимости отключить.

Модуль имеет довольно удобную и пользовательски-простую страницу с настройками. Устанавливается модуль просто – достаточно закинуть его в папку с модулями /sites/all/modules, потом перейти на сайте в раздел настройки модулей /admin/build/modules и включить. После данной операции в разделе с блоками /admin/build/block появится блок “Валютный конвертер”. Достаточно перетащить его в любой регион и (обязательно) запустить крон (для того, чтобы модуль получил данные из банков). После этого блок будет работать.

Настроить блок можно на странице /admin/settings/currency_converter. Здесь пояснения, я думаю, будут лишними. Не разобраться там невозможно

Модуль находится под активной разработкой, поэтому любые замечания и предложения только приветствуются.

Собственно, сабж:  currency_converter

Источник: http://drupal.ru/node/57336

Модуль для конвертации валют

Не так давно мной был написан один занятный модуль для быстрой конвертации валют между собой. Представляет из себя блок со списком валют и полем для ввода данных.

Модуль тянет по крону данные о валютах из банков на выбор – ЦБР или НБРБ (Российский и Белорусские центральные банки). Валюты можно включать или отключать, менять их местами. В качестве основной валюты можно использовать любую из представленных валют. В модуль встроены стили, который можно при необходимости отключить.

Модуль имеет довольно удобную и пользовательски-простую страницу с настройками. Устанавливается модуль просто – достаточно закинуть его в папку с модулями /sites/all/modules, потом перейти на сайте в раздел настройки модулей /admin/build/modules и включить. После данной операции в разделе с блоками /admin/build/block появится блок “Валютный конвертер”. Достаточно перетащить его в любой регион и (обязательно) запустить крон (для того, чтобы модуль получил данные из банков). После этого блок будет работать.

Настроить блок можно на странице /admin/settings/currency_converter. Здесь пояснения, я думаю, будут лишними. Не разобраться там невозможно

Модуль находится под активной разработкой, поэтому любые замечания и предложения только приветствуются.

Собственно, сабж:  currency_converter

Модуль разработан при поддержке Интернет-Маркетинга

Источник: http://www.drupal.ru/node/57336

Проба пера или первый мой модуль по Drupal 7

Вот и вышел долгожданный релиз Drupal 7. В целом продукт мне понравился, и для того, что бы получше изучить новое АПИ я решил постепенно перевести написанные мной модули под новую платформу. Первой ласточкой стал один из элементов модуля ccfilter – collapse text. Но, что бы было поинтересней, я не просто перевел его под D7, но и несколько расширил функциональность.

Новый модуль ccfcollpase позволяет встраивать при помощи специальных тэгов (аля BBCode) в материалы сворачиваемый/разворачиваемый текст.
По сравнению с версией для D6, данный фильтр позволяет вставлять вложенные элементы, кроме того предусмотрен блок врапера, который позволяет разворачивать/сворачивать все элементы находящиеся внутри данного врапера. Также можно установить с помощью дополнительных атрибутов индивидуально для каждого слайдера некоторые параметры поведения, как то скорость сворачивания/разворачивания и метод сворачивания/разворачивания (пока доступны три метода slide, fade, slidefade).

В дальнейшем данный фильтр будет использован как один из составляющих элементов ccfilter под D7.

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

Общий синтаксис:

/** * Структура обработки фильтра: * в треугольные скобки помещены не обязательные синтаксические конструкции * одинарные кавычки в параметрах обязательны, порядок параметров произвольный * ******************************************************************************* * <[сollapse-wrapper <hide|show> <title-show='Expand All' title-hide='Collapse all'>]> * [сollapse <attributes>] * <материал внутри слайдера> * <[сollapse <attributes>]> * <материал внутри вложенного слайдера> * <[/сollapse]> * <продолжение материала внутри слайдера> * [/сollapse] * <[/сollapse-wrapper]> ******************************************************************************* * опциональные атрибуты задают режим работы слайдера * если аттрибуты не установлены, то беруться предустановленные параметы в настройках фильтра * attributes = * <hide|collapsed|show|expanded> - определяют как будет выглядить слайдер * при загрузки страницы hide или collapsed - свернутый слайдер, * show или expanded - развернутый слайдер * <title-show='Expand'> - определяет префикс заголовка для разворачивания слайдера * <title-hide='Collapse'> - определяет префикс заголовка для сворачивания слайдера * <title=''> определяет постфикс заголовка слайдера * например для комбинации title-show='Показать' title-hide='Скрыть' title='материал' * для развернутого слайдера будет сформирован заголовок - Показать материал * и при сворачивании он будет меняться на - Скрыть материал * <speed-show='slow|fast'> <speed-hide='slow|fast'> - скорость разворачивания и * соответственно сворачивания слайдера, кроме значений slow и fast можно указать * число миллисекунд * <method-show='Slide|Fade|SlideFade'> - метод анимации при разворачивании * <method-hide='Slide|Fade|SlideFade'> - метод анимации при сворачивании * * [сollapse-wrapper <show|hide> <title-show='Expand All' title-hide='Collapse all'>] * ......- * [/сollapse-wrapper] * определяет контейнер для нескольких слайдеров, и добавляет ссылку c возможностью * развернуть или свернуть все слайдеры внутри контейнера * атрибут show hide - определяет начальное значение обработчика враппера */

Если атрибуты не проставлены (а все они необязательны), то их значения берутся из предопределенных значений определенных в настройке фильтра.
В атрибутах имеющих значение – обязательны одинарные кавычки.
Порядок и наличие атрибутов произвольный, если какой либо из атрибутов не определен, то его значение берется из предопределенного в настройках фильтра .
Значения по умолчанию:
title-show=t(’show’)
title-hide=t(’hide’)
title=”
speed-show=’fast’
speed-hide=’fast’
method-show=’slide’
method-hide=’slide’

Допускаются вложенные сполеры (т.е. внутри сполера вы можете расположить еще дополнительные сполеры), уровень вложенности технически не ограничен и определяется здравым смыслом и ограничениями дизайна (верстки) сайта.

Полный заголовок формируется как конкатенация префикса (title-show|title-hide) и заголовка (title)
Некорректность (нарушение структуры – парности тэгов) не отслеживается и может привести к непредсказуемым результатам (вплоть до краха верстки), поэтому кажется сомнительный включать данный фильтр в общедоступный формат ввода.

Так как данный сайт (имеется ввиду мой домашний сайт) все еще на D6, для экспериментов и тестирования я создал новый сайтик www.printarts.ru, примеры работы фильтра можно посмотреть на страничке http://www.printarts.ru/article/proverka-raboty-ccfcollapse-filtra

Жду отзывов и багрепортов тестирования данного модуля.

Оригинал материала на сайте www.hotel-prog.ru

Прикрепленный файл Размер ccfcollapse.zip 5.7 кб

Источник: http://drupal.ru/node/56981

Проба пера или мой первый модуль под Drupal 7 (добавлен функционал)

Вот и вышел долгожданный релиз Drupal 7. В целом продукт мне понравился, и для того, что бы получше изучить новое АПИ я решил постепенно перевести написанные мной модули под новую платформу. Первой ласточкой стал один из элементов модуля ccfilter – collapse text. Но, что бы было поинтересней, я не просто перевел его под D7, но и несколько расширил функциональность.

Новый модуль ccfcollpase позволяет встраивать при помощи специальных тэгов (аля BBCode) в материалы сворачиваемый/разворачиваемый текст.
По сравнению с версией для D6, данный фильтр позволяет вставлять вложенные элементы, кроме того предусмотрен блок врапера, который позволяет разворачивать/сворачивать все элементы находящиеся внутри данного врапера. Также можно установить с помощью дополнительных атрибутов индивидуально для каждого сполера некоторые параметры поведения, как то скорость сворачивания/разворачивания и метод сворачивания/разворачивания (пока доступны три метода slide, fade, slidefade).

В дальнейшем данный фильтр будет использован как один из составляющих элементов ccfilter под D7.

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

Общий синтаксис:

/** * Стркутра обрабоки фильтра * в треугольные скобки помещены не обязательные значения (сами они не нужны) * одинарные кавчки в параметрах обязательны, порядок параметров произволный * ******************************************************************************* * <[сollapse-wrapper <hide|show> <title_show='Expand All' title_hide='Collapse all'>]> * [сollapse <attributes>] * <материал внутри сполера> * <[сollapse <attributes>]> * <материал внутри вложенного сполера> * <[/collapse]> * <продолжение материала внутри сполера> * [/сollapse] * <[/сollapse-wrapper]> ******************************************************************************* * опциональные атрибуты задают режим работы сполера * если аттрибуты не установлены, то беруться предустановленные параметы в настройках фильтра * attributes = * <hide|collapsed|show|expanded> - определяют как будет выглядит сполер * при загрузки страницы hide или collapsed - свернутый сполер, * show или expanded - развернутый свернутый сполер * <title-show='Expand'> - определяет префикс заголовка для показа сполера * <title-hide='Collapse'> - определяет префикс заголовка для скрытия сполера * <title=''> определяет постфикс заголовка сполера * например для комбинации title-hide='Скрыть' title-show='Показать' title='материал' * для развернутого сполера будет сформирован заголовок - Скрыть материал * и при сворачивании он будет меняться на - Показать материал * <speed-show='slow|fast'> <speed_hide='slow|fast'> - скорость разворачивания и * соответственно сворачивания сполера, кроме значений slow и fast можно указать * число миллисекунд * <method-show='Slide|Fade|SlideFade'> - метод анимации при разворачивании * <method-hide='Slide|Fade|SlideFade'> - метод анимации при сворачивании * <hode='NumNode'> - содержимое сполера берется из ноды номер NumNode * содержимое создается во время создания текущей ноды и обновляется только в * случае сброса кэша * <ajax-hode='NumNode'> - содержимое сполера берется из ноды номер NumNode * содержимое подгружается через ajax при первом разворачивании сполера (если сполер свернут) * или при первой загрузке строницы (если сполер развернут) * если атрибут title не определен и есть один из атрибутов node или ajax_node, * то в качестве title будет использован заголовок ноды. * Нода в сполер загружается без комментариев и заголовка. * Вывод ноды определен через шаблон 'ccfcollapse-inline-node.tpl.php' * в шаблоне поставляемом с модулем также * скрыты массивы field_tags и links * * [сollapse-wrapper <show|hide> <title-show='Expand All' title-hide='Collapse all'>] * ......- * [/сollapse-wrapper] * определяет контейнер для нескольких сполеров, и добавляет ссылку c возможностью * развернуть или свернуть все сполеры внутри контейнера */

Если атрибуты не проставлены (а все они необязательны), то их значения берутся из предопределенных значений определенных в настройке фильтра.
В атрибутах имеющих значение – обязательны одинарные кавычки.
Порядок и наличие атрибутов произвольный, если какой либо из атрибутов не определен, то его значение берется из предопределенного в настройках фильтра .
Значения по умолчанию:
title-show=t(’show’)
title-hide=t(’hide’)
title=”
speed-show=’fast’
speed-hide=’fast’
method-show=’slide’
method-hide=’slide’

Допускаются вложенные сполеры (т.е. внутри сполера вы можете расположить еще дополнительные сполеры), уровень вложенности технически не ограничен и определяется здравым смыслом и ограничениями дизайна (верстки) сайта.

Полный заголовок формируется как конкатенация префикса (title-show|title-hide) и заголовка (title)
Некорректность (нарушение структуры – парности тэгов) не отслеживается и может привести к непредсказуемым результатам (вплоть до краха верстки), поэтому кажется сомнительный включать данный фильтр в общедоступный формат ввода.

Так как данный сайт (имеется ввиду мой домашний сайт) все еще на D6, для экспериментов и тестирования я создал новый сайтик www.printarts.ru, примеры работы фильтра можно посмотреть на страничке http://www.printarts.ru/article/proverka-raboty-ccfcollapse-filtra

Жду отзывов и багрепортов тестирования данного модуля.

Оригинал материала на сайте www.hotel-prog.ru


**************************************************************************
Обновил модуль.
**************************************************************************

Добавлен следующий функционал:
1. Два (взаимоисключающих) атрибута node=’N’ и ajax-node=’N’ (если указаны оба то работает node).
Данный атрибут позволяет подгрузить в сполер ноду с номером N (при этом содержимое между тэгами [сollapse][/collapse] не имеет значения, так как будет заменено на содержимое ноды.
Различие этих атрибутов следует из названия, первый (node) формирует материал сполера из ноды во время создания, второй на “лету” посредством подгрузки node через ajax.
У обоих методов есть свои достоинства и недостатки.
Особенности атрибута node:
- Если изменена включаемая нода, то в сполере она не измениться до момента сброса кэша или пересохранения самого материала включающего сполер с данной нодой.
+ Включенный статично материал доступен для индексации поисковиками
+ Более быстрая загрузка сполера
+ При отключенном в браузере js материал виден как статический текст

Особенности атрибута ajax-node:
+ Нода в сполер загружается единожды при первом разворачивании сполера
+ Материал в сполере всегда актуален (т.е. если изменилась включаемая нода, то материал в сполере тоже будет загружаться измененный)
-+ Поисковики и индексаторы не будут видеть материал скрытый в сполере (даже в том случае если установлен атрибут show)
- При отключенном в браузере js материал не будет виден

Особенности применения данных атрибутов:

Будет плохой идеей «зациклить» материал т.е. при помощи атрибута node (ajax-node) включит в текущий материал создаваемую ноду непосредственно либо опосредованно, через цепочку нод (например вы редактируете ноду № 5 и включаете в сполер ноду №3 а в ноде №3 в сполер включена нода № 5), т.е. избегайте рекурсии, скорее всего это приведет к падению сервера с 502 ошибкой, и может быть исправлено только убиением(редактированием) данной ноды непосредственно в базе (для экспериментаторов править надо таблицу {field_data_body} после чего сбросить кеш).

В параметры конфигурации добавлен параметр определяющий можно ли включать в сполер не опубликованные ноды (в принципе я подумал что будет хорошей идеей создать не опубликованные ноды как шаблоны для дальнейшего включения в сполеры),
если данный флажок не установлен и нода включенная в сполер снята с публикации, то в сполер вместо содержания ноды будет выведена информация об отсутствии ноды (если это статический метод загрузки, то только после очистки кэша)

Вывод ноды определяется шаблоном ccfcollapse-inline-node.tpl.php (который вы можете переопределить в своей теме), в шаблоне по умолчанию (который включен в данный модуль) отключен вывод тэгов ноды и линки (т.е. практически выводиться голый “body” ноды).

Комментарии включаемой ноды не попадают в сполер.

В качестве включаемой ноды можно включать ноду в свою очередь содержащую свои сполеры (в том числе и с атрибутам node/ajax-node)
Правда в случае с включением ноды содержащей ajax-node сполер на моей теме возникают какие-то проблемы с css но попробую разобраться (может это тема глючит).
Да и еще раз избегайте рекурсии прямой или косвенной.

Если у вас включен модуль path (pathauto) то в качестве параметра node/ajax-node
можно использовать и синоим (например “article/test_node”).

Если при использовании атрибутов node или ajax-node не использован атрибут title, то в качестве title будет использован заголовок включаемой ноды.
Данный заголовок всегда формируется статично, т.е. если вы изменили заголовок включаемой ноды, то надо или сбросить кэш, либо пересохранить сам материал.

2. Переменные в атрибутах теперь могут быть заключены не только в одинарные но и в двойные кавычки (но обязательно парные), это позволяет например создавать атрибуты типа “O’Вerly” или ‘ООО “Моя компания”‘.

Пример использования новых возможностей можно посмотреть по адресу

http://www.printarts.ru/article/collapse-test-load-node

Прикрепленный файл Размер Новая версия – ccfcollapse.zip 8.01 кб

Источник: http://www.drupal.ru/node/56981

CMLService 2.08 – Модуль обмена данными с 1С

Модуль обмена данными с 1С (использует формат данных CommerceML 2)

Настройки

Для облегчения интерфейса и для стабильности хода выполнения операций, импорт продуктов из 1С разделен на 3 этапа.

Операция удаления продуктов

Операция импорта продуктов из 1С

Операция импорта ценовых предложений из 1С

Импорт
# Удаление ранее импортированных товаров (batch process)
# Импорт в полуавтоматическом режиме категорий из 1С (batch process)
# Импорт в полуавтоматическом режиме позиций товара, с привязкой к категориям (batch process)
# Импорт ценовых предложений из 1с
# Автоматический импорт (возможен только с модулем 1С www.cmlservice.com)

Экспорт
# Экспорт заказов из 1С
# Экспорт контрагентов из 1С
# Автоматический экспорт (возможен только с модулем 1С www.cmlservice.com)

скачать

Источник

Источник: http://drupal.ru/node/56968

CMLService 2.08 – Модуль обмена данными с 1С

Модуль обмена данными с 1С (использует формат данных CommerceML 2)

Настройки

http://drupal.org/project/cmlservice (теперь и на .org)
https://bitbucket.org/mirocow/cmlservice (и на bitbucket.org)

Для облегчения интерфейса и для стабильности хода выполнения операций, импорт продуктов из 1С разделен на 3 этапа.

Операция удаления продуктов

Операция импорта продуктов из 1С

Операция импорта ценовых предложений из 1С

Импорт
# Удаление ранее импортированных товаров (batch process)
# Импорт в полуавтоматическом режиме категорий из 1С (batch process)
# Импорт в полуавтоматическом режиме позиций товара, с привязкой к категориям (batch process)
# Импорт ценовых предложений из 1с
# Автоматический импорт (возможен только с модулем 1С www.cmlservice.com)

Экспорт
# Экспорт заказов из 1С
# Экспорт контрагентов из 1С
# Автоматический экспорт (возможен только с модулем 1С www.cmlservice.com)

скачать

Источник

Источник: http://www.drupal.ru/node/56968

Новости проекта OpenStore

***OpenStore – это сборка готового интернет-магазина на основе Ubercart и Drupal***

Предистория
Сайт проекта
Скачать сборку
Тут мы ловим блох

В этой теме я буду информировать народ о последних новостях проекта.

Добрые вести на 6.02.2011

Вышла Openstore Beta 2. Версия представляет собой перебродивший прежний dev + 2 новых модуля:

Yml export производства товарища restyler. Честно говоря, я не сильно в восторге от этого модуля, он сильно прост (хотя возможно это плюс) да и принцип действия не особо нравится, к тому же, пришлось немножко подправить, но, тем не менее, респект и уважение автору.

Долгожданный модуль интеграции 1С с Уберкарт производства товарища Mirocow, а точнее его demo. Доступна полнофункциональная версия, но за деньги. Купить можно (и нужно) через меня. Покупая что-то через меня, вы поддерживате проект и энтузиазм мой, его творящий.

Качаем, торопливо отстранив только что откупоренный пивас

Важные объявления:

Разобрался в настройках Openstore сам и хочешь помочь другим? Нужны добровольцы для написания руководства пользователя интернет магазина на основе Уберкарт!

Сделал таки магазин с использованием сборки OpenStore?

Отправь своё детище на мыло openstore.org.ua@gmail.com c указанием своего логина на сайте проекта www.openstore.org.ua. Я размещу на этот магазин прямую ссылку с сайта проекта!

Источник: http://drupal.ru/node/56952

Новости проекта OpenStore

***OpenStore – это сборка готового интернет-магазина на основе Ubercart и Drupal***

Предистория
Сайт проекта
Скачать сборку
Багтреккер

Обновление от 27.03.2011

ВНИМАНИЕ

Проект заморожен в связи с переездом автора в США. В ближайшие как минимум 6 мес (начиная с апреля 2011) я вряд ли смогу хоть как-то заниматься этим проектом. Это значит, что как минимум на этот срок:

Не будут выходить никакие обновления
Не будут рассматриваться задачи в багтреккере, сам багтреккер будет закрыт во избежании спама.
Загрузки всё также будут доступны

Спасибо за понимание!

Источник: http://www.drupal.ru/node/56952

Drupal 7 и Приватные файлы

С чего все началось? С темы которая всех на этом форме мягко говоря удивила: “Прикрепить файлы к статье Joomla“. Несмотря на название, само содержимое топика (опуская слово Joomla) было вполне адекватным! А именно поставлена следующая задача.

Задача: Прикрепить к статье файл.

Основные требования:
1. Файл должен загружаться с компьютера автора, в процессе ввода текста. *Хороший пример – этот форум. Тут можно прикрепить файл непосредственно при вводе сообщения.
2. Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Дополнительные (не обязательные, но крайне жалетельные) требования:
1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать
2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации
3. Счётчик скачивания файла где-нибудь недалеко от ссылки “скачать”
4. Статика в админке, “кто, когда и что” скачал (это было бы вообе шикарно!)

Подопытным для всего этого как не странно стала не Joomla, а Drupal 7.

Сама задача для друпала не хитрая “Прикрепить к статье (материалу) файл” нам позволяет замечательная фишка семерки “Field API” т.е. по сути первый пункт основных требований выполнили. Идем дальше:

Цитата:

Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Это для меня был самый интересный вопрос, поэтому на нем я и заострю внимание.

Для начала нам надо настроить “файловую систему” первым делом надо создать приватную папку, где будут хранится все наши приватные файлы. Я сделал это следующим образом:

cd /путь/к/папке/с/установленным/друпалом/sites/default chmod 755 . mkdir files-private chmod 555 .

Для тех кто не в теме, расшифровываю. Сначала папке /sites/default задал права на запись, создал в ней папку, затем вернул права на “только доступ”. поскольку папку /sites/default/files по умолчанию отдана апачу, я решил не создавать приватную папку в ней, чтоб еще не писать правила для запрета апача гулять туда (хотя подозреваю что оповестить его о запрете все равно придется).
После этой процедуры вернемся в админку друпала, а именно идем по адресу admin/config/media/file-system и в настройках “Приватный путь файловой системы” вписываем только что созданную нами папку sites/default/files-private после чего сохраняем настройки.
Далее идем по направлению Структура » Типы содержимого » наш тестовый тип » Управлять полями создаем поле типа “файл” (для изображений аналогично) и в настройках указываем Хранилище Личные файлы сохраняем и смотрим что получилось.

Я минут 5 втыкал что за фигня получилась, вроде как файлы приватные загружаются в одну структуру, отдаются из другой, но отдаются всем подряд. После чего я начал гуглить… и первым делом нагуглил следующее:

Цитата:

Setting the download method to “Private” doesn’t have any effect by itself…
what the private download setting does do, is fire off an extra event, hook_download()

Тут кстати автор опЯчататься. На самом деле хук называется  hook_file_download
А вообщем это все можно перевести как “Сама по себе приватная файловая система ничего не делает т.е. по сути это api и которая дает один (может и больше, не интересовался) хук с помощью которого мы можем управлять скачиванием этих файлов. После чего я набросал модуль из двух хуков, один создает новое право для ролей  hook_permission, а второй тот самый  hook_file_download в котором указано что если у пользователя нет права на просмотр приватных файлов слать его лесом! Получившийся модуль искать в прикрепленных файлах.

После активации модуля идем на страницу прав пользователей admin/people/permissions и выдаем новое правило “View private files” кому положено качать приватные файлы т.е. зарегистрированным пользователям. На этом собственно второй пункт выполнен, все анонимы идут лесом.

Теперь идем по дополнительным пунктам:

Цитата:

1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать

Уже сделано.

Цитата:

2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации

В нашем модуле надо просто $uri прировать не к -1 а к странице регистрации.

3 и 4 пункты решает модуль  Download Count вот только портировать под 7-ку еще надо его. А вот это  Download Tools для семерки, но сам его не тестил.

Ну в общем-то тема раскрыта, комментируем.

Источник: http://drupal.ru/node/56888

Drupal 7 и Приватные файлы

С чего все началось? С темы которая всех на этом форме мягко говоря удивила: “Прикрепить файлы к статье Joomla“. Несмотря на название, само содержимое топика (опуская слово Joomla) было вполне адекватным! А именно поставлена следующая задача.

Задача: Прикрепить к статье файл.

Основные требования:
1. Файл должен загружаться с компьютера автора, в процессе ввода текста. *Хороший пример – этот форум. Тут можно прикрепить файл непосредственно при вводе сообщения.
2. Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Дополнительные (не обязательные, но крайне жалетельные) требования:
1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать
2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации
3. Счётчик скачивания файла где-нибудь недалеко от ссылки “скачать”
4. Статика в админке, “кто, когда и что” скачал (это было бы вообе шикарно!)

Подопытным для всего этого как не странно стала не Joomla, а Drupal 7.

Сама задача для друпала не хитрая “Прикрепить к статье (материалу) файл” нам позволяет замечательная фишка семерки “Field API” т.е. по сути первый пункт основных требований выполнили. Идем дальше:

Цитата:

Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Это для меня был самый интересный вопрос, поэтому на нем я и заострю внимание.

Для начала нам надо настроить “файловую систему” первым делом надо создать приватную папку, где будут хранится все наши приватные файлы. Я сделал это следующим образом:

cd /путь/к/папке/с/установленным/друпалом/sites/default chmod 755 . mkdir files-private chmod 555 .

Для тех кто не в теме, расшифровываю. Сначала папке /sites/default задал права на запись, создал в ней папку, затем вернул права на “только доступ”. поскольку папку /sites/default/files по умолчанию отдана апачу, я решил не создавать приватную папку в ней, чтоб еще не писать правила для запрета апача гулять туда (хотя подозреваю что оповестить его о запрете все равно придется).
После этой процедуры вернемся в админку друпала, а именно идем по адресу admin/config/media/file-system и в настройках “Приватный путь файловой системы” вписываем только что созданную нами папку sites/default/files-private после чего сохраняем настройки.
Далее идем по направлению Структура » Типы содержимого » наш тестовый тип » Управлять полями создаем поле типа “файл” (для изображений аналогично) и в настройках указываем Хранилище Личные файлы сохраняем и смотрим что получилось.

Я минут 5 втыкал что за фигня получилась, вроде как файлы приватные загружаются в одну структуру, отдаются из другой, но отдаются всем подряд. После чего я начал гуглить… и первым делом нагуглил следующее:

Цитата:

Setting the download method to “Private” doesn’t have any effect by itself…
what the private download setting does do, is fire off an extra event, hook_download()

Тут кстати автор опЯчататься. На самом деле хук называется  hook_file_download
А вообщем это все можно перевести как “Сама по себе приватная файловая система ничего не делает т.е. по сути это api и которая дает один (может и больше, не интересовался) хук с помощью которого мы можем управлять скачиванием этих файлов. После чего я набросал модуль из двух хуков, один создает новое право для ролей  hook_permission, а второй тот самый  hook_file_download в котором указано что если у пользователя нет права на просмотр приватных файлов слать его лесом! Получившийся модуль искать в прикрепленных файлах.

После активации модуля идем на страницу прав пользователей admin/people/permissions и выдаем новое правило “View private files” кому положено качать приватные файлы т.е. зарегистрированным пользователям. На этом собственно второй пункт выполнен, все анонимы идут лесом.

Теперь идем по дополнительным пунктам:

Цитата:

1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать

Уже сделано.

Цитата:

2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации

В нашем модуле надо просто $uri прировать не к -1 а к странице регистрации.

3 и 4 пункты решает модуль  Download Count вот только портировать под 7-ку еще надо его. А вот это  Download Tools для семерки, но сам его не тестил.

Ну в общем-то тема раскрыта, комментируем.

Источник: http://www.drupal.ru/node/56888

Guestbook for Drupal 7

Есть такой замечательный модуль Guestbook. Позволяет делать гостевую книгу для сайта и персональные гостевые для пользователей.
Подготовил версию для 7.x. В основу взял 6.x-2.0.
Удалена поддержка Panels.

Скачать можно здесь.

Источник: http://drupal.ru/node/56852

Guestbook for Drupal 7

Есть такой замечательный модуль Guestbook. Позволяет делать гостевую книгу для сайта и персональные гостевые для пользователей.
Подготовил версию для 7.x. В основу взял 6.x-2.0.
Удалена поддержка Panels.

Скачать можно здесь.

Источник: http://www.drupal.ru/node/56852

OpenADS for Drupal 7

Есть замечательный модуль OpenADS. Нужен для интеграции банерообменной системы OpenX c Drupal.

Подготовил версию для 7.x. В основу взял 6.x-1.0.
Тестировалась с OpenX 2.8.7, возможны глюки с другими версиями.
Скачать можно здесь

Источник: http://drupal.ru/node/56235

OpenADS for Drupal 7

Есть замечательный модуль OpenADS. Нужен для интеграции банерообменной системы OpenX c Drupal.

Подготовил версию для 7.x. В основу взял 6.x-1.0.
Тестировалась с OpenX 2.8.7, возможны глюки с другими версиями.
Скачать можно здесь

Источник: http://www.drupal.ru/node/56235

Предлагаю поддержать в twitter хэш-тег #drupal_ru

Здравствуйте!

С недавнего времени начал понемногу пользоваться твиттером. Там есть такое интересное понятие – хэш-тег, его использование позволяет пользователям отсматривать твиты определенной тематики, например твиты про ваш город или твиты про веб-дизайн.

Среди прочих хэш-тегов есть хэш-тег #drupal – которым пользуется сообщество drupal разработчиков со всего мира. Но есть особенность, дело в том что данным хэш-тегом пользуется преимущественно англоязычное сообщество, и просматривая твиты чувствуешь себя немного неуютно, хочется чтобы было по-русски.
Поэтому я начал в своих твитах про Drupal использовать хэш-тег #drupal_ru, и видимо пока только я один им пользуюсь.

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

Кроме того, если еще нет такого, то предлагаю создать модуль, позволяющий вести трансляцию твитов по хэш-тегу на сайте. Как например сделано тут www.uwdc.ru “Tweets #uwdc”.

Источник: http://www.drupal.ru/node/56173

Аргументы Views. Часть1. Вывод в блоке элемента текущей страницы

Хочу рассказать о своем опыте работы с некоторыми аргументами Views.
И о тех случаях где их можно эффективно применять.

Часть 2.

Задача. Нужно вывести в блоке картинки текущей страницы.
Причем чтобы потом блок можно перемещать из колонки в колонку (из региона в регион).
На месте картинок может быть все что угодно, что есть в содержимом страницы.

Создаем новый Вид, добавляем вывод Блок и в его настройках кон фигурируем что нужно вывести в настройках Полей.
При необходимости указывать фильтры страницы из которой это берется.

Преимущество данного метода в том, что Views можно точнее настраивать, чем стандартные методы вывода.

Настройка аргумента.

В списке блоков нужно этот блок поместить в нужный регион.

Надеюсь, это будет полезно тем, кто этого не знал.

Источник: http://drupal.ru/node/56000

Аргументы Views. Часть1. Вывод в блоке элемента текущей страницы

Хочу рассказать о своем опыте работы с некоторыми аргументами Views.
И о тех случаях где их можно эффективно применять.

Часть 2.

Задача. Нужно вывести в блоке картинки текущей страницы.
Причем чтобы потом блок можно перемещать из колонки в колонку (из региона в регион).
На месте картинок может быть все что угодно, что есть в содержимом страницы.

Создаем новый Вид, добавляем вывод Блок и в его настройках кон фигурируем что нужно вывести в настройках Полей.
При необходимости указывать фильтры страницы из которой это берется.

Преимущество данного метода в том, что Views можно точнее настраивать, чем стандартные методы вывода.

Настройка аргумента.

В списке блоков нужно этот блок поместить в нужный регион.

Надеюсь, это будет полезно тем, кто этого не знал.

Источник: http://www.drupal.ru/node/56000

Drupal 6 мультисайтинг на it-patrol (из серии “Радио – начинающим”)

Хотел, как лучше, а получилось опять 12 листов формата А4, поэтому здесь только анонс

В статье «CMS Drupal + AuthorIT против CMS Drupal + FCKeditor» было вскользь упомянуто об организации мультисайтинга связкой CMS Drupal + AuthortIT, в настоящей же статье:

* отчаявшимся выложена пошаговая инструкция по организации мультисайтинга на Drupal на хостинге it-patrol;
* любознательным разъяснена «физика» сотворенного;
* делаварам приведены количественные, качественные и эфемерные преимущества мультисайтинга;
* склонным к интригам повествовано о трагической судьбе председателя в условиях суровой социалистической действительности…

А сама статья здесь – http://tdocs.su/15050

ЗЫ. Напоминаю, что статья от начинающего для начинающих, поэтому прошу ногами сильно не пинать.

Attached poll “Интересен ли материал статьи?”.
Register or login to poll
Results:
Очень: 3 голоса
Да: 10 голосов
Не очень: 2 голоса
Нет: 1 голос
Я окончил МЭИ (МИФИ, МФТИ, МГУ, ВВИА им. Жуковского) и, будучи человеком деликатным, никогда не выберу предыдущую опцию!: 0 голосов

Источник: http://drupal.ru/node/55982

Drupal 6 мультисайтинг на it-patrol (из серии “Радио – начинающим”)

Хотел, как лучше, а получилось опять 12 листов формата А4, поэтому здесь только анонс

В статье «CMS Drupal + AuthorIT против CMS Drupal + FCKeditor» было вскользь упомянуто об организации мультисайтинга связкой CMS Drupal + AuthortIT, в настоящей же статье:

* отчаявшимся выложена пошаговая инструкция по организации мультисайтинга на Drupal на хостинге it-patrol;
* любознательным разъяснена «физика» сотворенного;
* делаварам приведены количественные, качественные и эфемерные преимущества мультисайтинга;
* склонным к интригам повествовано о трагической судьбе председателя в условиях суровой социалистической действительности…

А сама статья здесь – http://tdocs.su/15050

ЗЫ. Напоминаю, что статья от начинающего для начинающих, поэтому прошу ногами сильно не пинать.

Attached poll “Интересен ли материал статьи?”.
Register or login to poll
Results:
Очень: 3 голоса
Да: 10 голосов
Не очень: 2 голоса
Нет: 1 голос
Я окончил МЭИ (МИФИ, МФТИ, МГУ, ВВИА им. Жуковского) и, будучи человеком деликатным, никогда не выберу предыдущую опцию!: 0 голосов

Источник: http://www.drupal.ru/node/55982

Улучшение advanced catalog

Захотелось чтоб в Ubercart advanced catalog при выборе категории отображались товары из вложенных подкатегорий, а список категорий отображался картинками.
Результат можно посмотреть здесь: http://www.krasmebel.ru/shop/catalog/ofisnaya-mebel
Для этого
1. В представлении advanced_catalog заменил Аргумент Таксономия: ID Термина на
Таксономия: ID Термина (с глубиной)
2. Поправил
/sites/all/modules/uc_advanced_catalog/uc_advanced_catalog.module

Обновлено (исправленный вариант):

<?php
  if ($count > 0) {
/*    if (count($links)) {
      $output .= theme('links', $links, array('class' => 'links inline uc-categories')) ."<br />\n";
    }

    // creating pager
    ksort($row);
    $rows[] = $row;
    $pager = theme('table', array(), $rows, array('class' => 'pager-field'));

    // output construction
    $output .= $catalog->description;
*/
//My begin

    // creating pager
    ksort($row);
    $rows[] = $row;
    $pager = theme('table', array(), $rows, array('class' => 'pager-field'));

    // original code
    // Display table of child categories similar to an osCommerce site's front page.
    $columns = variable_get('uc_catalog_category_columns', 3);
    $cat_rows = array();
    $row1 = array();
    $i = 1;
    foreach ($child_list as $cell) {
      $row1[] = array('data' => $cell, 'class' => 'category');
      if ($i % $columns == 0) {
        $cat_rows[] = $row1;
        $row1 = array();
      }
      $i++;
    }
    if (count($row1) > 0 && count($row1) < $columns) {
      if (count($cat_rows) >= 1) {
        $row1 = array_merge($row1, array_fill(count($row1), $columns - count($row1), array('data' => '&nbsp;', 'class' => 'category')));
      }
      $cat_rows[] = $row1;
    }
    $output .= $catalog->description;
    $output .= theme('table', array(), $cat_rows, array('class' => 'category'));

//My end

?>

Источник: http://drupal.ru/node/55950

Улучшение advanced catalog

Захотелось чтоб в Ubercart advanced catalog при выборе категории отображались товары из вложенных подкатегорий, а список категорий отображался картинками.
Результат можно посмотреть здесь: http://www.krasmebel.ru/shop/catalog/ofisnaya-mebel
Для этого
1. В представлении advanced_catalog заменил Аргумент Таксономия: ID Термина на
Таксономия: ID Термина (с глубиной)
2. Поправил
/sites/all/modules/uc_advanced_catalog/uc_advanced_catalog.module

Обновлено (исправленный вариант):

<?php
  if ($count > 0) {
/*    if (count($links)) {
      $output .= theme('links', $links, array('class' => 'links inline uc-categories')) ."<br />\n";
    }

    // creating pager
    ksort($row);
    $rows[] = $row;
    $pager = theme('table', array(), $rows, array('class' => 'pager-field'));

    // output construction
    $output .= $catalog->description;
*/
//My begin

    // creating pager
    ksort($row);
    $rows[] = $row;
    $pager = theme('table', array(), $rows, array('class' => 'pager-field'));

    // original code
    // Display table of child categories similar to an osCommerce site's front page.
    $columns = variable_get('uc_catalog_category_columns', 3);
    $cat_rows = array();
    $row1 = array();
    $i = 1;
    foreach ($child_list as $cell) {
      $row1[] = array('data' => $cell, 'class' => 'category');
      if ($i % $columns == 0) {
        $cat_rows[] = $row1;
        $row1 = array();
      }
      $i++;
    }
    if (count($row1) > 0 && count($row1) < $columns) {
      if (count($cat_rows) >= 1) {
        $row1 = array_merge($row1, array_fill(count($row1), $columns - count($row1), array('data' => '&nbsp;', 'class' => 'category')));
      }
      $cat_rows[] = $row1;
    }
    $output .= $catalog->description;
    $output .= theme('table', array(), $cat_rows, array('class' => 'category'));

//My end

?>

Источник: http://www.drupal.ru/node/55950

[РЕШЕНО] Drupal 7 – вывод всех нод заданной таксономии. (/all)


Много вопросов задается куда делось /all.
Погуглив нашел модуль taxonomy_filter
Его младший брат http://drupal.org/project/tf_views, который добавляет только эту функцию без описанного ниже.

Taxonomy Filter Core – добавляется возможность /all и xxx+yyy, а так же есть 3 блока для вывода инфы и действий с ними: current criteria, refine criteria, search results.

current criteria показывает количество просто какой термин выбран и количество нод с ним (показывает по нулям, хоть ноды есть)
(на скрине блок 1, при нажатии удаляет с выдачи термин)

Блок search results выводит список терминов, которые которые сейчас присутстуют в выдаче (remove обрабатывается правильно)
(На скрине блок 2, “Место расположение” – имя словаря))

refine criteria – охерезная штука, в search results позволяет добавлять сущестующие еще не выбранные варианты таксономии в уже готовую выдачу или удалить из нее.. (На скрине снизу, динамическая)

Баги: выдача есть только по /all, ак же в списке блоков нет какого то блока, на который в настройках модуля матюхается)

Получается модуль будет обязательным для сайтов на d7.

Источник: http://drupal.ru/node/55878

[РЕШЕНО] Drupal 7 – вывод всех нод заданной таксономии. (/all)


Много вопросов задается куда делось /all.
Погуглив нашел модуль taxonomy_filter
Его младший брат http://drupal.org/project/tf_views, который добавляет только эту функцию без описанного ниже.

Taxonomy Filter Core – добавляется возможность /all и xxx+yyy, а так же есть 3 блока для вывода инфы и действий с ними: current criteria, refine criteria, search results.

current criteria показывает количество просто какой термин выбран и количество нод с ним (показывает по нулям, хоть ноды есть)
(на скрине блок 1, при нажатии удаляет с выдачи термин)

Блок search results выводит список терминов, которые которые сейчас присутстуют в выдаче (remove обрабатывается правильно)
(На скрине блок 2, “Место расположение” – имя словаря))

refine criteria – охерезная штука, в search results позволяет добавлять сущестующие еще не выбранные варианты таксономии в уже готовую выдачу или удалить из нее.. (На скрине снизу, динамическая)

Баги: выдача есть только по /all, ак же в списке блоков нет какого то блока, на который в настройках модуля матюхается)

Получается модуль будет обязательным для сайтов на d7.

Источник: http://www.drupal.ru/node/55878

Уменьшение цены на определенный процент в Ubercart

На одном проекте была задача – реализовать поддержку снижения цен на товары на определенный процент в зависимости от роли пользователя. Нужно это было для организации работы с дилерами – у разных дилеров разный процент скидки. Реализовал я это с помощью модуля uc_percentage_price.

 

На странице конфигурации можно указать процент, который будет вычитаться из цены продажи и отображаться на сайте. Веса нужны для того, чтобы определить какой процент для скидки брать, если у пользователя несколько ролей. Преимуществом обладают меньшие веса.
Скачать можно здесь

Источник: http://drupal.ru/node/55759

Уменьшение цены на определенный процент в Ubercart

На одном проекте была задача – реализовать поддержку снижения цен на товары на определенный процент в зависимости от роли пользователя. Нужно это было для организации работы с дилерами – у разных дилеров разный процент скидки. Реализовал я это с помощью модуля uc_percentage_price.

 

На странице конфигурации можно указать процент, который будет вычитаться из цены продажи и отображаться на сайте. Веса нужны для того, чтобы определить какой процент для скидки брать, если у пользователя несколько ролей. Преимуществом обладают меньшие веса.
Скачать можно здесь

Источник: http://www.drupal.ru/node/55759

© 2009 Обзор CMS