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

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

Вывести форму логина в своём блоке [РЕШЕНО]

19 апреля 2010 в 16:48

Добрый день!

Столкнулся с небольшой проблемой, которую не могу решить. Дело в том, что при подключении модуля OpenId, под полем для указания аккаунта openid имеется описание со ссылкой «Что такое OpenID?», которая не закрыта noindex. Я решил исправить это дело и стал искать различные решения. Готовых ответов, признаюсь сразу, не нашёл. Чтобы ничего не ковырять сам модуль OpenID и модуль User (ибо не кошерно), я решил вывести форму user_login_block в своём блоке, заключив её целиком в noindex. Всё бы ничего, но я никогда ещё не помещал форму, созданную чужим модулем в свой блок, а потому, как оказалось, не могу добиться вывода. Юзал поиск, поискал в книжке («Pro Drupal Developement»), но найти так и не сумел. Банальное решение «в лоб» через

<?phpglobal $user;
drupal_get_form('user_login_block')?>

ничего не дало, и форма не появляется.
Подскажите, пожалуйста, что я делаю не так? Спасибо.

Разное содержимое одного блока для разных терминов

19 октября 2009 в 13:55

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

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

Пункт а) решается с помощью сниппета, взятого с сетегнома. Предположим, что мы хотим показывать наш блок терминам с идентификаторами 1, 2 и 6. В таком случае мы должны для нашего блока в «Настройках видимости страницы» выбрать «Показать, если данный PHP-код возвращает TRUE (PHP-режим, только для экспертов)», а затем в поле ниже вставить следующий кусок кода:

<?php
$desired_terms 
= array(126);
if ( 
arg(0) == 'node' and is_numeric(arg(1)) ) {
    
$node node_load(arg(1));
   foreach (
$node->taxonomy as $term) {
        if (
in_array($term->tid$desired_terms)) {
            return 
TRUE;
        }
    }
}
return 
FALSE;
?>

Работа с $links через hook_link_alter

29 июня 2009 в 1:07

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

Я решил плотнее заняться изучением работы с $links, но неожиданно столкнулся с рядом проблем. Так как я использую Advanced Forum, мне захотелось скрыть от пользователя возможность использования кнопки «Ответить» без использования Flat Comments и, соответственно, без обнуления идентификатора родителя. Вместо неё я решил повесить яваскрипт для цитирования (спасибо камраду penexe, который благородно сам скрипт мне подарил).

Если я правильно понял, для этого мне надо использовать hook_link_alter(). Ссылку «Ответить» содержит $links['comment_reply'], который я попытался переопределить следующим образом:

<?php    $links['comment_reply'] = array(
      
'title' => t('reply'),
      
'attributes' => array('title' => t('select text and click here to quote'), 'onmouseover' => 'getText(\''.$account->name.'\');''onclick' => 'insertQuote(); return false;'),
    );
?>

В принципе, это вариант срабатывает — ссылка «Ответить» для каждого комментария подменяется кодом. Но проблема в том, что объект $account, судя по всему, относится к ноде, а не к комментарию, поэтому $account->name к исходнике страницы даёт мне ник пользователя создавшего ноду, а не добавившего комментарий. Я не могу понять, куда мне смотреть в поисках имени автора комментария, ибо $node->user и $comment->user также не дают результата. Подскажите, пожалуйста, что я просмотрел.
Спасибо.

Какую капчу выбрать?

5 июня 2009 в 12:47

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

Сайт, который я медленно делаю, постепенно развивается, и вот передо мной встал вопрос подключения капчи — дело в том, что на сайте регулярно регистрируются боты, а мне они, по понятным причинам, не нужны -) Полез на drupal.org, чтобы ознакомиться с тем, что можно использовать для защиты от ботов, и увидел, что кроме основного модуля CAPTCHA есть ещё «надстройки» в лице reCAPTCHA, CAPTCHA Pack, Captcha Riddler и VidoopCAPTCHA. Плюс ко всему камрад neochief выпустил две скрытых капчи.

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

Привязка к каждому посту/комментарию кнопки «цитировать»

7 мая 2009 в 16:38

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

Возможно, мой вопрос имеет к Друпал отношение косвенное и больше относится к JS, но, тем не менее, ответ на него часто нужен на сайтах, использующих Друпал.