Problème d'insertion dans la base de données à partir d'un plugin

Réduire
Une réponse a été apportée à ce sujet.
X
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [Problème] Problème d'insertion dans la base de données à partir d'un plugin

    Je dois insérer dans la base de données joomla de mon site. En particulier, dans la table mail_templates. Mais, il m'est impossible d'y arriver et je n'ai pas de message d'erreur.
    Voici le code des différents fichiers.
    Cliquez sur l'image pour l'afficher en taille normale  Nom : imagestructure.png  Affichages : 0  Taille : 5,8 Ko  ID : 2051488

    File: insertiondt.php
    Code:
    <?php defined('_JEXEC') or die; use Joomla\CMS\Factory;
    use Joomla\CMS\Plugin\CMSPlugin;
    class plgInsertionDataCompliance extends CMSPlugin {
    
    public function onExtensionAfterInstall($installer, $eid){
    if ($eid === 'plg_insertiondatacompliance') { $this->onMyEvent();
    }
    }
    
    public function onMyEvent() {
    // Obtenez une connexion à la base de données
    $db = Factory::getDbo();
    $columns = array('template_id', 'extension', 'language', 'subject', 'body', 'html_body', 'attachments', 'params');
    $values = array('com_datacompliance.admin_admin', 'com_datacompliance', '', 'FOO', 'BAR', '<p>BAR</p>', '', '{"tags":["name","email","username","registerdate","lastvisitdate","requirereset","resetcount","lastresettime","activation","block","id","actions","actions_text"]}');
    $query = $db->getQuery(true) ->insert($db->quoteName('#__mail_templates')) ->columns($db->quoteName($columns)) ->values(implode(',', $db->quote($values)));
    $db->setQuery($query); $db->execute(); } }
    file: insertiondt.xml
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <extension method="upgrade" group="datacompliance" type="plugin" version="1.6"> <name>InsertionDataCompliance</name>
    <version>1.0.0</version>
    <creationDate>May 2022</creationDate>
    <author>BMD!</author>
    <authorEmail>bmdpro@gmail.com</authorEmail>
    <authorUrl>http://www.joomlathat.com</authorUrl>
    <copyright>2022 joomlathat.com</copyright>
    <license>GNU General Public License v2</license>
    <description>InsertionDataCompliance</description>
    <files>
    <filename plugin="InsertionDataCompliance">insertiondt.php</filename>
    <folder>sql</folder>
    </files>
    <languages>
    <!--language tag="en-GB">languages/en-GB.plg_invoices_payment_paypal.ini</language-->
    </languages>
    <update>
    <schemas>
    <schemapath type="mysql">sql</schemapath>
    </schemas>
    <files folder="sql">
    <file type="sql">update-1.0.0.sql</file>
    </files>
    </update>
    </extension>
    file: update-1.0.0.sql
    Code:
    INSERT INTO #__mail_templates (template_id, extension, subject, language, body, htmlbody, attachments, params) VALUES ('tempid', 'extension', '','Sujet du mail', 'Corps du mail', '<p>p</p>', '', '{}');
    Dernière édition par bmdiarra à 10/05/2023, 22h56
  • Réponse sélectionnée par bmdiarra, le 11/05/2023, 23h49.

    Hello.

    Si je comprend bien c'est un insert que tu veux faire à l'install du plugin.

    Dans ce cas tu n'as pas besoin de ton code php, mais juste de la section update dans ton manifest.

    Toutefois la tienne ne me semble pas correcte.

    Il faut juste definir le chemin dans la section schemapath:
    Code:
    <update>
    <schemas>
    <schemapath type="mysql">sql/updates/mysql</schemapath>
    </schemas>
    </update>​
    et nommer ton fichier sql avec le numéro de version défini dans la section version du manifest ce qui donne : /sql/update/mysql/1.0.0.sql
    Ce qui fera que le fichier sql ne sera exécuté qu'au seul passage à la version 1.0.0

    Voir la doc : https://docs.joomla.org/Manifest_fil...ch.C3.A9ma_SQL

    Si tu préfères faire la maj par php, il faudrait déjà voir si l'insert n'est pas déjà fait, puis vérifier ta requête et que tu passes bien sur cette partie du code.
    Par exemple en écrivant dans les logs la requête sql obtenue avec un $query->_toString
    Dernière édition par roland_d_alsace à 11/05/2023, 09h07
    bmdiarra aime ceci.

    Commentaire


    • #2
      Hello.

      Si je comprend bien c'est un insert que tu veux faire à l'install du plugin.

      Dans ce cas tu n'as pas besoin de ton code php, mais juste de la section update dans ton manifest.

      Toutefois la tienne ne me semble pas correcte.

      Il faut juste definir le chemin dans la section schemapath:
      Code:
      <update>
      <schemas>
      <schemapath type="mysql">sql/updates/mysql</schemapath>
      </schemas>
      </update>​
      et nommer ton fichier sql avec le numéro de version défini dans la section version du manifest ce qui donne : /sql/update/mysql/1.0.0.sql
      Ce qui fera que le fichier sql ne sera exécuté qu'au seul passage à la version 1.0.0

      Voir la doc : https://docs.joomla.org/Manifest_fil...ch.C3.A9ma_SQL

      Si tu préfères faire la maj par php, il faudrait déjà voir si l'insert n'est pas déjà fait, puis vérifier ta requête et que tu passes bien sur cette partie du code.
      Par exemple en écrivant dans les logs la requête sql obtenue avec un $query->_toString
      Dernière édition par roland_d_alsace à 11/05/2023, 09h07
      bmdiarra aime ceci.
      A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
      Rejoignez le Joomla Users Groupe Alsace...
      roland_d_alsace va-t-il devenir roland_du_grand_est ?

      Commentaire


      • #3
        Bonjour, votre réponse a été d'une grande aide. Merci encore.
        En faite, pour l'insertion par le biais de php, je n'arrive même pas a rentrer dans le les function (onMyEvent()). Avez vous une méthode efficace ou une meilleur explication.

        Commentaire


        • #4
          Je n'ai pas encore compris parfaitement le fonctionnement de "$this->", mais j'ai déjà pu constater que dans certains contextes, cela ne fonctionne pas.
          Si vous n'arrivez pas à accéder à votre fonction onMyEvent(), essayez de remplace "$this->onMyEvent()" par
          Code:
          onMyEvent()
          seul ou
          Code:
          self::onMyEvent()
          .
          Tous les services pour les sites Joomla! : sécurité, nettoyage de sites piratés, hébergement, SEO, applications Fabrik, migration, compatibilité mobiles, accessibilité, ...
          Administrateur certifié Joomla! 3
          https://www.betterweb.fr

          Commentaire


          • #5
            Envoyé par bmdiarra Voir le message
            Bonjour, votre réponse a été d'une grande aide. Merci encore.
            En faite, pour l'insertion par le biais de php, je n'arrive même pas a rentrer dans le les function (onMyEvent()). Avez vous une méthode efficace ou une meilleur explication.
            Hello.
            En fait je ne comprend pas ta logique.
            Je n‘ai jamais utilisé ces événements mais à mon avis​ onextensionafterinstall ​​ se déclenche après l’install d’une extension et lance les plugins qui gèrent cet événements (mais il faut que ces plugins soient déjà installés).
            Cela ne peut donc fonctionner correctement dans ton cas.
            De toutes façon cela n’a aucun intérêt de l’appliquer sur lui même car pour cela il faut utiliser le script php défini dans le manifest.
            Voir https://docs.joomla.org/Manifest_fil...hier_de_script
            A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
            Rejoignez le Joomla Users Groupe Alsace...
            roland_d_alsace va-t-il devenir roland_du_grand_est ?

            Commentaire


            • #6
              Envoyé par jfque Voir le message
              Je n'ai pas encore compris parfaitement le fonctionnement de "$this->", mais j'ai déjà pu constater que dans certains contextes, cela ne fonctionne pas.
              Si vous n'arrivez pas à accéder à votre fonction onMyEvent(), essayez de remplace "$this->onMyEvent()" par
              Code:
              onMyEvent()
              seul ou
              Code:
              self::onMyEvent()
              .
              Hello.
              self:: est utilisé pour appeler une méthode d’une classe statique à l’interieur de cette même classe (c’est donc comme une simple librairie de fonctions) et $this-> pour appeler une méthode ou une propriété à l'intérieur d’une classe dynamique (un objet qui aura donc été instancié au préalable).
              Dernière édition par roland_d_alsace à 13/05/2023, 12h48 Raison: faute
              A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
              Rejoignez le Joomla Users Groupe Alsace...
              roland_d_alsace va-t-il devenir roland_du_grand_est ?

              Commentaire

              Annonce

              Réduire
              Aucune annonce pour le moment.

              Partenaire de l'association

              Réduire

              Hébergeur Web PlanetHoster
              Travaille ...
              X