Добавление css через template.php с проверкой на определенное представление (view_mode?) и определенный тип ноды

Аватар пользователя Crossingover Crossingover 3 декабря 2014 в 3:17

Доброго времени суток, товарищи!
Мучаюсь с такой задачей: необходимо добавить стиль для определенного представления определенного материала.
Никак не получается попасть точно в цель.

Идея была в template.php сделать
<?phpdrupal_add_css(drupal_get_path('theme', 'subtheme') . '/css/_.css');?>

Соответственно я пытался в subtheme_preprocess_node и subtheme_preprocess_page и subtheme_preprocess_html сделать проверку
<?php($vars['node']->type == 'mytype' && $vars['view_mode']=='mymode')?>

На сколько я понимаю эти события срабатывают для различных сущностей, и в разных сущностях доступен различный набор параметров. Если для самих нод отрабатывает ubtheme_preprocess_node, то для списка subtheme_preprocess_page. Однако там указанные проверки не срабатывают.

Направьте пожалуйста, куда копать.

Заранее благодарен!

Комментарии

Аватар пользователя Orion76 Orion76 3 декабря 2014 в 5:47

Не понятно, в чем проблема.
Если css подключается для определенных типов нод, то и логичнее и правильнее его подключать в subtheme_preprocess_node.

Аватар пользователя Crossingover Crossingover 10 ноября 2015 в 11:50

"orion76" wrote:
orion76 в Ср, 03/12/2014 - 06:47.Новое

Не понятно, в чем проблема.
Если css подключается для определенных типов нод, то и логичнее и правильнее его подключать в subtheme_preprocess_node.

Спасибо за ответ! Я хочу, чтобы css подключался только на определенных отображениях представления () для определенных типов нод.

Аватар пользователя Crossingover Crossingover 5 декабря 2014 в 2:00

подскажите пожалуйста, что я делаю не так для добавления хука:
1. в теме в template.php я добавляю функцию hook_views_pre_view, меняю hook на имя своей темы
2. внутри функции пишу
drupal_add_css(drupal_get_path('theme', 'subtheme') . '/css/asd.css');
3. сбрасываю кэш, рефрешу страницу - смотрю код страницы - стиль не подключен..

Аватар пользователя Crossingover Crossingover 4 декабря 2014 в 17:08

"klimp" wrote:
бликовано klimp в Ср, 03/12/2014 - 12:59.

hook_views_pre_view. Ну и посмотрите прочие views_hooks. Там и пишем drupal_add_css.

Спасибо, все понял, буду делать через хук.

Мало ли кому пригодится, нашел $view->current_display, которое возвращает машинное имя представления отображения!
Правда оно не доступно в template.php, зато доступно в шаблоне ноды (node.tpl.php)

Как альтернатива, можно сделать в template.php в subtheme_preprocess_node через $vars['view']->current_display

Аватар пользователя sg85 sg85 5 декабря 2014 в 6:04

template.php откровенно по фиг на hook_views_pre_view, ибо последний не имеет никакого отношения к темизации(если быть точнее, то он вызывается исключительно из модулей). Если же Вам нужно воткнуть этот CSS именно через template.php, то, на мой взгляд, наиболее удобно использовать YOURTHEME_preprocess_page, в котором проверять текущее местоположение через arg(), либо засунуть Ваш код в модуль(однако, не рекомендую делать через модуль в случае, если этот CSS принадлежит теме оформления, ибо потом замучаетесь искать где Вы его подключили, ибо вариантов подключения там более чем до хрена)

Аватар пользователя Crossingover Crossingover 5 декабря 2014 в 13:17

sg85 wrote:
template.php откровенно по фиг на hook_views_pre_view, ибо последний не имеет никакого отношения к темизации(если быть точнее, то он вызывается исключительно из модулей). Если же Вам нужно воткнуть этот CSS именно через template.php, то, на мой взгляд, наиболее удобно использовать YOURTHEME_preprocess_page, в котором проверять текущее местоположение через arg(), либо засунуть Ваш код в модуль(однако, не рекомендую делать через модуль в случае, если этот CSS принадлежит теме оформления, ибо потом замучаетесь искать где Вы его подключили, ибо вариантов подключения там более чем до хрена)

sg85, спасибо за помощь!
Цели воткнуть именно через template.php нет. По поводу hook_views_pre_view, что я сделал теперь:
1. Взял из views.api Хук hook_views_pre_view
2. Добавил в views.module, переименовав в views_pre_view и вставил в неё
drupal_add_css(drupal_get_path('theme', 'subtheme') . '/css/asd.css');
понимаю, что не хорошо так делать, но если сработаю, перенесу в модуль css
3. Чищу кэш - стиль не подключается.

Подскажите пожалуйста:
1. Где я ошибся?
2. Хорошо ли править модуль таким образом? (менять views.module, добавлять свои css. Он же обновляется..)

На самом деле я гуглил, как работать с хуками, куда их вставлять, в какой последовательности они вызываются - не нашел понятного мана, на ютубе только подсмотреть куда их люди пишут. Там и увидел про template.php..

Аватар пользователя gun_dose gun_dose 5 декабря 2014 в 13:23

А чем, если не секрет, обусловлена необходимость добавлять цсс именно таким способом, а не простым добавлением нужных правил в основной цсс-файл темы?

Аватар пользователя Crossingover Crossingover 5 декабря 2014 в 13:39

"gun_dose" wrote:
Опубликовано gun_dose в Пт, 05/12/2014 - 14:23.Новое

А чем, если не секрет, обусловлена необходимость добавлять цсс именно таким способом, а не простым добавлением нужных правил в основной цсс-файл темы?

люблю когда все правильно и к месту. Smile
Стили нужны только для определенного представления (current_display) отображения (views) и для определенного типа контента, и, я думаю, пихать и в общую кучу не эргономично. Безусловно, я могу ошибаться, т.к. не являюсь профессионалом в этой области и кастомизация Drupal (и php, да и вообще веб-разработка) для меня нова. Естественно с точки зрения трудозатрат такой подход не оправдан, но очень хочется уже узнать ответ на вопрос.

Аватар пользователя gun_dose gun_dose 5 декабря 2014 в 13:52

не скажу насчёт эргономики, но с точки зрения производительности - крайне сомнительно. Во-первых, сервер нагружается лишней логикой. Во-вторых, каждая подключённая цсс-ка - это дополнительный запрос из браузера. А ведь к примеру, один файл в 2кБ загрузится значительно быстрее, чем два файла по 1кБ. Хотя я вижу, что для вас решение этого вопроса стало делом чести, поэтому дерзайте)))

Аватар пользователя Crossingover Crossingover 5 декабря 2014 в 14:08

"gun_dose" wrote:
Опубликовано gun_dose в Пт, 05/12/2014 - 14:52.

не скажу насчёт эргономики, но с точки зрения производительности - крайне сомнительно. Во-первых, сервер нагружается лишней логикой. Во-вторых, каждая подключённая цсс-ка - это дополнительный запрос из браузера. А ведь к примеру, один файл в 2кБ загрузится значительно быстрее, чем два файла по 1кБ. Хотя я вижу, что для вас решение этого вопроса стало делом чести, поэтому дерзайте)))


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

"sg85" wrote:
Опубликовано sg85 в Пт, 05/12/2014 - 07:04.

template.php откровенно по фиг на hook_views_pre_view, ибо последний не имеет никакого отношения к темизации(если быть точнее, то он вызывается исключительно из модулей). Если же Вам нужно воткнуть этот CSS именно через template.php, то, на мой взгляд, наиболее удобно использовать YOURTHEME_preprocess_page

через YOURTHEME_preprocess_page также не сработала drupal_add_css(drupal_get_path('theme', 'subtheme') . '/css/news.css');
Просто ничего не происходит. Может быть контекс вызова не подразумевает добавление css?
8::(

Аватар пользователя gun_dose gun_dose 5 декабря 2014 в 14:22

"Crossingover" wrote:
разделить стили для одного представления одни а для другого - другие через общий css не получится...

Это почему это не получится? Если не убирать в настройках вьюс галочку "Добавить классы по умолчанию", то там столько классов добавляется, что можно делать всё, что угодно.

Аватар пользователя Crossingover Crossingover 5 декабря 2014 в 15:58

"gun_dose" wrote:
Это почему это не получится? Если не убирать в настройках вьюс галочку "Добавить классы по умолчанию", то там столько классов добавляется, что можно делать всё, что угодно.

Пошел искать "Добавить классы по умолчанию" - в настройках формата нашел "Добавлять классы строк" и тут увидел в разделе Расширенный -> CSS-класс !!! Ведь сто раз пользовался пунктом "тема оформления", который находится ниже Smile
как же печально не знать платформу 8(

gun_dose, спасибо! В итоге способом через стиль темы и воспользовался!

Но задача с хуками все равно маячит на заднем плане Smile

Аватар пользователя sg85 sg85 5 декабря 2014 в 19:47

"gun_dose" wrote:
не скажу насчёт эргономики, но с точки зрения производительности - крайне сомнительно. Во-первых, сервер нагружается лишней логикой. Во-вторых, каждая подключённая цсс-ка - это дополнительный запрос из браузера. А ведь к примеру, один файл в 2кБ загрузится значительно быстрее, чем два файла по 1кБ. Хотя я вижу, что для вас решение этого вопроса стало делом чести, поэтому дерзайте)))

потеря в производительности при подключении одного CSS составит примерно 1 миллиардный процент, впрочем, этот процент имеет смысл, если у вас социальная с 20млн уников в день, но там сам друпал "немного" неуместен.
Кроме того, обычно включают кеширование CSS и JS, в этом случае, все CSS файлы склеиваются, сжимаются, и делятся на 4 части, то есть, получаем 4 css файла(всегда, грубо говоря, 1 - ядро, 2 - модули, 3 - тема, 4 - еще что-то), другой вопрос, что если CSS файл один и тот же на всех страницах, то он будет сразу закеширован браузером и при навигации по сайту новые стили подгружаться попросту не будут, тогда как, если на странице попался уникальный CSS, то для этой страницы будет создан отдельный кеш, и при первом переходе браузеру придется его подгрузить, но в любом случае, все эти CSS файлы подгружаются единожды(дальше они будут браться из кеша браузера).

"Crossingover" wrote:
через YOURTHEME_preprocess_page также не сработала drupal_add_css(drupal_get_path('theme', 'subtheme') . '/css/news.css');
Просто ничего не происходит. Может быть контекс вызова не подразумевает добавление css?
8::(

первые пришедшие на ум 3 варианта - ошибка в названии хука(или темы), запрашиваемый CSS файл не найден, забыли почистить кеш.

Аватар пользователя Crossingover Crossingover 5 декабря 2014 в 23:22

"sg85" wrote:
Опубликовано sg85 в Пт, 05/12/2014

проверил еще раз - сработало! Я думаю, что не почистил кэш, хотя держал это в голове, т.к. с subtheme_preprocess_node все срабатывало просто после рефреша страницы. Виноват, буду тщательнее проверять. Однако в YOURTHEME_preprocess_page не доступен параметр $vars['view']->current_display.

Аватар пользователя klimp klimp 6 декабря 2014 в 9:45

Я бы не стал юзать препроцессы в вашем случае. В hook_views_pre_view я как павило добавляю js/css для реализации какого-то jquery плагина или кастомного фронтэнда, просто стили оформления вьюса так подключать бессмыссленно. Css не грех как и в теме написать - она для этого и предназначена. Хук, да пишется в своём модуле.

Аватар пользователя Crossingover Crossingover 8 декабря 2014 в 12:24

"klimp" wrote:

Я бы не стал юзать препроцессы в вашем случае. В hook_views_pre_view я как павило добавляю js/css для реализации какого-то jquery плагина или кастомного фронтэнда, просто стили оформления вьюса так подключать бессмыссленно. Css не грех как и в теме написать - она для этого и предназначена. Хук, да пишется в своём модуле.[/quote]
Спасибо за ответ!
hook_views_pre_view Вы в модуле в views прописываете (в views.module функцию views_pre_view)? Или создаете новый сой модуль чтобы задействовать, чтобы там использовать хук _pre_view?

PS. почему то views_pre_view не отрабатывает drupal_add_css...

Аватар пользователя klimp klimp 10 декабря 2014 в 8:46

В модуле views ничего прописывать не надо! Хакать плохо, тому есть обоснования. Я создаю свой модуль для подобных хуков.

Аватар пользователя Crossingover Crossingover 10 декабря 2014 в 12:40

"klimp" wrote:
Опубликовано klimp в Ср, 10/12/2014 - 09:46.Новое

В модуле views ничего прописывать не надо! Хакать плохо, тому есть обоснования. Я создаю свой модуль для подобных хуков.


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

Аватар пользователя Crossingover Crossingover 10 декабря 2014 в 12:40

"klimp" wrote:
Опубликовано klimp в Ср, 10/12/2014 - 09:46.Новое

В модуле views ничего прописывать не надо! Хакать плохо, тому есть обоснования. Я создаю свой модуль для подобных хуков.


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