web-dev-qa-db-fra.com

Comment conserver des données dans la classe d'assistance du module Joomla

J'ai créé un module qui se connecte à la base de données et récupère des données à l'aide de

$data = $db->loadRowList();

dans l'une des fonctions membres de la classe d'assistance du module. Est-il possible de stocker cet objet $data En tant que variable membre de la classe afin que je puisse l'utiliser dans d'autres fonctions membres de la classe? Mon idée est d'utiliser $data Dans mes fonctions Ajax. J'ai essayé de le définir comme ceci:

class MyModuleHelper{
    private $data;

    public static MyDatabaseFunction($params)
    {
      ....
      self::$data = $db->loadRowList();
      ...
      //here self::$data is full
    }

    public static MyAjaxFunction()
    {
       //here self::$data is empty
    }
     .....
}
3
VTodorov

Je pense que vous êtes un peu confus quant à la relation entre PHP méthodes/variables) statique et AJAX appelle. Lorsque vous effectuez un AJAX appel au serveur, il ne récupèrera pas une version de votre objet MyModuleHelper créée précédemment (même si les méthodes de cet objet sont statiques), car l'appel AJAX est présent) une portée d'application complètement différente de celle du chargement de la page.

Pensez-y de cette façon: deux personnes chargent la page contenant le module. Chaque chargement de page entraînait la création/exécution d’une application/thread totalement indépendante PHP) avec une instance complètement différente de MyModuleHelper (qu’elle ait ou non des méthodes/variables statiques). Chaque personne clique ensuite sur le bouton qui appelle AJAX appel. Comment le serveur sait-il quel appel AJAX est lié à quelle instance de MyModuleHelper? Il ne le fait pas. En fait, ces deux premiers PHP les applications/exécutions n'existent plus (ils ont terminé leur travail et se sont terminés à la fin du chargement de la page)). Le serveur créerait une nouvelle PHP application). exécution et pour chaque appel AJAX (avec de nouvelles instances de MyModuleHelper)).

C’est pourquoi vos $ data sont toujours vides lorsque vous passez l’appel AJAX. Les méthodes/variables statiques ne sont utiles que lorsque identique PHP = application utilise une classe et vous souhaitez partager des données (via une variable de classe statique) ou utiliser des méthodes statiques.

La seule façon de faire ce que vous souhaitez est de vous assurer que $ data est rempli dans tous les appels de fonction que vous appelez via AJAX (inutile d'utiliser des méthodes ou des variables statiques) :

class MyModuleHelper
{

  var $data = null;

  public populateData()
  {
     // no need to re-populate if we re-call this method for whatever reason
     if(is_object($this->data)) return;

     ...

     $this->data = $db->loadRowList();
  }


  public MyAjaxFunction()
  {
     $this->populateData();

     var_dump($this->data);

     // do stuff
  }


  public MyOtherAjaxFunction()
  {
     $this->populateData();

     var_dump($this->data);

     // do other stuff
  }

}

J'espère que cela t'aides.

2
Drew G

Je ne connais pas beaucoup les méthodes statiques, car je ne les utilise jamais (et ne me citez pas), c'est peut-être parce que vous ne pouvez pas accéder à des propriétés non statiques dans une fonction statique.

Donc vous devrez soit définir votre propriété de classe comme ceci:

class MyModuleHelper
{
    static $data;
    ...
}

ou s'éloigner des méthodes statiques, comme ceci:

class MyModuleHelper
{
    private $data;

    public function MyDatabaseFunction($params)
    {
        $this->data = $db->loadRowList();
    }

    public function MyAjaxFunction()
    {
        var_dump($this->data);
    }
}

J'espère que cela t'aides

2
Lodder

J'ai écrit beaucoup de modules ajax pour le travail, donc je peux comprendre ce que vous essayez d'accomplir avec vos méthodes statiques.

Je pense que vous pouvez avoir un malentendu sur comment/quand ces méthodes static sont appelées.

Via la gestion Joomla des processus ajax, la fonction qui ressemble à:

public static function ModuleNameAjax() {

sera immédiatement appelé par défaut (il s'agit d'une fonctionnalité). Peu importe l'ordre dans lequel vous écrivez les méthodes static à l'intérieur de class modModuleNameHelper { }. La fonction ModuelNameAjax() sera appelée et toutes les autres fonctions statiques ou non statiques resteront en sommeil/non appelées jusqu'à ce que vous les appeliez explicitement.

Si vous souhaitez avoir un accès immédiat à AND et mettre en cache les données générées à partir de la fonction MyDatabaseFunction($params), vous devrez alors l'appeler de l'intérieur de ModuleNameAjax().

class MyModuleHelper {
    private $data;

    public static MyDatabaseFunction($params) {
        ...
        self::$data = $db->loadRowList();
        ...
        //here self::$data is full
    }

    public static MyAjaxFunction() {
        //here self::$data is empty
        self::MyDatabaseFunction($params); // I'll assume you have access to $params
        //here self::$data should be full and can forever be called by any function
        // from within the class until php terminates the script.
    }
}
0
mickmackusa