You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2023-03-21 10:48:37

Slain
Member
Registered: 2023-03-06
Posts: 37

Fields : ajouter des balises

Bonjour,

Je crée le sujet ici car je pense qu'au final la section sera plus appropriée que celle d'origine (Utilisation GLPI).

L'historique est dans le sujet n° 286435 (je n'ai pas le droit de mettre un lien, désolé) : je souhaiterais ajouter des balises (qui correspondent aux champs personnalisés créés avec le plugin Fields) pour les gabarits de notifications.
Je suis en GLPI 10.0.6 et Fields 1.20 (.0 sur le serveur Windows/IIS en prod et .2 sur ma VM Ubuntu 22.04 de test).

J'ai tenté de modifier le code du plugin en m'appuyant sur le plugin Satisfaction, je suis donc passé par la modification du fichier Hook.php pour ajouter la possibilité de notifier :

function plugin_fields_install()
{
    // Regenerating tables/files can consume lot of memory/time
    $memory_limit       = (int)Toolbox::getMemoryLimit();
    $max_execution_time = ini_get('max_execution_time');
    Config::setConfigurationValues('core',['notifications_email' => 0]);
    if ($memory_limit > 0 && $memory_limit < (512 * 1024 * 1024)) {
        ini_set('memory_limit', '512M');
    }
    if ($max_execution_time > 0 && $max_execution_time < 300) {
        ini_set('max_execution_time', '300');
    }

    $plugin_fields = new Plugin();
    $plugin_fields->getFromDBbyDir('fields');
    $version = $plugin_fields->fields['version'];


    $migration = new Migration($version);
    if (isCommandLine()) {
        echo __("MySQL tables installation", "fields") . "\n";
    } else {
        echo "<center>";
        echo "<table class='tab_cadre_fixe'>";
        echo "<tr><th>" . __("MySQL tables installation", "fields") . "<th></tr>";

        echo "<tr class='tab_bg_1'>";
        echo "<td align='center'>";
    }

    $classesToInstall = [
        PluginFieldsContainer::class,
        PluginFieldsContainerDisplayCondition::class,
        PluginFieldsDropdown::class,
        PluginFieldsField::class,
        PluginFieldsLabelTranslation::class,
        PluginFieldsProfile::class,
        PluginFieldsStatusOverride::class,
    ];

    // First, install base data
    foreach ($classesToInstall as $class) {
        if (method_exists($class, 'installBaseData')) {
            $class::installBaseData($migration, $version);
        }
    }
    $migration->executeMigration();

    // Then process specific user classes/tables
    foreach ($classesToInstall as $class) {
        if (method_exists($class, 'installUserData')) {
            $class::installUserData($migration, $version);
        }
    }
    $migration->executeMigration();

    if (!isCommandLine()) {
        echo "</td>";
        echo "</tr>";
        echo "</table></center>";
    }
    return true;
}

/**
 * Plugin uninstall process
 *
 * @return boolean
 */
function plugin_fields_uninstall()
{

    if (!class_exists('PluginFieldsProfile')) {
        Session::addMessageAfterRedirect(
            __("The plugin can't be uninstalled when the plugin is disabled", 'fields'),
            true,
            WARNING,
            true
        );
        return false;
    }

    $config = new Config();
    $config->deleteConfigurationValues('core',['notifications_email']);


    $_SESSION['uninstall_fields'] = true;

    echo "<center>";
    echo "<table class='tab_cadre_fixe'>";
    echo "<tr><th>" . __("MySQL tables uninstallation", "fields") . "<th></tr>";

    echo "<tr class='tab_bg_1'>";
    echo "<td align='center'>";

    $classesToUninstall = [
        'PluginFieldsDropdown',
        'PluginFieldsContainer',
        'PluginFieldsLabelTranslation',
        'PluginFieldsField',
        'PluginFieldsProfile',
        'PluginFieldsStatusOverride',
        'PluginFieldsContainerDisplayCondition'
    ];

    foreach ($classesToUninstall as $class) {
        if ($plug = isPluginItemType($class)) {
            $dir  = PLUGINFIELDS_DIR . "/inc/";
            $item = strtolower($plug['class']);

            if (file_exists("$dir$item.class.php")) {
                include_once("$dir$item.class.php");
                if (!call_user_func([$class,'uninstall'])) {
                    return false;
                }
            }
        }
    }

    echo "</td>";
    echo "</tr>";
    echo "</table></center>";

    unset($_SESSION['uninstall_fields']);

    // clean display preferences
    $pref = new DisplayPreference();
    $pref->deleteByCriteria([
        'itemtype' => ['LIKE' , 'PluginFields%']
    ]);

    return true;
}

J'ai également créé dans inc/ un fichier notificationtargetticket.class.php :

<?php
/* ---- added by Slain to Fields plugin ---- */

if (!defined('GLPI_ROOT')) {
 die ("Sorry, youj can't directly access this file.");
}

/* Class PLuginFieldsNotificationTargetTicket */
class PluginFieldsNotificationTargetTicket extends NotificationTarget {
        function getEvents() {
                return ["field" => __('Additional fields', 'fields')];
        }

        static function assEvents(NotificationTargetTicket $target) {
                $target->events['field'] = __('Additional fields', 'fields');
        }

        function getTags() {
                $notification_target_ticket = new NotificationTargetTicket();
                $notification_target_ticket->getTags();
                $this->tag_descriptions = $notification_target_ticket->tag_descriptions;
        }

        function getDataForObject(CommonDBTM $item, array $options, $simple=false) {
                $notification_target_ticket = new NotificationTargetTicket();
                $data = $notification_target_ticket->getDataForObject($item, $options, $simple);
                return $data;
        }

        static function install() {
                $notificationTemplateDBTM = new NotificationTemplate();
                if (!$notificationTemplateDBTM->getFromDBByCrit(['name' => 'Resolve Ticket'])) {
                        $notificationTemplateID = $notificationTemplateDBTM->add([
                                'name' => 'Resolve Ticket',
                                'itemtype' => 'Ticket',
                                'comment' => 'Created by the plugin Fields'
                        ]);
                }

                $notificationDBTM = new Notification();
                if (!$notificationDBTM->getDBByCrit(['name' => 'Resolve Ticket'])) {
                        $notifications_id = $notificationDBTM->add([
                                'name' => 'Resolve Ticket',
                                'entities_id' => 0,
                                'is_recursive' => 1,
                                'is_active' => 1,
                                'itemtype' => 'Ticket',
                                'event' => 'solved',
                                'comment' => 'Created by the plugin Fields'
                        ]);
                }
        }

        static function uninstalM = new Notification();
                global $DB;

                $notificationDBTM = new Notification();
                $notificationDBTM->getFromDBByCrit(['event' => 'solved']);

                $notifi$DB->query("DELETE FROM glpi_notificationtemplatetranslations
                                WHERE notificationtemplates_id = " . $notification_notificationTemplate->getField('notificationtemplates_id'));

                        $DB->query("DELETE FROM glpi_notificationtargets
                                WHERE notifications_id = " . $notificationDBTM->getID());

                        $DB->query("DELETE FROM glpi_notifications_notificationtemplates
                                WHERE notifications_id = " . $notification_notificationTemplate->getField('notificationtemplates_id'));

                        $DB->query("DELETE FROM glpi_notificationtemplates
                                WHERE id = " . $notification_notificationTemplate->getField('notificationtemplates_id'));

                        $DB->query("DELETE FROM glpi_notifications
                                WHERE id = " . $notificationDBTM->getID());
}
}

Jusqu'ici sans erreur notable (rien dans le fichier files/_log/php-errors.log smile

Je pense qu'il faut que je crée également un fichier notificationmailing.class.php en me basant sur ce code (extrait du plugin Satisfaction) :

<?php
/*
 * @version $Id: HEADER 15930 2011-10-30 15:47:55Z tsmr $
 -------------------------------------------------------------------------
 fields plugin for GLPI
 Copyright (C) 2016-2022 by the fields Development Team.
 https://github.com/pluginsglpi/fields
 -------------------------------------------------------------------------
 LICENSE
 This file is part of fields.
 fields is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
 fields is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with fields. If not, see <http://www.gnu.org/licenses/>.
 --------------------------------------------------------------------------
 */

if (!defined('GLPI_ROOT')) {
   die("Sorry. You can't access directly to this file");
}

/**
 * Class PluginResourcesNotification
 */
class PluginFieldsNotificationMailing extends CommonDBTM {

   static $rightname = 'plugin_fields';

   /**
    * Return the localized name of the current Type
    * Should be overloaded in each new class
    *
    * @param integer $nb Number of items
    *
    * @return string
    **/
   static function getTypeName($nb = 0) {

      return __('Notification ticket solved', 'fields');
   }

   /**
    * Have I the global right to "create" the Object
    * May be overloaded if needed (ex KnowbaseItem)
    *
    * @return booleen
    **/
   static function canCreate() {
      return Session::haveRight(self::$rightname, [CREATE, UPDATE, DELETE]);
   }

   /**
    * Have I the global right to "view" the Object
    *
    * Default is true and check entity if the objet is entity assign
    *
    * May be overloaded if needed
    *
    * @return booleen
    **/
   static function canView() {
      return Session::haveRight(self::$rightname, READ);
   }

   /**
    * Function list items
    *
    * @param type $ID
    */
   public function listItems($ID) {

      $rand = mt_rand();

      // Start
      $start = 0;
      if (isset($_REQUEST["start"])) {
         $start = $_REQUEST["start"];
      }

      // Get data
      $data = $this->getItems($ID, $start);
      if (!empty($data)) {
         echo "<div class='center'>";
         $dbu = new DbUtils();
         Html::printAjaxPager(self::getTypeName(2), $start, $dbu->countElementsInTable($this->getTable()));
         echo "<table class='tab_cadre_fixehov'>";
         echo "<tr class='tab_bg_1'>";
         echo "<th colspan='3'>".self::getTypeName(1)."</th>";
         echo "</tr>";
         echo "<tr class='tab_bg_1'>";
         echo "<th>".__('User')."</th>";
         echo "<th>".__('Date')."</th>";
         echo "<th>".__('Type')."</th>";
         echo "</tr>";

         $dbu = new DbUtils();

         foreach ($data as $field) {
            echo "<tr class='tab_bg_2'>";
//            // User
//            echo "<td>".$dbu->formatUserName($field['users_id'], $field['name'], $field['realname'], $field['firstname'])."</td>";
//            echo "<td>".Html::convDateTime($field['date_mod'])."</td>";
//            echo "<td>".self::getStatus($field['type'])."</td>";
//            echo "</tr>";
            // Ticket
            // TODO
         }
         echo "</table>";
         echo "</div>";
      }
   }

   /**
    * Function get items for resource
    *
    * @global type $DB
    * @param type $recordmodels_id
    * @param type $start
    * @return type
    */
   function getItems($resources_id, $start = 0) {
      global $DB;

      $output = [];

      $query = "SELECT `".$this->getTable()."`.`id`, 
                       `glpi_users`.`realname`,
                       `glpi_users`.`firstname`,
                       `glpi_users`.`name`,
                       `".$this->getTable()."`.`type`,
                       `".$this->getTable()."`.`users_id`,
                       `".$this->getTable()."`.`date_mod`,
                       `".$this->getTable()."`.`plugin_resources_resources_id`
          FROM ".$this->getTable()."
          LEFT JOIN `glpi_users` ON (`".$this->getTable()."`.`users_id` = `glpi_users`.`id`)
          WHERE `".$this->getTable()."`.`plugin_resources_resources_id` = ".Toolbox::cleanInteger($resources_id)."
          ORDER BY `".$this->getTable()."`.`date_mod` DESC
          LIMIT ".intval($start).",".intval($_SESSION['glpilist_limit']);

      $result = $DB->query($query);
      if ($DB->numrows($result)) {
         while ($data = $DB->fetchAssoc($result)) {
            $output[$data['id']] = $data;
         }
      }

      return $output;
   }

   /**
    * Function get the Status
    *
    * @return an array
    */
   static function getStatus($value) {
      $data = self::getAllStatusArray();
      return $data[$value];
   }

   /**
    * Get the SNMP Status list
    *
    * @return an array
    */
   static function getAllStatusArray() {

      // To be overridden by class
      $tab = ['report'  => __('Resource creation', 'resources'),
         'other'   => __('Other', 'resources')];

      return $tab;
   }

   /**
    * if profile deleted
    *
    * @param \Ticket $resource
    */
   static function purgeNotification(Ticket $ticket) {
      $temp = new self();
      $temp->deleteByCriteria(['tickets_id' => $ticket->getField("id")]);
   }
}

Et bien sûr, avec une structure des tables ajoutées (et surtout de la table qui m'intéresse, pour pouvoir ajouter un numéro de devis à ma réponse de ticket) :

| glpi_plugin_fields_containerdisplayconditions |
| glpi_plugin_fields_containers                 |
| glpi_plugin_fields_fields                     |
| glpi_plugin_fields_inprogressfielddropdowns   |
| glpi_plugin_fields_labeltranslations          |
| glpi_plugin_fields_profiles                   |
| glpi_plugin_fields_statusoverrides            |
| glpi_plugin_fields_ticketenquirynrs           |
| glpi_plugin_fields_ticketstates               |

Et un zoom sur cette table glpi_plugin_fields_ticketenquirynrs :

+-----------------------------+--------------+------+-----+---------+----------------+
| Field                       | Type         | Null | Key | Default | Extra          |
+-----------------------------+--------------+------+-----+---------+----------------+
| id                          | int unsigned | NO   | PRI | NULL    | auto_increment |
| items_id                    | int unsigned | NO   |     | NULL    |                |
| itemtype                    | varchar(255) | YES  | MUL | Ticket  |                |
| plugin_fields_containers_id | int unsigned | NO   |     | 1       |                |
| enquirynrfield              | varchar(255) | YES  |     | NULL    |                |
+-----------------------------+--------------+------+-----+---------+----------------+

J'avoue que je ne suis pas très fort sur le PHP, d'où le besoin d'une aide.

Dans mon cheminement de réflexion, je pense que la prochaine étape est d'adapter la requêter suivante dans notificationmailing.class.php :

      $query = "SELECT `".$this->getTable()."`.`id`, 
                       `glpi_users`.`realname`,
                       `glpi_users`.`firstname`,
                       `glpi_users`.`name`,
                       `".$this->getTable()."`.`type`,
                       `".$this->getTable()."`.`users_id`,
                       `".$this->getTable()."`.`date_mod`,
                       `".$this->getTable()."`.`plugin_resources_resources_id`
          FROM ".$this->getTable()."
          LEFT JOIN `glpi_users` ON (`".$this->getTable()."`.`users_id` = `glpi_users`.`id`)
          WHERE `".$this->getTable()."`.`plugin_resources_resources_id` = ".Toolbox::cleanInteger($resources_id)."
          ORDER BY `".$this->getTable()."`.`date_mod` DESC
          LIMIT ".intval($start).",".intval($_SESSION['glpilist_limit']);

Sachant que cette requête correspond au plugin Satisfaction, je pense pour le plugin Fields ne pas avoir besoin de la jointure avec la table glpi_users.
Mais je me demande s'il est nécessaire de réaliser une jointure avec la table glpi_tickets (puisqu'un numéro de devis sera forcément associé à un numéro de ticket dans notre cas), et surtout comment mes balises vont être nommées?
Ou si j'ai raté un endroit où je dois nommer mes balises?

Merci d'avance aux développeurs qui se pencheront sur le sujet.

Slain

Offline

#2 2023-03-21 15:09:20

Slain
Member
Registered: 2023-03-06
Posts: 37

Re: Fields : ajouter des balises

En complément, j'ai quand même cherché à avancer (j'avoue que je ne sais pas si j'applique la bonne méthode ni si je vais dans le bon sens, mais je ne compte pas rester les bras croisés en attendant une solution toute cuite).
J'ai donc créé le fichier notificationmailing.class.php avec le code suivant (que j'espère du coup adapté à ce que je voulais faire) :

<?php
/*
 * @version $Id: HEADER 15930 2011-10-30 15:47:55Z tsmr $
 -------------------------------------------------------------------------
 fields plugin for GLPI
 Copyright (C) 2016-2022 by the fields Development Team.
 https://github.com/pluginsglpi/fields
 -------------------------------------------------------------------------
 LICENSE
 This file is part of fields.
 fields is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
 fields is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with fields. If not, see <http://www.gnu.org/licenses/>.
 --------------------------------------------------------------------------
 */

if (!defined('GLPI_ROOT')) {
   die("Sorry. You can't access directly to this file");
}

/**
 * Class PluginResourcesNotification
 */
class PluginFieldsNotificationMailing extends CommonDBTM {

   static $rightname = 'plugin_fields';

   /**
    * Return the localized name of the current Type
    * Should be overloaded in each new class
    *
    * @param integer $nb Number of items
    *
    * @return string
    **/
   static function getTypeName($nb = 0) {

      return __('Notification ticket solved', 'fields');
   }

   /**
    * Have I the global right to "create" the Object
    * May be overloaded if needed (ex KnowbaseItem)
    *
    * @return booleen
    **/
   static function canCreate() {
      return Session::haveRight(self::$rightname, [CREATE, UPDATE, DELETE]);
   }

   /**
    * Have I the global right to "view" the Object
    *
    * Default is true and check entity if the objet is entity assign
    *
    * May be overloaded if needed
    *
    * @return booleen
    **/
   static function canView() {
      return Session::haveRight(self::$rightname, READ);
   }

   /**
    * Function list items
    *
    * @param type $ID
    */
   public function listItems($ID) {

      $rand = mt_rand();

      // Start
      $start = 0;
      if (isset($_REQUEST["start"])) {
         $start = $_REQUEST["start"];
      }

      // Get data
      $data = $this->getItems($ID, $start);
      if (!empty($data)) {
         echo "<div class='center'>";
         $dbu = new DbUtils();
         Html::printAjaxPager(self::getTypeName(2), $start, $dbu->countElementsInTable($this->getTable()));
         echo "<table class='tab_cadre_fixehov'>";
         echo "<tr class='tab_bg_1'>";
         echo "<th colspan='3'>".self::getTypeName(1)."</th>";
         echo "</tr>";
         echo "<tr class='tab_bg_1'>";
         echo "<th>".__('User')."</th>";
         echo "<th>".__('Date')."</th>";
         echo "<th>".__('Type')."</th>";
         echo "</tr>";

         $dbu = new DbUtils();

         foreach ($data as $field) {
            echo "<tr class='tab_bg_2'>";
//            // User
//            echo "<td>".$dbu->formatUserName($field['users_id'], $field['name'], $field['realname'], $field['firstname'])."</td>";
//            echo "<td>".Html::convDateTime($field['date_mod'])."</td>";
//            echo "<td>".self::getStatus($field['type'])."</td>";
//            echo "</tr>";
            // Ticket
            // TODO
         }
         echo "</table>";
         echo "</div>";
      }
   }

   /**
    * Function get items for resource
    *
    * @global type $DB
    * @param type $recordmodels_id
    * @param type $start
    * @return type
    */
   function getItems($items_id, $start = 0) {
      global $DB;

      $output = [];

      $query = "SELECT `".$this->getTable()."`.`id`, 
                       `glpi_tickets`.`name`,
                       `glpi_tickets`.`status`,
                       `".$this->getTable()."`.`items_id`,
                       `".$this->getTable()."`.`enquirynrfield`,
          FROM ".$this->getTable()."
          LEFT JOIN `glpi_tickets` ON (`".$this->getTable()."`.`items_id` = `glpi_tickets`.`id`)
          WHERE `".$this->getTable()."`.`items_id` = ".Toolbox::cleanInteger($items_id)."
          ORDER BY `".$this->getTable()."`.`items_id` DESC
          LIMIT ".intval($start).",".intval($_SESSION['glpilist_limit']);

      $result = $DB->query($query);
      if ($DB->numrows($result)) {
         while ($data = $DB->fetchAssoc($result)) {
            $output[$data['id']] = $data;
         }
      }

      return $output;
   }

   /**
    * Function get the Status
    *
    * @return an array
    */
   static function getStatus($value) {
      $data = self::getAllStatusArray();
      return $data[$value];
   }

   /**
    * Get the SNMP Status list
    *
    * @return an array
    */
   static function getAllStatusArray() {

      // To be overridden by class
      $tab = ['report'  => __('Resource creation', 'resources'),
         'other'   => __('Other', 'resources')];

      return $tab;
   }

   /**
    * if profile deleted
    *
    * @param \Ticket $resource
    */
   static function purgeNotification(Ticket $ticket) {
      $temp = new self();
      $temp->deleteByCriteria(['tickets_id' => $ticket->getField("id")]);
   }
}

Est-ce que quelqu'un saurait me confirmer si je n'ai pas d'erreurs dans ce code?

Et du coup, si j'ai réussi à adapter mon code, comment est-ce que je peux nommer mes balises?

Merci d'avance smile

Offline

#3 2023-03-22 09:42:36

Slain
Member
Registered: 2023-03-06
Posts: 37

Re: Fields : ajouter des balises

Bonjour,

Je continue mon petit bonhomme de chemin (des fois que ça aiderait d'autres personnes qui sont en galère) : ça faisait un moment que je me demandais en parallèle de mon code "mais c'est bien beau de créer une classe pour les notifications, mais à un moment il faut bien l'appeler quelque part ! Sinon ça ne peut pas fonctionner, tu peux créer un truc génial, si tu l'appelles pas il va pourrir dans un coin!"...
Et bien en relisant le hook.php du plugin Satisfaction, je suis tombé sur une ligne que je n'avais pas vu, tout occupé que j'étais à essayer d'adapter le code au plugin Fields :

   PluginSatisfactionNotificationTargetTicket::install();

Du coup, bingo, je viens d'ajouter une ligne dans le hook.php du plugin Fields sur ma VM de test :

PluginFieldsNotificationTargetTicket::install();

Et du coup l'inverse dans la fonction uninstall :

PluginFieldsNotificationTargetTicket::uninstall();

Bien, maintenant ça va appeler la classe PluginFieldsNotificationTargetTicket (et la désinstaller si on désinstalle le plugin) ... Par contre (je préfère prévenir, avec moi vous allez finir par écrire "les plugins GLPI pour les nuls" big_smile), est-ce que ça veut dire que je dois désinstaller et réinstaller mon plugin pour que ça prenne effet?
Et si la réponse juste au-dessus est oui, est-ce que ça veut dire que ça va supprimer de la base de données les tables concernant les champs personnalisés et les entres associées?

Merci pour vos réponses, et mes excuses pour le niveau affligeant que j'ai sad

Offline

#4 2023-03-22 12:55:24

Slain
Member
Registered: 2023-03-06
Posts: 37

Re: Fields : ajouter des balises

Je continue mon monologue (toujours au cas où une âme charitable voudrait bien m'épauler et/ou au cas où d'autres seraient assez perchés pour tenter l'ajout de balises de notification à un plugin existant), je viens de trouver où les balises du plugin Satisfaction sont déclarées ! smile

dans inc/surveyanswer.class.php j'ai trouvé la fonction suivante :

static function addNotificationDatas(NotificationTargetTicket $target) {

      $event = $target->raiseevent;
      if (isset($target->obj->fields['id'])) {
         $tickets_id  = $target->obj->fields['id'];
         $entities_id = $target->obj->fields['entities_id'];

         $ticket_satisfaction = new TicketSatisfaction();
         if ($ticket_satisfaction->getFromDBByRequest(['WHERE' =>
                                                          ["tickets_id" => $tickets_id]])) {

            $sanswer_obj = new self();
            if ($sanswer_obj->getFromDBByCrit(["ticketsatisfactions_id" => $ticket_satisfaction->getField('id')])) {
               $dbu                           = new DbUtils();
               $sanswer_obj->fields['answer'] = $dbu->importArrayFromDB($sanswer_obj->fields['answer']);

               $plugin_satisfaction_surveys_id = $sanswer_obj->getField('plugin_satisfaction_surveys_id');
            } else {

               if (($survey = PluginSatisfactionSurvey::getObjectForEntity($entities_id)) !== false) {

                  $plugin_satisfaction_surveys_id = $survey;
               }
            }

            if (isset($plugin_satisfaction_surveys_id)) {
               $squestion_obj = new PluginSatisfactionSurveyQuestion;
               $questions     = $squestion_obj->find([PluginSatisfactionSurveyQuestion::$items_id => $plugin_satisfaction_surveys_id]);

               switch ($event) {
                  case 'satisfaction':
                     $data = '';
                     foreach ($questions as $question) {
                        $data .= $question['name'] . "\n\n";
                     }
                     $target->data['##satisfaction.question##'] = $data;
                     break;

                  case 'replysatisfaction':

                     $data = '';
                     foreach ($questions as $question) {

                        if (isset($sanswer_obj->fields['answer'][$question['id']])) {
                           $value = $sanswer_obj->fields['answer'][$question['id']];
                        } else {
                           if ($question['type'] == PluginSatisfactionSurveyQuestion::TEXTAREA) {
                              $value = '';
                           } else if ($question['type'] == PluginSatisfactionSurveyQuestion::NOTE) {
                              $value = $question['default_value'];
                           } else {
                              $value = 0;
                           }
                        }
                        $data .= $question['name'] . " : " . self::getAnswer($question, $value) . "\n\n";
                     }
                     $target->data['##satisfaction.answer##'] = $data;

                     break;
               }
            }
         }
    
  }

Il me reste donc à modifier cette fonction pour l'adapter au plugin ET à savoir dans quel fichier je dois le mettre... smile

Edit : J'ai rien dit, il faut aussi que j'appelle la fonction addNotificationDatas dans le setup.php (si en plus je me trompe de nom de fichier, ça va pas avancer!)
ça je veux bien, c'est surtout sur le contenu de la fonction que je vais morfler. sad

Last edited by Slain (2023-03-22 14:29:32)

Offline

#5 2023-04-03 17:07:12

Slain
Member
Registered: 2023-03-06
Posts: 37

Re: Fields : ajouter des balises

Bonjour,

Je reviens un peu à la charge sur le sujet après quelques jours à bosser d'autres urgences...

Bon, pour les motivés, ce que j'ai tenté à droite à gauche, ça n'a eu pour effet que de faire crasher mon plugin. sad
Si d'autres ont voulu suivre mes âneries (pour rester poli), il faut "juste" retélécharger le plugin d'origine et recopier les fichiers Hook.php et Setup.php dans le dossier plugins/fields, et lancer la mise à jour du plugin pour récupérer ses onglets de champs personnalisés.

Par contre, avis aux développeurs bénévoles et bien calés, je ne serais pas contre quelques conseils svp smile

Merci d'avance!

Offline

#6 2023-05-03 16:38:43

Slain
Member
Registered: 2023-03-06
Posts: 37

Re: Fields : ajouter des balises

Bonjour,

Je remets un peu d'huile sur ce sujet : y aurait-il une bonne âme qui arriverait à m'expliquer (quasiment comme à un enfant de 9 ans) comment créer une balise de notification à partir d'un plugin existant?

Merci d'avance smile

Offline

#7 2023-05-23 10:54:46

Slain
Member
Registered: 2023-03-06
Posts: 37

Re: Fields : ajouter des balises

Bonjour,
Le retour de la modification du plugin (j'essaie d'avancer quand même un peu sur le sujet)!
Dernier essai en date : j'ai donc essayé de modifier le fichier Hook.php pour ajouter dans les classes à installer (dans la fonction install donc) et dans les classes à désinstaller (dans la fonction uninstall) la classe PluginFieldsNotificationMailing (qui donc devrait me permettre de créer mes fameuses balises).
Je sais d'avance que mon fichier notificationmailing.class.php n'est pas encore bon (car je m'étais basé sur une table déjà rajoutée dans la base de données, mais que je n'ai pas sur ma plateforme de test), j'y reviendrai plus tard.

Toujours est-il que quand j'ai voulu désinstaller le plugin, j'ai eu droit à une belle page blanche qui me disait "suppression des bases de données" ou un message dans le genre.

Je suis donc allé voir dans files/_log/php-errors.log, et j'ai enfin trouvé une info qui me guide :

*** Uncaught Exception TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, class PluginFieldsNotificationMailing does not have a method "uninstall" in /var/www/html/plugins/fields/hook.php

Là où je ne suis pas plus avancé par contre, c'est que j'ignore totalement ce que je dois mettre dans ma fonction uninstall dans le fichier notificationmailing.class.php sad
Et en y réfléchissant, qui dit uninstall dit aussi install?

J'ai voulu comparer avec les fichiers existants dans le dossier inc/ du plugin Fields (puisque je pars de ce plugin, au départ).
J'ai bien trouvé une fonction uninstall dans container.class.php :

public static function uninstall()
    {
        global $DB;

        //uninstall container table and class
        $obj = new self();
        $containers = $obj->find();
        foreach ($containers as $container) {
            $obj->delete(['id' => $container['id']]);
        }

        //drop global container table
        $DB->query("DROP TABLE IF EXISTS `" . self::getTable() . "`");

        //delete display preferences for this item
        $pref = new DisplayPreference();
        $pref->deleteByCriteria([
            'itemtype' => __CLASS__
        ]);

        return true;
    }

Mais aussi dans dropdown.class.php :

public static function uninstall()
    {
        global $DB;

        //remove dropdown tables and files
        if ($DB->tableExists("glpi_plugin_fields_fields")) {
            require_once "field.class.php";
            $field = new PluginFieldsField();
            $dropdowns = $field->find(['type' => 'dropdown']);
            foreach ($dropdowns as $dropdown) {
                self::destroy($dropdown['name']);
            }
        }
        return true;
    }

Et là, j'ai bel à regarder l'écran comme une poule regarderait un couteau, je ne sais pas quoi en faire sad

Je ne sais pas comment désinstaller ma classe notificationmailing!
Et je ne sais pas non plus comment l'installer, puisque dans ces deux fichiers "source" je n'ai pas trouvé la fonction install mais installBaseData et/ou installUserData...
à part supposer que je n'installerais que des UserData (qui sont les balises) en récupérant les infos depuis la base de données, je ne sais pas comment orienter ma classe.

Si quelqu'un veut bien m'aider, ça serait sympa wink

Merci d'avance

Offline

Board footer

Powered by FluxBB