Отключение css для определенных пользователей

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

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 15 января 2012 в 2:06

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

В 7-ой версии это делается с помощью hook_css_alter.

Беда только в том, что почему-то везде где я видел этот прием, стили отключаются для всех - и админов и пользователей.
Но ведь пользователи не равны!
И если админу нужно оставить стиль модуля Administration menu, то зачем из-за этого страдать пользователю (или наоборот).

Ну для 6-ки дополнительную проверку включить не сложно, потому что там все переменные под рукой.

В используемом хуке 7-ки сразу доступна только переменная со стилями, и чтобы узнать текущего юзера нужна еще одна строка, ради которой это всё и пишу). Итак:

<?php
function THEME_css_alter(&$css) { 
 global 
$user//ну впринципе и всё, дальше дело техники)

 //можно проверить пользователя по роли $user->roles;

  

$roles $user->roles;
  
$admin false;
 
     foreach (
$roles as $key => $value) {
        if(
$value == "administrator") {            
            
$admin=true;
            break;
        }
    }

 

//или $user->name (для незарегистрированных отсутствует)

 

if(isset($user->name) && $user->name=="admin"){
     
$admin=true;
 }

 

//само отключение подробно описано в ссылке, приведенной в самом начале, но для полноты картины

 //способ 1

    

$exclude = array(
            
drupal_get_path('module','system').'/system.base.css'
            
drupal_get_path('module','system').'/system.menus.css'
            
//....
            
); 

     foreach (

$exclude as $css_file) { 
        unset(
$css[$css_file]); 
     } 

 

//способ 2

     

$exclude = array(
        
'modules/system/system.base.css' => FALSE,
        
'modules/system/system.menus.css' => FALSE,
        
//..
        
);

     

$css array_diff_key($css$exclude);     

 

//вот еще, для суровых ребят
     
foreach ($css as $key => $value) {
        if (
$value['group'] != CSS_THEME) {
            
$exclude[$key] = FALSE;
        }
     }    
    
     
$css array_diff_key($css$exclude);

}

?>

Есть замечания, предложения? Буду рад услышать

Комментарии

Аватар пользователя enemis enemis 15 января 2012 в 2:50

А зачем это делается?
Я думал если включенно оптимизация CSS то все пакуется в один файл и отсылается user один раз?
Не пойму у вас там что стилей 100500? Или вы уверены что этот прием разгрузит сервер?. Вообще что вы пытаетесь добиться отключением админских стилей?
Я допустим в админке использую те же стили что и на сайте...

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 15 января 2012 в 11:09

Для Айдара: пожалуйста. Работает.

Для enemis:
Я уверен, что чем меньше лишнего отправлять пользователю, тем лучше. И не важно, сильно это разгрузит сервер, ускорит загрузку, сделает более стабильной верстку (которую верстальщик так долго делал без учета других стилей) или нет.

А еще, когда верстальщик смотрит на код, и видит вместо своих 4 стилей еще 20 чужих стилей, то расстраивается)

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

Аватар пользователя enemis enemis 15 января 2012 в 15:01

Я не уверен так как я такими извращениями не пользуюсь. Вот некоторые мои мысли:

1. Если вам даже удастся отключать (в чем я не уверен) то при включении оптимизации сайта(рекомендую делать всегда[конечно есть более лучшие решения] производительность увеличивается) система пробежит по всем модулям и включит только те css которые нужны, те если у вас css используется только для usera или одмина, то в результирующем файле у вас будут все равно оба как вы бы не старались.
2. если вам кажется что много стилей убирайте лишнее у меня для сайта в среднем выходит от 800-1000 строк но я не использую шаблоны.
3. Выгоняйте с работы такого не уравновешенного верстальщика :), потому что у друпала каждый модуль может формировать свои стили, поэтому нужно уметь их либо отключать сразу(не рекомендую много в них хорошего) либо уметь переопределять их.

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 15 января 2012 в 21:10

enemis, большое спасибо за проявленный интерес. Я пока не силен в этой теме и возможно действительно совершаю глупость. Поэтому, если можно, уточнить пару моментов.

Оптимизация - это включение агрегации css или что-то другое? Потому что при включенной агрегации данный метод работает нормально.

т.е. стили были собраны по группам, администратор получает их все, пользователь, только группу CSS_THEME (которая и была для него оставлена)

«конечно есть более лучшие решения»

пожалуйста, раз уж обозначили что есть, скажите какое?

Аватар пользователя enemis enemis 16 января 2012 в 0:58

Читайте о cacherouter, boost для снижение нагрузки за счет кеширования... Sphinx сишный поиск снижает нагрузку... Devel позволяет смотреть сложные запросы... Отказавшись от views и panels повысится производительность, можно посмотреть в devel на сколько. И хаки ядра для самых суровых оптимизаторов, смотрим в девеле где много кушает и прокладываем другой путь... Я последней херней не занимаюсь, так как супер высоконагруженные проекты еще не делал...

Аватар пользователя alexandr.poddubsky alexandr.poddubsky 2 марта 2012 в 13:59

"vaplas" wrote:
Еще раз большое спасибо!)

нормально.никого не слушай. Первое правило- что можно удалить - удаляй, что можно закэшировать -кэшируй, используй всегда форк. Меньше мусора , шустрее сайт. Некоторым конечно нравятся комбайны трактора, но мне больше по душе самолеты.