web-dev-qa-db-fra.com

Global PHP fonctions?

Comment puis-je faire quelques globalphp functions qui peut être appelé depuis n’importe quel Joomla custom module? E.g Je souhaite créer une fonction globale exécutant une requête de sélection de base de données:

function select($row,$table_name,$where,$equals) {

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($row)
      ->from($db->quoteName($table_name))
      ->where($db->quoteName($where) . "=" . $db->q($equals));
$db->setQuery($query);
$result = $db->loadResult();
$row = $db->loadAssoc();
return $row[$row];

}

puis appelez-le depuis n'importe quel module:

$result = select('id','#__table','name','john');

quel serait le meilleur moyen d'y parvenir?

2
saibbyweb
  1. Pour ajouter une fonction globale, il vous suffit de déclarer une fonction tôt dans le cycle de vie lorsque vous ne faites pas partie d'une classe - toutes les fonctions en tant que telles sont globales en php. Un endroit raisonnable pour le faire, qui ne serait pas remplacé, serait en dehors de la déclaration de classe dans un plugin système. Toutes les fonctions qui y figurent seront ajoutées à l’espace global lors de l’initialisation de joomla - la désactivation du plug-in arrêtera le chargement des fonctions. Si vous envisagez de le faire, vous devez vous assurer que vos fonctions s'appellent quelque chose qui ne se heurtera pas à d'autres fonctions. Ce n'est pas une bonne pratique mais peu importe.

  2. Ce que je recommanderais, c'est que vous utilisiez des méthodes statiques à la place et enregistrez votre classe dans le dossier libraries avec jloader. La doc est ici: https://docs.joomla.org/Using_own_library_in_your_extensions

En bref, si j'appelle ma lib Pf, j'aurai un fichier nommé /libraries/pf/helper.php

<?php
class PfHelper
{
    public static function sayWooh()
    {
        return "wooh!";
    }
}

Et un plug-in système qui enregistre la bibliothèque - cela chargera automatiquement toutes les classes de la bibliothèque qui suivent la convention de dénomination décrite dans la documentation liée ci-dessus.

Un plugin système nécessite un minimum de 2 fichiers. /plugins/system/loadcustomlibrary.xml

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system">
    <name>Load Custom Library</name>
    <version>1.0</version>
    <description>Register custom library with Joomla's autoloader</description>
    <files>
        <filename plugin="loadcustomlibrary">loadcustomlibrary.php</filename>
    </files>
</extension>

/plugins/system/loadcustomlibrary.php

<?php
class plgSystemLoadcustomlibrary extends JPlugin
{
    public function onAfterInitialise()
    {
        JLoader::registerPrefix('Pf', JPATH_LIBRARIES . '/pf');
    }
}

Maintenant, n'importe où dans Joomla, je peux utiliser n'importe laquelle de mes fonctions de l'aide comme ceci:

echo PfHelper::sayWooh();

Les avantages sont que vous devez seulement vous assurer que le nom de votre bibliothèque n'est pas une copie de l'un des éléments déjà présents dans le dossier des bibliothèques Joomla. Joomla ne chargera la classe d'assistance que si vous l'utilisez car elle est chargée automatiquement. Vous obtenez toujours la simplicité de pouvoir appeler votre fonction/méthode n’importe où sans avoir à importer quelque chose à chaque fois. Vous pouvez diviser vos fonctions en classes si vous en avez beaucoup, ce qui peut vous aider à être réutilisable, facile à maintenir, etc. Avoir votre propre bibliothèque est une technique intéressante pour savoir si vous souhaitez utiliser du code partout.

2
jamesgarrett

Je suggérerais d'éviter d'écrire une fonction "globale". Oui, il serait très facile d’en écrire un, mais vous irez à l’encontre de la conception architecturale de Joomla.

Ce que je suggèrerais de faire serait d'implémenter la fonctionnalité partagée en tant que plug-in, la fonction étant écrite en tant qu'écouteur d'événements. Ne vous inquiétez pas, c'est plus facile que ça en a l'air.

  1. Écrivez un plugin comme ceci:

    class PlgXyzMyPlugin extends JPlugin    // <-- replace 'xyz' with whatever you want; ie a relevant and unique plugin type name.
    {
        public function onMyEvent()         // <-- it's an event listener, so name should start with 'on'.
        {
            //...your code here
        }
    }
    
  2. Où que vous souhaitiez appeler la fonction, écrivez ce qui suit:

    JPluginHelper::importPlugin('xyz');  // <-- 'xyz' here is the same as in the plugin classname above.
    $dispatcher = JEventDispatcher::getInstance();
    $results = $dispatcher->trigger('onMyEvent', $args);  //event name is the function name. $args is an array of the parameters.
    

$results contiendra maintenant un tableau des résultats de votre fonction et d’autres avec le même type de plugin.

Cela rend votre fonction disponible partout où vous en avez besoin, mais sans qu'elle soit globale.

Il présente également des avantages supplémentaires. si vous trouvez un bogue dans la fonction ou souhaitez l'améliorer, vous pouvez mettre à jour le plug-in sans avoir à toucher à tous vos autres modules.

1
Simba