Блог пользователя - edhel

Кросспостинг из Drupal в ВК своими руками

12 апреля 2013 в 19:50
  1. Создаём группу в ВК, допустим её id будет 111.
  2. Регистрируем приложение в ВК типа standalone (http://vk.com/editapp?act=create), допустим id его будет 222.
  3. Получаем токен для доступа к API: в браузере открываем ссылку http://oauth.vk.com/authorize?client_id=222&scope=offline,wall&redirect_.... Берём токен из адресной строки после редиректа, допустим AABBCC.
  4. Добавляем в нужный тип материала (допустим news) cck-поле с чекбоском (репостить ноду в ВК или нет). Можно и без чекбокса, если надо репостить все материалы.
  5. Создаём таблицу в БД для сохранения соответствий между нодами и постами в ВК:
    CREATE TABLE IF NOT EXISTS vk_node (
      nid int(10) unsigned NOT NULL,

Самописная фотогалерея на Drupal

29 марта 2013 в 20:55

Долго использовали на сайте coppermine, который сильно устарел, неудобен, тяжело расширяем (по сравнению с drupal). Наконец дошли руки переделать на Drupal 6.x и реализовать то, что давно нужно было. Готовых тяжелых модулей для фотогалереи не использовал. Результат: http://photo.sfu-kras.ru/.

Альбомы — это нода, к которой прикрепляются фото как файлы (cck+filefield+imagefield). Недостаток такой архитектуры — заметно тормозит редактирование альбома (много js), если фото больше 100. Но делать альбомы с таким большим кол-вом фото имхо моветон. Список используемых модулей ниже.

Стандартные модули с drupal.org:

  • active_tags — более удобное прописывание ключевых слов (ключевые слова используются для поиска похожих альбомов)

Подключение нового jQuery в Drupal

30 апреля 2012 в 7:39

В Drupal используется далеко не свежий jQuery. Если просто заменить misc/jquery.js новой версией, но могут вылезти баги в разных местах. Есть модуль jquery_update, с помощью которого можно немного обновить jQuery, но для подключения некоторых JS-библиотек этого всё равно недостаточно.

Недавно понадобился новый jQuery для highcharts. В итоге сделал финт ушами с подключением нового jQuery только на избранных страницах с диаграммами. Модуль выглядит так (существенные месте прокомментированы):


<?php

Вывод даты по-русски

2 сентября 2011 в 21:14

Дрюпал до сих пор (вплоть до 7.x) не может вывести по-русски даты как "3 сентября 2011 г.". Обычно я ставлю формат вывода вида 03.09.2011, который более менее соответствует русской локали. Но всё же "3 сентября" нагляднее, чем "03.09". Чтобы сделать так, приходится фиксить тему и менять вывод переменной $submitted у нод и комментов.

Код тут: http://edhel.krasu.ru/node/406.

Производительность Drupal 7.0 vs 7.2

4 июня 2011 в 19:55

В продолжение своего предыдущего поста: http://www.drupal.ru/node/62641.
По аналогичной методике протестировал производительность новых версий drupal 6.22 и 7.2.

Drupal 7.2 показал +14% к скорости работы по сравнению с 7.0.

Конкретные цифры тут: http://edhel.krasu.ru/drupal-7-perfomance

Тестирование производительности Drupal 6 и Drupal 7

21 мая 2011 в 19:42

Провёл по возможности честное и приближенное к реальности тестирование d6 и d7:

  1. в d6 сделал новостям такие же поля, как в d7 по умолчанию (title, body, tags, image), для чего пришлось поставить модули cck, filefield, imagefield, image api, imagecache
  2. добавил новостям текстовое поле source
  3. создал по 20 новостей с заполненными всеми полями
  4. сделал меню из 6 пунктов + 3 развёрнутых подпункта
  5. добавил меню в виде блока и сделал одинаковый набор блоков на обоих версиях (поиск, вход, меню, навигация)
  6. загрузил русскую локализацию (в d7 пришлось фиксить ядро, иначе php не хватало времени для загрузки локализации)
  7. отключил логи в апаче и mysql (иначе они портят тесты кэша)
  8. выгрузил все программы какие смог
  9. после каждого теста перегружал apache и mysql
  10. тестировал на большем количество запросов (1000 запросов по очереди в один поток)

Результаты в мс (среднее значение):

страница d6.20 d7.0
node 144 114
node/1 60 68
cache 11 15
нормированное время 1 1,07

*кэш от конкретной страницы почти не зависит, поэтому для него приведена просто одна цифра*

Тестировалось на winxp, php 5.2.9, eaccelerator (xampp).

Накануне более "тупо" тестировал drupal 5,6,7, там цифры для drupal 7 получилась менее утешительные, результаты тут: http://edhel.krasu.ru/drupal-5-6-7-perfomance.

Использование полнотекстового индекса во views

30 октября 2010 в 8:05

Во views есть возможность сделать полнотекстовый поиск по полю, но будет использоваться медленный оператор LIKE '%слово%' (на больших массивах данных). В MySQL есть полнотекстовый индексы (http://dev.mysql.com/doc/refman/5.0/en/create-index.html, http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html).

Вот как можно заставить views использовать полнотекстовый индекс с помощью оператора MATCH:

1. Ручками создаём полнотекстовый индекс, например, по полю node.title.
2. Добавляем во views фильтр по полю node.title на равенство с учётом регистра (можно сделать его "exposed").
3. Пишем модуль mymodule c хуком views_query_alter:

<?php
function mymodule_views_query_alter(&$view, &$query) {
if ($view->name == 'MYVIEW_NAME') {
$args_count = 0;
foreach ($query->where[0]['clauses'] as $key => $value) {
if (strstr($value, '%s')) $args_count++;
if ($value == "(node.title) = ('%s')") {
$query->where[0]['clauses'][$key] = "MATCH (node.title) AGAINST ('%s' IN BOOLEAN MODE)";
_mymodule_views_query_alter_hepler($query->where[0]['args'][$args_count - 1]);
}
}
}
}

function _mymodule_views_query_alter_hepler(&$s) {
$words = preg_split("/\s+/", trim($s));
$new_words = array();
foreach ($words as $word) {
$first = drupal_substr($word, 0, 1);
if ($first != '+' && $first != '-') {
$word = '+' . $word;
}
$new_words[] = $word;
}
$s = join(' ', $new_words);
}

?>

Кривой robots.txt

17 августа 2010 в 7:20

С удивлением обнаружил в robots.txt строчку Disallow: /sites/. Если файлы расположены не в /files/, а в /sites/*/files, то яндексы-гуглы не будут индексировать значительную часть файлов (doc, pdf, картинки и т.п.). Баг имхо, обсуждается, в частности, здесь http://drupal.org/node/494462.

У меня есть установка дрюпала с мультисайтингом на 30 сайтов, которой уже много-много лет, и большинство сайтов хранят файлы в /sites/. И все эти годы куча файлов не индексировалась. Обнаружил, когда посмотрел логи Яндекс.Сервера.

Хлебные крошки в Google

7 декабря 2009 в 15:17

Заметил, что Google для результатов с drupal.org стал показывать «хлебные крошки» для найденных страниц. Например, по запросу node breadcrumb выводится «drupal.org › Download › Modules» (ссылками).

Подключение внешнего JavaScript

18 ноября 2009 в 7:29

drupal_add_js не работает для внешних адресов, т.к. вначале добавляет слэш к адресу.

Может помочь drupal_set_html_head('[script src...']), но он не подключает jQuery. Если вызвать drupal_add_js('','inline'), то jQuery подключится, но позже нашего скрипта.

Поэтому если надо подключить внешний скрипт, который использует jQuery, то делаем так:

Перевели сайт на Drupal

5 апреля 2009 в 20:22

http://ic.sfu-kras.ru/. Был сайт на PHP+файлы. Перевели на Drupal 6 сохранив лицо. Ничего мега-особенного, но всё же.

Поиск через Яндекс.Сервер. Он мне больше нравится, чем встроенный в Drupal. Особенно выводит, когда drupal-евский поиск начинает тормозить по 5-10 сек.

Об InnoDB

Видео-хостинг на Drupal 6 для вуза

12 марта 2009 в 10:03

Сделали сайт на Drupal 6 для хостинга видео и аудио-ресурсов для университета: http://tube.sfu-kras.ru/

Возможности:

  • онлайн-просмотр видео/аудио в различном качестве (c помошью JW Player) с поддержкой псевдо-поточности (прокрутка в любое место видео без полной загрузки)
  • навигация по рубрикам, ключевым словам, пользователям, похожему видео
  • плейлисты
  • онлайн-загрузка видео (обработка автоматически не ведется, ручками кодируется в ffmpeg и файлы выкладываются по FTP)
  • экспорт (HTML-код)
  • возможность ограниченного доступа к избранным материалам: по IP-адресам универа, для ролей, по паролю (тут основная была проблема с тем, что jw player похоже не передавал cookie скприпту-стримеру, пришлось хитрую авторизацию делать по "билетам")
  • оглавление для навигации по конкретному видео (пример: http://tube.sfu-kras.ru/video/196)
  • поиск с помощью Яндекс.Сервер

Из нестандартных модулей используюся:

  • cck (метаописание)
  • fivestar+votingapi (звездочки)
  • google_analytics (статистика)
  • node_breadcrumb (фикс брэдкрамбов)
  • tagadelic (облако тегов)
  • cas_client (моя самописная CAS-авторизация)

+ несколько модулей конкретно для этого сайта (навигация, плейлисты и т. д.)

Не использовал views намеренно, ибо он тормоз имхо) Получилось так, что просмотр списка видео работает быстрее и выполняет меньше SQL-запросов, чем просмотр отдельной ноды с видео.

-----------

Breadcrumb в 6-ке

14 ноября 2008 в 6:41

1) Обнаружил, что в 6-ке для элементов меню не строится автоматически breadcrumb. Строится только для меню navigation. Для фикса есть модуль menu_breadcrumb.

2) Наконец-то портировал свой модуль node_breadcrumb на 6-ку. В частности, добавил и вышеупомянутый фикс (это пара строк).

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

Администрирование комментариев в собственной ноде

6 февраля 2008 в 9:29

Есть модуль http://drupal.org/project/usercomment, но с последними версиями Дрюпала не пашет и слишком навороченный... Написал схожий модуль, но более короткий, правда и с особенностями...

Принцип работы

Текстовые поля в CCK со множественными значениями — добавление полей на лету

29 декабря 2007 в 10:18

Думаю многим известна проблема с текстовыми полями со множественными значениями: по умолчанию можно ввести только 3 значения. Если надо больше — то нужно сохранить ноду и опять перейти в режим редактирования. Можно увеличить начальное кол-во полей хакнув text.module (строка 272 в моей версии):

foreach (range($delta, $delta + 2) as $delta) {

заменить, например, на:

foreach (range($delta, $delta + 4) as $delta) {

Производительность и PHP-акселератор

5 октября 2007 в 16:42

Поставили вчера пхп-акселератор (eAccelerator v0.9.5.1). Сравнил время генерации страничек для юзеров (не анонимов):

было(мс) стало(мс) уменьшение времени (разы)
главная: 1040 360 2.88
новости: 1760 860 2.05
страница: 1100 370 2.97
карта сайта: 1129 390 2.89
поиск: 3200! 2300! 1.39

Кол-во записей в таблицах БД:

node: 1780
node_revisions: 1943
url_alias: 418
comments: 3509
term_data: 226
menu: 486

Вообще скорость работы не впечатляет конечно, особенно без акселератора... Те же новости сделаны обычным образом cck+views и такое время генерации жуткое... Можно конечно оптимизировать страницу новостей, забив на views и написав всю выборку одним селектом. А вот поиск вообще ни в какие ворота!

Хорошо хоть все посетители анонимы, тормоза в основном отражаются только на нервах админов/модеров)

Модуль для удаления поля "сообщение в системный журнал"

27 сентября 2007 в 5:13

Периодически всплывает сабж. Собрал модуль. Код модуля:

<?php

function remover_form_alter($form_id, &$form) {
if ($form['#id'] == 'node-form') {
unset($form['log']);
}
}
?>

Кроме этого, в модуле есть еще 3 закомментированных функции:

remover_link_alter - удаляет все ссылки у ноды типа news и все ссылки на термины (можно использовать как отправную точку для настройки ссылок на свой вкус).

Все мои сайты на Друпал

20 августа 2007 в 19:13

http://region.krasu.ru/ - Народная энциклопедия «Мой Красноярск»
http://tungus-bolid.krasu.ru/ - Тунгусский феномен
http://rrc.krasu.ru/ - Красноярский региональный ресурсный центр
http://sfu-kras.ru/ - Сибирский федеральный университет (СФУ)
http://gazeta.sfu-kras.ru/ - Газета СФУ

Модуль для настройки breadcrumb и позиции в меню нодов

9 августа 2007 в 8:54

Часто надо, чтобы нода определенного типа или определенной категории была привязана к пункту меню. Раньше я для этого делал мини-хаки в hook_nodeapi, а на днях наконец навоял модуль с админским интерфейсом.

Добавление пунктов меню в длинные меню

12 июля 2007 в 8:22

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

Хотел было сначало хакнуть menu.module, но потом нашел более цивиальное решение с помощью тем:

<?php
function mytheme_select($element) {
$select = '';
$size = $element['#size'] ? ' size="' . $element['#size'] . '"' : '';
_form_set_class($element, array('form-select'));
$multiple = isset($element['#multiple']) && $element['#multiple'];
if ($element['#name'] == 'menu[pid]') {
$options = _mytheme_form_select_options($element, NULL, '--');
} else {
$options = form_select_options($element);
}