Question sur le hook_css_alter

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

J'ai développé un module, mais à cause d'une requête ajax faite avec ajax_deliver() il charge le css du thème principal du site dans la partie admin ce qui "casse" le css du module.

J'ai donc voulu supprimer le css du thème principal du site dans la partie admin.

[code]

function monModule_css_alter(&$css)
{
global $theme_info,$base_root;

foreach($css as $chemin=>$value)
{
$chemin_frac=explode('/',$chemin);
$total_frac=count($chemin_frac);
$chemin_css="";

if($chemin_frac[2]=="themes")
{
for($i=4;$i<$total_frac;$i++)
{

$chemin_css=$chemin_css.'/'.$chemin_frac[$i];
}
unset($css[drupal_get_path('theme', $theme_info->name) . $chemin_css]);

}

}

}

[/code]

Le problème, c'est qu'il exécute ce hook pour le site.... du coup plus de css sur le site si je fais ça.
Je comprends pas pourquoi... car le module se veut être indépendant du site pour la partie css, puisqu'il a son propre css.

Ce hook se trouve dans le monModule.module dans le répertoire module de drupal.

Quelqu'un peut m'expliquer ce qu'il se passe ?

Miciii

Forum : 

Bonjour,

Je ne comprends pas trop ce que tu veux faire à la base.

"J’ai développé un module, mais à cause d’une requête ajax faite avec ajax_deliver() il charge le css du thème principal du site dans la partie admin ce qui «casse» le css du module."

Que fait ton module ? Que fait le CSS que tu as développé pour le module ? Essaye d'expliquer un peu mieux cette partie pour voir si tu pars sur la bonne route.

je développe un petit module qui reprend le fonctionnement de gmail (je me forme sur drupal), j'utilise donc l'ajax.

Je me connecte en IMAP et recupere les mails des boites, pour les affichés sous forme de liste.

J'ai deux boutons en dessous cette liste, suivant précédant pour afficher les mails dans une liste 5 par 5.

Lorsque je clique sur un des boutons qui est construit comme ça dans le hook_menu:

$items['page'] = array(
'page callback' => 'webMail_work_ajax_page_callback',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);

puis le call back :

$content=page($tab,$pointeur);
$commands[] = ajax_command_replace('#centre', $content);
$page = array('#type' => 'ajax', '#commands' => $commands);
ajax_deliver($page);

page() est une fonction ou je retourne du code html avec une requête sur un array (qui contient tous les mails).

Apparemment le ajax_deliver fait appel à des fonctions qui charge le css du site.

J'ai créé un thème pour le site, ce module est juste pour le backoffice.

En chargeant le css du site, cela me change la taille de la police du module par exemple.
Car dans le css du site je dois avoir :

*{
font-size:....;
}

etc... comment enpécher le fait de charger le css dédier au site dans le module....

Voilou j'espere que s'est beaucoup plus claire.... Merci en tout cas pour essayer de comprendre

J'ai créé un hook_css_alter dans lequel j'ai mis :

function webMail_work_css_alter(&$css) {

global $theme_info,$base_root;

if (path_is_admin(current_path()))
{

foreach($css as $chemin=>$value)
{
$chemin_frac=explode('/',$chemin);
$total_frac=count($chemin_frac);
$chemin_css="";

if($chemin_frac[2]=="themes")
{

for($i=4;$i<$total_frac;$i++)
{
$chemin_css=$chemin_css.'/'.$chemin_frac[$i];
}
unset($css[drupal_get_path('theme', $theme_info->name) . $chemin_css]);

}

}
}

}

la ça fonctionne nickel.... juste à savoir si c'est une bonne solution ou pas !
J'ai changer dans le hook_menu la définition du lien page en items['admin/page'] afin qu'il la détecte en page admin.

Donc en gros je lui dis pour la partie admin tu ne charges pas le css du site, car apparemment le ajax_deliver le chargeait !!!

Mais pourquoi le hook_alter_css du module modifie le site entier ? s'est pour contrer cela que je suis obliger de vérifier les page admin ou pas....

Hello,
Excuse le délai de réponse, je suis pas mal occupé en ce moment.

Attention, un hook s'exécute sur l'ensemble du site, pas seulement sur les pages du module qui t'intéressent ! Tu dois bien comprendre ça :
Un hook, c'est un appel de Drupal. Drupal n'est pas censé savoir ce que fait ton module, donc si ton module répond à l'appel, Drupal s'exécute.

Hook_alter_css est un appel de Drupal : "allô les modules, qui veut modifier le CSS ?", et ce sur TOUTES les pages du site. Si ton module répond "Moi j'ai un alter_css", alors Drupal exécute. Bêtement.

J'ai trouvé une page qui pourrait t'intéresser :
http://api.drupal.org/api/drupal/includes!ajax.inc/function/ajax_base_pa...

J'ai pas trop fouillé pour comprendre ce qu'ils préconisaient comme solution, mais en tout cas, ils décrivent exactement ce que tu voudrais faire.
Sinon, ta solution est viable, mais c'est "un peu coûteux" de faire ça à chaque chargement de page sur le site, du coup.

Merci pour ta réponse, oui cela marche bien mais effectivement en terme d'optimisation pas top !

Je vais regarder le lien et merci pour ton explication sur les hooks ! s'est clair comme ça :)

Bonne journée et merci encore