Source for file Widget.php
Documentation is available at Widget.php
// vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 fdm=marker encoding=utf8 :
* Pxxo - build self-supported and interoperable Web graphical components
* Copyright (c) 2008, Nicolas Thouvenin
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the author nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* @copyright Copyright (c) 2008 Nicolas Thouvenin
* @license http://opensource.org/licenses/bsd-license.php
require_once 'Pxxo/View.php';
require_once 'Pxxo/Buffers.php';
require_once 'Pxxo/Config.php';
require_once 'Zend/Translate.php';
* Classe mère de tous les widgets
* @copyright Copyright (c) 2008 Nicolas Thouvenin
* @license http://opensource.org/licenses/bsd-license.php
* Pointeur vers l'objet parent de l'objet courant
* Tableau d'objet Pxxo_Component contenant tous fils de l'objet courant
* Tableau d'objet Pxxo_Buffer contenant toutes les ressources de l'objet courant
* @var Pxxo_Buffers Tableau contenant des informations destinées à l'entete HTML de la page terminale
* @var Pxxo_Response Gestion de l'entete HTTP
* Liste des variables utilisées pas l'objet
* Liste des variables publique de la classe (calculées automatiquement)
* Liste des variables privées de l'objet en plus des variables préfixées par _
private $_vars_privates =
array('Parent', 'Templates', 'Components', 'Resources', 'widget', 'Response');
* Liste des variables devant être mise en cache en plus des variables non privées
* Liste des modes "OneTime"
* Mode (ou action) en cours de traitment
* Mode (ou action) à exécuter par défaut
* Type de contenu produit en sortie
* Niveau de filtre appliqué sur la sortie
* mode persistant ou non (cad : le mode reste actif tant que l'on n'en change pas explicitement)
* Cet objet va produire une page terminale
* @var boolean active le chargement automatiques des ressources
* Active le mode caché ! Attention incompatible avec le controller...
* Ne peut être modidfié uniquement un surchargant cette déclaration
* @var boolean vient-on de changer de mode ?
* @var boolean le mode actuel vient-il d'être séléctionné volontairement
* @var boolean le mode actuel ne pourra produire de résultat car un mode fils à déclencher le mode Standalone
* @var boolean le Mode précendent
* Permet d'ajouter automatiquement un prefix aux variables accessible avec les méthodes getXxxxVar() et setXxxxVar()
* @var boolean Active ou non le mode cache
* @var string lieu de stockage du cache
* @var string temps de stockage dans le cache
* Indique l'état dans lequel se trouve l'objet
* Nom de la variable permettant de choisir le mode (ou l'action) à traiter
* @var string null par défaut ce qui indique que cette valeur prendra la même que son objet parent
* Donnée permettant les traductions
* Options du Module de Traduction
* Liste de chemin physique de répertoire contenant des themes
* ./themes:/var/httpd/www/themes
* @var string des chemins séparer par PATH_SEPARATOR
* Chemin physique par défaut des templates de l'objet
* Tableau associant un mode à un objet Pxxo_Buffer
* URL d'accès aux ressources du composant
* Chemin physique correspondant à l'URL d'accès aux ressources du composant
* Nom UNIQUE de définition de la classe
* Identifiant UNIQUE pour chaque instance de la classe
* Nom donné par un Composant Parent
* @var mixed Contient la valeur retournée par la méthode du dernier mode executé...
* @var boolean la première méthode correspondant à un mode qui retourne une valeur à gagner...
* @var array Tableau contenant les variables de classes modifiables à la construction de l'objet
// Variable de classe => son equivalent dans Pxxo::config
'ThemePaths' =>
'theme_path',
'TemplatePath' =>
'templates_path',
'ResourcePath' =>
'resources_path',
'ResourceURL' =>
'resources_url',
'CachePath' =>
'cache_path',
'CacheMode' =>
'cache_flag',
'CacheTime' =>
'cache_time',
'PrependVar' =>
'undefined',
'MinifyLevel' =>
'undefined',
'StandaloneMode' =>
'undefined',
'PersistentMode' =>
'undefined',
'DefaultMode' =>
'undefined',
'CurrentMode' =>
'undefined',
'ClassName' =>
'undefined',
'TranslateData' =>
'undefined',
'TranslateAdapter'=>
'undefined',
'TranslateOptions'=>
'undefined',
* @var array liste des options du widgets
* @var Pxxo_Widget_Decorator instance de l'éventuel décorateur
* @var Pxxo_Widget instance de ce que l'on décore (peut pointer sur un décorateur)
* @var Pxxo_Widget instance du widget que l'on décore (ne peut pas pointer sur un decorateur)
* @param string tableau des paramètres du composants
* @param string chemin complet du fichier de définition du widget
$this->_options['LoadingMode'] =
'undefined'; // ?
// {{{ Assignation automtiques des attributs de l'objet
foreach($this->_options as $opt =>
$cfg) {
$this->$opt =
$options[$opt];
elseif ($cfg !==
'undefined') {
// Paramètres Spécifiques
if (isset
($options[$p])) {
$this->$p =
$options[$p];
// {{{ Caclul pseudo automatique d'un identifiant unique pour le composant
// Retro compatibilité 3.6 et précedente
if (!isset
($GLOBALS['PXXO_GLOBALS'][$this->ClassName])) $GLOBALS['PXXO_GLOBALS'][$this->ClassName] =
0;
if ($GLOBALS['PXXO_GLOBALS'][$this->ClassName] !==
0)
++
$GLOBALS['PXXO_GLOBALS'][$this->ClassName];
// {{{ Detection des variables publique du widget
foreach($tab as $k =>
$v) {
// {{{ gestion du ThemePaths
$filepath =
dirname($filename).
DIRECTORY_SEPARATOR.
basename($filename, '.php');
if (isset
($options['themepath'])) $this->addThemePath($options['themepath']);
// Dans cette classe, On considère le TemplatePath comme commun à tous les widgets
* Ajout d'un widget sous forme de composant
* si l'identifiant est null on attache un widget au Widget courant
* sans pour autant le mettre à disposition du template
* mais renvoyant simplement le rendu sous forme d'une chaine de caractères
* @param string identifiant du widget dans les templates
* @param Pxxo_Widget instance d'un widget
if ($this->State <
1) trigger_error("`$this->ClassID::putWidget` called in the __construct() method : you should call it in the initMode() method", E_USER_NOTICE);
if (is_null($id) or $id ===
false) {
* @param string identifiant dans les templates
* @param Pxxo_Buffer instance d'un flux
if ($this->State <
1) trigger_error("`$this->ClassID::putData` called in the __construct() method : you should call it in the initMode() method", E_USER_NOTICE);
$this->_view->assign($id, $value);
* Ajout le contenu d'un template dans une zone
* @param string identifiant dans les templates
if ($this->State <
1) trigger_error("`$this->ClassID::putFile` called in the __construct() method : you should call it in the initMode() method", E_USER_NOTICE);
$this->_view->setInputBuffer($stm);
$this->_view->assign('Self', $this);
$this->_view->transform($typ_rsc);
$out =
$this->_view->getOutputBuffer();
* le CSS est contenu dans un fichier. Ce fichier fonctionne comme un template.
* @param string nom du fichier (son emplacement sera déduit en fonction du theme)
* @param string media destibation des templates
* @return string identifiant de la ressources dans $this->Resources
if (isset
($this->_memory_cache[__METHOD__
][$filename][$media.
'X'])) return $this->_memory_cache[__METHOD__
][$filename][$media.
'X'];
/* CAS Internet explorer */
if (substr($media, 0, 3) ===
'if ') {