среда, 18 сентября 2013 г.

Дни рождения с помощью Views 3 в Drupal 7

Очень часто необходимо вывести список пользователей у которых сегодня день рождения. Для этого можно использовать поле типа Date и Views. К сожалению во Views нельзя сделать фильтрацию по полю даты, так как такая фильтрация подразумевает точное совпадение даты. Необходимо указать год, что в случае дня рождения не подходит, так как нужна не точная дата, а совпадение месяца и дня.
Можно сделать вывод списка с помощью отдельного модуля, но иногда использовать views удобнее,так как можно гибко настраивать, какие поля выводить и в каком виде.
Итак задача: сделать вывод списка пользователей, родившихся сегодня, с помощью Views.

Шаг 0. Добавляем поле типа Date к User сущности

Поле должно называться Birthday (внутреннее название - field_birthday).

Шаг 1. Создаем View. 

Administration > Structure > Add New View. Называем View - Birthdays. View должен выводить пользователей (Show Users).
Нажимаем "Сохранить и продолжить" (Save & Continue).

Шаг 2. Добавляем контекстный фильтр.

Выбираем поле User: Birthday (field_birthday) и нажимаем кнопку добавить (Add).






















Шаг 3. Настройка фильтра.

В настройках фильтра, указываем опцию "Provide default value". Выбираем PHP Code. 
Вставляем в поле следующий код:

$results = db_query("SELECT entity_id FROM field_data_field_birthday WHERE DATE_FORMAT(field_birthday_value,'%m-%d') = DATE_FORMAT(NOW(),'%m-%d') AND entity_type = 'user'");
$ids = array();
foreach ($results as $result) {
  $ids[] = $result->entity_id;
}
return implode(',',$ids);


Осталось только отметить в настройках фильтра "Allow multiply values" и сохранить View. После этого можно открыть страницу Birthdays на сайте: http://site.com/b?q=birthdays и наслаждаться списком пользователей :-)

пятница, 5 июля 2013 г.

Drupal 5, Ubercart 1, UC_Recurring

Вчера надо было добавить продажу членства на достаточно старом сайте на Drupal 5. Хотел было настроить UC_Recurring, но оказалось, что на пятерке этот модуль поддерживает оплату через Authorize.net, а этот сервис для приема платежей по определенным причинам не подходит владельцу проекта. Пришлось остановится на использовании uc_roles. Проект UC_Recurring выпилили из ядра Ubercart 2, так что врядли он вообоще юзабелен до третьей версии.

понедельник, 24 июня 2013 г.

Прощай Ubuntu, здравствуй Debian!

Долгое время на моем ноуте стояла Kubuntu, так как KDE - это единственная достойная внимания графическая оболочка для работы. Мне в KDE нравится все: и дизайн, и интегрированность компонентов и общий подход к дизайну приложений.

В последнее время из рядов Canonical стали приходить тревожные новости: Unity вместо гнома, Mir - вообще что-то из ряда вон выходящее. Вместо того, чтобы сделать свою тему оформления и набор плагинов для Gnome и сливать наработки в общий котел, ребята из Canonical решили сделать свой Gnome с блекджеком и шлюхами Unity. Дальше - больше... не прошло и года, как им понадобился свой дисплейный менеджер - Mir....


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

В общем я решил что поддерживать велосипедостроение в Ubuntu  я больше не буду и пересел на Debian.

четверг, 14 февраля 2013 г.

Автоматическое создание обратных ссылок BackReference

Суть задачи: есть ноды определенного типа в которых есть поле entity reference, которое ссылается на другие ноды этого же типа. При  создании такой ноды можно выбрать другие материалы, которые при просмотре созданного материала будут видны как ссылки типа see also (или похожие материалы)
Нужно чтобы при добавлении ссылки на материал (назовем его дочерним материалом) в родительский материал - создавалась обратная ссылка в дочернем материале (ссылка, которая ссылается на родительский материал).

Нашел отличный видео-урок: http://dev.nodeone.se/en/creating-multiple-back-links

Ну и ссылка на видео напрямую: 

вторник, 5 февраля 2013 г.

Как в Drupal 7 подменить один пункт меню другим

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

Нашел пример как это делается в модуле User

menu_set_active_item('user/' . $user->uid);
return menu_execute_active_handler(NULL, FALSE);