Drupal ajax при обновлении части страницы не использует файлы шаблона

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

Аватар пользователя muaddip muaddip 13 июня 2013 в 15:02

Редактировал product display в коммерце, убрал надпись валюты "рубл.", и в поле стоимости дописываю span (стояла задача вывести знак рубля предложенный Лебедевым).
Span вывожу через hook_page_alter(). Так вот, при смене цвета на странице дисплея продукта, перегружается часть страницы вместе с ценой (перегружается ajax-ом), и после перегрузки нет нужного span-a.
Причем, когда только сделал это переопределение, вроде работало даже после ajax перезагрузки. Сейчас перестало работать.
Подскажите:
1. файл из темы template.php, получается, не участвует при ajax перестроении страницы ?
2. Я сейчас благодаря модулю devel и команде dpm(), могу увидеть первоначальное содержимое переменной $page. Как можно отследить, как меняется переменная $page при ajax перегрузках?

Комментарии

Аватар пользователя serega111 serega111 13 июня 2013 в 17:14

Что за ajax запрос, что именно он загружает?

При ajax запросе страница не проходит темизацию заново. Темизируется только та часть, которая возвращается Если, конечно, вы ajax'ом не загружаете всю страницу целиком

Аватар пользователя muaddip muaddip 13 июня 2013 в 18:29

Drupal 7, commerce.
Стандартный ajax запрос модуля commerce. В ноде, которая отображает продукты (product_display), выводятся поля продукта. При нажатии на те поля, которые были указанны атрибутами, формируется запрос и меняются поля товара (line_item_fields) на поля другого товара.
У меня цвет товара сделан атрибутом (commerce_fancy_attributes), при нажатии на другой цвет, в ноде меняются те поля, которые были взяты из продукта. Это скорее всего неправильная формулировка в терминах друпала, но может так станет яснее.

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

Остается открытым второй вопрос: чем можно следить за переменными друпала во время ajax перегрузок (здесь dpm() и devel не помогут). Просто давно столкнулся с тем, что при ajax перегрузках, не знаешь как меняются перменные и посмотреть никак не могу. И в итоге сидишь гадаешь, где ошибся и тратишь кучу времени. Может есть какой-то способ смотреть переменные друпала, так сказать динамически, чтобы знать что твориться при ajax перегрузках ?

Аватар пользователя serega111 serega111 13 июня 2013 в 19:46

Раньше я выводил все переменные в файл. потом нашел функцию dd в модуле devel. Вот тут куча инфы по установке софта для дебага http://ratatosk.net/drupal/tutorials/debugging-drupal.html

Насчет темизации. Зря вы меняете символ валюты через темизацию страницы. можно сделать это через темизацию поля цены. Тогда при ajax запросе должно подхватываться правильная темизация

Аватар пользователя muaddip muaddip 14 июня 2013 в 22:00

Я не совсем понимаю, что за темизация поля цены?
Это поле выводится не в форме, а как поле страницы. То есть hook_form_alter здесь уже не подойдет. Если вы про хук hook_commerce_currency_info_alter, то я его использую. Но там загвоздка, я могу ввести только текстовые данные, если введу html разметку, то ее выведет, как текст. А для того чтобы вывести этот злосчастный значок, мне нужно вывести картинку. Я картинку выводил бэкграунд имеджем в span. Но span я в этот хук если вставлю, то пользователю выведется текст вида "500<span class="someclass"></span>".
Был там модуль для смены названия валюты, но опять же он работал через хук hook_commerce_currency_info_alter со всеми вытекающими.

ПыСы за ссылку спасибо, поизучаю.

Аватар пользователя serega111 serega111 14 июня 2013 в 22:08

"muaddip" wrote:
Я не совсем понимаю, что за темизация поля цены?

Как и страница, блок или нода, поле может иметь свой шаблон.
тут все написано https://api.drupal.org/api/drupal/modules!field!theme!field.tpl.php/7, в комментах есть пример того, как должны выглядеть имена шаблонов для поля.

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

Аватар пользователя muaddip muaddip 15 июня 2013 в 12:48

Про field.tpl.php помню. Но если при перегрузке не используется page.tpl.php, то по идее и не будет использоваться field.tpl.php .

Форматтер когда-то писал для своего поля. Но форматтер для поля определяется в файле модуля, через hook_field_formatter_view() и hook_field_formatter_info(). Если я определю форматтер в другом модуле, то я не знаю, как указать, что этот дополнительный форматтер относится к подмодулю commerce_price модуля commerce. Патчить commerce считаю не вариантом, так как хочется получать обновления безопасности.

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

Аватар пользователя serega111 serega111 15 июня 2013 в 13:31

"muaddip" wrote:
Про field.tpl.php помню. Но если при перегрузке не используется page.tpl.php, то по идее и не будет использоваться field.tpl.php .

будет, по крайней мере должно.

Насчет форматтера, все верно, вам нужно вот эти два хука hook_field_formatter_view() и hook_field_formatter_info()
<?php
function mymodule_field_formatter_info() {
return array(
'label' => t('my label'),
'field_types' => array('commerce_price')
);
}

function mymodule_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
// копируете код из commerce_price для форматтера, который у вас основной.
// добавляете проверку валюты и для рубля выводите измененное поле.
}
?>

так все будет работать, и не надо патчить commerce_price. Форматтер можно определить для любого поля, не обязательно для того, которое реализовано в модуле