Module pour éviter de toucher au core de Dolibarr

Bonjour à tous,
Nous avons le projet de créer un module afin de ne plus toucher au core de Dolibarr.
Comme plusieurs personnes, nous avons modifié plusieurs éléments natifs de Dolibarr, afin de le faire correspondre à notre besoin.
- Certaines LIST (vue)
- Certaines CARD (vue et action)
L’idée étant d’utiliser massivement les hooks, les triggers et du jQuery.
Avant de me lancer dans ce projet, j’aurais aimé savoir si quelqu’un connaît un tel module ou si quelqu’un avait travaillé dans ce sens.
Pour vous donner un exemple concret:
Liste commandes clients

screenshot_dolibarr_orderlist.png
Les lignes en « rose » correspondent aux commandes clients non commandées chez nos fournisseurs (fk_commandefourndet vide)
Les icônes sont issues d’infos stockées dans note_private

Merci à vous pour vos lumières.
Bruce

Edit : il s’agira d’un module pour du DROPSHIPPING

Bonjour :happy:
https://www.dolistore.com/en/modules/221-Custom-Fields.html

Salut et merci dolibarr95 pour ton retour.
Mais mon besoin porte sur les listes.

Bonjour a vous,

Personnellement je ne recommande pas l’utilisation de CustomField, bien que complet et fonctionnel ce module répondais au besoin des attributs complémentaires qui n’existaient pas dans Dolibarr.
Maintenant, depuis 2 ans, les attributs complémentaires sont présent partout dans Dolibarr (à 98%, par ce que rien n’est parfait) et je préfère me dire qu’on pousse des améliorations dans le cœur de Dolibarr plutôt que de le faire avec des modules.
D’autant plus que les attributs complémentaires sont maintenant affichable et filtrable dans (toujours 98%) des listes.

-- Attention réponse technique pour Bruce
Bruce, pour répondre a ton besoin, c’est faisable avec des hooks, malheureusement, les hook sur les listes ne sont pas toujours présents.
Si on regarde /dolibarr/htdocs/commande/list.php tu trouveras les hooks (en V7)
doActions (le classique) => faire des action en plus ou injecter du JS ou des traitements php
printFieldListSelect => pour ajouter des colonnes en SQL
printFieldListWhere => pour ajouter des filtres SQL
printFieldPreListTitle => pour ajouter des filtres à afficher
printFieldListOption => pour afficher les filtre sur les colonnes dans les listes
printFieldListTitle= > pour ajouter des titres de colonnes à afficher
printFieldListValue => pour afficher les valeur des colonnes ajouté via les hook précédant
printFieldListFooter => Ajouter des totaux

Donc avec cette ensemble de hook tu peux ajouter tous ce que tu veux dans les listes .
Malheureusement ces hooks ne sont pas encore implémenté dans touts les listes mais les Pull Request qui proposerons l’intégration de ces hook dans les listes seront toujours les bienvenues.

Ce n’est pas une solution clef en main, avec ces indices, il devrait être possible de répondre au besoins.

1 « J'aime »

Salut Florian,

Merci pour ta réponse riche d’enseignements.
A partir de quelle version de Dolibarr on peut afficher les extrafields sur les listes ?
Pour les hooks c’est top ! Si je comprends bien je peux injecter du jQuery par ce biais (doActions).

Bruce

Bonjour à tous,

Sur la piste des extrafields…
Je souhaite créer un extrafield ligne de commande fournisseur.
Cet extrafield doit être la ref_client de la commande client.
Je m’explique, une commande fournisseur peut avoir plusieurs lignes de commandes clients.
L’idée est de faire apparaître sur les lignes de commandes fournisseurs, la ref_client de la commande client.
J’espère avoir été clair.
Merci à tous et bon week-end.
Bruce

configuration Module commande fournisseur
attribut complémentaire ligne
type liste issue d’une table (ou case à coché issue d’une table si tu veux lier plusieurs commandes client à ta ligne fournisseur)

valeur commande:ref:rowid::

Pièces jointes :

Salut Florian et merci pour ton aide !
En fait, les ref_client des commandes clients sont implémentées automatiquement dans la note_private des commandes fournisseurs.
Je voudrais pouvoir les voir depuis les commandes fournisseurs (liste et card).

Ce que j’ai fait:
- Extrafield commande fournisseur : liste issue d’une table => commande_fournisseur:note_private:rowid::

Mais aucune remontée d’infos…

Bonjour à tous,

J’essaye de me dépatouiller avec les extrafields…
J’ai des infos dans note_private des commandes clients.
Je créé donc un extrafield commande de type liste issue d’une table avec pour valeur :
commande:note_private:rowid::
Mais rien ne s’affiche sur la liste des commandes clients…

Bonjour à tous,
Je reviens à la charge sur mon futur module.
J’essaye d’implémenter un hook (ajout de js) sur la liste des commandes clients.
Dans modcustomdoli.class.php j’ai :

$this->module_parts = array('hooks' => array('orderlist'),);
Puis dans Actions_Customdoli.class.php

[code]
function doActions($hookmanager)
{
//$error = 0; // Error counter
//$myvalue = ‹ test ›; // A result value

	/*print_r($parameters);
	echo "action: " . $action;
	print_r($object);
	*/

	//if (in_array('printFieldPreListTitle', explode(':', $parameters['orderlist'])))
	//{
	  	$printFieldPreListTitle= '<script>
		$(document).ready(function(){
			$("#matable").find(".rouge").closest("tr").addClass("noprepa");
			$("#matable").find(".vert").closest("tr").addClass("prepa");
			$("#hide").click(function(){
		    $(".vert").closest("tr").hide();
		    });
		    $("#show").click(function(){
		        $("tr.prepa").show();
		    });
			var nb_pair;
			var nb_impair;
			var total_nb;
			var cde;
			nb_pair=$(".pair").length;
			nb_impair=$(".impair").length;
			total_nb=nb_pair+nb_impair;
			if (total_nb > 1)
			{
				cde = "commandes clients";
			}
			else
			{
				cde = "commande client";
			}
			$( "#total" ).text( " " + total_nb + " " + cde);
			$( ".titre" ).text( " " + total_nb + " " + cde);
		});
		</script>';
	//}
	
	//print $printFieldPreListTitle;

    $this->resprints = $printFieldPreListTitle;
	
	return 1;
}

}[/code]

Mais rien ne fonctionne…
Merci pour votre aide.
Bruce

J’ai réussi à injecter le JS

function printCommonFooter($parameters, &$object, &$action, $hookmanager)
	{
		$error = 0; // Error counter
		/*$myvalue = 'test'; // A result value

		print_r($parameters);
		echo "action: " . $action;
		print_r($object);
		*/
		if($parameters['currentcontext'] == "orderlist")
		print '<script type="text/javascript">
			$(document).ready(function(){
				$("#matable").find(".rouge").closest("tr").addClass("noprepa");
				$("#matable").find(".vert").closest("tr").addClass("prepa");
				$("#hide").click(function(){
			    $(".vert").closest("tr").hide();
			    });
			    $("#show").click(function(){
			        $("tr.prepa").show();
			    });
				var nb_pair;
				var nb_impair;
				var total_nb;
				var cde;
				nb_pair=$(".pair").length;
				nb_impair=$(".impair").length;
				total_nb=nb_pair+nb_impair;
				if (total_nb > 1)
				{
					cde = "commandes clients";
				}
				else
				{
					cde = "commande client";
				}
				$( "#total" ).text( " " + total_nb + " " + cde);
				$( ".titre" ).text( " " + total_nb + " " + cde);
			});
			</script>';
		//}
		
		//print $printFieldPreListTitle;

	    //$this->resprints = $printFieldPreListTitle;
		
	}

Maintenant je cherche à afficher des colonnes supplémentaires (extrafields commndeline)