ingumsky@drupal.org: Блог

Главные вкладки

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

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) для того, чтобы сузить поле деятельности запроса, но, как я понимаю, это даст только лишнюю нагрузку на базу.

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

Непустые пустые заголовки комментариев [РЕШЕНО]

9 января 2009 в 19:53

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

Не пойму, куда именно копать, так как здесь приводится пример хака для unicode.inc, чего делать очень не хочется, а чуть ниже предлагается написать соответствующий модуль с одним хуком, с которым я пока не встречался и не знаю, как работать.
Спасибо!

Как оптимизировать Друпал, чтобы решить вопрос с недостатком памяти, выделенной на php?

4 января 2009 в 23:14

Добрый день, уважаемые коллеги!

Столкнулся с очередным вопросом, ответить на который я по причине недостатка знаний пока не могу. В разработке имеется сайт, который крутится на хостинге с рядом скачанных с drupal.org чужих и парой простеньких (если не сказать примитивных), написанных мной модулей. Кэширование отключено. Установлены, в частности, cck, views и devel (больше тяжёлых модулей нет). PHP limit жёстко выставлен хостером на 64 метра (изначально вообще было 16). С помощью devel'а стараюсь отслеживать то, как работает сайт на различных страницах. Обычно на выходе страницы devel указывает на 28 метров израсходованной памяти, но при загрузке admin/modules показатель вырастает до 45, что не может не настораживать. Доходит до того, что я не могу поставить drupal_for_firebug, чтобы с его помощью исправлять ошибки и свои ляпы, потому что вылезают ошибки о перерасходе памяти. Такими темпами я почти уверен, что мне не хватит памяти на token, pathauto, acm/tal и advanced forum, а также пару модулей, которые мне придётся писать самому.

Подскажите, это у меня руки не из того места растут или всё так и должно быть? Если это как-то можно скорректировать/оптимизировать (увеличение лимита до 96 метров, к сожалению, не предлагать), то не подскажите ли как? Помыкался по форуму и даже по русскоязычному Друпал-поиску, но ответа на этот вопрос не нашёл -(

Спасибо заранее.

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

30 декабря 2008 в 20:11

Добрый день!

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

Имеется тип содержимого «матч» и тип содержимого «футболист».
Нужно дать возможность при создании/редактировании «матча» добавлять 11-18 футболистов, причём каждому из футболистов назначать номер и указывать минуту (минуты?), на которой он забивал гол (голы?). Я никак не могу понять, каким образом мне организовать хранение таких данных и их представление в форме. Возможно, стоит использовать для хранения id ноды каждого футболиста и информации о его номере, минутах с забитыми мячами, карточками ассоциативный массив? Насколько было бы правильным такое решение? Как правильно с точки зрения Друпал его реализовать? (Я встречал в книге по Друпал упоминание какой-то функции, которая разбирает массив на строчку для удобства хранения, и парной ей функции для сборки массива обратно, но не могу вспомнить, как эти функции назывались и как именно они работают).

Помогите, пожалуйста, советом.

Как определить, какой точно INSERT с данными отправляет cck?

26 декабря 2008 в 15:55

Добрый день!

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

Спасибо.

Таксономия: как это работает?

20 декабря 2008 в 17:05

Здравствуйте, уважаемые!

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

Задача:
Мне нужна разветвлённая система в словаре «География», в который будут «складываться» страны и города. Я предположил, что структура будет примерно такой:
География
-Страны
--Англия
--Бразилия
--Россия
и т.д.
-Города
--Ливерпуль
--Мидлсбро
--Москва
и т.д.

При этом для терминов Ливерпуль и Мидлсбро родителем будут не только «Города», но и «Англия» из География->Страны, для термина «Москва» — «Города» и «Россия»... и так далее.

Мои действия:
1. Я создал новый словарь «География» и определил ноды, к которым термины этого словаря будут относиться.
2. Затем создал термин «Страны», родителем которого стал корень.
3. Потом начал по очереди создавать новые термины из подготовленного списка стран, каждому из них определяя в родители «Страны».
4. В итоге я получил на выходе в example.net/admin/content/taxonomy/2 плоский алфавитный список всех введённых терминов словаря «География», среди которых затесался и термин «Страны».
5. Для пробы указал для одного из материалов термин «Дания» и посмотрел, что получилось. При просмотре термина «Дания» выводится тизер материала, в который был прописан тег, при просмотре тега «Страны» я вижу пустую страницу без указания входящих в эту рубрику терминов и надпись «В этой категории нет материалов».

Вопрос по мотивам ответа - CCK: как взять значение «ссылки на ноду» из произвольного поля?

14 декабря 2008 в 15:11

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

Столкнулся с проблемой, которую не знаю, как решить. Суть такова, имеется несколько типов страниц, предназначенных для разного содержимого (отдельно матчи, отдельно информация о команде-сопернике, например). Хочется связать их между собой так, чтобы потом делать красивую выборку через views. Как я себе это представляю: При создании новой ноды матча (type1) можно из выпадающего списка выбрать соперника (тип содержимого type2), при этом в качестве значения будет записываться не название команды соперника, а id той самой ноды, которая ей посвящена.

Например, я создаю ноду матча, который состоится 14 декабря, прописываю дату время, а потом указываю соперника — открываю выпадающее меню, где могу выбрать «Арсенал» (nid 5), «Астон Виллу» (nid 17) или «Болтон» (nid 19). Если выбираю «Арсенал», в качестве значения прописывается 5, «Астон Виллу» — 17 и т.д.

Подскажите, пожалуйста, как это реализовать, если учесть, что список возможных соперников будет постоянно пополняться? Как я понимаю, нужно написать функцию на php, которая будет пробегать по всем нодам type2, доставать оттуда имена соперников (teamname) и создавать массив со значениями вида nid => teamname. Правильно? Помогите, пожалуйста, с написанием такой функции.

И ещё, подскажите, пожалуйста, какой тип искомого поля «соперник» использовать в ноде type1 — число (integer) или ссылка на ноду?

Заранее спасибо за помощь!

Обновился: Пропала возможность работать с полями cck (РЕШЕНО)

11 декабря 2008 в 17:20

Добрый день!

Провёл сегодня обновление с 6.6 на 6.7 и столкнулся с проблемой, которую пока не могу решить: пропали cck-поля для загрузки картинок. Не могу понять, почему. При просмотре контент-тайпа выдаётся ошибка:

views filters — как с помощью фильтра по полю date реализовать «On this day»?

9 декабря 2008 в 16:53

Добрый день!

Пытаюсь с помощью cck+views реализовать блок «on this day» — выдачу списка нод, в поле date которых есть совпадение с сегодняшним числом и месяцем. При этом год и время совершенно неважны. Всё бы ничего, но не могу победить фильтр по полю date — он мне упорно предлагает варианты фильтрации, которые можно сузить год-месяц-число-часы-минуты-секунды до год-месяц, например, или до год-месяц-число, но никак не до месяц-число.

Не могу понять, что стоит подставить в качестве относительного значения (relative value), чтобы добиться нужного результата?
Как я понимаю, условие в запросе должно выглядеть примерно так:
WHERE (DATE_FORMAT(STR_TO_DATE(node_data_field_dateofbirth.field_dateofbirth_value, '%Y-%m-%dT%T'), '%m-%d') = '01-28')
Во всяком случае, в таком виде SQL выдаёт мне правильные варианты.

Помогите, пожалуйста!