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

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

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, но, тем не менее, ответ на него часто нужен на сайтах, использующих Друпал.

Сколько взять за сайт визитку?

5 мая 2009 в 13:10

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

Обратились ко мне с предложением сегодня сделать сайт-визитку для небольшой конторы. Как будет выглядеть такой сайт, я представляю, но сколько попросить за его изготовление? Подскажите, пожалуйста.

Как отключить пользователям возможность следить друг за другом?

1 апреля 2009 в 17:03

Добрый день!

Передо мной встала следующая проблема:
Имеется сайт, на котором заведены несколько ролей. В трекере этого сайта можно следить за перемещением пользователей — по каким страницам и когда они ходили. Проблема в том, что мне не нужно, чтобы пользователи знали, как и куда ходят их соседи. Анонимы и «зарегистрированные пользователи» этого и так не видят. Как отключить для остальных? В настройках прав нет ничего, связанного с этим, настроек трекера не существует в принципе. Куда копать? Подскажите, пожалуйста.
Спасибо!

В чём принципиальные отличия Rules от Workflow?

20 марта 2009 в 2:31

Подскажите, пожалуйста, чем принципиально (и не принципиально) отличаются друг от друга модули Rules и Workflow. Как я понимаю, первый из них — это бывший Workflow-ng. Обра работают с триггерами и действиями, но... как? Почитал описания обоих модулей, но так и не понял, какой из них для чего именно предназначен. Вижу отличия только в том, что Rules в два раза тяжелее.
Спасибо!

Поле ввода терминов таксономии рендерится не так, как должно

13 марта 2009 в 18:02

Добрый день!

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

Вчера обнаружил, что ввод таксономии теперь происходит не в самом низу формы, а сразу за первым же контейнером. Полез проверять в настройки типа материала — там всё было нормально. Попытался тасовать поля, драг-энд-дропом перетаскивая таксономию в разные части формы, вручную менял вес словаря на более тяжёлый, но ничего не менялось... Отключил модуль hierarchical_select и очистил кеш сайта. Поля для добавления таксономии перестали рендериться вовсе! Смотрел исходный код страницы, в том числе файрбагом, но не обнаружил ни единого упоминания в исходниках страницы о таксономии. При этом введённые ранее термины продолжают отображаться так же, как делали это раньше. Подскажите, пожалуйста, куда копать при решении этой проблемы. Может быть кто-нибудь уже сталкивался с подобным?

FastCGI и ошибка 500

26 февраля 2009 в 21:31

Добрый день!

Уже давно меня беспокоит проблема, которая мешает мне нормально обновлять модули и даже запускать хронометр (вручную, ибо два известных мне бесплатных веб-сервиса, к сожалению, не работают), — регулярное появление пятисотой ошибки. Вроде бы у меня на хостинге стоит ограничение на php в 128 мегабайт, да и ограничение на время выполнения скриптов мне сегодня уже подняли до минуты с тридцати секунд, а всё равно — регулярно вижу пятисотую ошибку при запуске хронометра, update.php и включении модулей на /admin/build/modules.

Посмотрел в лог ошибок, там регулярно встречаются подобные сообщения:

[Tue Feb 24 13:43:04 2009] [error] [client 78.***.***.***] FastCGI: comm with (dynamic) server "/var/www/fcgi/example.net/php5-fcgi-starter" aborted: (first read) idle timeout (30 sec), referer: http://www.example.net/update.php?op=results
[Tue Feb 24 13:43:04 2009] [error] [client 78.***.***.***] FastCGI: incomplete headers (0 bytes) received from server "/var/www/fcgi/example.net/php5-fcgi-starter", referer: http://www.example.net/update.php?op=results

Глюки с пропажей целых столбцов во views — помогите локализовать проблему

21 февраля 2009 в 3:06

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

Помогите, пожалуйста, локализовать и решить проблему, над которой я ломаю голову уже третий день.
Ситуация:
У меня есть views, в котором создана таблица с данными — один столбец с датой и временем, а в остальных прочая информация (cck и node reference). Всё работало прекрасно, до переезда на views 6.x-2.3. Теперь в табличном выводе у меня постуют все поля, расположенные справа от столбца с датой, но поля слева от неё отображаются нормально. Соответственно, если передвигать столбец с датой вправо, то становятся видимыми всё больше и больше полей. Если изменить вывод с табличного на грид, неформатированный или список — видны все поля. На локальной машине, на которой лежит точная копия сайта, всё работает нормально. Я мог бы оставить столбец с датой справа, но для вьюса, который является расписанием событий это как-то «некошерно», да и одно дело использовать такую «фичу», а совсем другое — иметь на сайте баг, от которого не можешь избавиться.
Что делал:
1. Чистил кеш;
2. Перезаливал модуль;
3. Отключал и включал все контриб-модули с запуском update.php после каждого инейбла каждой новой группы;
4. Сливал дамп базы с одной копии сайта и ставил её на другую (с удалением предыдущего варианта), повторял ту же операцию в обратном направлении;
5. Перезаливал на глючащий сайт всю папку с Друпал;
6. Проверял количество выделенных на Друпал ресурсов на одном сайте и на другом (и там, и там 128Мб)
Результат:

Forms API и получение данных из одинаковых строк (РЕШЕНО)

30 января 2009 в 4:01

Прошу прощения у уважаемого сообщества за свою надоедливость, но не могу решить очередную проблему при написании своего модуля. Я новичок в Друпал и пхп, поэтому алгоритмы решения вижу, а вот с семантикой проблемы. Курение Forms API, исходников чужих модулей и мануала по пхп, а также чтение соответствующих глав из книжек по пятому и шестому Друпалу, к сожалению, не помогли.

Суть такова. Есть форма, вида:
Имя 1 : Запах 1 : Вкус 1
Имя 2 : Запах 2 : Вкус 2
Имя 3 : Запах 3 : Вкус 3
и т.д.
и соответствующая таблица, в каждую строку которой вносится по одному имени, запаху и вкусу.
Поля «Имя» по свойствам идентичны между собой, «Запах» между собой тоже одинаковы, то же касается и «Вкуса».

Я написал модуль, который через хук _form рисует мне форму, а через _submit добавляет её значения в базу. Если отрисовываю только одну строку, данные прекрасно добавляются в таблицу, но мне этого недостаточно. Могу через while () нарисовать любое количество строк формы, но никак не могу сделать, чтобы при сабмите формы инсертились все строки, а не одна из них. Понимаю, что нужно цеплять идентификатор на каждую «строку» и создавать массив из «строк» формы, но не могу взять в толк, как с этим работать. Пожалуйста, ткните носом или подскажите, как это делается. Ужасно стыдно задавать наверняка простые вопросы, но у меня уже голова трещит от новой информации.

Модуль выглядит таким образом (публикую только нужные хуки):

function player_nameform() {
  $form['player_options'] = array(
    '#type' => 'value',
    '#value' => array(t('Ivan'), t('Stepan'), t('Metan'))

Не создаётся таблица в БД моим собственным модулем (РЕШЕНО)

29 января 2009 в 17:04

Добрый день!

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

В общем, имеется такой .module

<?php
// $Id$
/**
 * Implementation of hook_install().
 */

function match_stats_install() {
  drupal_install_schema('match_stats');
}

/**
 * Implementation of hook_schema().
 */

function match_stats_schema() {
  $schema['match_stats'] = array(
    'description'     => t('The base Match Stats table.'),
    'fields'          => array(
      'mid'           => array(
        'description' => t('The {node}.nid (match id) of match to which this {match_stats} entry applies.'),
        'type'        => 'int',
        'not null'    => TRUE,
        'default'     => 0),
      'pid'           => array(
        'description' => t('The {node}.nid (player id) of player profile to which this {match_stats} entry applies.'),
        'type'        => 'int',
        'not null'    => TRUE,
        'default'     => 0),
      'pnum'    => array(
        'description' => t('Shirt number of the player (match_stats.pid) in this match (match_stats.mid)'),
        'type'        => 'int',
        'size'        => 'tiny',
        'not null'    => TRUE,
        'default'     => 0),
      'in'  => array(
        'description' => t('Minute the player went in.'),
        'type'        => 'int',
        'size'        => 'tiny',
        'not null'    => TRUE,

Проблема локализации privatemsg 6.x-1.0-rc2 (РЕШЕНИЕ)

18 января 2009 в 18:57

Тем, кто брался за локализацию на своём сайте модуля приватных сообщений privatemsg и столкнулся с проблемой при переводе заголовка («Messages»), может помочь информация из этого топика на drupal.org.

Для тех, кто пока не в курсе. Локализовать стандартными методами в этом модуле можно всё, кроме пункта меню, который и ведёт на страничку личных сообщений. Заголовок «Messages» можно поправить только в настройках меню. И всё бы ничего, но это лишает Вас возможности лицезреть в названии пункта меню количество новых сообщений в ящике, которые видны, только если в качестве заголовка Вы оставили «Messages». Тем не менее, с помощью небольшого патча (в настоящее время последняя версия имеет номер два) всё это можно отремонтировать. В результате Вы получите нормальный пункт меню, из которого будет видно, сколько новых писем лежит у Вас в ящике.

Правильное обновление между минорными версиями

15 января 2009 в 16:37

Добрый день!

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

"Сетегном" wrote:
1. Сделайте копию базы данных и файлов.
2. Проверьте работоспособность копии базы данных.
3. Войдите в аккаунт № 1.
4. Переведите сайт в режим Offline.
5. Переключитесь на страндартную тему Garland.
6. Выключите дополнительные модули.
7. Удалите старые файлы.
8. Скопируйте на их место новые системыне файлы.
9. Скопируйте обратно папки files и sites.
10. Убедитесь, что новые файлы настроек содержат верную информацию.
11. Запустите файл update.php.
12. Убедитесь, что версии всех дополнительных модулей и тем поддерживают новую версию системы.
13. Включите дополнительные модули и снова запустите файл update.php.
14. Включите используемую вами дополнительную тему.
15. Переведите сайт в режим Online.

Меня более всего интересуют пункты 5 и 6, которые я в вышеприведённой цитате специально выделил. В связи с этим несколько вопросов к гуру:
1. Так ли уж необходимо при обновлении между минорными версиями переключаться на стандартную тему, выключать дополнительные модули и удалять (а не писать поверх них) старые системные файлы?
2. Какого рода проблемы могут возникнуть, если не выполнить эти шаги в процессе обновления?

Сборник полезных рецептов

12 января 2009 в 19:29

За то время, пока я знакомлюсь с Друпалом и его русскоязычным коммьюнити, я успел уже принять участие в нескольких дискуссиях, которые оказались для меня, как начинающего друпалера, весьма полезны. Вот только беда, что и эти дискуссии и другие, которые я только читал, канули в Лету моего трекера, и я уже забыл, где их искать. В общем, я принял волевое решение собирать в рамках этого поста в моём блоге на drupal.ru кое-что из полезных рецептов, которые заинтересовали меня лично. Авось что-то из них пригодится и другим людям?

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

Косым шрифтом отмечены последние дополнения.

Модули:
1. Модуль AJAX-комментариев by neochief
Модуль, который позволяет пользователям добавлять комментарии без обновления страницы. Должно быть жутко удобная штука, но и её я ещё не пробовал.

2. Заголовки комментариев
Модуль comment_subject для изменения автозаполнения заголовков, которое часто раздражает пользователей.

3. Модуль «Я пойду!» by nleo

Ошибки при проверке обновлений и запуске крона

12 января 2009 в 17:04

Добрый день!

Возникли проблемы при поиске обновлений для ядра и модулей и запуске крона, причём я не могу эти ошибки локализовать. При попытке запуска admin/reports/updates/check система напрягается, а потом выдаёт пятисотую ошибку. При этом в admin/reports/updates иногда (!) всё-таки появляются пояснения о том, что проверка обновлений сделана («Последняя проверка: 4 минуты 56 секунд назад», например), но судя по списку, проводится эта проверка не для всего списка модулей — например, для views, который у меня идёт последним в списке, написано «Не найдены доступные версии». Судя по «Отчёту о состоянии», та же проблема и с обновлениями ядра.

1. Я искал по всем доступным логам, но никакой информации об ошибках не нашёл. Что интересно, в admin/reports/status было написано, что крон не выполнялся в течение 19 часов, хотя на web-cron.ru я настроил запуск своего крона раз в час.
2. Попробовал запустить cron.php руками, но получал лишь «информативное» сообщение «Ошибка запуска Cron.»
3. В результате я сделал вывод, что виноват в ошибках может быть модуль, который я пишу со вчерашнего дня. Он у меня был включен на сайте.
4. После отключения своего модуля сделал update.php — пропал simplemenu, крон по-прежнему не запускался.

Как составить правильный запрос к MySQL с условием по дате?

11 января 2009 в 2:42

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

Пишу модуль, который будет отображать блок со ссылками на две ноды (матчи), которые надо выбирать, отталкиваясь от сегодняшней даты. Первая должна быть самой «свежей» из прошедших, вторая — ближайшей из грядущих. Пример: Есть матчи 3 января, 7 января, 10 января, 13 января и 15 января. Мне нужно, чтобы запрос 11 января выдёргивал из базы только матчи 10 и 13 января и т.д, 12 января — тоже самое, а 14 января уже матчи 13 и 15 января и т.д.

Вопрос первый: как сделать это одним запросом к базе? Решил пойти через ORDER BY ABS(DATEDIFF(gamedatetime,CURDATE())) (модуль разницы между датой матча и текущим днём) LIMIT 2, но не уверен, что это наилучший вариант, хотя ответы он мне выдаёт правильные.
Вопрос второй: будет ли подобный запрос кошерным (да ещё и с использованием функций MySQL по обработке дат и математическими операциями) или лучше всё-таки разделить на два?
Вопрос третий: как бы вы посоветовали правильно кэшировать блок с таким запросом, результат которого может оставаться неизменным в течение нескольких дней (так как перерывы между играми бывают большими)?

В принципе, можно добавить к моему запросу что-нибудь типа WHERE gamedatetime (поле даты матча) BETWEEN DATE_SUB(CURDATE(), INTERVAL 10 DAY) AND DATE_ADD(CURDATE(), INTERVAL 10 DAY) для того, чтобы сузить поле деятельности запроса, но, как я понимаю, это даст только лишнюю нагрузку на базу.

Заранее спасибо за ответы.