FAQ: Forum à Questions

Basiques

Récuperer une variable GET,POST
Récuperer l'ensemble des paramètres
Passer une variable de l'action à la vue
Vérifier si une variable est assigné à la vue
Charger un module à un emplacement du layout
Executer un traitement pour l'ensemble d'un module
Ajouter un plugin
Appeler / Utiliser un plugin
Un export excel (csv pour être exact)
Un export excel utf-8 (csv pour être exact)
Récuperer le nom du module
Récuperer le nom de l'action
Récuperer la variable de navigation
Faire un lien vers l'action "liste" du module "article"
Comment passer un parametre au layout
Comment verifier un parametre dans le layout
Comment faire une redirection
Loguer dans l'application
Lire un fichier
Créer/écrire dans un fichier
Créer un répertoire
Lister les fichiers d'un répertoire
Lister les sous-répertoires d'un répertoire
Envoyer un email

Avancée

Livrer une application en production
Comment utiliser l'authentificaiton
Comment faire un site multi-lingue
Utiliser l'url rewriting
Utiliser la barre de debug
Créer des graphiques
Manipuler des dates
Utiliser le plugin plugin_form
Comment créér un webservice
Comment exporter un objet en xml
Comment exporter une liste/tableau d'objet en xml
Automatiser un retraitement sur des enregistrements
Créer un modèle virtuel
Faire un appel API REST

Paramétrage

Paramétrer le virtualhost
Parametrer le module par defaut

Cache

Gérer le cache
Gérer le cache de variable

JQuery

JQuery, faire un lien innerHtml
JQuery, modifier un element html
JQuery, faire un appel ajax avec callback

Tutoriaux

Créer un nouveau site
Créer la couche modèle de votre site
Créer un module CRUD (Create Read Update Delete)
Ajouter un menu à votre site
Ajouter une authentication à une page/un module
Ajouter une authentication via le builder
Permettre l'upload d'un fichier
Créer un module CRUD intégrable (Create Read Update Delete)
Vérifier les entrées d'un formulaire
Ajouter une verification particuliere
Facilitez la création de formulaire
Gérer des permissions (ACL)
Utilisez des CRUD intégrables
Utiliser des classes Zend Framework 1
Utiliser des classes Zend Framework 2
Utiliser les jetons pour éviter les failles XSRF
Faire un site avec un cache html complet
Implémenter un tableau Guriddo
Utiliser la barre de debug
Faire un webservice
Une question ? la FAQ est là pour ça

Réponses


Paramétrer le virtualhost

Voici la paramétrage d'un virtualhost pour la configuration suivante:
Sources: /var/www/mkframework/data/genere/votreApplication
Url: www.projet.com


  
<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   ServerName www
.projet.com
   DocumentRoot 
/var/www/mkframework/data/genere/votreApplication/public
   <Directory />
       Options FollowSymLinks
       AllowOverride None
   
</Directory>
   <Directory /var/www/mkframework/data/genere/votreApplication/public>
       Options Indexes FollowSymLinks MultiViews
       AllowOverride All
       Order allow
,deny
       allow from all
   
</Directory>
</
VirtualHost>
    



Au moment de la livraison voir ci dessous


Livrer une application en production

Le builder génère les applications dans son repertoire data/genere/
Il suffit de copier le repertoire librairie (lib/framework) et le repertoire de votre application (data/genere/votreApplication) sur le serveur.
Il faut ensuite indiquer dans l'application où se situe la librairie (modifier le fichier conf/path.ini.php variable lib dans la section [path] )
note: si votre application a été générée avec une ancienne version du framework, le fichier contenant les chemin devrait être conf/site.ini.php et non conf/path.ini.php

  
[path]
lib=../../../lib/framework/
    


Vous pouvez également activer la variable de cache d'autoload, qui créera un fichier de cache autoload.php dans votre repertoire de cache (par défaut data/cache)*

  
[cache]
(...)
autoload.enabled
   



Pour le virtualhost (en ayant placé le site dans /var/www par exemple)

  
<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   ServerName www
.projet.com
   DocumentRoot 
/var/www/votreApplication/public
   <Directory />
       Options FollowSymLinks
       AllowOverride None
   
</Directory>
   <Directory /var/www/votreApplication/public>
       Options Indexes FollowSymLinks MultiViews
       AllowOverride All
       Order allow
,deny
       allow from all
   
</Directory>
</
VirtualHost>
    



Pour nginx:

  
server 
{
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /var/www/votreApplication/public;
   index index.php index.html index.htm;

   # Make site accessible from http://www.projet.com/
   server_name www.projet.com;

   location / {
       # First attempt to serve request as file, then
       # as directory, then fall back to displaying a 404.
       try_files $uri $uri/ =404;
       # Uncomment to enable naxsi on this location
       # include /etc/nginx/naxsi.rules
   }

   location ~ \.php$ {
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
   #    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
   #
   #    # With php5-cgi alone:
   #    fastcgi_pass 127.0.0.1:9000;
   #    # With php5-fpm:
       fastcgi_pass unix:/var/run/php5-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
   }

   # deny access to .htaccess files, if Apache's document root
   # concurs with nginx's one
   #
   #location ~ /\.ht {
   #    deny all;
   #}
}
    



Si vous utilisez l'url rewriting #link ##urlrewriting #label lisez ceci link#

* faites bien attention à ce que l'application ait les droits d'écriture sur ce répertoire de cache.


Récuperer une variable GET,POST


  
_root
::getParam('mavariable')
    



Récuperer l'ensemble des paramètres


  
_root
::getRequest()->getParams()
    




Gérer le cache

Vous avez deux solutions:
1. Soit la totalité de la page est mise en cache,
Ceci en indiquant enabled=1 dans le fichier conf/site.ini.php section [cache]
Vous pouvez définir le temps de validité du cache avec le paramètre lifetime (toujours au même endroit)

Note: dans le cas où l'ensemble du site doit être mis en cache sauf une ou deux pages,
vous pouvez activer le cache (dans le fichier de config) et ajouter une méthode before_lapagehorscache dans laquelle vous annulez le cache (Par exemple une page formulaire de contact).


  
module_article 
extends abstract_module{

   //cette methode est executée pour tout le module avant de verifier le cache
   public function before(){
       //il suffit donc de forcer la valeur à 0
       _root::setConfigVar('cache.enabled',0);
   }

   //cette methode est executée juste pour l'action pagehorscache avant de verifier le cache
   public function before_pagehorscache(){
       //il suffit donc de forcer la valeur a 0
       _root::setConfigVar('cache.enabled',0);
   }
   public function _pagehorscache(){
       (...)
       //votre page hors cache
   }

}
    




2. Soit une partie (un couple module/action)
Pour cela, il faut utiliser la methode _root::getCache(), qui récupère l'instance unique de la class _cache
Le cache est géré avec les objets vue (_view) vous verifiez qu'il existe un cache,
- si oui, vous verifier si il est recent (date de modif superieur à N minutes), vous utilisez le cache,
- si non, vous faites votre traitement et n'oubliez pas d'enregistrer la vue dans le cache à la fin

  
private function getViewList(){
   //y a t il un cache actif de moins d'1 minute
   if( _root::getCache()->isCached'article_list',1) == true ){
       $oView=_root::getCache()->getCached'article_list');
   }else{
       $oModelArticle=new model_article;
       $tArticle=$oModelArticle->findAll();
      
       $oView
=new _view('article::list');
       $oView->tArticle=$tArticle;
       $oView->tColumn=$oArticleModel->getListColumn();
  
       
//on enregistre la vue en cache
       _root::getCache()->setCache('article_list',$oView);
   }
   return $oView;
}

public function 
_list(){
   $oView=$this->getViewList();
  
   $this
->oLayout->add('main',$oView);
}
    



note vous pouvez demander a toujours utiliser un cache, pour les parties statiques (exple: un menu)
pour cela ne renseignez pas de limite

  
public function _list(){
   //y a t il un cache
   if( _root::getCache()->isCached'menu') == true ){
       $oView=_root::getCache()->getCached'menu');
   }else{

       $tLink=array(
           'Accueil' => 'pages::accueil',
           'News' => 'pages::news',
           'Présentation' => 'pages::presentation',
           'Librairie' => 'pages::librairie',
           'L ORM' => 'pages::orm',
           'Tutoriaux' => 'pages::tutoriaux',
           'CommentKonFait ?' => 'pages::faq',
           'Builder' => 'pages::builder',
       );
      
       $oView
=new _view('menu::index');
       $oView->tLink=$tLink;
      
       
//on enregistre la vue en cache
       _root::getCache()->setCache('menu',$oView);
   }
   return $oView;
}
    


Note: si vous modifiez le menu, il vous suffit de supprimer le fichier data/cache/menu.cache pour qu'il regenere un cache

Attention dans le cas de ce menu, si on laisse ainsi, l'onglet accueil sera toujours selectionné: mis en cache la première fois
Lors qu'on va appeler la page news, il affichera le cache du menu (onglet accueil selectionné) :(
Pour éviter cela, il faut ajouter un id permettant de creer un cache pour toutes les variantes du menu (une par onglet)
En faisant ainsi par exemple

  
public function _index(){
   //ici on cree un id unique avec le couple module/action
   $sMenuId='menu_'._root::getModule().'_'._root::getAction();
   //y a t il un cache
   if( _root::getCache()->isCached$sMenuId ) == true ){
       $oView=_root::getCache()->getCached$sMenuId );
   }else{

       $tLink=array(
           'Accueil' => 'pages::accueil',
           'News' => 'pages::news',
           'Présentation' => 'pages::presentation',
           'Librairie' => 'pages::librairie',
           'L ORM' => 'pages::orm',
           'Tutoriaux' => 'pages::tutoriaux',
           'CommentKonFait ?' => 'pages::faq',
           'Builder' => 'pages::builder',
       );
      
       $oView
=new _view('menu::index');
       $oView->tLink=$tLink;
      
   _root
::getCache()->setCache$sMenuId ,$oView);
   }
   return $oView;
}
    




Gérer le cache de variable

Vous avez désormais la possibilité de gerer un cache de variable.
Proposé à l'origine pour vos requetes ORM, il permet:
- de gagner en performances
- de décharger votre SGBD
note: vous avez toujours la possibilité d'indiquer une date de "peremption" pour ce cache

Son utilisation:

  
   
public function findAll(){
       $sId='articleFindAll';

       //y a-t-il un cache pour cette variable ?
       if(_root::getCacheVar()->isCached($sId) ){
           //si oui, on recupere le tableau d'objets en cache
           $tArticle=_root::getCacheVar()->getCached($sId);
       }else{
           //si non: on execute la requete dans l'ORM et on enregistre le tableau en cache
           $tArticle $this->findMany('SELECT * FROM '.$this->sTable.'   ');
           _root::getCacheVar()->setCache($sId,$tArticle);
       }

       return $tArticle;

   }
   //en prenant en compte un temps de validité:
   public function findLast(){
       $sId='articleFindAll';

       //y a-t-il un cache pour cette variable inferieur à 60 minutes ?
       if(_root::getCacheVar()->isCached($sId,60) ){
           //si oui, on recupere le tableau d'objets en cache
           $tArticle=_root::getCacheVar()->getCached($sId);
       }else{
           //si non: on execute la requete dans l'ORM et on enregistre le tableau en cache
           $tArticle $this->findMany('SELECT * FROM '.$this->sTable.' ORDER BY id DESC   ');
           _root::getCacheVar()->setCache($sId,$tArticle);
       }

       return $tArticle;

   }
    


Mais vous pouvez l'utiliser pour mettre en cache n'importe quel variable gourmande à construire ;)


Passer une variable de l'action à la vue

Par exemple, passer l'objet article de l'action à la vue show
module/article/main.php

  
$oView
=new _view('article::show');
//on "assigne" la variable $article à la vue sous le nom "monArticle"
$oView->monArticle=$article;
    



Coté vue
module/article/view/show.php

  
echo $this->monArticle->id;
echo 
$this->monArticle->titre;
    




Vérifier si une variable est assignée à la vue

Par exemple, vérifier si une variable nous a été assigné
module/article/main.php

  
$oView
=new _view('article::show');
//on "assigne" la variable $article à la vue sous le nom "monArticle"
if($maCondition==true){}
$oView->monArticle=$article;
}
    



Coté vue
module/article/view/show.php

  
if(isset($this->monArticle)){
echo 
$this->monArticle->id;
echo 
$this->monArticle->titre;
}
    




Gérer la pagination de son site

Dans votre fichier module/article/main.php

  
public function _listPagination(){

//d'abord on recupere notre liste d'articles
$oArticleModel=new model_article;
$tArticle=$oArticleModel->findAll();

//ensuite on instancie le module pagination (le repertoire module/pagination)
$oModulePagination=new module_pagination;
$oModulePagination->setModuleAction('article::listPagination');//on lui indique notre couple module/action
$oModulePagination->setParamPage('page');//le nom du parametre page a utiliser
$oModulePagination->setLimit(2);
$oModulePagination->setPage_root::getParam('page') );
$oModulePagination->setTab$tArticle ); //on lui passe le tableau d'article a paginer

$oView=new _view('article::listPagination');
$oView->tArticle=$oModulePagination->getPageElement(); //on passe a la vue le tableau pagine d'articles a afficher
$oView->tColumn=$oArticleModel->getListColumn();
$oView->oModulePagination=$oModulePagination->build(); //on passe a la vue la navigation de pagination

$this->oLayout->add('main',$oView);
}

(...)
    



Dans votre vue module/article/view/listPagination.php

  
(...)

//ajouter a la fin de votre vue pour avoir la navigation de pagination
<?php echo $this->oModulePagination->show()?>
   



Charger un module a un emplacement template

Vous pouvez avoir besoin de charger un module a un endroit donnée
Pour cela vous devez inclure ce module, par exemple le calendrier a "emplacement" par exemple "calendrier"

  
$oView
=new _view('module::action');
$oModuleCalendrier=new module_calendrier;
$oModuleCalendrier->sModuleAction='article::list'//indiquer le couple module::action de la page parente

$oView->oViewCalendrier=$oModuleCalendrier->build(); //la methode build() doit retourner un objet _view
    


et a partir de la, dans module/view/action.php

  
<?php echo $this->oViewCalendrier->show();?>
   


note: pour avoir le module calendrier, il faut générer "avec exemples"


Executer un traitement pour l'ensemble d'un module

Pour cela, la methode before() a fait son apparition, cette methode est toujours executée a chaque appel d'action (via l'url) d'un module
On l'utilise lors de la generation de crud pour initier en permanence le menu

  
function before(){
   $this->oLayout=new _layout('template1');
      
   $this
->oLayout->addModule('menu','menu::index');
  
   
//de cette facon, dans template1 on affiche le menu avec un echo $this->load('menu')
}
    




Ajouter un plugin

Rien de plus simple, creer un fichier plugin_votrePlugin.php dans le repertoire plugin/
qui contiendra

  
Class plugin_votrePlugin{
   //le contenu de votre plugin
}
    




Appeler / Utiliser un plugin

Pour appeler un plugin, par exemple le plugin plugin_form

  
$oForm
=new plugin_form();
    




Un export excel (csv pour etre exact)

Dans votre fichier action par exemple module/article/main.php

  
(...)
public function 
_listeArticleCsv(){

   $tArticle=model_article::getInstance()->findAll();

   $oView=new _view('article::listeArticleCsv');
   $oView->tArticle=$tArticle;
   //$this->oLayout ayant ete initialisée dans la methode before
   $this->oLayout->add('main',$oView);
   $this->oLayout->setLayout('download');
   $this->oLayout->sFileName='fichier_article_list.csv';
   $this->oLayout->sExtension='csv';
  
   $this
->oLayout->show();
   exit;
}
    



Dans le layout layout/download.php

  
<?php
header
('Cache-Control:public');
header('Pragma:');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Content-Disposition: attachment; filename=\"".$this->sFileName."\"");
header('Content-Transfer-Encoding:binary');
header("Content-Type: application/".$this->sExtension.";name=\"".$this->sFileName."\"");

flush();
echo 
$this->load('main')?>
   


Dans la vue module/article/view/listeArticleCsv.php

  
TITRE
;AUTEUR
<?php
foreach($this->tArticle as $oArticle):
   echo $oArticle->titre;
   echo ';';
   echo $oArticle->auteur;
   echo "\n";
endforeach;
    




Un export excel utf-8 (csv pour etre exact)

Dans votre fichier action par exemple module/article/main.php

  
(...)
public function 
_listeArticleCsv(){

   $tArticle=model_article::getInstance()->findAll();

   $oView=new _view('article::listeArticleCsv');
   $oView->tArticle=$tArticle;
   //$this->oLayout ayant ete initialisée dans la methode before
   $this->oLayout->add('main',$oView);
   $this->oLayout->setLayout('download');
   $this->oLayout->sFileName='fichier_article_list.csv';
   $this->oLayout->sExtension='csv';
  
   $this
->oLayout->show();
   exit;
}
    



Dans le layout layout/download.php

  
<?php
header
('Cache-Control:public');
header('Pragma:');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Content-Disposition: attachment; filename=\"".$this->sFileName."\"");
header('Content-Transfer-Encoding:binary');
header("Content-Type: application/".$this->sExtension.";name=\"".$this->sFileName."\"");

flush();
echo
"\xEF\xBB\xBF"//Permet a Excel de reconnaitre que le fichier est en UTF-8
echo $this->load('main')?>
   


Dans la vue module/article/view/listeArticleCsv.php

  
TITRE
;AUTEUR
<?php
foreach($this->tArticle as $oArticle):
   echo html_entity_decode($oArticle->titre);
   echo ';';
   echo html_entity_decode($oArticle->auteur);
   echo "\n";
endforeach;
    





Recuperer le nom du module

Ce framework utilise une variable contenant le couple module::action
Pour recuperer juste le nom du module

  
echo _root::getModule();
    




Recuperer le nom de l'action

Ce framework utilise une variable contenant le couple module::action
Pour recuperer juste le nom de l'action

  
echo _root::getAction();
    




Recuperer la variable de navigation

Ce framework utilise une variable contenant le couple module::action
Pour recuperer la variable de navigation (article::list)

  
echo _root::getParamNav();
    




Faire un lien vers l'action liste du module article

Pour creer un lien vers un couple module / action
Ecrivez un

  
//sans parametre
<a href="<?php echo _root::getLink('article::liste');?>">libelle</a>

//avec parametre (par exemple edition id 2)
<a href="<?php echo _root::getLink('article::edit',array('id'=>2));?>">edition de l'article 2</a>
   



[UPDATE 27nov09]
Ajout possiblité de generer un lien avec un tableau

  
//avec parametre (par exemple edition id 2)
<a href="<?php echo _root::getLink(array('article::edit','id'=>2));?>">edition de l'article 2</a>
   





Comment passer un parametre au layout

Aussi simplement qu'avec le _view

  
class module_article extends abstract_module{
  
   
public function before(){
       $this->oLayout=new _layout('template1');
       (...)
   }
  
   
public function _show(){
       $this->oLayout->title="Titre de l'article";
   }

}
    


Et dans le layout, comme dans une vue
layout/template1.php

  
<html>
<
head>
<
title><?php echo $this->title ?></title>
</head>
(...)
</html>
   



Comment vérifier qu'un paramètre est bien assigné au layout

Aussi simplement qu'avec le _view

  
class module_article extends abstract_module{
  
   
public function before(){
       $this->oLayout=new _layout('template1');
       (...)
   }
  
   
public function _show(){
       $this->oLayout->test="Titre de l'article";
   }

}
    


Et dans le layout, comme dans une vue
layout/template1.php

  
<html>
<
head>
<
title>titre</title>
</
head>
<
body>
<?
php if(isset($this->test)):?><p><?php echo $this->test?></p><?php endif;?>
(...)
</html>
   



Comment utiliser l'authentificaiton

Il existe plusieurs solutions pour gerer l'authentification
Vous pouvez mettre:
1. Tout privé
2. Tout public sauf certaines zones privées

Vous pouvez gérer l'authentification globale avec le parametre [auth] enabled
dans conf/site.ini.php

  
[auth]
;
note : >= php5.2 dans le php.ini
;session.cookie_httponly=1
;session.use_cookies 1
;session.use_only_cookies 1
enabled
=0
   



Vous pouvez gerer l'authenfication ciblée soit par module

  
class module_exemple extends abstract_module{
  
   
public function before(){
       //ici on force l'authentification sur l'ensemble du module
       _root::getAuth()->enable();
   }
  
}
    



ou par couple module/action

  
class module_exemple extends abstract_module{
  
   
(...)

   public function before_list(){
       //ici on force l'authentification sur le couple exemple::list
       _root::getAuth()->enable();
   }
   public function _list(){
       //page privee
   }
    



note: lorsqu'on utilise l'authentification du mkframework il faut egalement parametrer la partie [auth]
dans conf/site.ini.php

  
[auth]
;
note : >= php5.2 dans le php.ini
;session.cookie_httponly=1
;session.use_cookies 1
;session.use_only_cookies 1
enabled
=0
class=plugin_auth
module
=auth::login
session
.timeout.enabled=1
session
.timeout.lifetime=(60*1)
    



Comme vous pouvez le voir ici est defini le couple a appeler pour l'authentification, ici auth::login (variable module)
La classe à utiliser pour verifier l'authentification (variable class)
Le framework appelera la methode isConnected() de la classe (par defaut plugin_auth)




Comment faire une redirection


  
_root
::redirect('module::action'[,$tParam]);
    



Par exemple pour rediriger vers la page d'affichage de l'article 2

  
_root
::redirect('article::show',array('id'=>2) );
    




Comment faire un site multi-lingue

Faire un site multi lingue nécessite trois choses:
1. parametrer un fichier d'association par langue
2. utiliser la fonction adéquate pour afficher le mot dans la bonne langue
3. permettre de switcher, et garder la langue sélectionée

Pour la première partie, vous pouvez vous rendre dans le repertoire data/i18n, vous y trouverez un fichier par langue
Fichier data/i18n/en.php

  
<?php _root::setConfigVar('tLangue',array(

'BONJOUR' => 'Hello',
'BIENVENUE' => 'Welcome',
'CHOISISSEZ_LANGUE' => 'Choose your language',
'DU_TEXTE_EN_FRANCAIS' => 'Some text in english',
'La_date' => 'The date',

))
?>   
   

Comme vous pouvez le voir chaque fichier définit un tableau associatif : un tag/mot et sa traduction

Pour la deuxième partie il faut utiliser la méthode static get de la classe plugin_i18n

  
<?php echo plugin_i18n::get('BONJOUR'); ?>
   

Faites appel a cette méthode pour chaque titre, bouton... à afficher.

Enfin pour la dernière partie, vous pouvez au choix utiliser des images de drapeaux, des liens ou autre pour chaque langue.
Dans votre layout, ou vos vues un petit lien

  
<a href="?lang=fr">FR</a>
    



Et dans vos modules pensez à intercepter la valeur pour charger le bon fichier

  
_root
::startSession();
if( 
_root::getParam('lang') ){
   $_SESSION['lang']=_root::getParam('lang');
}
if(!isset(
$_SESSION['lang'])){
   $_SESSION['lang']=_root::getConfigVar('language.default');
}

plugin_i18n::load($_SESSION['lang']);
    





Loguer dans l'application

Le framework permet de loguer selon plusieurs niveaux de criticité
1. erreur
2. warning
3. message applicatif
4. information

Ceci en activant la gestion de log dans le fichier conf/site.ini.php

  
[log]
class=
plugin_log
error
=0
warning
=0
application
=0
information
=0
   



En activant les logs, vous pourrez lire dans le repertoire data/log/ les logs du frameworks
Mais ce n'est pas tout, vous pouvez vous aussi utiliser ce logueur pour votre besoin

  
_root
::getLog()->info('Un message d information');
_root::getLog()->warning('Un message de warning');
_root::getLog()->error('Un message d erreur');
_root::getLog()->log('Un message de votre application');
    


En utilisant uniquement la methode static log() pour vos messages, vous aurez la possibilité de filtrer uniquement vos messages applicatif.
Utiliser la flexibilité du parametrage couplé aux différents appel au module du log

Exemple de génération:

  
2012
-07-14;12:13:43;info;module a appeler [article::list]
2012-07-14;12:13:43;info;appel module [article::before]
2012-07-14;12:13:43;info;--layoutinitialisation [template1]
2012-07-14;12:13:43;info;-layoutchoix de [layout/template1.php]
2012-07-14;12:13:43;info;-layoutajout appel module [menu::indexa la place [menu]
2012-07-14;12:13:43;info;--vueinitialisation [menu::index]
2012-07-14;12:13:43;info;---vueassignation [tLink]
2012-07-14;12:13:43;info;appel module [article::_list]
2012-07-14;12:13:43;info;sql select:
2012-07-14;12:13:43;info;--vueinitialisation [article::list]
2012-07-14;12:13:43;info;---vueassignation [tArticle]
2012-07-14;12:13:43;info;---vueassignation [tColumn]
2012-07-14;12:13:43;info;-layoutajout appel vue [module/article/view/list.phpa la place [main]
2012-07-14;12:13:43;info;appel module [article::after]
2012-07-14;12:13:43;info;-layoutaffichage [layout/template1.php]
2012-07-14;12:13:43;info;-layoutchargement/affichage place [menu]
2012-07-14;12:13:43;info;--vueaffichage [module/menu/view/index.php]
2012-07-14;12:13:43;info;-layoutchargement/affichage place [main]
2012-07-14;12:13:43;info;--vueaffichage [module/article/view/list.php]

    




Utiliser l'url rewriting

Pour utiliser l'url rewriting, il faut:
1. activer le module rewrite sur votre serveur apache
2. parametrer votre virtualhost pour autoriser l'url rewriting / ou creer un fichier .htaccess
3. activer dans votre fichier conf/site.ini.php la variable enabled de la section [urlrewriting]
4. configurer vos règles dans le fichier conf/routing.php

Pour le point 2
Soit vous définissez dans le virtualhost de votre site

  
<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   ServerName www
.projet.com
   DocumentRoot 
/var/www/mkframework/data/genere/votreApplication/public
   <Directory />
       Options FollowSymLinks
       AllowOverride None
   
</Directory>
   <Directory /var/www/mkframework/data/genere/votreApplication/public>
       Options Indexes FollowSymLinks MultiViews

       RewriteEngine On
       RewriteCond 
%{REQUEST_FILENAME} -[OR]
       RewriteCond %{REQUEST_FILENAME} -[OR]
       RewriteCond %{REQUEST_FILENAME} -d
       RewriteRule 
^.*$ - [NC,L]
       RewriteRule ^.*$ index.php [NC,L]

       Order allow,deny
       allow from all
   
</Directory>
</
VirtualHost>
    


Soit vous créer un fichier .htaccess dans le repertoire public/ de votre projet avec le contenu suivant:

  
Options 
+FollowSymlinks

RewriteEngine On
RewriteCond 
%{REQUEST_FILENAME} -[OR]
RewriteCond %{REQUEST_FILENAME} -[OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule 
^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
    



Pour nginx:

  

server 
{
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /var/www/votreApplication/public;
   index index.php index.html index.htm;

   # Make site accessible from http://www.projet.com/
   server_name www.projet.com;

   location / {
       # First attempt to serve request as file, then
       # as directory, then fall back to displaying a 404.
       try_files $uri $uri/ @rewriteapp;
       # Uncomment to enable naxsi on this location
       # include /etc/nginx/naxsi.rules
   }
   location @rewriteapp {
       # rewrite all to index.php
       rewrite ^(.*)$ /index.php last;
   }

   location ~ \.php$ {
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
   #    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
   #
   #    # With php5-cgi alone:
   #    fastcgi_pass 127.0.0.1:9000;
   #    # With php5-fpm:
       fastcgi_pass unix:/var/run/php5-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
   }

   # deny access to .htaccess files, if Apache's document root
   # concurs with nginx's one
   #
   #location ~ /\.ht {
   #    deny all;
   #}
}
    



Pour le point 3, dans votre fichier conf/site.ini.php

  
[urlrewriting]
enabled=0
class=plugin_routing
conf
=conf/routing.php
   


Passer la variable enabled à 1

  
[urlrewriting]
enabled=1
class=plugin_routing
conf
=conf/routing.php
   



Ensuite pour le point 4 éditer le fichier conf/routing.php

  
<?php
$tab
=array(
           'articles.html' => array(
                               'nav'=>'article::list',
                              
                               
),
           'articleDetail_:id:.html' =>  array(
                               'nav'=>'article::show',
                               'tParam' => array('id')
                               ),
           'articleEdit_:id:' =>  array(
                               'nav'=>'article::edit',
                               'tParam' => array('id')
                               ),                   
          
           
'taches' => array(
                               'nav'=>'tache::list',
                               ),
           'taches_archives' => array(
                               'nav'=>'tache::archivelist',
                               ),
           'tacheDetail_:id:' =>  array(
                               'nav'=>'tache::show',
                               'tParam' => array('id')
                               ),
           'tacheEdit_:id:' =>  array(
                               'nav'=>'tache::edit',
                               'tParam' => array('id')
                               ),   
           
//page 404 (page non trouve)
           '404' => array(
                               'nav' => 'article::list',
                               ),
      
       
);
    


Vous y trouvez un exemple de paramétrage
Ce qu'il faut comprendre: à l'appel d'une page, le framework recherche dans ce tableau une page correspondant à une des clés.
Par exemple, vous avez une page articles.html qui doit pointer vers le module article, l'action list

  
   
'articles.html' => array(
       'nav'=>'article::list',
      
       
),
    


Si vous avez une partie variable, par exemple l'id de l'article

  
   
'article_:id:.html' =>  array(
       'nav'=>'article::show',
       'tParam' => array('id')
       ),
    


note: si la règle n'est pas trouvé, on redirige sur la page paramétré en 404

On utilise les variables "nav" qui contient le couple module/action, et "tParam" (optionnel) dans le cas ou il y a une partie variable
Par exemple si on a besoin de la variable "CAT_PKEY" dans une page de categorie (index.php?:nav=categorie::list&CAT_PKEY=2)

  
   
'categorie_:CAT_PKEY:.html' =>  array(
       'nav'=>'categorie::list',
       'tParam' => array('CAT_PKEY')
       ),
    


Dans cette exemple la lien index.php?:nav=categorie::list&CAT_PKEY=2 devient categorie_2.html

Le fait de passer la variable urlrewriting.enabled de 0 à 1 permet de switcher entre le mode urlrewriting et le mode normal, aucune autre modification de vos liens n'est nécessaire (la methode _root::getLink se charge de tout)



Paramétrer le module par défaut de votre application

Lorsque vous arrivez sur votre site, par défaut vous tombez sur celui paramétré par défaut.
Editez le fichier conf/site.ini.php

  
[navigation]
scriptname=index.php
var=:nav
module
.default=article
action
.default=list
    



Vous voyez la variable "module.default" indiquant le module par défaut, ainsi que "action.default" pour l'action par défaut.
Ainsi avec cette configuration, le framework appelera le module module_article et sa methode "_list".


Lire un fichier

Utilisez la classe _file

  
$oFile
=new _file('/tmp/fichier.txt');
print 
$oFile->getContent();
    




Créer/écrire dans un fichier

Utilisez la classe _file

  
$oFile
=new _file('/tmp/fichier.txt');
$oFile->setContent('mon texte');
$oFile->save();
    




Créer un répertoire

Utilisez la classe _dir

  
$oDir
=new _dir('/tmp/repertoire');
print 
$oDir->save();
    




Lister les fichiers d'un répertoire

Utilisez la classe _dir

  
$oDir
=new _dir('/tmp/repertoire');
$tFile$oDir->getListFile();
    


note: cette méthode retourne la liste des fichiers sous forme d'objet _file ;)

  
foreach($tFile as $oFile){
   print $oFile->getAdresse();
}
    




Lister les sous-répertoires d'un répertoire

Utilisez la classe _dir

  
$oDir
=new _dir('/tmp/repertoire');
$tDir=$oDir->getListDir();
    


note: cette méthode retourne la liste des répertoires sous forme d'objet _dir ;)


Envoyer un email

Utilisez la classe plugin_mail

  
$sFromLibelle
='Moi';
$sEmailFrom='moi@email.com';

$sEmailDestinataire='destinataire@domaine.com';

$sSubject='Sujet de l email';
$sBody='Texte de l email';

$oPluginMail=new plugin_mail();

$oPluginMail->setFrom($sFromLibelle,$sEmailFrom);

$oPluginMail->addTo($sEmailDestinataire);

$oPluginMail->setSubject$sSubject );
$oPluginMail->setBodyHtml$sBody );


$oPluginMail->send();
    




JQuery, faire un lien innerHtml

Vous voulez mettre a jour un element html avec le rendu d'une page.
Avec le plugin plugin_jquery vous pouvez creer des fonctions utilisant jquery
Par exemple on peut avoir une liste d'article dont on veut afficher le detail
D'abord on créé la fonction ici showArticle qui prendra un argument

  
<?php
$oFunctionShow
=new plugin_jquery('showArticle',array('param_id'));
$oFunctionShow->addLinkUpdateElement$this->getLink('article::showajax',array('id'=> '$param_id')) ,'rendu') ;
$oFunctionShow->addModifyElement('rendu','show');
echo 
$oFunctionShow->getJs();
?>
   

Code genere

  
<script language="Javascript">
function 
showArticle(param_id){
$.
ajax({
url'index.php?:nav=article::showajax&id='+param_id+'',
success: function(response) {
// update status element
$('#rendu').html(response);
}
});
$(
'#rendu').show();}</script>
   

Ensuite on peut l'appeler facilement dans la liste d'article

  
<?php foreach($tArticle as $oArticle):?>
<a href="#" onclick="showArticle(<?php echo $oArticle->id?>)"><?php echo $oArticle->titre?></a>
<?php endforeach;?>
   

Sans oublier l'element html qui sera mis à jour

  
<div id="rendu"></div>
    



note: pour utiliser la librairie jQuery il vous faut inclure celle-ci dans votre layout
en ajoutant (en adaptant le numero de version)
Librairie a recuperer sur le site de jQuery http://docs.jquery.com/Downloading_jQuery#Current_Release
ou lier la derniere version stable

  
<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
   



JQuery, modifier un element html

Vous voulez modifier un element html via la librairie jQuery

  
<?php
$oFunctionShow
=new plugin_jquery('afficher');
$oFunctionShow->addModifyElement('rendu','show');
echo 
$oFunctionShow->getJs();
?>
   

Code généré

  
<script language="Javascript">function affiche(){
$(
'#rendu').show();}</script>
   


note: pour utiliser la librairie jQuery il vous faut inclure celle-ci dans votre layout
en ajoutant (en adaptant le numero de version)
Librairie a recuperer sur le site de jQuery http://docs.jquery.com/Downloading_jQuery#Current_Release
ou lier la derniere version stable

  
<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
   




JQuery, faire un appel ajax avec callback

Vous voulez faire un appel ajax et envoyer la réponse à une de vos fonction javascript

  
<?php
$oFunctionShow
=new plugin_jquery('showArticle',array('param_id'));
$oFunctionShow->addLinkCallFunction$this->getLink('article::showajax',array('id'=> '$param_id')) ,'interprete') ;
echo 
$oFunctionShow->getJs();
?>
   

Code genere

  
<script language="Javascript">function showArticle(param_id){
   $.ajax({
   url'index.php?:nav=article::showajax&id='+param_id+'',
   success: function(response) {
   // call function
   interprete(response);
   }
   });
}
</script>
   

N'oubliez pas d'écrire votre fonction "interprete" qui recevra en parametre le retour ajax.

note: pour utiliser la librairie jQuery il vous faut inclure celle-ci dans votre layout
en ajoutant (en adaptant le numero de version)
Librairie a recuperer sur le site de jQuery http://docs.jquery.com/Downloading_jQuery#Current_Release
ou lier la derniere version stable

  
<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
   



Utiliser la barre de debug

En mode "dev", la barre est chargée en bas de l'écran et permet d'afficher les variables $_GET, $_POST, $_SERVER, $_SESSION
Ainsi que les variables de configurations (+ profils de connexions )


Vous pouvez également utiliser l'espion dans votre code ainsi

  
plugin_debug
::addSpy('votre commentaire'$oMaVariable);
    


Vous verrez dans la barre un bouton "Spy variables" pour les afficher

Vous pouvez également utiliser des chronos dans votre code ainsi
Par exemple pour chronométrer le temps d'une requête

  
public function findAll(){
   plugin_debug::addChrono('debut requte A');
   $tArticle=$this->findMany('SELECT * FROM article');
   plugin_debug::addChrono('fin requete A');
   return $tArticle;
}
    


Vous verrez dans la barre un bouton "times" pour les afficher

Note: si le plugin n'est pas disponible sur votre projet
1. télécharger le plugin plugin_debug (page télécharger) dans ler répertoire plugin/ de votre application
2. ajouter dans votre fichier public/index.php en amont:

  
$iMicrotime
=microtime();
    


et en fin de fichier

  
if(_root::getConfigVar('site.mode')=='dev'){
   $oDebug=new plugin_debug($iMicrotime);
   echo $oDebug->display();
}
    




Créer des graphiques (HTML5)

Vous pouvez générer avec le plugin plugin_chart générer des graphiques en utilisant les canvas HTML5
Pour cela:
Coté module

  
public function _mapage(){
   //utiliser le layout "html5" plutot que "template1"
   $oLayout=new _layout('html5');

   //créer votre vue
   $oView=new _view('votreModule::votreVue'):
    



Histo

  
   
//--------------------------------
   //--------histo
   $oChartHisto=new plugin_chart('HISTO',400,200);
       $oChartHisto->setTextSizeLegend('12px arial');
       $oChartHisto->setData($tData);

       $oChartHisto->setMarginLeft(20);

       $oChartHisto->setStepY(10);
       $oChartHisto->setGridY(10,'#444');
      
       
//coordonnees de la legende
       $oChartHisto->setCoordLegend(220,10);

     $oView->oChartHisto=$oChartHisto;
    



Coté vue

  
<?php echo $this->oChartHisto->show()?>
   




Camembert

  
   
//--------------------------------
   //--------pie
   $tData=array(
       array( 'bois' 120),
       array( 'fer' 15),
       array( 'or' 65),
   );
  
   $oChartPie
=new plugin_chart('PIE',400,200);
   $oChartPie->setTextSizeLegend('12px arial');
   $oChartPie->setData($tData);
  
   
//coordonnees de la legende
   $oChartPie->setCoordLegend(220,10);
  
   $oView
->oChartPie=$oChartPie;
    




  
<?php echo $this->oChartPie->show()?>
   




Lines

  
   
//--------------------------------
   //--------lines
   $oChartLine=new plugin_chart('LINES',400,200);
   $oChartLine->setTextSizeLegend('12px arial');
   $oChartLine->setMarginLeft(20);
   $oChartLine->setPaddingX(1);
   $oChartLine->setPaddingY(20);
  
   
//coordonnees de la legende
   $oChartLine->setCoordLegend(220,10);
  
   $oChartLine
->setStepX(2);
   $oChartLine->setStepY(20);
  
   
//$oChartLine->addMarkerY(100,'#444');
   $oChartLine->setGridY(20,'#444');
   $oChartLine->addGroup('or','green');
       $oChartLine->addPoint(2009,100);
       $oChartLine->addPoint(2011,110);
       $oChartLine->addPoint(2014,170);
      
      
   $oChartLine
->addGroup('bois','blue');
       $oChartLine->addPoint(2010,80);
       $oChartLine->addPoint(2011,20);
       $oChartLine->addPoint(2013,170);
  
   $oView
->oChartLine=$oChartLine;
    




  
<?php echo $this->oChartLine->show()?>
   





Histogramme

     
   
//--------------------------------
   //--------bar
   $oChartBar=new plugin_chart('BAR',400,200);
   $oChartBar->setTextSizeLegend('12px arial');
   $oChartBar->setMarginLeft(20);
   $oChartBar->setPaddingX(1);
   $oChartBar->setPaddingY(20);
  
   
//coordonnees de la legende
   $oChartBar->setCoordLegend(220,10);
  
   $oChartBar
->setStepX(2);
   $oChartBar->setStepY(20);
  
   
//$oChartLine->addMarkerY(100,'#444');
   $oChartBar->setGridY(20,'#444');
   $oChartBar->addGroup('or','green');
       $oChartBar->addPoint(2010,100);
       $oChartBar->addPoint(2012,110);
       $oChartBar->addPoint(2014,90);
       $oChartBar->addPoint(2016,170);
      
   $oChartBar
->addGroup('bois','blue');
       $oChartBar->addPoint(2010,90);
       $oChartBar->addPoint(2012,120);
       $oChartBar->addPoint(2014,80);
       $oChartBar->addPoint(2016,170);
      
   $oChartBar
->addGroup('fer','red');
       $oChartBar->addPoint(2010,110);
       $oChartBar->addPoint(2012,120);
       $oChartBar->addPoint(2014,70);
       $oChartBar->addPoint(2016,150);
  
   
//affichage de la page
   $oLayout->show();
}
    




  
<?php echo $this->oChartBar->show()?>
   





Manipuler des dates

Un plugin est à votre disposition pour manipuler des dates
Création de la date d'aujourd'hui

  
$oDate
=new plugin_datedate('Y-m-d'));
print 
$oDate->toString('d/m/Y');
    


Création d'un objet date par rapport à une date fournie

  
$oDate
=new plugin_date('2013-12-25','Y-m-d');
print 
$oDate->toString('d/m/Y');
    


note: les formats pris en charge en entrée sont : Y-m-d, d-m-Y, d/m/Y, Y/m/d, m-d-Y, y-m-d

Ajouter une journée, mois ou année

  
$oDate
=new plugin_date('2013-01-01','Y-m-d');
//ajout d'un jour
$oDate->addDay(1);
print 
$oDate->toString('d/m/Y');

//ajout d'un mois
$oDate->addMonth(1);
print 
$oDate->toString('d/m/Y');

//ajout d'une année
$oDate->addYer(1);
print 
$oDate->toString('d/m/Y');
    


Note: la méthode toString utlise la fonction date() de php pour afficher celle-ci, plus d'informations sur les paramètres autorisés: https://php.net/manual/fr/function.date.php



Utiliser le plugin plugin_form

Editer un formulaire

Un nouveau plugin permet de simplifier la création d'un formulaire
Lorsque vous faites un formulaire d'édition d'article par exemple
Coté module

  
public function _edit(){

   $tMessage=$this->processSave();
  
   $oArticle
=model_Article::getInstance()->findById(_root::getParam('id'));
  
   $tAuteur
=model_Auteur::getInstance()->getSelect();
  
   $oView
=new _view('article::edit');
   $oView->oArticle=$oArticle;
   $oView->tAuteur=$tAuteur;
  
   $oPluginXsrf
=new plugin_xsrf();
   $oView->token=$oPluginXsrf->getToken();

   $this->oLayout->add('main',$oView);
}
    



Coté vue

  
<?php
$oForm
=new plugin_form($this->oArticle);
$oForm->setMessage($this->tMessage);
?>

<table>
   <tr>
       <th>Titre</th>
       <td><?php echo $oForm->getInputText('titre');?></td>
   </tr>
  
   <tr>
       <th>Resume</th>
       <td><?php echo $oForm->getInputText('resume');?></td>
   </tr>
  
   <tr>
       <th>Auteur</th>
       <td><?php echo $oForm->getSelect('auteur_id',$this->tAuteur);?></td>
   </tr>
  
</table>

<?php echo $oForm->getToken('token',$this->token);?>

<p><input type="submit" value="Valider"/></p>
   

Plus d'informations ici: documentation doxygen

Définir une valeur par défaut


  
public function _new(){

   $tMessage=$this->processSave();
  
   $oArticle
=new row_Article();
   //on definit un titre par defaut
   $oArticle->titre='titre par defaut';
   //foonctionne aussi pour les menus deroulant
   $oArticle->auteur_id=2;
  
   $tAuteur
=model_Auteur::getInstance()->getSelect();
  
   $oView
=new _view('article::edit');
   $oView->oArticle=$oArticle;
   $oView->tAuteur=$tAuteur;
  
   $oPluginXsrf
=new plugin_xsrf();
   $oView->token=$oPluginXsrf->getToken();

   $this->oLayout->add('main',$oView);
}
    



Coté vue

  
<?php
$oForm
=new plugin_form($this->oArticle);
$oForm->setMessage($this->tMessage);
?>

<table>
   <tr>
       <th>Titre</th>
       <td><?php echo $oForm->getInputText('titre');?></td>
   </tr>
  
   <tr>
       <th>Resume</th>
       <td><?php echo $oForm->getInputText('resume');?></td>
   </tr>
  
   <tr>
       <th>Auteur</th>
       <td><?php echo $oForm->getSelect('auteur_id',$this->tAuteur);?></td>
   </tr>
  
</table>

<?php echo $oForm->getToken('token',$this->token);?>

<p><input type="submit" value="Valider"/></p>
   

Plus d'informations ici: documentation doxygen


Comment créér un webservice

Un nouveau plugin permet de générer le wsdl pour votre webservice
Tout d'abord, crééer un fichier à la racine du répertoire public/ par exemple webservice.php
Avec le code suivant:

  
<?php
$_GET
[':nav']='webservice::index';
include(
'index.php');
    


Créer ensuite un module "webservice": créer un repertoire module/webservice/
Un fichier main.php
Ci dessous l'exemple du code utilisé pour le projet mkdraw
Le webservice ici permet à distance de mettre à jour un schéma.

  
<?php
class module_webservice extends abstract_module{
  
   
public function _index(){
       ini_set("soap.wsdl_cache_enabled","0");

       //creation du plugin wsdl
       $oPluginWsdl=new plugin_wsdl;
       //on indique le nom du webservice
       $oPluginWsdl->setName('mkdraw');
       //on indique l'url du webservice
       $oPluginWsdl->setUrl('http://localhost/mkframework/data/genere/mkdraw/public/webservice.php');
       //on indique chaque methode disponible
       $oPluginWsdl->addFunction('setContent');
           //ainsi que ses parametres
           $oPluginWsdl->addParameter('id','int');
           $oPluginWsdl->addParameter('tObject','string');
           $oPluginWsdl->addParameter('tMenuLayerObject','string');
           //et ses eventuels retours
           $oPluginWsdl->addReturn('return','string');
           $oPluginWsdl->addReturn('ok','int');
          
      
       
if(isset($_GET['WSDL'])) {
           //si le wsdl est demande, on l'affiche
           $oPluginWsdl->show();
          
       
}else {
          
           
//sinon on cree le webservice
           $oServer = new SoapServer'http://localhost/mkframework/data/genere/mkdraw/public/webservice.php?WSDL', array('cache_wsdl' => WSDL_CACHE_NONE));
           //on defini la classe a utiliser comme webservice (methode publiques)               
           $oServer->setClass('webservice');
           $oServer->handle();
          
       
}
       exit;
   }
}
class 
webservice{
   public function setContent($id,$tObject,$tMenuLayerObject){
      
       $oSchema
=model_schema::getInstance()->findById($id);
       $oSchema->tObject=$tObject;
       $oSchema->tMenuLayerObject=$tMenuLayerObject;
       $oSchema->save();
      
       
return array('return'=>'test','ok'=>1);
      
   
}
}
    





Comment exporter un objet en xml

Pour afficher un enregistrement en xml:

  
public function _showXml(){
      
   $oAuteur
=model_auteur::getInstance()->findById(_root::getParam('id'));
  
   $oXml
=new plugin_xmlObject($oAuteur);
   $oXml->setListColumn(array('id','nom','prenom'));
   $oXml->show();
}

    


Et pour enregistrer dans un fichier, utilisez la méthode build() plutot que show():

  
public function _saveXml(){
   $id=_root::getParam('id');

   $oAuteur=model_auteur::getInstance()->findById($id);
  
   $oXml
=new plugin_xmlObject($oAuteur);
   $oXml->setListColumn(array('id','nom','prenom'));
   $sXml=$oXml->build();
  
   $oFile
=new _file('../data/auteur_'.$id.'.xml');
   $oFile->setContent($sXml);
   $oFile->save();
}
    





Comment exporter une liste/tableau d'objet en xml

Pour afficher une liste/tableau d'objet en xml:

  
public function _listXml(){
  
   $tAuteur
=model_auteur::getInstance()->findAll();
  
   $oXml
=new plugin_xmlListObject($tAuteur);
   $oXml->setListColumn(array('id','nom','prenom'));
   $oXml->show();
}
    


Et pour enregistrer dans un fichier, utilisez la méthode build() plutot que show():

  
public function _saveXml(){
   $tAuteur=model_auteur::getInstance()->findAll();
  
   $oXml
=new plugin_xmlListObject($tAuteur);
   $oXml->setListColumn(array('id','nom','prenom'));
   $sXml=$oXml->build();
  
   $oFile
=new _file('../data/auteurs.xml');
   $oFile->setContent($sXml);
   $oFile->save();
}
    




Automatiser un retraitement sur des enregistrements

Il arrive certaines fois que l'on souhaite reformater une date à la récupération et/ou à l'enregistrement
Par exemple si l'on change le format d'affichage de la date en fonction de la langue ou si l'on utilise un datePicker.

Pour cela, il faut pour modifier les enregistrements lus:
Dans la class row_** de votre table, par exemple ici row_article

  
class row_article extends abstract_row{
  
   
protected $sClassModel='model_article';
   (...)
  
   
//on surcharge le constructeur
   public function __construct($tRow){

       //on modifie le champ date avant d'initialiser l'objet
       $oDate = new plugin_date($tRow['date'],'d/m/Y');
       $tRow['date'] = $oDate->toString('Y-m-d');

       //on appel le constructeur normal de la row
       parent::__construct($tRow);
      
      
   
}
    



Et pour modifier à la sauvegarde en base de données:

  
class row_article extends abstract_row{
  
   
protected $sClassModel='model_article';
   (...)
  
  
   
public function save(){
       if(!$this->isValid()){
           return false;
       }
      
       
//on formate à la volée
       $oDate = new plugin_date($this->date,'d/m/Y');
       $this->date $oDate->toString('Y-m-d');
      
      
       parent
::save();
       return true;
   }
    






Créer un modèle virtuel

Imaginons que l'on ai un ou N fichiers physiques (csv,xml..) et que l'on souhaite permettre d'avoir des tableaux ou autre les affichant.
On peut désormais utiliser cette classe abstraite "abstract_modelVirtual"


  
class model_virtualProducts extends abstract_modelVirtual{
  
   
//cache actif oui/non
   protected $bCacheEnabled=true;
   //id du cache genere
protected $sCacheId='virtualProducts';
   //duree de vie du cache (en minute)
protected $iCacheLifetime=2;
  
   
public static function getInstance(){
       return self::_getInstance(__CLASS__);
   }
  
   
public function __construct(){

       //definition des colonnes
       $this->setColumns(array(
           'Category',
           'Name',
           'Price'
          
       
));
      
       
//laisser tel quel pour gerer le cache
       if(!$this->isCached()){
$this->load();
$this->storeCache();
}
   }
   public function load(){

       //algo pour remplir la base virtuelle
       $oXml=simplexml_load_file(_root::getConfigVar('path.data').'xml/products.xml');
       foreach($oXml->children() as $oXmlChild){
          
           $obj
=new stdClass();
          
           $obj
->Category=(string)$oXmlChild['label'];
          
           
foreach($oXmlChild->children() as $oXmlChild2){
              
               $obj
->Name=(string)$oXmlChild2->name;
               $obj->Price=(string)$oXmlChild2->price;
              
               $this
->addObject($obj);
           }
          
       
}
      
      
   
}
  
   
public function findAll(){
       //note pour les requetes SQL pas besoin de definir une table, mais le mot cle "from" reste necessaire
       return $this->findMany('SELECT * FROM virtual ');
   }
   public function findAllSortBy($sField,$sSide){
       return $this->findMany('SELECT * FROM virtual ORDER BY '.$sField.' '.$sSide);
   }
  
}
    





Faire un appel API REST

Vous pouvez appeler une API Rest via le plugin plugin_restClient

Par exemple pour flattr:

  
$oRest
=new plugin_restClient('https://api.flattr.com/rest/v2',443);
$oRest->useHttpGet();
$oRest->useUrl();
$oRest->useJsonResponse();

if(
$oRest->send()){
   print "ok \n";
   var_dump($oRest->getResponse() );
}else{
   print "nok \n";
   var_dump($oRest->getResponse() );   
}