Bonjour,
Pour appliquer des adaptations à un contexte d’utilisation particulier (épicerie coopérative tenue par des bénévoles), j’ai besoin de surcharger des scripts en utilisant un module externe.
Comme il n’y pas de fonction override je passe par un hook à l’intérieur de la page que je veux surcharger. Le but est de ne pas modifier les scripts de Dolibarr pour faciliter les mise à jour.
Je prend le premier hook de la page à surcharger et je recharge la page avec un header si possible ou bien avec js si le header est déjà envoyé. Je transmet les paramètres GET et si nécessaire, POST
En général il faut passer par doActions mais cela peut varier (voir le 1er hook qui sera toujours lancé) :
if ($parameters['context'] == 'pricesuppliercard:globalcard:main' && $parameters['modulevalcoop']!= 1) {
// On est sur la page de la fiche produit
// Rediriger vers page personnalisée
// Transmettre les paramètres $_GET
$query = http_build_query($_GET);
// Rediriger vers la page personnalisée avec les paramètres GET
header("Location: " . DOL_URL_ROOT . "/custom/valcoop/product/price_suppliers.php" . ($query ? "?$query" : ""));
exit;
}
S’il faut récuperer aussi les paramètres POST :
// Remplacer la page reception/card.php
// Ici il faut aussi récupérer les paramètres POST pour les passer à la page de destination
if ($parameters['context'] == 'receptioncard:globalcard:main' && $parameters['modulevalcoop'] != 1) {
// Construit la query string à partir de $_GET
$query = http_build_query($_GET);
$url = DOL_URL_ROOT . "/custom/valcoop/reception/card.php" . ($query ? "?$query" : "");
// Génère le formulaire caché avec tous les paramètres POST
echo '<form id="redirectForm" method="POST" action="' . htmlspecialchars($url) . '">';
foreach ($_POST as $key => $value) {
if (is_array($value)) {
foreach ($value as $v) {
echo '<input type="hidden" name="' . htmlspecialchars($key) . '[]" value="' . htmlspecialchars($v) . '">';
}
} else {
echo '<input type="hidden" name="' . htmlspecialchars($key) . '" value="' . htmlspecialchars($value) . '">';
}
}
echo '</form>';
// envoie le formulaire en js avec le POST et le GET
// de manière à surcharger la page reception/card.php avec les paramètres GET et POST
echo '<script>document.getElementById("redirectForm").submit();</script>';
exit;
}
Si le header est déjà envoyé (pages index.php), il faut utiliser js :
// Redirige vers la page personnalisée avec tous les paramètres GET
// Comme la page d'origine a déjà lancé un header, on utilise un script JS pour rediriger (par exemple si un écho ou un print a été fait avant)
echo '<script>window.location.href="'.DOL_URL_ROOT.'/custom/valcoop/index_module.php?'.$query.'";</script>';
// Au cas ou le JS ne fonctionne pas, on met un meta refresh et un lien
echo '<noscript><meta http-equiv="refresh" content="0;url='.DOL_URL_ROOT.'/custom/valcoop/product/index.php'.$query.'"></noscript>';
echo '<a href="'.DOL_URL_ROOT.'/custom/valcoop/index_module.php">Cliquez ici si vous n\'êtes pas redirigé</a>';
exit;
Dans la page modifiée je conserve les appels hooks mais je met un drapeau dans l’appel concerné pour éviter la récurence à l’infini :
$parameters = array('socid' => $socid,'modulevalcoop' => 1);
J’ai des remarques et des questions à ce sujet :
- Est-ce que cette méthode est correcte ? Cela a l’air de fonctionner.
- Ne serait-il pas plus simple d’incorporer un hook prévu à cet effet dans main.inc ? Du type « beforepage ». En écrivant cela je me rend compte qu’il y a peut-être un hook dans main.inc à utiliser pour éviter de commencer à charger la page à surcharger. Il faut que je regarde cela.
- Je voulais savoir s’il y a une méthode plus directe de surcharge d’une page. Et au besoin, la rajouter :
- Un peu comme dans Joomla : on peut simplement mettre sa page dans son thème en utilisant la même arborescence que dans le coeur et le tour est joué : joomla charge cette page de préférence à la page du coeur.
- Et du coup cela serait valable aussi pour surcharger une classe (la méthode que j’ai trouvée est moins directe).
3 messages - 2 participant(e)s
Lire le sujet en entier