Ajouter une entrée dans la zone de recherche

Bonjour,

Est-il possible avec un nouveau module d’ajouter dans la zone de recherche de gauche une nouvelle entrée pour faire des recherches sur un autre champ (ex : recherche sur les factures).

Je n’ai rien vu dans la doc ni dans le forum à ce sujet

Apparemment, cette gestion est faite en dure dans le fichier main.inc.php

Y-a-t-il une astuce ?

Merci d’avance

Bonjour,

C’est à priori possible. Il suffit créer un module avec un hook (je pense en particulier au printSearchForm)
http://wiki.dolibarr.org/index.php/Système_de_Hooks

Ça devrait rajouter une nouvelle boîte de recherche sur le menu de gauche. Il suffit ensuite de gérer la requête comme bon vous semble.

Merci pour la réponse, mais je patauge complètement dans la création du module avec un hook en suivant la documentation.

Par exemple, je ne sais pas ce que je dois mettre à la place de ‹ hookcontext1 › dans cette partie :

$this->module_parts = array('hooks' => array('hookcontext1','hookcontext2'));

Ensuite, je n’ai pas trouvé le contexte que je devais mettre, car cette ligne ne me retourne rien :

print('Module context: '.$object->context);

D’une manière générale, je ne comprend pas la logique, donc je patauge complètement.

Merci d’avance pour vos lumières

Bonjour,

En fait les hooks permettent d’exécuter du code n’importe où dans Dolibarr. Et pour savoir à quel endroit le code doit être exécuté, les hooks utilisent cette notion de contextes qui sont tous simplement des repères sur les pages de Dolibarr. Par exemple, la fiche d’une facture est repérée par le contexte ‹ invoicecard ›, celle d’un membre par ‹ membercard ›, etc…

Tous ces contextes sont définis durant l’initialisation de Dolibarr par appel à la fonction « initHooks ». C’est Dolibarr qui gère cette initialisation, pas vous.

Dans votre cas, vous souhaitez rajouter un bloc de recherche sur la gauche. Ces blocs de recherche sont initialisés dans la fonction left_menu de main.inc.php. Dans cette fonction, on trouve l’appel à initHooks suivant :

$hookmanager->initHooks(array('searchform','leftblock'));

Il y a donc deux contextes ici : ‹ searchform › (qui définit le repère associé aux blocs de recherche) et ‹ leftblock › qui est le bloc situé en-dessous.

Seul le contexte ‹ searchform › nous est utile donc lors de la définition du module on spécifie :

$this->module_parts = array('hooks' => array('searchform'));

Je sais pas si j’étais clair, en espérant que ça vous aide.

Pour la première partie, c’est très claire (merci pour les explications), mais je ne comprend pas comment je dois nommer ma fonction pour qu’elle s’exécute.

Si je regarde dans ‹ main.inc.php › la fonction ‹ left_menu ›, je vois cette ligne :

$searchform.=$hookmanager->executeHooks('printSearchForm',$parameters);

Donc j’en déduis que je dois nommer ma fonction ‹ printSearchForm › dans ma class ActionsYourModuleName en suivant cette doc

Exemple de code :

function printSearchForm($urlaction,$urlobject,$title,$htmlmodesearch,$htmlinputname) { return "toto et tutu"; }

Mais rien se ne passe.

il faut désactiver/réactiver le module pour que le contexte du hook soit prix en compte

J’ai bien désactiver/réactiver le module.

Voici ce que j’ai fais :

  • Dans le fichier « htdocs/monmodule/code/module/modMonModule.class.php », j’ai mis cette ligne « $this->module_parts = array(‹ hooks › => array(‹ searchform ›)); »
  • J’ai créé le « fichier "monmodule/class/actions_yourmodulename.class.php » avec la fonction « printSearchForm » mais je ne comprend pas comment est appelé cette fonction étant donné que je n’indique nul part le nom de cette class

qu’on soit bien d’accord:

il faut bien garder une cohérence au niveau du nom du module, du répertoire et de la classe.

/monmodule/core/module/modMonmodule.class.php
/monmodule/class/actions_monmodule.class.php

le fait de rajouter:

$this->module_parts = array(‹ hooks › => array(‹ searchform ›));

va dire à dolibarr que le module « monmodule » fait appel au contexte « searchform »
une foi que ce contexte est appelé, il va vérifier si la classe « /monmodule/class/actions_monmodule.class.php » existe, si oui il charge la classe « ActionsMonmodule », ensuite lorsqu’il rencontre le hook « printSearchForm », il vérifie si cette méthode existe dans la classe, si oui il l’exécute.

Super. Merci beaucoup.

C’était bien un problème de nommage de la class :
-> actions_yourmodulename.class.php => actions_monmodule.class.php

Pour avoir un peu cherché sur le sujet des hook et en particuliers celui de recherche, je post ici le bout de code que j’ai finalement utilisé pour ajouter à mon module la recherche par numéro de série d’un équipement.

1 ajouter dans la classe de déclaration du module la ligne suivante :
$this->module_parts = array(‹ hooks › => array(‹ searchform ›));
2 créer un fichier action_mymodule.class.php dans le dossier où se trouve déjà les classes de votre module
3 voici le hook codé pour réaliser une recherche sur le numéro de série de l’équipement :

[code type=php]class ActionsEquipement // extends CommonObject
{

/*\* Overloading the doActions function : replacing the parent's function with the one below 
 \*  @param      parameters  meta datas of the hook (context, etc...) 
 \*  @param      object             the object you want to process (an invoice if you are in invoice module, a propale in propale's module, etc...) 
 \*  @param      action             current action (if set). Generally create or edit or null 
 \*  @return       void 
 */ 
function printSearchForm($parameters, $object, $action) 
{ 
	global $conf,$langs;
	
	$langs-\>load("equipement");
	$title = img_object('','equipement').' '.$langs-\>trans("Equipements");
	$ret='';
	$ret.='<div class="menu_titre"\>';
	$ret.='<a class="vsmenu" href="'.DOL_URL_ROOT.'/equipement/list.php'.'"\>';
	$ret.=$title.'</a\><br\>';
	$ret.='</div\>';
	$ret.='<form action="'.DOL_URL_ROOT.'/equipement/list.php'.'" method="post"\>';
	$ret.='<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'"\>';
	$ret.='<input type="hidden" name="mode" value="search"\>';
	$ret.='<input type="text" class="flat" ';
	if (! empty($conf-\>global-\>MAIN_HTML5_PLACEHOLDER)) $ret.=' placeholder="'.$langs-\>trans("SearchOf").''.strip_tags($title).'"';
	else $ret.=' title="'.$langs-\>trans("SearchOf").''.strip_tags($title).'"';
	$ret.=' name="search_ref" size="10" /\>&nbsp;';
	$ret.='<input type="submit" class="button" value="'.$langs-\>trans("Go").'"\>';
	$ret.="</form\>\n";
	return $ret;
}

}[/code]

Je n’ai en fait que repris la fonction printSearchForm générique que j’ai adapté pour ma recherche spécifique. il doit être possible d’utiliser la fonction générique dans le hook mais comme les deux on le même nom…