Développement

Développement (19)

Cette partie du tutoriel ne concerne que les personnes qui veulent aller beaucoup plus loin avec AllEvents : comprendre son fonctionnement, quelles sont les fonctions qui sont exécutées, observer certaines variables, afficher des informations de debogage, ... et bien sûr modifier le code source de certaines pages en utilisant la technique "Surcharge" spécialement développpée pour AllEvents.

Catégories enfants

Informations additionnelles

Informations additionnelles (2)

Sont repris ici des informations uniquement accessibles aux personnes ayant acquis la version Premium de AllEvents.

Acquérir le plug-inAcquérir la version Premium

Voir les éléments...
dimanche, 17 mars 2013 10:43

Programmer plus vite avec NetBeans

Écrit par

Code template pour NetBeansSi vous développez sous NetBeans, que ce soit en PHP ou un autre langage supporté, connaissez-vous la notion de "Code Templates" ?   Il s'agit d'une sorte d'abréviation que vous spécifiez dans l'écran Tools -> Options -> Editor -> Code Templates et qu'il est ensuite très simple d'utiliser.  Exactement comme la notion des "Autotext" sous MS Word.

Durant le développement de AllEvents, je dois très régulièrement afficher le contenu d'une variable ou simplement un texte "Je suis ici" afin de suivre l'exécution de AE : je suis passé dans cette fonction, puis dans celle-ci, je suis repassé, etc.

J'ai aussi une fonction "deprecated" que j'utilise afin de mettre en évidence, lors du développement, les méthodes que j'ai dépréciée et dont je veux m'assurer qu'elles ne sont plus utilisées.

Une fonction "die" aussi pour stopper net l'exécution du code.

Et ainsi de suite...  

Parce qu'un développeur est par nature fainéant, il n'est pas efficace de garder quelque part des snippets de code qu'il faut retrouver puis copier/coller dans NetBeans.

Pour créer votre premier Code Template,

  • Cliquez sur le menu Tools puis Options de NetBeans.  
  • Dans la fenêtre "Options", cliquez sur Editor puis sur Code Templates.   Si besoin, sélectionnez PHP comme langage de programmation.  
  • Cliquez sur New
  • Encodez une abréviation
  • Dans la zone texte "Expanded Text" introduisez; pour la dernière fois, votre code.  Celui-ci peut faire plusieurs lignes.
  • Au besoin, encodez une description dans l'onglet Description.
  • Faites attention au bas de la zone texte : laissez "Expand Template on:" sur "Tab".

Un exemple : l'abbréviation j3 pour le code if(version_compare(JVERSION,'3.0.0','ge')) {

Cliquez sur Ok pour fermer la fenêtre.

Dans un document php, allez sur un ligne vierge et tapez exactement votre abréviation (j3) immédiatement suivi par la touche Tab et hop, votre code apparaît.

Reste le plus dur : créer votre dictionnaire d'abbréviations ;-)

Informations supplémentaires

  • Package Free Ce billet concerne le package Free et est donc immédiatement disponible dans la version gratuitement téléchargeable de AllEvents.

Lorsque le contrôleur de AllEvents reçoit une demande pour exécuter une tâche ; le nom de la tâche doit être en deux parties : « controlleur.tâche ».

La première partie est le nom du contrôleur qui va gérer la tâche ; deux exemples :

  • « main.display » : le contrôleur est « main.php » et la tâche « display »
  • « settings.apply » : le contrôleur est « settings.php » et la tâche est « apply »

Le contrôleur de AllEvents va d’abord vérifier si le contrôleur se trouve dans le dossier controllers du composant (dans administrator/components/com_allevents/controllers si la tâche est lancée depuis l’administration).

Lorsque le contrôleur n’est pas trouvé, il va faire appel au plugin de AllEvents et lancer une requête « Est-ce qu’un plugin gère la tâche controlleur.php ? »   A chaque plugin de déterminer si c’est le cas.   La fonction « onExecuteTask » sert à cette fin (voir le fichier /plugins/allevents/agenda/agenda.php p.ex.).    

Si la tâche est « agendas.display », le plugin Agenda devrait réagir de cette façon :

  1. Il va isoler le nom du contrôleur (agendas) puis le nom de la tâche (display)
  2. Il va regarder si le fichier /controllers/agendas.php existe dans son dossier /plugins/allevents/agenda/controllers.
  3. Si c’est le cas, il va regarder s’il y a une méthode nommée display() qui est déclarée dans le contrôleur.
  4. Si c’est toujours le cas, il va indiquer au contrôleur principal de AllEvents qu’il gère la tâche « agendas.display » et qu’il est prêt à recevoir la demande d’exécution.  

Une fois que le contrôleur reçoit la demande d’exécution de la tâche, il va d’abord déterminer le nom du manifest où la tâche est déclarée : le manifest est le fichier nommé metadata.xml qui se trouve dans le dossier d’une vue.   Parce que toutes les tâches sont toujours liées à une vue ; cette méthode permet de déterminer l’ensemble des tâches d’une vue.

Si la tache est « agendas.display » ; le nom de la vue va être « agendas ».   Le contrôleur du plugin va donc lire le fichier /plugins/allevents/agenda/views/agendas/metadata.xml.    

Attention : parce que le plugin doit gérer autant les tâches émises depuis l’administration que depuis le site, les vues d’administrations sont préfixées par « be_ ».  Ainsi, ce sera « /plugins/allevents/agenda/view/be_agendas/metadata.xml » pour la vue d’administration.

Le manifest contient la déclaration de la vue, comment elle doit s’afficher, quels sont les boutons qui doivent se retrouver dans la barre d’outils et quelles sont les tâches qui sont attachées au boutons ; entre autre.

Le manifest déclare aussi un  nœud <tasks> qui va reprendre toutes les tâches gérées par la vue :

<tasks>
        <!-- Définition des tâches déclenchées par la vue "main".  Définit quelle est la vue et le layout qui suivra l'exécution de la tâche -->
        <task name="agendas.csv" view="agendas" layout="list" msg="" />
        <task name="agendas.delete" view="agendas" layout="list" />
        <task name="agendas.display" view="agendas" layout="list" />
        <task name="agendas.publish" view="agendas" layout="list" msg="" />
        <task name="agendas.unpublish" view="agendas" layout="list" msg=""/>
        
        <!-- L'attribut msg n'est pas supporté pour les fonctionnalités ajax -->
        <task name="agendas.ajax_publish" view="agendas" layout="list" tablename="allevents_agenda" />
        <task name="agendas.ajax_unpublish" view="agendas" layout="list" tablename="allevents_agenda" />        
        <task name="agendas.ajax_accessregistered" view="agendas" layout="list" tablename="allevents_agenda" />
        <task name="agendas.ajax_accessspecial" view="agendas" layout="list" tablename="allevents_agenda" />
        <task name="agendas.ajax_accesspublic" view="agendas" layout="list" tablename="allevents_agenda" />        
     </tasks>     

Lorsque la tâche à exécuter est « agendas.display », le contrôleur du plugin sait donc que :

  • le contrôleur est agendas.php (première partie du nom de la tâche)
  • la tâche se nomme display.  Cette tâche est programmée dans le contrôleur agendas.php
  • la tâche doit afficher une vue nommée « agendas » et le layout doit être « list ».


Le manifest (fichier metadata.xml) ne reprenait pas seulement la liste des tâches.  Vu qu’il s’agit du manifest de la vue « agendas » ; il reprend la description de l’affichage de la vue :

<views>
   <view name="agendas" >
      <layout name="list" isList="true" permissions="isAdmin" tablename="allevents_agenda" img="agenda" title="COM_ALLEVENTS_AGENDAS_MGT" subtitle="" tip="COM_ALLEVENTS_EVENT_AGENDAS_MGT" action="index.php?option=com_allevents" editTask="agenda.edit">
         <toolbar>
            <button name="add" permissions="canAdd" task="agenda.add" />
            <button name="edit" permissions="canEdit" task="agenda.edit" />
            <button name="publish" permissions="canEdit" task="agendas.publish" />
            <button name="unpublish" permissions="canEdit" task="agendas.unpublish" />
            <button name="delete" permissions="canDelete" task="agendas.delete" />
            <button name="csv" permissions="isAdmin" task="agendas.csv" icon="download" iconOver="" alt="EVENT_CSV" />    
            <button name="help" url="http://allevents.avonture.be/agenda" />      
         </toolbar>
         <menu>
            <entry label="COM_ALLEVENTS_CONTROL_PANEL" task="main.display" />
            <entry label="COM_ALLEVENTS_EVENT_EVENTS" task="events.display"  />
            <entry label="COM_ALLEVENTS_PERMISSIONS" task="groups.display" permissions="isAdmin" />
         </menu>    
         <filters>
            <filter name="published" label="JOPTION_SELECT_PUBLISHED" />
            <filter name="access" label="JOPTION_SELECT_ACCESS" />                   
            <filter name="language" label="JOPTION_SELECT_LANGUAGE" />-->               
         </filters>               
      </layout>           
   </view>
</views>

Il s’agit donc de la vue de type « list » (et donc la liste des agendas).   Cette liste peut être affichée aux utilisateurs qui ont un niveau d’accès type administrateur.   La table gérée par la liste est allevents_agenda.   

Si une icône doit s’afficher vers la liste depuis le panneau de contrôle de AllEvents, l’icône sera « agenda » qui correspond à une classe définie dans le css de AllEvents.  

Le titre est « COM_ALLEVENTS_AGENDA_MGT » (soit « Gestion des agendas ») ; il y aura un sous-titre.   

Chaque action exécutée lancera une requête vers le contrôleur de AllEvents et, pour finir, la tâche associée à chaque entrée de la liste (soit à chaque agenda affiché) sera « agenda.edit » ce qui permettra de cliquer sur un enregistrement et de basculer dans la vue d’édition dudit agenda.

La liste devra proposer une barre d’outils avec les boutons :

  • « add » soit Nouveau.   Il faut avoir un niveau de permissions permettant de créer un enregistrement.  La tâche qui sera exécutée sera « agenda.add ».
  • « edit » soit Modifier.   Permission : canEdit et Tâche : agenda.edit
  • « publish » et « unpublish » pour permettre de publier / dépublier les agendas.
  • « delete » pour permettre la suppression d’un agenda.   Ici il fautt avoir un niveau d’autorisation canDelete.   La tâche associé sera agendas.delete.
  • « csv » qui permet d’exporter les données sous forme de fichier texte.   
  • « help » qui va ouvrir une page du site de AllEvents.

Lors de l’affichage de la liste, un menu doit être proposé et qui va reprendre, au minimum, trois entrées :

  • Un lien vers le panneau de contrôle de AllEvents (tâche main.display)
  • Un lien vers la liste des évènements (tâche events.display)
  • Un lien vers la gestion des permissions (tâche groups.display).   Le lien ne peut s’afficher que pour une personne disposant d’une permission Administrateur.

Enfin, la liste des agendas fera apparaître trois listes pour filtrer les enregistrements :

  • Une liste qui permettra de filtrer sur le statut (publié / non publié)
  • Une liste pour filtrer sur le niveau d’accès (public, enregistré, …)
  • Une liste pour filtre sur la langue

Informations supplémentaires

  • Package Free Ce billet concerne le package Free et est donc immédiatement disponible dans la version gratuitement téléchargeable de AllEvents.

Si vous êtes programmeur VBA (Visual Basic For Applications), vous seriez probablement intéressé de pouvoir récupérer la liste des enregistrements d'une table de votre base de données Joomla et de l'exporter vers Excel.  De cette manière, vous pourriez alors profiter des fonctionnalités d'Excel comme la table pivot, les formatages, formules, ... et les appliquer sur vos enregistrements.

Le code proposé ci-dessous se connecte sur votre base de données et lance une requête de type SELECT que vous aurez configuré.   Toutes les données sont alors rappatriées physiquement dans une feuille de calcul : une fois le code de la macro exécuté; votre fichier Excel est autonome; aucune connexion vers la base de données n'étant nécessaire.

A cause de contraintes techniques imposées par la majorité des hébergeurs, une connexion sur votre base de données de production est, en principe, impossible.  Il vous faut préalablement prendre une copie de votre site en local.  Pour ce faire, je vous recommance l'excellentissime Akeeba Backup et son petit frère Kickstart

 

' ----------------------------------------------------------------------------------------
'
' Auteur      : Avonture Christophe
' Date        : 23 janvier 2013
'
' Description : Exemple de code pour récupérer les données d'une table
'               d'une base de données MySQL utilisée par Joomla
'
' Drivers     : Si vous ne l'avez pas encore fait, veuillez installer les drivers pour MySQL
'               Même si vous avez un système d'exploitation 64 bits, il vous faut installer
'               les drivers 32 bits.
'
'               http://dev.mysql.com/downloads/connector/odbc/5.1.html.
'
' Librairies  : Il faut ajouter une référence à la librairie
'               "ActiveX Data Objects" de Microsoft.   Pour ce faire, depuis l'éditeur de
'               code de VBA, cliquer sur le menu Outils puis Références.
'               Recherchez la librairie "Microsoft ActiveX Data Objects 6.1 Library"
'               (prenez la version la plus récente), sélectionnez-là puis cliquez sur OK.
'
' Utiliser ce code :
'
' 1. Créez un nouveau classeur, appuyez sur les touches ALT-F11 pour basculer
' dans l'éditeur de code.  A gauche, double-cliquer sur "Microsoft Excel Objects" puis sur
' Classeur1 afin d'ouvrir la fenêtre de code pour la feuille 1.  Copiez-coller l'entièreté
' de ce code source.
'
' 2. Initialisez les cinq constantes ci-dessous.  Pour connaître les valeurs à y rapporter,
' ouvrez le fichier configuration.php qui se situe à la racine de votre site.
'
' 3. Initialisez la constante cSQL avec une instruction SQL valide; de type SELECT ... FROM ...
'
' 4. Positionnez le curseur de l'éditeur sur n'importe quelle ligne de code de la procédure
' getMySQLData et appuyez sur F5 pour l'exécuter.
'
' 5. Retournez dans Excel (touches ALT-F11), affichez la feuille 1 et ... enjoy :-)
'
' ----------------------------------------------------------------------------------------

Option Explicit
Option Base 1
Option Compare Text

Const cDBServer = "localhost"     ' fichier configuration.php, variable $host
Const cDBName = "j25"             ' fichier configuration.php, variable $db
Const cDBPrefix = "cdvt1"         ' fichier configuration.php, variable $dbprefix
Const cDBUser = "root"            ' fichier configuration.php, variable $user
Const cDBPwd = ""                 ' fichier configuration.php, variable $password

Const cSQL = "SELECT * FROM #__allevents_events ORDER BY date, titre"

Private oConn As ADODB.Connection
Private rs As ADODB.Recordset
Private sSQL As String

Public Sub GetFromMySQL()

Dim bOpen As Boolean
Dim wFields As Long, I As Long
   
   Set oConn = New ADODB.Connection
   
   oConn.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver};Server=" & cDBServer & _
      ";Database=" & cDBName & ";Uid=" & cDBUser & ";Pwd=" & cDBPwd & ";"
      
   On Error Resume Next
   
   Err.Clear
   oConn.Open
   
   bOpen = (Err.Number = 0)
   
   On Error GoTo 0
   
   If Not bOpen Then
      
      ' Erreur de connexion :
      '
      '    * votre serveur MySQL n'est pas démarré ou
      '    * les drivers ne sont pas installés ou
      '    * les données de connexion sont incorrectes
      
      Debug.Print "GetFromMySQL() - " & Err.Description
      
   Else
      
      Set rs = New ADODB.Recordset
   
      rs.CursorType = adOpenKeyset
      rs.LockType = adLockOptimistic
      rs.ActiveConnection = oConn      
      
      rs.Open (Replace(cSQL, "#_", cDBPrefix))
      
      wFields = rs.Fields.Count - 1
      
      ' Récupère le nom des champs et rapporte ces noms dans la première ligne
      ' de la feuille de calcul
      
      For I = 0 To wFields
         Me.Cells(1, I + 1).Value = rs.Fields(I).Name
      Next I
            
      ' Copie la globalité du recordset à partir de la ligne 2 de la feuille de
      ' calcul
      
      Me.Cells(2, 1).CopyFromRecordset rs
      
      rs.Close
      oConn.Close
      Set rs = Nothing
      Set oConn = Nothing

   End If
   
End Sub

Informations supplémentaires

  • Package Free Ce billet concerne le package Free et est donc immédiatement disponible dans la version gratuitement téléchargeable de AllEvents.
mercredi, 01 août 2012 21:52

Documentation technique de AllEvents

Écrit par

Une documentation technique de AllEvents a été constituée par Jean-Claude Richard (alias Jisse03 sur le forum de Joomla!France) et hébergée sur l'un de ses sites.  

Cette documentation permet de consulter en ligne tout le code source de la version gratuite de AllEvents et sera d'une aide précieuse à celui qui veut rapidement retrouver une information comme le nom d'une fonction et son code

http://docs.lab-project.net/documents/allevents/index.html

Documentation technique de AllEvents @docs.lab-project.net

Informations supplémentaires

  • Package Free Ce billet concerne le package Free et est donc immédiatement disponible dans la version gratuitement téléchargeable de AllEvents.
lundi, 30 juillet 2012 19:44

Support de xDebug

Écrit par

Deux nouvelles méthodes ont été ajoutées au plug-in AllEvents - Debug et permettent d'activer simplement xDebug dès lors que ce dernier est installé sur votre serveur web.

Cette information n'est accessible qu'aux utilisateurs Premium ou ayant acheté le plug-in concernéEn savoir plus...

Informations supplémentaires

  • package Premium L'information décrite dans ce billet concerne une fonctionnalité du package dit "Premium"; voir liste des packages (lien Présentation du menu supérieur)
samedi, 28 juillet 2012 12:03

Développer plus facilement avec xDebug

Écrit par

Ce billet a pour unique dessein de décrire très rapidement l'utilité de xDebug et comment l'installer.   Je vous invite à continuer votre lecture en recherchant des tutoriels sur le web.

Lors du développement d'une extension Joomla (et par extension d'un code php), il peut vite se révéler fort pratique d'avoir installé xDebug sur sa machine de développement.

xDebug vient surcharger un grand nombre de méthodes natives de php comme var_dump() afin de donner plus d'informations au développeur en quête d'informations utiles pour corriger un bug ou améliorer une fonction.   En effet, xDebug est non seulement un outil de debugging mais aussi d'optimisation de code grâce à son fonction de profiling / trace.

Cette information n'est accessible qu'aux utilisateurs Premium ou ayant acheté le plug-in concernéEn savoir plus...

Informations supplémentaires

  • package Premium L'information décrite dans ce billet concerne une fonctionnalité du package dit "Premium"; voir liste des packages (lien Présentation du menu supérieur)
mercredi, 30 mai 2012 09:50

Nouvel évènement onAfterSaveEvent

Écrit par

De la même manière que onBeforeSaveEvent, l'évènement onAfterSaveEvent permet "d'écouter" AllEvents et de réagir en fonction.

onAfterSaveEvent est exécuté par AllEvents après la sauvegarde d'un évènement dans la table xxxx_allevents_events (table des évènements).   Dans le cas d'un nouvel évènement, le ID de l'évènement est seulement connu après la sauvegarde.   Si vous avez besoin de cet ID, c'est donc onAfterSaveEvent qu'il faut écouter.

Contrairement à onBeforeSaveEvent, vous n'avez pas la possibilité d'interdire la sauvegarde puisque cette dernière a déjà eu lieue.

Informations supplémentaires

  • Package Free Ce billet concerne le package Free et est donc immédiatement disponible dans la version gratuitement téléchargeable de AllEvents.

AllEvents va progressivement implémenter ses propres évènements afin de permettre à des développeurs de créer des plug-ins pour y répondre.   Ainsi, l'évènement onBeforeSaveEvent est appelé par la table de classe AllEvents_Events, fonction store() et va informer les plug-ins à l'écoute qu'un évènement est sur le point d'être sauvé.

Les plug-ins pourront répondre en exécutant leur propre code pour retourner deux valeurs :

  1. une valeur booléenne true/false pour autoriser ou non la sauvegarde
  2. une valeur texte qui sera affichée par AllEvents dès lors que la sauvegarde est interdite

Ci-dessous un code minimaliste d'un plug-in pour gérer onBeforeSaveEvent :

<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.plugin.plugin' );
if (!JComponentHelper::isEnabled('com_allevents', true)) return JError::raiseError(JText::_('AllEvents_Error'), JText::_('SE_COMP_NOT_INSTALLED'));
require_once (dirname(JApplicationHelper::getPath('front','com_allevents')).DS.'class'.DS.'superclass'.DS.'alleventsplugin.php');
class plgAllEventsBeforeSaveSample extends AEPlugin {
   
    // Nom du plugin.  Il sera utilisé entre autre lors de l'affichage de message d'erreur.    
    private $_me = 'AllEvents - onBeforeSaveEventSample';
   /**
    * Constructeur du plugin
    * 
    * @param $subject
    * @param $params        
    * 
    * @return unknown_type
    */
   function plgAllEventsBeforeSaveSample (&$subject, $params) {
       
      $this->_pluginPath = JPATH_SITE.DS.'plugins'.DS.'allevents'.DS;
      
      parent::__construct($subject, $params, get_class($this), '');
      
      return;
   } // function plgAllEventsBeforeSaveSample (&$subject, $params)         
   
   /*
    * Interception de l'évènement onBeforeSaveEvent.  Cet évènement est généré par la classe de table AllEvents_Events et par sa méthode store()
    *  
    * @param $event    Objet de type évènement.   Utiliser un "echo '<pre>'.print_r($event,true).'</pre>';" si vous désirez voir le contenu de l'objet      
    * @param $params   Paramètres éventuellement transmis à la fonction          
    * 
    * @return array('return', 'msg')
    *     return est une valeur de type True/False.    False interdira à AllEvents de sauver l'évènement 
    *     msg    est une chaîne de caractère.  msg sera affiché par AllEvents si return=false afin d'informer l'utilisateur de la raison pour laquelle 
    *            l'évènement ne peut pas être sauvé 
    */   
   function onBeforeSaveEvent(&$event, $params) {
       
      $bReturn = false;
      $msg = 'Vous ne pouvez pas...';
      return array('return'=>$bReturn, 'msg'=>$msg);
   } // function onBeforeSaveEvent (&$event, $params)  
   
} // class plgAllEventsBeforeSaveSample extends AEPlugin
?>

Explications :

Ligne 5 : Vérification que AllEvents est bien installé et publié sur le site.   Ceci afin de garantir que le site Joomla ne vas pas "planter" si on installe le plug-in alors même que AllEvents n'est pas présent.

Ligne 6 : Inclusion de la classe de gestion des plugins de AllEvents (classe AEPlugin).

Ligne 10 : Nom du plug-in.  Ce nom est utilisé par la classe AEPlugin.

Lignes 19 à 26 : Constructeur du plug-in.  Mettez-y le code d'initialisation de vos variables, de contrôle de présence de certains fichiers, etc.

Ligne 39 : Nom de la fonction = nom de l'évènement traité.   Deux paramètres sont transmis par AllEvents : une variable objet $event qui reprend l'évènement étant sur le point d'être sauvé et $param qui est une variable optionnelle.

Lignes 41 et 42 : initialisation des variables retours.    Votre code doit complété $bReturn soit par True si vous autorisez la sauvegarde soit par False si vous souhaitez que AllEvents l'interdise.   Et, dans ce dernier cas, la variable $msg doit reprendre un texte qui sera affiché pour informer l'utilisateur pourquoi l'évènement n'a pas été sauvé.    Les lignes 41 et 42 proposées ici sont évidemment à titre purement indicatif.

Ligne 43 : retour des deux variables au code appelant (il s'agit p.ex. de la fonction store() de la table de classe AllEvents_Events; mais pas forcément).

Le plug-in AllEvents - OnBeforeSaveEventSample est intégré dans la package Premium.

Informations supplémentaires

  • Package Free Ce billet concerne le package Free et est donc immédiatement disponible dans la version gratuitement téléchargeable de AllEvents.
mercredi, 21 décembre 2011 11:33

Manifest d'installation de AllEvents

Écrit par

L'installation de AllEvents, comme l'installation de n'importe quel composant/module/plugin/... Joomla se fait au travers d'un fichier xml que l'on appelle un manifeste.  Ces manifestes sont généralement totalement standard : ils suivent scrupuleusement le modèle mis à disposition par Joomla (voir http://docs.joomla.org/Manifest_files).  

Dans le cadre de AllEvents, je me suis quelque peu écarté de ce standard car l'installation du fichier ZIP est de type package : le composant est installé mais aussi les modules et quelques plugins.  J'ai également repris, dans le manifest, un certain nombre de paramètres qui seront utilisés par AllEvents lors de l'installation ou de la désinstallation du composant.

Le manifeste se trouve dans le dossier /administrator/components/com_allevents et se nomme allevents.xml.

manifest modules plugins
(cliquez pour agrandir)

Le manifest de AllEvents reprend deux noeuds supplémentaires : /install/modules et /install/plugins.   Ces entrées permettent à l'installateur (install.allevents.php) de déterminer quels sont les modules et les plugins qui accompagnent le package et qui doivent être installé pendant l'installation du composant.

Chaque entrée (tag <item>) contient un certain nombre d'attributs, la plupart sont optionnels :

  • name indique le nom du module/plugins.  Ce nom est le nom du dossier qui se trouve dans le package d'installation (dans le dossier /modules ou /plugins).
  • client indique s'il s'agit d'un module pour le backend (c'est le cas de QuickIcons) ou pour le frontend.   Les seules valeurs possibles sont "administrator" ou "client". Uniquement pour les modules.
  • position, pour un module, permet de définir la position de template dans lequel le module doit être publié.   Cette position doit bien sûr exister dans votre template. Uniquement pour les modules.
  • ordering permet de définir la valeur par défaut du champs ordering tel que vous le définiriez dans le backend de Joomla.  Cela doit être une valeur numérique.  Uniquement pour les modules.
  • published définit si le module/plugin doit être immédiatement publié.   Seules valeurs possibles : 1 (oui) ou 0 (non)
  • optional définit comment doit se comporter l'installateur : si optional est sur 0, le module/plugin doit impérativement être dans le package.  Si ce n'est pas le cas, l'installateur échouera.  Si optional est sur 1, si le module/plugin est manquant, aucune erreur ne sera soulevée et l'installateur continuera.   Seules valeurs possibles : 1 (oui) ou 0 (non).
  • install permet de définir si le module/plugin doit être installé.   Cela permet de désactiver temporairement l'installation (exactement comme si l'on met la ligne en commentaire).   Seules valeurs possibles : 1 (oui) ou 0 (non).
  • group définit le type de plugin (p.e. "search", "system", "allevents", ...).  Uniquement pour les plugins.

 

AllEvents.  Manifest d'installation de AllEvents
(cliquez pour agrandir)

Vous trouverez aussi le noeud /install/allevents qui reprend différents paramètres d'installation propre à AllEvents :

  • Les settings (/install/allevents/settings) qui est un tag unique reprenant des attributs :
    • debug permet d'activer le mode error_reporting(E_ALL) lors de l'installation.   Seules valeurs possibles : true / false
    • remove_media indique si, lors de la désinstallation, il faut que le dossier /media/com_allevents soit supprimé.   Ce paramètre surcharge l'éventuel paramètre global du composant que l'administrateur peut définir dans le backend de AllEvents.   Seules valeurs possibles : true / false.    Si false, le paramètre global sera pris en compte.
    • remove_menus détermine si les entrées de menus pointant vers AllEvents doivent être supprimées.  Seules valeurs possibles : true / false.
    • drop_tables permet d'indiquer que les tables de AllEvents doivent être supprimées lors de la désinstallation.  Ce paramètre surcharge l'éventuel paramètre global du composant que l'administrateur peut définir dans le backend de AllEvents.   Seules valeurs possibles : true / false.    Si false, le paramètre global sera pris en compte.
    • introduction contient l'url vers la page de description des fonctionnalités de AllEvents.
  • L'entrée tables (/install/allevents/tables) reprend la liste de toutes les tables du composant.   Chaque table fait l'objet d'un tag <table> avec un certain nombre d'attributs
    • name est le nom de la table.   Syntaxe : #__ suivi du nom de la table.
    • class est utilisé en interne par le composant. 
    • required si initialisé à 1 indique que la table est une table indispensable de AllEvents.  Dans ce cas, l'installateur vérifiera que la table existe bel et bien lors de l'installation.  Si la table devrait manquer, un message d'erreur sera renvoyé lors de l'installation.   Seuls valeurs possibles : 1 (oui) ou 0 (non)
    • refresh_css indique si, lors de la finalisation de l'installation, cette table doit faire l'objet d'une création d'un fichier CSS.    En effet, les tables agenda, activités, ... sont liées à une feuille de style qui se trouve dans le dossier /media/com_allevents/css/dynamic de votre site.   Cette feuille de style est générée dynamiquement par AllEvents lorsque vous, p.e., éditez un agenda.    Si, refresh_css est sur 1 lors de l'installation, le fichier css associé à la table sera regénéré.   Seules valeurs possibles : 1 (oui) ou 0 (non).

Informations supplémentaires

  • Package Free Ce billet concerne le package Free et est donc immédiatement disponible dans la version gratuitement téléchargeable de AllEvents.
jeudi, 10 novembre 2011 13:52

Fatal error: Out of memory

Écrit par

Lorsque vous rencontrez le message d'erreur "Fatal error: Out of memory (allocated xxxxx) (tried to allocate xxxxxx bytes) in file xxxxx", ce message indique que la page que vous essayez d'afficher consomme trop de mémoire par rapport à ce que votre hébergeur vous a autorisé d'utiliser.   Chez certains hébergeurs gratuits, comme Free p.e., cette limitation peut être de 32MB voire moins ce qui, pour faire tourner un site peut se révéler étroit.

Le nom du fichier mentionné dans l'erreur n'est pas utile, c'est juste lui qui a consommé le byte de trop et fait exploser le bouchon.

Un exemple "Fatal error: Out of memory (allocated 29884416) (tried to allocate 4864 bytes) in une_page_quelconque.php on line 21"

Comment comprendre l'erreur ?

  • "Out of memory (allocated 29884416) (tried to allocate 4864 bytes)" : le site n'a pas le droit d'utiliser plus de 30M de mémoire et votre site Joomla a besoin de près de 5MB supplémentaires pour s'afficher et ce besoin a fait exploser votre consommation mémoire.   

  • "in une_page_quelconque.php on line 21" : le nom du fichier n'a pas beaucoup d'importance, c'est lui qui a demandé l'octet de trop qui a fait explosé la mémoire; cela ne signifie pas du tout que c'est lui qui est le gros consommateur.

Si vous êtes sur un serveur web local ou sur un serveur dédicacé, vous avez la possibilité de modifier le fichier php.ini.   Ce fichier est celui qui défini la mémoire maximale que votre site web peut utiliser.   Il s'agit de la variable "memory_limit" : éditer le fichier et augmenter sa valeur.

Si vous êtes sur un serveur web mutualisé ou si vous ne souhaitez pas augmenter la mémoire maximale, il faudra donc identifier quel est le code qui est gros consommateur.   Cela peut être un plug-in, un module ou le composant utilisé sur la page. 

A la recherche du coupable

Faites un tour dans votre liste de plug-ins type Content ou System : lors de l'affichage d'une page, Joomla! exécute un grand nombre de plug-ins dont ceux de ces deux types.   AllEvents fait également appel aux plug-ins de type Content car il est parfaitement possible que vous ayez utilisé un tag dans un champs tel que la description d'un évènement.

Depuis la liste des plug-ins, regardez ceux dont vous êtes certains de ne plus utiliser : les plug-ins de type Content mal écrit pourrait consommer de la mémoire inutilement et un peu de CPU du serveur.   Les désactiver sera donc bénéfique pour votre site.   Faites bien attention en désactivant un plug-in de type System car certains pourraient être requis pour que votre site fonctionne correctement.   Autant désactiver un plug-in Content est assez inoffensif, autant désactiver un plug-in System peut planter le site.

Utilisation du profilage de Joomla

Joomla met également à votre disposition un outil de debugging.   Rendez-vous dans votre console d'administration, cliquez sur "Configuration du site" puis sur l'onglet "Système".  

Activation du débogage de JoomlaActivez le mode de débogage en cliquant sur Oui puis en enregistrant votre modification (pour bien faire, restez dans la page pour désactiver plus facilement ensuite).

Dans un nouvel onglet de votre navigateur, afficher la page de votre site; celle qui provoquait l'affichage du "Out of memory". 

Scrollez jusqu'au bas de la page et aurez alors accès à la console de débogage de Joomla!.

 Joomla! Console de débogage activée

Occupation de la mémoire : après avoir cliqué sur ce titre, vous déplierez une zone qui vous indique votre consommation actuelle.   Notez ce chiffre : plus il est proche de votre limite, plus les risques d'un Fatal error : out of memory sont importantes.

Profile d'information : extrêmement utile car il vous indique la consommation mémoire de votre site à chaque étape importante réalisée par Joomla! dont les différents appels à des modules. Vous pourrez suivre l'augmentation des besoins de mémoires et identifier le coupable c'est-à-dire celui dont la consommation avant <--> après est fort conséquente.   

Ci-dessous un exemple réel : on voit que la consommation de mémoire était de 7,23MB avant l'appel au module Abcdef et qu'après son exécution, la consommation a explosé à 20,17MB.  Ce module a donc consommé 13MB à lui seul.   Désactiver ce module sera donc très bénéfique pour alléger votre page.

Application 0.181 seconds (+0.000); 7.22 MB (-0.001) - beforeRenderModule mod_custom (Logo HR)
Application 0.181 seconds (+0.001); 7.23 MB (+0.003) - afterRenderModule mod_custom (Logo HR)
Application 0.182 seconds (+0.000); 7.23 MB (+0.000) - beforeRenderModule mod_abcdef (Derniers messages Forum)
Application 0.497 seconds (+0.316); 20.17 MB (+12.941) - afterRenderModule mod_abcdef (Derniers messages Forum)
Application 0.497 seconds (+0.000); 20.17 MB (-0.001) - beforeRenderModule mod_articles_popular (Les plus populaires)
Application 0.552 seconds (+0.055); 20.68 MB (+0.517) - afterRenderModule mod_articles_popular (Les plus populaires)

Informations supplémentaires

  • Package Free Ce billet concerne le package Free et est donc immédiatement disponible dans la version gratuitement téléchargeable de AllEvents.
Page 1 sur 2