Возможно ли в своём модуле добавить информацию в блок, формируемый другим модулем?

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

Аватар пользователя AnNik AnNik 13 ноября 2011 в 10:34

Ну собственно сабж...
Есть самописный модуль, хотелось бы, чтобы он добавлял кое-какую информацию в стандартные блоки, формируемые модулями ядра.
Возможно ли это в принципе и если да то как?

Комментарии

Аватар пользователя direqtor direqtor 13 ноября 2011 в 13:19

1. Ищем в коде ядра функцию, выводящую контент нужного вам блока.
2. Копипастим код функции в код вывода контента своего блока.
3. Делаем нужные вам изменения.
4. Заменяем системный блок вашим на странице управления блоками.
5. Профит...

Аватар пользователя v1adimir@drupal.org v1adimir@drupal.org 13 ноября 2011 в 18:24

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

На вскидку, я бы попробовал через preprocess_ функцию.

Аватар пользователя Orion76 Orion76 13 ноября 2011 в 18:36

если просто добавить к содержанию блока что-то (в начало, в конец) то способов море..
А если немного подправить содержание, то проще как посоветовали в первом посте..
Другие варианты "костыльнее"-))

Аватар пользователя AnNik AnNik 13 ноября 2011 в 20:28

"orion76" wrote:
если просто добавить к содержанию блока что-то (в начало, в конец) то способов море..
А если немного подправить содержание, то проще как посоветовали в первом посте..

Да, надо "просто добавить". Подправлять не надо.

Аватар пользователя Orion76 Orion76 14 ноября 2011 в 0:52

тогда..как писали выше... в template.php функцию ИМЯ_ТЕМЫ_preprocess_block(&$vars) в $vars должен быть элемент, содержащий тело блока и идентификаторы блока.

Аватар пользователя direqtor direqtor 14 ноября 2011 в 5:56

"<a href="mailto:v1adimir@drupal.org">v1adimir@drupal.org</a>" wrote:
На вскидку, я бы попробовал через preprocess_ функцию.

"orion76" wrote:
тогда..как писали выше... в template.php функцию ИМЯ_ТЕМЫ_preprocess_block(&$vars) в $vars должен быть элемент, содержащий тело блока и идентификаторы блока.
Господа, вы хоть API-то читаете? Блок слишком общее понятие. Для всех остальных в общем случае вы увидете только переменную $content. И что в шаблоне, что в preprocess-функции вы сможете только добавить что-то в начало или в конец. Правда, бывают варианты - модуль может отправлять в блок куда больше переменных, чем по дефолту. Модуль также может объявлять хуки, которыми можно изменить контент блока. Но это уже надо смотреть конкретный модуль.

А изменить вывод блока внутри $content в общем случае, можно только так, как я написал выше.

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 14 ноября 2011 в 8:17

"direqtor" wrote:
И что в шаблоне, что в preprocess-функции вы сможете только добавить что-то в начало или в конец

Через препроцесс можно полностью заменить вывод контента блока. Ваш метод, с поиском какого то кода странный вообщем то.

Аватар пользователя direqtor direqtor 14 ноября 2011 в 16:23

В препроцесс-функцию содержимое блока УЖЕ поступает в одной переменной и его можно только не ИЗМЕНИТь, а полностью ЗАМЕНИТЬ.

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

Аватар пользователя direqtor direqtor 14 ноября 2011 в 16:26

"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
Ваш метод, с поиском какого то кода странный вообщем то.
В пять сек находится. И чего в этом странного? Люди писали вывод блока, оттестили код на баги, документировали... По-моему проще его скопипастить и использоватьсо своими фичами, чем изобретать свои велосипеды.

Аватар пользователя AnNik AnNik 14 ноября 2011 в 15:32

"orion76" wrote:
тогда..как писали выше... в template.php функцию ИМЯ_ТЕМЫ_preprocess_block(&$vars) в $vars должен быть элемент, содержащий тело блока и идентификаторы блока.

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

Аватар пользователя AnNik AnNik 14 ноября 2011 в 15:34

"direqtor" wrote:
Модуль также может объявлять хуки, которыми можно изменить контент блока. Но это уже надо смотреть конкретный модуль.

Да, это видимо единственный вариант, надо смотреть хуки конкретных модулей...

Аватар пользователя Orion76 Orion76 14 ноября 2011 в 16:19

"AnNik" wrote:
Э, нет, хотелось бы это сделать в модуле, а не в теме...

в шапке этой страницы ссылка API
забиваете в поиск "preprocess" (верхний-правый угол)...
там все написано..

Аватар пользователя direqtor direqtor 14 ноября 2011 в 16:32

"AnNik" wrote:
Я понимаю, что в общем случае порядок вызова модулей непредсказуем, и в момент вызова хука из одного модуля переменные, которые создаёт другой модуль, могут ещё вообще не существовать...
Порядок вызова хуков модулей полностью предсказуем. Drupal - это программа, а не какая-то там Госдума РФ. Просто надо поинтересоваться в API, как это происходит. В случае же отрисовки конкретного блока всегда вызывается конкретный hook_block с вполне определенными параметрами.

Аватар пользователя Orion76 Orion76 14 ноября 2011 в 16:51

"direqtor" wrote:
Так и модуль написать - фигня. :)

кому как... в подобных топиках я вообще боюсь употреблять выражение "написать модуль"...-)))