Блог пользователя - ingumsky@drupal.org

Скрыть все ноды пользователя по событию

12 марта 2012 в 14:28

Добрый день, коллеги!

Есть следующий вопрос. Пытаюсь сделать депубликацию нод и комментариев пользователя по событию (пользователь отмечен флагом). Беглый просмотр имеющихся опций для действий Rules показал, что непосредственно депубликовать или удалить все материалы пользователя нельзя. Как я понимаю, придётся использоваться связку Rules + VBO. Это так или всё-таки есть другие варианты?

Rules с условиями

2 марта 2012 в 2:22

Здравствуйте, коллеги!

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

Спам-бот на Друпал-сайте

10 января 2012 в 14:27

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

Forms API. Проверка уникальности значения

27 декабря 2011 в 4:13

Коллеги, подскажите, плиз, что-то у меня уже голова совсем не соображает...

Есть форма, описанная в соседнем топике и состоящая из однотипных строк. Пользователь выбирает пункт из списка и назначает ему «оценку», и так для нескольких пунктов. Мне необходимо проверять, что пользователь выбирал разные пункты из списка, а не одни и те же (к примеру, что он не выбрал «Бруснику» или любую другую «ягоду» больше одного раза). Как правильно сделать такую проверку?

Forms API. Пустое значение селекта и значение по умолчанию

25 декабря 2011 в 2:22

Добрый вечер, коллеги!

Появилось пара вопросов по Forms API, подскажите, пожалуйста, решение. Рисую форму, которая имеет несколько однотипных строк с одинаковым набором полей. Выглядит примерно так:
Предположим, что форму отображаем на странице ноды с id 53.
Селект (обязательный): Малина (value = 1), Черника (value = 2), Брусника (value = 3), Клюква (value = 4). Селект (необязательный): 1-10.
Селект (обязательный): Малина (value = 1), Черника (value = 2), Брусника (value = 3), Клюква (value = 4). Селект (необязательный): 1-10.
Селект (обязательный): Малина (value = 1), Черника (value = 2), Брусника (value = 3), Клюква (value = 4). Селект (необязательный): 1-10.
После отправки на сервер данные должны сохраняться в мою таблицу вида:
nid, berry, rate
53, 1, 8
53, 4, 0
53, 2, NULL
Как видно, каждая строка формы сохраняется в отдельной строке таблицы, там есть общий идентификатор (nid), значения для обязательного селекта и значения необязательного селекта. Вопросы следующие:

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

27 августа 2011 в 18:43

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

[Решено] Views vs Pathauto (User:Name в качестве аргумента Views)

27 августа 2011 в 16:24

Здравствуйте!

Возникла неожиданная проблема там, где её не ждали. Суть в том, что у меня есть views, который выводит список материалов. В качестве аргумента я скармливаю ему имя пользователя, чтобы получить список материалов, созданных этим пользователем. И всё бы ничего, но views принимает аргумент в виде строки, отличной от той, что используется в URL во всех остальных случаях (спасибо Pathauto). Путём манипуляций с параметрами аргумента я нашёл комбинацию (lowercase и spaces to dashes для пути), с которой большая часть аргументов становится похожа на те, что хотелось бы видеть, но всё равно не все. Например, представим, что есть пользователи с именами Ingumsky, John Smith, jack_brown, S.White, He is Awesome, Паша. Ниже я привожу, как выглядят аргументы для моего вьюса, каково имя пользователя и [в квадратных скобках], как выглядит имя пользователя в большинстве URL Друпала:
При запросе example.net/my_view/ingumsky — вьюс выдаёт материалы пользователя Ingumsky [ingumsky]
При запросе example.net/my_view/john-smith — вьюс выдаёт материалы пользователя John Smith [john-smith]
При запросе example.net/my_view/jack_brown — вьюс выдаёт материалы пользователя jack_brown [jackbrown]
При запросе example.net/my_view/s.white — вьюс выдаёт материалы пользователя S.White [swhite]
При запросе example.net/my_view/he-is-awesome — вьюс выдаёт материалы пользователя He is Awesome [he-awesome]

Использование модуля Token в блоке

12 июля 2011 в 23:19

Добрый вечер!

Подскажите, пожалуйста, или укажите конкретное направление для поиска решения следующего вопроса:
Хочу использовать токен (счётчик флага flag-bookmarks-count) в коде блока, созданного через /admin/build/block/add/ и отображаемого на странице с нодой. Как мне его вставить? Попытка вставить [flag-bookmarks-count] успехом не увенчалась — вывелся текст, а не число, которое должно быть вместо него. Стал искать информацию о том, как это сделать, и понял, что совершенно не въезжаю в принцип работы. На d.o, в API.txt, прилагаемом к модулю token, и в различных материалах, найденных через поисковики, об этом толком не говорится, так как описание работы функции token_replace, которая мне, видимо, нужна, весьма немногословно.
<?phptoken_replace($text, $type = 'global', $object = NULL, $leading = TOKEN_PREFIX, $trailing = TOKEN_SUFFIX, $options = array(), $flush = FALSE)?>

$text A string potentially containing replaceable tokens.

$type (optional) A flag indicating the class of substitution tokens to use. If an object is passed in the second param, 'type' should contain the object's type. For example, 'node', 'comment', or 'user'. If no type is specified, only 'global' site-wide substitution tokens are built.

$object (optional) An object to use for building substitution values (e.g. a node comment, or user object).

$leading (optional) Character(s) to prepend to the token key before searching for matches. Defaults to TOKEN_PREFIX.

Rules и Trigger: Вместо или вместе?

27 марта 2011 в 22:36

Вопрос элементарный — есть сайт, на котором используется встроенный в ядро Trigger. Сейчас понадобилось расширить возможности, которые он предоставляет, поэтому собираюсь ставить Rules. Но я так и не понял, если я его ставлю, надо ли оставлять включённым Trigger, или Rules будет поддерживать все те же действия и события, которыми до тех пор ведал Trigger, и потому встроенный модуль можно отключить?

Как правильно организовать редирект?

14 февраля 2011 в 2:16

Добрый вечер, коллеги!

Возник вопрос, к поиску решения на который я пока даже не знаю, как подступиться. Быть может, кто-нибудь из вас сталкивался с подобной проблемой и сможет подсказать решение.

1. Есть куча (тысячи) УРЛов вида example.net/node-type/nid (Pathauto).
2. Хочется заменить (с 301 редиректом) на более «дружелюбные», например: example.net/node-type/nid/node-title.
3. Надо сохранить возможность находить ноды (в том числе те, что будут созданы позднее) через адрес старого «типа» (example.net/node-type/nid), тем более, что многие из этих УРЛов хорошо засвечены в поисковиках.

Первая мысль — использовать Path redirect со включённым «example.net/node-type/nid», где стоит опция автоматического создания редиректа при изменении алиаса. Но это не решает третью подзадачу для тех нод, что будут созданы в будущем: все они получат алиасы вида example.net/node-type/nid/node-title, а example.net/node-type/nid создан не будет.

Вторая мысль — использовать views типа page с адресом node-type и передавать ему в качестве аргумента nid. В результате любая нода нужного типа (в том числе созданная в будущем) будет получена как при обращении по адресу старого типа, так и по адресу нового... Но это не решает вторую подзадачу полностью, так как ведёт к дублированию содержимого, потому что поисковики будут видеть одинаковые страницы по адресам обоих типов, что не кошерно.

Nginx и rewrite

25 декабря 2010 в 14:37

Друзья, подскажите, пожалуйста, как сделать корректно на nginx автоматическую переадресацию (и, соответствено, подмену адреса) всех запросов example.net/* на www.example.net/*

nginx и cron

22 ноября 2010 в 23:49

Добрый день, коллеги!

Неожиданно обнаружил проблему с кроном. Дело в том, что на днях мы совершили перевод сайта с nginx+apache на чистый nginx. Всё работает замечательно, и сайт стал лучше справляться с нагрузкой, но сегодня я заметил, что в статусе (example.net/admin/reports/status) у меня светится:
«Последний запуск 5 дней 18 часов назад.

Крон давно не запускался. Подробная информация находится в документации по настройке, на странице настройки работы крона. Вы можете запустить выполнение регулярных процедур (cron) вручную.»

Если я пытаюсь запустить крон вручную (example.net/admin/reports/status/run-cron), выдаёт ошибку запуска крона. При этом из консоли wget мне бодро рапортует о том, что example.net/cron.php — 200.

В логе Друпал (example.net/admin/reports/dblog) вижу информацию о последних попытках запуска крона:
Все запуски вручную отмечены предупреждением: «Попытка перезапуска выполнения регулярных процедур (cron) в то время, как они уже выполняются».
Все регулярные запуски (ежечасовые) за последние дни идут с ошибкой: «Время выполнения регулярных процедур превысило час, скорее всего это зависание».

Подскажите, пожалуйста, с чем это может быть связано и как побороть? Когда работал с Апачем (ещё те самые 5 дней 18 часов назад), проблем с кроном не было вообще.

plugins.jQuery.com работает на drupal!

31 октября 2010 в 18:38

Возможно, все уже давным-давно об этом знают, но лично я обнаружил это только сегодня. Оказывается, plugins.jquery.com сделан на drupal. Вполне вероятно, что не только этот сайт в связке jquery.com, но этот уж точно.

Пропали комментарии и форма их вывода

7 октября 2010 в 22:23

Добрый день!

Мне достался «в наследство» проблемный сайт, который я сейчас пытаюсь привести в надлежащий вид. Проблема этого сайта в том, что он сначала был на движке, купленном у одной конторы, а потом его стали переводить на Drupal, потому что в том движке что-то не устраивало. Миграция проходила весьма тяжело, и предыдущие администраторы, пока искали нужный функционал, успели установить множество различных модулей, которые позднее снесли (Activity, Advanced Forum, FlashVideo, Heartbeat, Node comment и так далее — многие десятки модулей). С тех времён осталось множество артефактов, которые я постепенно разгребаю.

Сейчас я столкнулся с проблемой с комментариями и не могу найти решение уже несколько дней. Я хочу включить комментарии для записей определённых типов материалов и, как обычно, для этого на странице example.net/admin/content/node-type/my-node-type в настройках комментариев разрешил оставлять комментарии к записям, а также установил нужные права (post comments) группам, которые могут оставлять эти права.

Тем не менее, никакой формы для отправки комментариев я на странице ноды нужного типа не вижу, комментариев — тоже (впрочем, их и нет). Враппера для комментариев в коде странице нет. Я стал смотреть тему, так как думал, что там жёстко всё вырезали — нифига подобного. Кастомная тема для этого сайта мало чем по своей структуре отличается от какого-нибудь Гарланда.

Views API: Существует ли в Сети внятное объяснение, как правильно писать свои хендлеры для фильтров?

29 сентября 2010 в 0:52

Коллеги!

Поделитесь ссылками на внятные статьи/руководства, откуда можно было бы узнать, как писать хендлеры для фильтров views. Я нашёл ряд материалов в сети, в которых разные люди рассказывают, как они добавляли хендлеры фильтров под свои задачи:
http://zugec.com/drupal/creating-custom-filters-in-views-2
http://thereisamoduleforthat.com/content/fun-views-and-location
http://www.examiner.com/open-source-in-national/drupal-how-to-create-vie...
http://www.dave.st/content/creating-datetime-view-handler-views2
Но мне этого не хватает, потому что авторы статей не заостряют внимания на том, почему они в одном случае создают в хендлере форму, а в другом — пишут объект, с помощью которого добавляют условия в запрос. Разумеется, я и документацию по API смотрел здесь: http://views2.logrus.com/doc/html/index.html Однако, мне остаётся непонятным, как действует «расширение» одного хендлера другим, как передавать значения фильтра запросу к базе (объект?), и как, в конечном итоге, добиться того, чтобы в разделе с фильтрами появился мой собственный, который будет обрабатывать введённые поля так, как я того хочу.

Пока я научился только сообщать views о созданных мной таблицах, чтобы с ними можно было работать (всё благодаря http://graker.ru/drupal/papers/views_integration), но это к хендлерам фильтров мало относится.

Batch API и node_save [РЕШЕНО]

25 сентября 2010 в 3:33

Здравствуйте!

Второй день бьюсь над решением проблемы. Судя по всему, мне не хватает понимания php и drupal, поэтому приходится обращаться к сообществу.

Передо мной стоит задача залить n новых нод в друпал. Я использую для этого node_save и пишу вот такой код, который загружаю через php-блок в Devel:

<?php
// Задаю массив массивов с содержимым новых нод 
$nodes_for_import = array(
array(
"1","5048","A","4838","4655","1959-08-22:T00:00:00","34000","2","3"),
array(
"2","5041","H","112","4655","1959-08-26:T00:00:00","33071","4","2"),
);

// Прогоняю массив через цикл, создавая из каждого подмассива новую ноду
foreach ($nodes_for_import as $node_fi) {
    
$node = new StdClass();
    
$node->nid 0;
    
$node->type 'my_type';
    
$node->language 'ru';
    
$node->comment '2';
    
$node->status 1;
    
$node->field_0 = array(array("value" => $node_fi[0]));
    
$node->field_1 = array(array("nid" => $node_fi[1]));
    
$node->field_2 = array(array("value" => $node_fi[2]));
    
$node->field_3 = array(array("nid" => $node_fi[3]));
    
$node->field_4 = array(array("nid" => $node_fi[4]));
    
$node->field_5 = array(array("value" => $node_fi[5]));
    
$node->field_6 = array(array("value" => $node_fi[6]));
    
$node->field_7 = array(array("value" => $node_fi[7]));
    
$node->field_8 = array(array("value" => $node_fi[8]));
    
node_submit($node);
    
node_save($node);
}
?>

[РЕШЕНО] Сбились настройки темы

23 июня 2010 в 17:47

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