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

Создание пользовательского формата представления стоимости товара в Drupal Commerce

2 июня 2011 в 15:56

При создании интеренет-магазина с помощью модуля Drupal Commerce может возникнуть потребность в конфигурировании формата представления стоимости товара.
По умолчанию стоимость товара отображается в формате:

1,234.25 UAH (на примере украинской гривны)

Для русскоязычного пользователя такой формат представления не совсем удобен. В текущей версии beta 3 функционал для изменения формата представления цены товара через пользовательский интерфейс отсутствует.

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


<?php
function mymodule_commerce_currency_info_alter(&$currencies$langcode) {
  
$currencies['UAH']['symbol'] = 'грн.'//задаем символ валюты, который нужно отображать
  
$currencies['UAH']['code_placement'] = 'hidden'//прячем буквенный код валюты, который отображается по умолчанию вместо символа валюты
  
$currencies['UAH']['symbol_placement'] = 'after'//указываем отображение символа валюты после стоимости
  
$currencies['UAH']['thousands_separator'] = ''//убираем разделитель сотен, по умолчанию это символ ","
}
?>

Хук должен выполнятся после того, как отработают хуки модуля commerce currency, для этого задаем соответствующий вес нашему модулю в таблице system

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

Дополнительний фильтр в блоке More Like This модуля Apache Solr Integration

1 июня 2011 в 14:58

Суть трабла:

Есть контент-тайп "product", в котором есть поле типа taxonomy term relation, которое ссылается на словарь таксономии product_avaliability с терминами avaliable (tid=84), not avaliable(tid=85). Нужно в блоке "More like this" отображать только те ноды, у которых поле taxonomy term relation установлено в значении avalible

Пробовал задавать слеедующие запросы в поле additional query (в настройках блока):

field_product_avaliability:avaliable
field_product_avaliability:84
avaliable
84

D7 -> D7.2 Проблемы с Panels

31 мая 2011 в 17:49

После обновления до 7.2 отваливается сайт с ошибкой

Fatal error: Class 'ctools_export_ui' not found in ***/sites/all/modules/panels/panels_mini/plugins/export_ui/panels_mini_ui.class.php on line 3

Очистка кэша частично решает проблему, однако только до следующего запуска update.php, после чего сайт опять ложится.

Нарыл на drupal.org похожую тему:

Кто уже сталкивался, и как решал, помимо отключения mini-panels?

Drupal 7 Redirect - ошибка при программном сохранении нод

27 мая 2011 в 13:21

На сайте установлен модуль Redirect
Также на сайте есть самописный модуль обновления актуальности контента с ERP, который изменяет значения нод, и сохраняет их с помощью node_save().

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

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '7ALrnuRf4WtsNyPXBenLsTxhZkHBaY1EHOoTufxIU58' for key 'hash': INSERT INTO {redirect} (hash, type, uid, source, source_options, redirect, redirect_options, language, status_code, count, access) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6, :db_insert_placeholder_7, :db_insert_placeholder_8, :db_insert_placeholder_9, :db_insert_placeholder_10); Array ( [:db_insert_placeholder_0] => 7ALrnuRf4WtsNyPXBenLsTxhZkHBaY1EHOoTufxIU58 [:db_insert_placeholder_1] => redirect [:db_insert_placeholder_2] => 0 [:db_insert_placeholder_3] => catalog/coolingstand/podstavka-kuler-dlya-noutbuka-antec-15-notebook-cooler-designer-ventilyator-1sht-110mm-800-rpm-42mm-notebook-cooler-designer [:db_insert_placeholder_4] => a:0:{} [:db_insert_placeholder_5] => node/5379 [:db_insert_placeholder_6] => a:0:{} [:db_insert_placeholder_7] => uk [:db_insert_placeholder_8] => 0 [:db_insert_placeholder_9] => 0 [:db_insert_placeholder_10] => 0 ) в drupal_write_record() (рядок 6776 із .../includes/common.inc).

drupal_form_submit() - белый экран

23 мая 2011 в 16:50

Суть трабла. Вызываю функцию программного сохранения формы - выдает белый экран.

Форма - стандартная форма редактирования контента, перехваченная по hook_form_alter()

Вызов функции выглядит следующим образом: drupal_form_submit($form_id, $form_state, $node);

Параметры:
$form_id - id формы;
$form_state - массив значений;
$node - объект ноды.

В чем может быть проблема?

[Решено ]Изменение приоритета вызова hook_form_alter()

20 мая 2011 в 16:27

Суть проблемы. Есть форма, и есть набор модулей, которые изменяют характеристики элементов формы с помощью hook_form_alter(). Каким образом можно задать приоритет выполнения данного хука в определенном модуле, чтобы он исполнялся после того, как hook_form_alter() всех других модулей уже отработали?

[РЕШЕНО] Запись напрямую в БД

16 мая 2011 в 16:51

Дано:
Есть некоторое поле, например поле "Склады" с техническим названием field_product_store_relation. Поле ссылается на термин таксономии, который означает склад. К одному полю может быть привязано несколько терминов.

Нужно:
организовать обновление значения этого поля через небольшие промежутки времени.

Реализация:
Обновляю значения напрямую в б.д. с помощью db_insert и db_updatе, так как для изменения одного поля вызывать тяжелые функции node_load() и node_save() - значить вызывать лишние хуки, и тратить лишнее время. Значения обновляю в таблицах:

{field_revision_field_product_store_relation}
{field_data_field_product_store_relation}

Проблема:
Записанные в таблицы значения не появляются в объектах нод. Полностью идентичные значения, записанные в эти самые таблицы с помощью node_save() показываются нормально, а записанные напрямую с помощью db_insert и db_updatе нет.

В чем может быть проблема?

Запуск импорта Feeds по крону

12 мая 2011 в 16:12

Вопрос как реализовать запуск импорта Feeds с помощью крон?
Данные импортируются из CSV-файлов. Стандартная процедура (через вызов /import) импорта подразумевает заполнение пользователем формы, а при вызове через крон этот процесс насколько я понимаю автоматизируется.

В настройках импорта нашел только выбор интервала запуска импорта данных. Как указать csv-файл, из которого брать значения - не понятно. В "ручном" режиме это делается при заполнении формы.

Drupal Commerce: паразинтые позиции в корзине

29 апреля 2011 в 15:35

Суть трабла.

Для анонимных пользователей возникает ошибка. Если пользователь добавит в коризину товар, и уйдет со страницы, явно не удалив этот товар, он (товар) так и остается в отображении корзины, причем ни на странице корзины, ни в админке его не видно, а в базе соответствующий "паразитной" позиции Line-item присутствует.

Есть подозрение, что происходит сбой в обработке механизма сессий.

Кто сталкивался с такой проблемой, и как ее решить?

Слетает дефолтная картинка в поле-изображении

28 апреля 2011 в 12:06

Обнаружил любопытный баг.

Суть проблемы:
Есть контент-тайп, у которого есть поле типа "Изображение". Для этого поля задается дефолтовая картинка, которая отображается, если значение поля явно не было задано.

Спустя определенное время после загрузки этого дефолтового изображения, оно пропадает.

Техническую причину проблемы нашел - файл дефолтового изображения записывается в БД с параметром status = 0, то есть файл обозначается как temporary, и автоматически удаляется по крону после превышения DRUPAL_MAXIMUM_TEMP_FILE_AGE.

[РЕШЕНО] Путь к дефолтовому изображению для филда

22 апреля 2011 в 13:00

Вопрос, суть следующая.

Есть филд типа "изображение", для которого задана дефолтовая картинка. Каким образом в коде модуля можно получить адрес, или fid файла дефолтового изображения для этого поля?

Форма комментариев c выводом через Views

15 апреля 2011 в 0:40

Суть трабла.

Есть вьюха, которая переопределяет вывод ноды определенного контент-тайпа. На этой же вьюхе выводится форма комментария, с помощью Customfield PHP. Используется следующий код:

Командная разработка на Drupal 7

13 апреля 2011 в 16:30

Есть вопрос.

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

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

С файловой частью все более-менее понятно. На то есть системы контроля версий.

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

Нагуглилось:

- Migraine от Shearer Software (судя по описанию, ориентирован на Д5, допилен под Д6, а про совместимость с Д7 вообще ничего не нагуглилось)
- Drupal Features (краем уха слышал, никогда не работал)

Как вариант на ум приходит еще отбор таблиц для дампа в ручном режиме через PhpMyAdmin или Sypex Dumper, с последующим импортом на продакшн. Гиморно и большая вероятность накосячить.

Какие еще варианты есть?

[РЕШЕНО] Автоматический запуск крона через 15 минут в Drupal 7

11 апреля 2011 в 17:43

Суть вопроса. Нужно автоматически запускать крон каждых 15 минут. В списке возможных настроек, которые предлагает Drupal 7, минимальное значение 1 час.
Каким образом в этом случае можно настроить запуск крона через каждых 15 минут? Лезть в ядро не кошерно, поэтому ищу варианты.

З.Ы. Poormanscron под 6-ку однозначно гибче.

Лишний вызов hook_menu в процесе сабмита ноды

6 апреля 2011 в 13:17

Есть трабл.

Дано:

Есть обработчик hook_menu()

1. Некоторым способом отбирается нода, и получается ее объект через node_load()
2. Изменяются значения некоторых полей (значения термина таксономии по которому нода отбирается для выдачи в этот самый hook_menu, нода таким образом блокируется, чтобы ее она не попала в выдачу другому пользователю), после чего объект ноды отдается в drupal_get_form()
3. В массиве формы скрываются некоторые поля, после чего форма отдается на выход обработчика hook_menu()

[Решено] Трабл с ajax загрузкой файлов

30 марта 2011 в 17:50

Суть трабла в следующем.

Есть некий тип контента, в котором есть поля-изображения.

Есть кастомный модуль, в котором создается кастомная форма редактирования нод указанного контент-тайпа. Работает примерно следующим образом:

1. Получаем объект ноды.
2. Модифицируем значения некоторых полей.
3. С помощью drupal_get_form() получаем ассоциативный массив формы на основе объекта ноды.
4. Скрываем некоторые поля, которые юзер не должен видеть.
4. Отдаем форму на выход обработчика hook_menu().

С обыкновенным контентом проблем нет - все корректно сохраняется.

Как только пробую выгрузить файл-изображение через стандартный file upload поля изображения формы, получаю примерно следующее:

Deprecated function: Call-time pass-by-reference has been deprecated in drupal_load() (line 933 of /home/site/rk2/includes/bootstrap.inc).
Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'node_form' not found or invalid function name в drupal_retrieve_form() (рядок 771 із /home/site/rk2/includes/form.inc).
Notice: Undefined index: #node в menu_form_node_form_alter() (рядок 594 із /home/site/rk2/modules/menu/menu.module).
Notice: Trying to get property of non-object в menu_form_node_form_alter() (рядок 594 із /home/site/rk2/modules/menu/menu.module).

и т.д. варнингов идет целый вагон, и в конце:

Notice: Undefined index: field_product_image в file_ajax_upload() (рядок 265 із /home/site/rk2/modules/file/file.module).

С выгрузкой файлов с помощью ajax пока не разобрался, в какую сторону копать?

Добавление кнопки и ее обработчика к произвольной форме

23 марта 2011 в 17:27

Есть следующий трабл. Есть некая форма, которую я перехватываю через hook_form_alter.
К ней добавляю поле кнопки с помощью следующего кода:

[Решено] Изменение редиректа после сабмита формы.

23 марта 2011 в 12:54

Суть трабла. Для отдельного типа контента перехватываю и изменяю вывод стандартной формы редактирования контента. Нужно обеспечить редирект после сабмита формы на кастомный адрес.
В 6-ке для этого был филд формы #redirect, в 7-ке его убрали. Как можно организовать редирект?

Модуль Views RSS - неправильное формирование ссылок

13 февраля 2011 в 14:19

Сабж. Установил модуль Views RSS, задал поля для отображения в лента. Все работает кроме одного.

Если я пытаюсь вывести поле как ссылку (например Node:Title) в ленте оно выводится не как ссылка, а как текст, причем отображается и HTML-код ссылки.

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

<a href="/blog_details/%D0%90%D0%BB%D1%8C%D1%84%D0%B0-%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D0%B0%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0">Альфа-версия функционала сайта</a>

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

Кто уже сталкивался с такой проблемой и как ее обходить?

[Решено] Таксономия в аргументах Views Drupal 7

8 февраля 2011 в 18:48

Есть вопрос по использованию в качестве аргументов Views терминов таксономии.

Как известно, в Drupal 7 термин таксономии привязывается к контенту через отдельный филд - term relation.

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

Среди возможных аргументом нашел также знакомые по 6-ке Taxonomy Term Id и т.п. Когда попробовал применить это поле в качестве аргумента результата не дало. Возможно не правильно делал.