Création module

12 messages dans ce sujet

Posté(e) · Signaler ce message

Bonjour, 

Voulant apporter beaucoup de modification mais ne souhaitant pas a chaque mise a jour remettre en dur le tout, je regarde pour créer des modules en utilisant les hooks.

Malheureusement j'apprend sur la tas. J'ai suivi ce sujet: https://forum.peel.fr/topic/8372-fonctionnement-des-modules-à-partir-de-peel-8/ et https://forum.peel.fr/topic/8371-fonctionnement-des-hooks-sur-peel-à-partir-de-la-version-8/ mais je galère et n'arrive a rien.

Le but etant pour le moment de faire un simple module qui pourrait simplement afficher un "bonjour" voir afficher une valeur. Je voulais que se soit au dessus de la liste des commandes du coups j'ai regarder dans fonctions_admin.php qui gére l'affichage de la liste sur admin_commande_liste.tpl et j'ai trouver un endoit avec un hook:

		$tpl_results = call_module_hook('affiche_liste_commandes_admin', $tpl_results, 'array', true);
		$tpl->assign('results', $tpl_results);

Mais celui-ci envoi un tableau au tpl j'ai donc créer juste au dessus cette ligne:

call_module_hook('hook_test_affiche_liste_commandes_admin',vn($Links->nbRecord));

logiquement ça appel hook_test_affiche_liste_commandes_admin et lui envoi le nombre de commande.

 

Pour créer un module, dans le dossier des modules j'ai créer un dossier "bonjour" dans lequel j'ai créer un fichier fonctions.php dans lequel j'ai ceci:

<?php
/**
 *
 * @brief Exemple de module : dossier monmodule/ contenant un fichier Monmodule.php ayant pour contenu la classe ci-dessous
 * @package PEEL
 * @author PEEL <contact@peel.fr>
 * @copyright Advisto SAS 51 bd Strasbourg 75010 Paris https://www.peel.fr/
 * @version $Id: xxx $
 * @access public
 */
class bonjour extends Module
{
    /**
     * Constructor
     *
     */
    public function __construct()
    {
        $this->name_by_lang = array('en' => 'Hello', 'fr' => 'Bonjour');
        $this->description_by_lang = 'afficher simplement bonjour';
        $this->technical_code = 'bonjour';
        $this->activation_variable = 'module_bonjour';
        $this->version = '8.0';
        $this->vendor = 'Ant0ny';
        $this->peel_versions_compatibility_infos = array('min' => '8.0', 'max' => null);
        $this->dependencies = null;

        parent::__construct();
    }

    /**
     * Vérifie l'installation du module
     */
    static public function check_install()
    {
        $listTables = listTables();
        return in_array('peel_bonjour', $listTables);
    }
    
    /**
     * Gère les opérations liées au module
     */
    public function execute($mode = null)
    {
        if($mode == 'install') {
            query("
CREATE TABLE IF NOT EXISTS `peel_bonjour` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bonjourchamp` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
");
            set_configuration_variable(array('technical_code' => 'modules_lang_folders_array', 'string' => array_merge_recursive($GLOBALS['site_parameters']['modules_lang_folders_array'], array('bonjour' => '/modules/bonjour/lang/')), 'type' => 'array', 'site_id' => 0, 'origin' => $this->technical_code), true);
            $GLOBALS['site_parameters']['modules_front_office_functions_files_array']['bonjour'] = '/modules/bonjour/fonction.php';
            set_configuration_variable(array('technical_code' => 'modules_front_office_functions_files_array', 'string' => $GLOBALS['site_parameters']['modules_front_office_functions_files_array'], 'type' => 'array', 'origin' => 'sites.php', 'site_id' => 0), true);
        } elseif($mode == 'uninstall') {
            query("DROP TABLE `peel_bonjour`");
            unset($GLOBALS['site_parameters']['modules_lang_folders_array']['bonjour']);
            set_configuration_variable(array('technical_code' => 'modules_lang_folders_array', 'string' => $GLOBALS['site_parameters']['modules_lang_folders_array'], 'type' => 'array', 'site_id' => 0, 'origin' => $this->technical_code), true);
            unset($GLOBALS['site_parameters']['modules_front_office_functions_files_array']['bonjour']);
            set_configuration_variable(array('technical_code' => 'modules_front_office_functions_files_array', 'string' => $GLOBALS['site_parameters']['modules_front_office_functions_files_array'], 'type' => 'array', 'origin' => 'sites.php', 'site_id' => 0), true);
        }
    }

    /**
     * Fonction de hook, qui renverra un contenu dépendant du hook concerné
     *
     * @param array $params
     * @return
     */
    static public function hook_test_affiche_liste_commandes_admin($params) {
echo 'Bonjour - Hello avec params='.$params;
	return "<br>TEST BONJOUR<br>";
    }

 

    /**
     * quelconque()
     *
     * @param string $param1
     * @param string $param2
     * @return
     */
   // public function quelconque($param1, $param2)
   // {
   // }
}
?>

J'ai repris cela depuis le sujet indiqué plus haut et adapter.

j'ai aussi créer une variable sur le site comme suite:
Origine :modules
Code technique :module_bonjour
Type :integer
Votre contenu :1

Je pense que cette création se fait logiquement via un fichier installation mais pour le moment j'essaie que ça fonctionne avant de faire des installations automatiques etc...

Actuellement j'ai rien du tout... alors que si je met simplement au dessus de l'appel un echo j'ai le texte tout en haut de la page affiché quand même (même si après logiquement faudrait l'envoyé au tpl mais du coups faudrai quand meme modifier le tpl?)
J'ai vu que l'exemple crée et supprime une table (pas utile dans mon cas mais j'ai laisse histoire de pas trop modifier l'exemple).

Et quand on trouve ceci dans le code:

call_module_hook('product_details_show',xxx);

c'est un appel des hooks qui peuvent avoir plusieurs nom du moment que ça comporte product_details_show dedans? comme 
 

function last_views_hook_product_details_show($params) {

mais ça pourrais etre aussi quleque chose de nouveau comme

 

function test_bonjour_hook_product_details_show($params) {

?

Merci pour votre aide et surtout a Simon ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié) · Signaler ce message

Apres tout mon dimanche a regarder et chercher des infos (que je ne trouve que pour WP etc...) et qui ne ressemblent pas a se qui est utilisé sur peel, je perd espoir :( 
je fait l'appel, je fait la fonction mais je vois pas comment la liaison est faite entre les deux, je doit louper quelque chose...

J'ai aussi changer mon fichier fonction.php par bonjour.php dans le dossier bonjour mais ça ne change rien... J'ai l'impression que c'est totalement ignoré.
Je vois qu'il y a des fonctions pour installer le module sur le script mais comment ça pourrais le faire, on doit lui dire quelque part ou alors faut aussi un autre fichier d'installation...

Si je n'y arrive pas d'ici 2-3 jours alors j'abandonnerai et coderai tout en dur dans le code source car a ce train la, je risque de ne jamais rien faire...

Merci pour votre aide ;)

Modifié (le) par ant0ny

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Je viens de regarder sur le fichier installation des module premium, il fait uniquement se que j'ai fait manuellement dans les variables si je dit pas de bêtises. Je comprend pas pourquoi ça fonctionne pas :(

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

cfc7db6039464450d3b3ade91574c067.gif

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Tout le monde est en vacance? 

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour ant0ny,

effectivement j'avais pris une semaine de congés ;)

Plusieurs pistes pour résoudre votre problème :
- Avant de faire l'installation, il faut mettre un "s" à "fonction.php" dans la ligne

            $GLOBALS['site_parameters']['modules_front_office_functions_files_array']['bonjour'] = '/modules/bonjour/fonction.php';

dans le script d'installation du module
- La première lettre du nom de la classe doit être en majuscule :

class Bonjour extends Module


- Faire l'installation du module depuis la page administrer/sites.php, afin de créer la table peel_bonjour dans la BDD

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié) · Signaler ce message

Bonjour Simon, 

Merci pour ton aide. Faut de temps en temps se prendre un peut de repos, tu as bien raison ;)

J'ai renommer mon fichier fonctions et j'ai mis le s dans le ligne. J'ai aussi mis une majuscule a "bonjour".

Ensuite je suis aller sur la page administrer/sites.php rien de spécial, je suis aller dans les parametre du site et la j'ai eu un message et erreur que je met ici mais je pense pas que se soit en lien avec mon module mais je pense plutot au module Ogone:

SQL OK : /home/asticketra/www/modules/ogone/ogone.sql
Notice : Erreur SQL 1062 - Duplicate entry '339' for key 'PRIMARY' - Page : /administrer/sites.php?mode=modif&id=1 - IP 79.132.248.13 - INSERT INTO `peel_configuration` (`id`, `technical_code`, `origin`, `type`, `string`, `lang`, `last_update`, `explain`, `etat`) VALUES
(339, 'peel_ogone_new_sha_mode', 'admin', 'boolean', 'true', '', NOW(), '', 1),
(338, 'peel_ogone_servers_ip_block_array', 'admin', 'array', '"84.233.249.112/28", "212.23.45.96/28", "213.254.248.96/28", "212.35.124.160/28", "212.35.124.176/28", "213.254.248.112/28", \r\n"72.52.4.0/24", "72.52.5.0/24", "209.200.154.0/24"', '', NOW(), '', 0),
(337, 'ogone_pspid', 'admin', 'string', 'Votre PSPID', '', NOW(), '', 1),
(336, 'ogone_cle', 'admin', 'string', 'Votre clé SHA renseigné dans le back office ogone', '', NOW(), '', 1),
(335, 'peel_ogone_test_mode', 'admin', 'boolean', 'true', '', NOW(), '', 1) in /home/asticketra/www/lib/fonctions/database.php on line 276

Notice : Erreur SQL 1054 - Unknown column 'nom_es' in 'field list' - Page : /administrer/sites.php?mode=modif&id=1 - IP 79.132.248.13 - UPDATE `peel_paiement` SET `nom_es`='Tarjeta de crédito' WHERE `technical_code`='ogone'; in /home/asticketra/www/lib/fonctions/database.php on line 276

 

En y retournant j'ai plus d'erreur mais je pense que quelque chose soit clocher avec le module ogone mais j'ai pas encore regarder a ça.

Mais j'ai pas la table peel_bonjour de créer, peut-etre car j'avais deja ajouté la variable manuellement. Je vais essayer de retirer la variable puis de retourner sur la page administrer/sites.php

YES, un pas en avant, j'ai supprimer ma variable, je suis retourner sur la page sites et dans module j'ai trouver

MODULE : bonjour 9.3

Module présent - Procédez à l'installation du module : Oui  •Non
Activer : Oui  •Non

J'ai mis oui et oui et validé. J'ai bien la table de créer dans ma base de donnée (meme si la ça sert a rien au moins il a bien pris le module et fait son installation). 

Il semble etre installé mais il m'indique quand meme la possibilité de l'installer sur oui ou non au lieu d'indiqué une confirmation que le module est installé mais c'est peut-etre normal comme ca

MODULE : bonjour 9.3

Module présent - Procédez à l'installation du module : •Oui  Non
Activer : •Oui  Non


Maintenant je tape un oeil avec le hook si j'arrive a avoir l'info du module sur la page liste des commandes...

Dans fonctions_admin.php dans la fonction affiche_liste_commandes_admin j'ai mis ceci:

 call_module_hook('test_affiche_liste_commandes_admin',vn($Links->nbRecord));

Pour appeler le code que j'ai dans le module qui devrai logiquement m'afficher du texte et/ou texte avec la valeur de la variable qui est le nombre de commande.

dans le module j'ai ceci:

    static public function bonjour_hook_test_affiche_liste_commandes_admin($params) {
echo 'Bonjour - Hello avec params='.$params;
$valeuraretourner = "<br>TEST BONJOUR<br>";
	return $valeuraretourner;
    }

J'ai fait un echo dedans par espoir et comme j'ai rien, j'ai fait un return mais pas mieux.

C'est tout se qu'il y a a faire pour les hooks? juste créer un appel et avoir fonction dans le module et ça doit fonctionner? je me demande comment il retrouve les "fonctions" qu'il doit exectuer lors de l'appel du hook vu que l'on appel  test_affiche_liste_commandes_admin et qu'il doit savoir qu'il faut prendre bonjour_hook_test_affiche_liste_commandes_admin dans mon module...

Je me trompe peut-etre, je doit peut-etre utiliser un hook présent sur un .tpl obligatoirement pour faire de l'affichage? Car la j'ai rien, meme pas tout en haut de la page comme si j'avais mis un echo en dur sur la page php..

 

Merci pour ton aide :)

Modifié (le) par ant0ny

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

vous devez renommer votre fonction

    static public function bonjour_hook_test_affiche_liste_commandes_admin($params) {

par

    static public function hook_test_affiche_liste_commandes_admin($params) {

Pour comprendre comment le code récupère les bonnes fonctions je vous invite à lire la fonction call_module_hook dans le fichier lib\fonctions\modules_handler.php

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour Simon, 

Merci, en effet ça fonctionne j'ai bien mon "bonjour avec la valeur affiché".

J'ai regarder la fonction call_module_hook et j'ai vu indiqué 

 * Appelle la fonction correspondant au $hook pour chaque module installé
 * La fonction doit s'appeler : [nom du module]_[nom du hook]

et

		$function_name = $this_module . '_hook_' . $hook;
		$class_name = StringMb::ucfirst($this_module);
		$method_name = 'hook_' . $hook;

Donc si je comprend bien, ma fonction étant dans une class j'utilise hook_ devant le nom car on se trouve comme méthode?

Et si j'aurai juste un fichier avec une fonction comme dans l'exemple alors c'est nom du module + _hook_ + nom du hook?

 

Quand j'ai ceci:

		$tpl_results = call_module_hook('affiche_liste_commandes_admin', $tpl_results, 'array', true);

Comment je peut trouver la partie de code qui sera affecté? En cherchant dans tous les fichiers avec "hook_affiche_liste_commandes_admin" je ne trouve rien.

 

J'essaie d'afficher un simple texte avec lien en haut de la page liste des commandes comme ceci:

210223083736551762.png

Du coups je doit créer un hook dans fonctions_admin.php de ce genre:

		$tpl_monlien = call_module_hook('test_affiche_liste_commandes_admin',$variabletest);
		$tpl->assign('monlien', $tpl_monlien);

Et dans admin_commande_liste.tpl mettre quelque chose comme ca:

{if isset($monlien)}
{$monlien}
{/if}

Mais du coups ça oblige des modifications dans le code source quand même et la création d'un module ne sert plus a rien vu que le but est de pouvoir justement créer mes modifications ou ajout comme module pour les garder lors de mise a jour et pouvoir les intégrer facilement... a moins que je puisse faire autrement via le hook affiche_liste_commandes_admin qui est appelé...

En tout cas merci pour ton aide Simon, j'arrive a avancé la ou j'était complétement bloqué et me permet de comprendre un peut mieux le fonctionnement.

Désolé pour les 10 000 questions.

Merci :D

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour, 

Si je comprend bien, ceci:

		$tpl_results = call_module_hook('affiche_liste_commandes_admin', $tpl_results, 'array', true);
		$tpl->assign('results', $tpl_results);

c'est en cas ou l'on souhaite manipuler des donnés de la liste via un hook mais il n'y en a pas dans le code donc c'est pour ça que j'en trouve pas avec hook_affiche_liste_commandes_admin

Du coups ce hook ne me permet pas d'ajouter un lien tout en haut, je doit donc ajouter un hook au code pour pouvoir le faire?

Merci :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) (modifié) · Signaler ce message

Bonjour Simon, 

Dans mon module j'ai ceci:

    static public function hook_haut_affiche_liste_commandes_admin($params) {
$valeuraretourner = '<p><a href="http://www.monsite.eu/factures/commande_pdfprep.php" target="_blank">PDF commande à préparer</a></p>';
	return $valeuraretourner;
    }

commande_pdfprep.php est une copie de commande_pdf.php que j'ai légèrement modifier pour juste avoir les commandes en attente de validation.

dans fonctions_admin.php j'ai ajouter ceci:

$tpl->assign('URLPDFCMD', call_module_hook('haut_affiche_liste_commandes_admin','1','null'));

Et dans admin_commande_liste.tpl j'ai ajouter ceci a l'endroit de l'affichage désiré:

{if isset($URLPDFCMD)} {$URLPDFCMD} {/if}

Du coups ça fonctionne correctement mais j'ai du ajouter une ligne dans le php et une dans le tpl, je doit donc bien modifier le code source et je peut pas créer de module sans toucher au code source qui ferait la même chose, c'est bien exacte?

Merci :)

Modifié (le) par ant0ny

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Donc si je comprend bien, ma fonction étant dans une class j'utilise hook_ devant le nom car on se trouve comme méthode?
Et si j'aurai juste un fichier avec une fonction comme dans l'exemple alors c'est nom du module + _hook_ + nom du hook?

=> Oui c'est bien ça

Quand j'ai ceci:
$tpl_results = call_module_hook('affiche_liste_commandes_admin', $tpl_results, 'array', true);
Comment je peut trouver la partie de code qui sera affecté? En cherchant dans tous les fichiers avec "hook_affiche_liste_commandes_admin" je ne trouve rien.
=> Il n'y a pas nécessairement de hook existant, certain hook existe dans des certains modules uniquement

Mais du coups ça oblige des modifications dans le code source quand même et la création d'un module ne sert plus a rien vu que le but est de pouvoir justement créer mes modifications ou ajout comme module pour les garder lors de mise a jour et pouvoir les intégrer facilement... a moins que je puisse faire autrement via le hook affiche_liste_commandes_admin qui est appelé...

=> Pour ajouter une variable via le hook existant "affiche_liste_commandes_admin", il faut que votre hook de votre nouveau module retourne par exemple return $output['nom_variable'] = $value. Ensuite vous pouvez utiliser cette valeur dans le tpl admin_commande_liste.tpl {$res.nom_variable} sous le foreach {foreach $results as $res}. Si cet endroit ne vous convient pas, il faut effectivement créer un nouveau hook.

c'est en cas ou l'on souhaite manipuler des donnés de la liste via un hook mais il n'y en a pas dans le code donc c'est pour ça que j'en trouve pas avec hook_affiche_liste_commandes_admin
Du coups ce hook ne me permet pas d'ajouter un lien tout en haut, je doit donc ajouter un hook au code pour pouvoir le faire?
 

=> Oui c'est bien ça

Du coups ça fonctionne correctement mais j'ai du ajouter une ligne dans le php et une dans le tpl, je doit donc bien modifier le code source et je peut pas créer de module sans toucher au code source qui ferait la même chose, c'est bien exacte?

 

=> Oui tout à fait 

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant

Twitter Advisto ecommerce

Facebook PEEL Shopping