Submitted by timos on
Bonjour à tous
J'aimerai savoir si certains d'entre vous ont des méthodes propres pour modifier le code d'un module de type contrib (je ne parles pas des modules du core).
Est-il possible de développer par exemple un sous-module qui permettrait de supplanter les fonctions concernées par le hack ?
J'avoue ne pas encore bien maîtriser l'api et être tout neuf dans le développement de petit module perso (merci Yoran ;-) ), du coup il est vrai que ceux que j'ai développés pour le moment permettent de faire de toutes petites choses et entièrement indépendantes des autres modules.
Le principe même du hook est de faire communiquer les modules entre eux, donc j'imagine que cela doit être possible.
Pour le moment, le module que j'ai du modifier a été hacké direct dans le code de celui-ci, ce qui est très moche en terme de maintenance...
Merci de vos retours d'expérience et conseils de bonnes pratiques.
Tim
Bonsoir, Sans entrer dans de
Permalien Soumis par takeova le 6 Décembre, 2009 - 21:51
Bonsoir,
Sans entrer dans de trop grands détails de peur de faire un message de 200 lignes pour répondre à votre question la manière propre de "hacker" un module contrib est de créer un autre module. Cependant cela ne fonctionne pas tout le temps, environ 5% des fonctionnalité d'un "gros modules" ne sont pas hackable par un autre module et donc il faut créer un petit patch qu'on utilise à chaque mis à jour.
Mais un des défaut ou bien une des qualités cela dépend c'est que on passe 5 minutes à choisir 2 module et 2 heures à les connecter ensemble mais c'est faisable?
Par exemple, un module A créer un formulaire qui permet de donner sa couleur préféré et le code tel quel :
<?php
function a_testform()
{
$form['couleur'] = array(
'#title' => t('Votre couleur préféré ?'),
'#type' => 'textfield',
'#description' => t('Quel est votre couleur préféré ?')
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Envoyer')
);
return $form;
}
?>
Maintenant nous voulons que dans le formulaire notre couleur par défaut soit le bleu on a deux choix hacké le module ou crée un petit module, dans le deuxième cas il suffit d'utiliser hook_form_alter() :
<?php
function b_form_testform_alter(&$form, $form_state)
{
$form['couleur'] = array(
'#value' => t('Bleu')
);
$form['submit'] = array(
'#value' => t('Ceci est ma couleur')
);
}
?>
Ce qui marche pour un formulaire marche pour tout le reste, par exemple un module crée un menupath tel que "/mon_module/merveilleux" nous on veut le changer pour que ce menu soit seulement un callback et qu'il soit accessible seulement pour l'utilisateur avec un id de 32
<?php
function b_menu_alter(&$items)
{
$items['mon_module/merveilleux']['type'] = MENU_CALLBACK;
$items['mon_module/merveilleux']['access callback'] = ($user->uid === 32) ? true : false;
}
?>
Tout cela pour dire qu'au final tout est modifiable par un autre module que ce soit un menu avec hook_menu_alter, une sql avec db_rewrite_sql ou bien même un profil avec hook_profile_alter.
Bonsoir et merci pour cette
Permalien Soumis par timos le 6 Décembre, 2009 - 23:41
Bonsoir et merci pour cette réponse rapide,
Cela éclaire tout à fait le point qui me paraissait obscur, de plus entre temps j'ai un peu explorer le module en question et j'avais effectivement découvert un fichier .api dans lequel de nombreux hook_fonction_alter() étaient documentés. Ce qui m'avait mis sur la voie.
Votre réponse me permet de confirmer cette découverte et de continuer à penser que drupal est, encore plus qu'un CMS, un framework incroyable.
Merci encore.
Tim.
PS : ah oui, le module que je voulais "hacker" est privatemsg.
Bonjour, Je remonte ce sujet
Permalien Soumis par ledom le 27 Juillet, 2010 - 15:05
Bonjour,
Je remonte ce sujet car je souhaiterais un éclaircissement.
Si j'ai bien compris les form_alter et menu_alter permettent de surcharger les forms et menu.
Mais comment faire lorsqu'on est pas dans le cas d'un form ou d'un menu?
Par exemple, j'ai un module qui dans une de ses fonction effectue un test pour attribuer une valeur a une variable.
311 if (!empty($criteria['vote_source']) && $anon_window >= 0) {
312 $criteria['timestamp'] = time() - $anon_window;
313 }
Je souhaite faire en sorte d'attribuer la valeur a la variable, sans faire le test.
La méthode bourrin: je commente les lignes 311 et 313 dans mon module
Est il possible de faire la meme chose grace a un hook depuis un nouveau module?
Merci
Hello, Il va falloir que je
Permalien Soumis par timos le 27 Juillet, 2010 - 15:28
Hello,
Il va falloir que je me repenche aussi sur la question, mais le premier truc que tu peux vérifier, c'est la doc de ta fonction qui peut peut être t'éclairer sur comment hacker celle-ci.
Autrement tu peux tenter ceci dans ton module :
tonmodule_fonctionahacker_alter()
enfin, je crois, mais je dois encore vérifier que les fonctions commençant par un underscore sont surchargeable facilement, je creuse un peu plus et je te tiens au courant.
++
Autant pour moi, le
Permalien Soumis par timos le 28 Juillet, 2010 - 09:51
Autant pour moi, le underscore en début de fonction n'a rien à voir !
cf http://drupal.org/node/866102
Merci Timos pour ta
Permalien Soumis par ledom le 28 Juillet, 2010 - 18:13
Merci Timos pour ta réponse.
Si j'ai bien compris ma fonction doit supporter les hooks pour pouvoir etre modifiée? Dis moi si je me trompe.
Pour les menu et les bloc ça ne pose pas de probleme, les hook sont prévu par l'api, mais pour un fonction quelconque j'ai l'impression que ce n'est pas possible.
La fonction en question est votingapi_select_votes du module votingapi
D'après http://drupal.org/node/68877 il ne semble pas exister d'api pour cette fonction.
Je voulais faire qqch de propre en mettant toute mes modifs dans un module, mais je crois que je vais en rester à la methode pas tres propre avec des hacks directement dans les module et des patchs que j'appliquerais en cas de mise a jour (me reste qu'a apprendre a patcher). A moins qu'une autre solution existe.
Il est toujours possible de
Permalien Soumis par Numerizen le 30 Juillet, 2010 - 11:26
Il est toujours possible de copier le code de cette fonction et de le retoucher dans son propre module pour en changer le comportement, et de l'appeler depuis un hook existant. Évidemment, il faut que ça colle avec le workflow du module ...
Salut, Je me permet juste de
Permalien Soumis par ledom le 8 Août, 2010 - 22:21
Salut,
Je me permet juste de signaler que j'ai trouvé un compromis qui me semble plutot bon, en attendant de faire developer de nouveaux modules au propres pour prendre en compte mes modifications.
Comme mon problème principal est rencontré lors des mises a jour éventuelles, et que je n'ai pas fait un très grand nombre de modifs, j'ai finalement utilisé l'excellent Meld, disponible sous ubuntu.
Il permet de comparer 2 répertoires (ici le drupal modifié et le drupal mis a jour) et indique les fichiers modifiés. Ensuite il permet de comparer 2 à 2 les fichiers et de faire passer les modifs de l'ancien vers le nouveau. Très pratique et rapide, meme si on est loin des regles de l'art...
Encore merci pour cette discussion.