Présentation
1.Un framework, késako ?
C'est avant tout un environnement de travail :
Il comprend :
- une librairie bien fournie pour vous économiser du code et du temps
- une structure de développement déjà établie
- une construction flexible, évolutive et réutilisable (modules,plugins)
- un générateur "le builder" pour vous générer vos projets, leur classes modèles, CRUD...
2.Un framework pourquoi faire ?
La première réponse est : pour vous faciliter la vie bien sûr :)
- en mettant à votre disposition une librairie pour améliorer votre confort de programmation
- en améliorant votre rapidité de développement : (vous ne codez plus de zéro, économie de code grâce aux librairies et au builder)
- en cadrant et homogénéisant votre travail (structure oblige)
- en organisant votre application: chaque type de fichier à sa place
- vous simplifier la sécurisation de votre application
- vous permettre facilement de rendre une partie privée, avec si besoin une gestion de droits
3.C'est bien beau et la prise en main ?
Pour utiliser d'autres frameworks, j'ai voulu viser la facilité de prise en main
Pour cela :
- Une structure de framework légère et claire
- Une documentation vous présentant l'ensemble des objets et leurs fonctions
- Des illustrations pour vous faciliter la compréhension
- Des tutoriaux pour vous faciliter l'apprentissage
- Une rubrique commentKonFait pour répondre aux questions que vous vous posez
- Un générateur de code en mode web : le builder
- Une application vierge créée par le "builder" contient déjà un lot de pages d'exemple facilitant l'apprentissage (on ne part pas de zéro)
4.Un générateur de code en mode web ?
Je vous ai développé un petit "builder", le MkFrameworkBuilder (clin d'oeil au commandeEnLigneOphobe)
Si vous ne souhaitez pas apprendre à utilser un générateur en ligne de commande, il est fait pour vous:
Il vous permettra en quelques clics :
- de créer un environnement vierge (avec ou sans quelque pages d'exemple)
- De générer la couche modèle de votre application (les classes nécessaires au dialogue avec vos sources de données)
- De générer le CRUD pour vos tables (Une page de liste, une page d'edition, d'affichage et de suppression d'un élément dans votre source de donnée)
- De générer un/des module(s) avec sa/ses action(s)
Et tout ça, je le répète en deux trois clic, pas de ligne de commande à saisir ;)
Les dernières news
2013/05/18 Nouvelle fonctionnalité pour le builder
Celui-ci permet désormais de générer des modules intégrablesComme vous pouviez déjà le faire pour les modules, désormais vous pouvez, via un formulaire équivalent générer des modules intégrables.
2013/05/17 Une nouvelle rubrique de tutoriaux vidéos
Puisque qu'une vidéo vaut parfois mieux qu'un long discours: une nouvelle rubrique fait son apparition.Celle-ci contiendra des tutoriaux vidéos, pour information, elles sont muettes: elles utilisent des annotations dans youtube.
Cette rubrique va s'enrichir au fur et à mesure, n'hesitez pas à vous rendre à cette adresse pour demander des tutoriaux ;)
L'adresse du forum: http://www.developpez.net/forums/d1343958/mkframework/demande-tutoriaux-videos/
2013/05/16 Builder: Suppression du .htaccess à la création d'un projet
Desormais le builder créera un projet sans .htaccess, celui-ci créait des problèmes lors de la première installation du frameworkDe plus, dans la documentation il sera expliqué comment renseigner son virtualhost ou créer son .htaccess :)
2013/05/15 Nettoyage du code inutile pour l'utilisateur
J'en ai profité pour supprimer le repertoire test ainsi que le script de tests unitaires1. Il n'a aucune utilité pour l'utilisateur final
2. A chaque amelioration, ajout de tests unitaires, ca incrementait le numero de version du svn "pour rien"
Idem pour le script/répertoire de génération de documentation
Le .htaccess a également été déplacé de la racine vers le repertoire public qui doit être votre "web root" ;)
2013/05/14 Optimisation/nettoyage (suite) toujours suite à l'audit de Sonar
Toujours dans l'optique d'améliorer la note Sonar (Pour information, Sonar Way:93,2% et Zend profile:97,7% )J'en ai profité pour alléger la classe _view de la gestion de template personnel non utilisée.
2013/05/09 Optimisation/nettoyage suite à l'audit de Sonar
Sonar est un outil d'audit de code qui permet aussi bien de d'optimiser son code en levant des alertes sur les méthodes jugées trop "complexe" que d'améliorer la qualité de celui-ci en vérifiant des codes de bonnes pratiques.Ces rapports vont de l'alerte de complexité d'une méthode, à la longueur maximum d'une ligne en passant par la découverte de variables non utilisées...
Suite à cet audit, j'ai procédé à quelques corrections permettant d'atteindre la note de 89,6% selon le profil "Zend"
Pour ceux qui souhaiteraient découvrir plus en détail Sonar, je vous conseille cet article
note: à partir de cette version je mets à disposition dans la page téléchargement la version actuelle et la dernière version.
2013/05/03 Correction / amélioration du builder
Correction lors de la génération de CRUD/CRUD intégrable de la partie "upload" qui essayait d'uploader dans data/upload (à la place de ../data/upload), desormais, il utilise la variable de configuration path.uploadNettoyage du code généré de CRUD / CRUD intégrable: suppression de codes inutilies remontés par des utilisateurs.
2013/05/02 Amélioration du plugin de validation
On peut désormais indiquer des messages personnalisés lors des vérifications. Lors des nouvelles générations de couche modèle, vos fichiers de couche modèle inclueront en commentaire un exemple d'utilisation de getCheck().CODE
/*exemple test validation*/
private function getCheck(){
$oPluginValid=new plugin_valid($this->getTab());
/* renseigner vos check ici
$oPluginValid->isEqual('champ','valeurB','Le champ n\est pas égal à '.$valeurB);
$oPluginValid->isNotEqual('champ','valeurB','Le champ est égal à '.$valeurB);
$oPluginValid->isUpperThan('champ','valeurB','Le champ n\est pas supé à '.$valeurB);
$oPluginValid->isUpperOrEqualThan('champ','valeurB','Le champ n\est pas supé ou égal à '.$valeurB);
$oPluginValid->isLowerThan('champ','valeurB','Le champ n\est pas inférieur à '.$valeurB);
$oPluginValid->isLowerOrEqualThan('champ','valeurB','Le champ n\est pas inférieur ou égal à '.$valeurB);
$oPluginValid->isEmpty('champ','Le champ n\'est pas vide');
$oPluginValid->isNotEmpty('champ','Le champ ne doit pas être vide');
$oPluginValid->isEmailValid('champ','L\email est invalide');
$oPluginValid->matchExpression('champ','/[0-9]/','Le champ n\'est pas au bon format');
$oPluginValid->notMatchExpression('champ','/[a-zA-Z]/','Le champ ne doit pas être a ce format');
*/
return $oPluginValid;
}
2013/04/30 Ajout d'un tutorial pour utiliser des classes ZendFramework 2
Un nouveau tutorial pour permettre d'utiliser des classes de ZendFramework 2Utiliser des classes de ZendFramework 2
2013/04/25 Amélioration de deux plugins plugin_html et plugin_mail
Le plugin_html gagne une methode getSelectMultiple() qui permet comme son nom l'indique de générer un menu déroulant multiple (multiple sélection)Quant au plugin_mail il gagne une methode setBCC() qui permet de saisir un email à mettre en copie cachée.
2013/04/24 Amélioration de l'ORM et du builder
Concernant l'ORM, vous pouvez choisir de passer les parametres soit les uns apres les autres, soit via un tableauExple:
CODE
$this->findMany('SELECT * FROM article WHERE etat=? AND auteur_id=?',$etat_actif,$auteur_id);
CODE
$this->findMany('SELECT * FROM article WHERE etat=? AND auteur_id=?',array($etat_actif,$auteur_id) );
Pour le builder:
1. Désormais lorsque vous créez un projet, celui-ci a son titre renseigné avec le nom du projet
2. Lorsque vous générez un module CRUD intégrable, en commentaire de son fichier main.php vous avez les instructions pour l'intégrer au sein d'un autre module
2013/04/23 Amélioration de l'ORM + correction du CRUD et CRUD integrable
Concernant l'ORM deux modifications:1. lorsque l'on enregistre un nouvel enregistrement, l'objet passe en mode update permettant ainsi ce type d'écriture:
CODE
$oAuteur=new row_auteur;
$oAuteur->nom='Hugo';
$oAuteur->prenom='Victor';
$oAuteur->save(); //ici l'ORM va inserer la ligne auteur
//du code ici par exemple pour recuperer un ID externe
$oAuteur->idExterne=42;
$oAuteur->save(); //ici l'ORM va faire un update de l'auteur inséré
2. Le builder créé une nouvelle méhode "save()" qui enrichie la methode d'enregistrement du même nom en verifiant la cohérence des données (via l'appel à la methode isValid())
Le CRUD et CRUD intégrable généré par le builder prennent en compte la modification précédente de l'ORM, et permettent désormais l'ecrasement d'une valeur par une valeur vide.
Auparavant, si vous editiez un enregistrement et vidiez le contenu d'un champ, celui-ci n'etait pas modifié, c'est désormais corrigé.
2013/04/21 Modification des sources du builder
Une modification a été apportée aux fichiers utilisés par le builder pour générer des modules CRUD intégrables.Il y a également un nouveau tutorial concernant l'intégration de ces modules intégrables.
2013/04/14 Correction des fichiers sources pour les modules intégrables
Une correction aux fichiers sources utilisés pour générer un module intégrable.2013/04/14 Correction de l'affichage des erreurs
Dans le processus de développement de site, à un moment, on passe du dev/test à la livraison en production.Et à ce moment la, on veut livrer une application plus sécurisé: et un éléments de cette sécurité est de ne surtout pas afficher les erreurs, pour cela, il vous suffit de modifier le fichier conf/mode.ini.php
Modifier la variable "mode"
CODE
[site]
mode=dev
On passe d'un affichage total (en mode dev)
CODE
error_reporting(E_ALL);
CODE
error_reporting(0);
2013/04/07 Amelioration de la sécurité du plugin xsrf
Désormais vous pouvez renforcer la sécurité de votre plugin xsrf en activant l'unicité du jeton.Celui-ci est enregistré en session à sa création, ainsi, un même jeton ne peut être utilisé qu'une seule fois.
Pour activer cette sécurité supplémentaire, une nouvelle variable "xsrf.session.enabled" fait son apparition dans le fichier con/site.ini.php
CODE
[security]
;XSRF ou CSRF,bSecuriteXSRF utilisation de jeton dans le CRUD, plus d'infos: http://fr.wikipedia.org/wiki/Cross-Site_Request_Forgeries
;XSS, bSecuriteXSS protection des variables GET,POST... via getParam( , plus d'infos http://fr.wikipedia.org/wiki/XSS
xsrf.enabled=1
xsrf.timeout.lifetime=(60*3)
xss.enabled=1
xsrf.session.enabled=1
2013/03/26 Correction du plugin ACL: ajout d'une securisation
Ajout d'une methode de purge dans l'objet ACL (_root::getACL) pour purger les permissions avant de les remplir de nouveau.Lors du processus de gestion d'ACL
CODE
$sLogin=_root::getParam('login');
$sPass=sha1(_root::getParam('password'));
$oModelAccount=new model_account;
$tAccount=$oModelAccount->getListAccount();
if(_root::getAuth()->checkLoginPass($tAccount,$sLogin,$sPass)){
$oAccount=_root::getAuth()->getAccount();
$tPermission=model_permission::getInstance()->findByGroup($oAccount->groupe);
//on purge les permissions en session
_root::getACL()->purge();
//boucle sur les permissions
if($tPermission)
foreach($tPermission as $oPermission){
if($oPermission->allowdeny=='ALLOW'){
_root::getACL()->allow($oPermission->action,$oPermission->element);
}else{
_root::getACL()->deny($oPermission->action,$oPermission->element);
}
}
_root::redirect('prive::list');
}
note: ajout d'un tutorial pour gere les ACL ici: Gérer les permissions
2013/03/24 Amélioration des modules CRUD* intégrables
Une nouvelle classe abstraite fait son apparition et permet de simplifier la creation de modules intégrables.Désormais le code d'un module CRUD intégrable:
CODE
<?php
class module_examplemodule extends abstract_moduleembedded{
public static $sModuleName='examplemodule';
public static $sRootModule;
public static $tRootParams;
public function __construct(){
self::setRootLink(_root::getParamNav(),null);
}
public static function setRootLink($sRootModule,$tRootParams=null){
self::$sRootModule=$sRootModule;
self::$tRootParams=$tRootParams;
}
public static function getLink($sAction,$tParam=null){
return parent::_getLink(self::$sRootModule,self::$tRootParams,self::$sModuleName,$sAction,$tParam);
}
public static function getParam($sVar,$uDefault=null){
return parent::_getParam(self::$sModuleName,$sVar,$uDefault);
}
public static function redirect($sModuleAction,$tModuleParam=null){
return parent::_redirect(self::$sRootModule,self::$tRootParams,self::$sModuleName,$sModuleAction,$tModuleParam);
}
(...)
Ensuite pour simplifier le code, les methodes getLink, getParam et redirect sont redéfinis afin de prendre en compte le nom de votre module ainsi que le contexte de la page pour éviter les risques de colisions
Ainsi vous pouvez avoir deux module CRUD ou plus au sein de la même page sans que la soumission d'un formulaire n'impacte l'autre.
*CRUD: Create Read Update Delete (une page de listage, une de modification, d'ajout, de visualisation et une dernière de suppression)
2013/03/21 Correction du builder
Une correction dans le builder des sources utilisées pour generer un projet sans exemple, il y avait une erreur sur les chemins css/jsUne seconde correction concernant les liens vers les pages de CRUD et module après génération
Enfin j'en ai profité pour modifier les noms des profil de connexion par defaut: j'ai ajouté "Exple" pour bien indiquer que ce ne sont que des noms de profils (et non le sgbd utilisé) ;)
Par exemple ici
CODE
pdoMysqlExple.dsn="mysql:dbname=blog;host=localhost"
pdoMysqlExple.sgbd=pdo_mysql
pdoMysqlExple.hostname=localhost
pdoMysqlExple.database=blog
pdoMysqlExple.username=root
pdoMysqlExple.password=pass
Ainsi on peut avoir deux connexions sur deux serveurs mysql différents, il suffit de creer deux profil différents
Par exemple:
CODE
pdoMysqlExple.dsn="mysql:dbname=blog;host=localhost"
pdoMysqlExple.sgbd=pdo_mysql
pdoMysqlExple.hostname=localhost
pdoMysqlExple.database=blog
pdoMysqlExple.username=root
pdoMysqlExple.password=pass
pdoMysqlExple2.dsn="mysql:dbname=autreBase;host=autreServeur"
pdoMysqlExple2.sgbd=pdo_mysql
pdoMysqlExple2.hostname=autreServeur
pdoMysqlExple2.database=autreBase
pdoMysqlExple2.username=autreUser
pdoMysqlExple2.password=pass
2013/02/11 Correction du framework pour prendre en compte une recommandation de sécurisation
Une recommandation de sécurité consiste à avoir une "web root public", cela consiste a n'avoir de visible sur le web que notre index.php et les repertoires accessibles au client: css et js.Pour permettre ce changement d'arborescence, des corrections de chemins ont été faites pour que l'ensemble des chemins soient bien définit à partir du fichier de configuration.
Désormais, les nouveaux projets générés auront cette nouvelle arborescence.
note: les modifications ont été appliqués avec un soucis de non regression: vous pouvez donc mettre à jour votre framework en conservant votre arborescence actuelle.
Si vous souhaitez faire bénéficier de cette recommandation votre projet actuel il vous faut:
1. deplacer votre repertoire site/layout à la racine
2. renommer le repertoire "site" en "public"
3. deplacer le fichier index.php dans le repertoire "public"
4. modifier vos layouts pour supprimer "site/"
5. modifier dans public/index.php les chemins des fichiers de configuration (préfixer de ../)
6. modifier dans conf/site.ini.php dans la section [path]
2013/02/09 Correction d'un message d'erreur et ajout documentation
Une correction de l'intitulé d'un message d'erreur qui indiquait d'utiliser le fichier conf/navigation.php à la place de conf/site.ini.phpIl a été également ajouté des exemples dans la page de tutoriaux
2013/01/02 ORM: ajout de la recuperation du last insert id
Bonne année 2013, l'orm permet desormais, naturellement de recuperer le dernier id inséréL'id du nouvel objet ajouté est simplement mis à jour.
CODE
$oArticle = new row_Article;
$oArticle->title='Titre article';
$oArticle->save();
//redirection vers la page d'affichage du nouvel article
_root::redirect('article::show',array('id'=> $oArticle->id));
2012/12/18 Ajout d'une fonctionnalité sur le builder
Le builder permet desormais de generer des modules CRUD facilement intégrable.Vous avez désormais le choix entre generer un module CRUD autonome ou un module CRUD a intégrer dans un autre module.
2012/11/24 Correction d'un bug sur la classe syntax d'oracle, et amelioration du builder
Correction de la classe de syntaxe oracle par un membre de developpez.com: gdelest.Amélioration de la methode CRUD du builder, il utilise desormais tout le temps le nom de la table pour creer ses variables oMatable, tMatable et non le nom du module.
Par exemple: si vous créer un CRUD pour la table Utilisateur que vous nommer "profil", ilc créera bien un module profil, avec son repertoire, son controlleur... mais nommera les variables $oUtilisteur et $tUtilisateur et non $oProfil et $tProfil.
PS: merci à gdelest d'avoir soumis cette correction.
2012/11/14 Correction d'un bug sur plugin_i18n
Juste une correction d'un bug sur le plugin plugin_i18n qui permet de faire un site multilingue.2012/11/05 Assouplissement de l'authentification
Le module d'authentification dans son ensemble est désormais publique, par exemple si vous avez configuréCODE
[auth]
module=auth::login
Mais si vous tentez d'accéder à une page protégée, vous serez toujours redirigé sur l'action "login" du module "auth" ;)
2012/11/04 Correction du fichier de configuration par défaut d'un projet vide
Lors de la dernière mise à jour j'ai ajouté des paramètres dans le fichier de configuration et j'ai dupliqué celui-ci dans l'arborescence du projet vide (utilisé par le builder pour générer un projet sans exemples)Mais les projets avec et sans exemple ont une différence sur ce fichier: le module de navigation par défaut ("article" pour un projet avec exemples et "default" pour un projet vide), c'est corrigé.
2012/11/02 Amélioration de la configuration du cookie de session, correction de la gestion du temps d'inactivité
On peut facilement configurer le temps du cookie, son chemin, ainsi que son domaine dans le fichier de config conf/connexion.ini.phpOn a désormais:
CODE
[auth]
session.cookie_httponly=1
session.cookie_secure=1
(...)
session.cookie_domain=
session.cookie_path=/
session.cookie_lifetime=
Ce qui donne:
CODE
session_set_cookie_params(session.cookie_lifetime,session.cookie_path,session.cookie_domain,session.cookie_secure,session.cookie_httponly)
2012/10/30 Correction du bug #1563 soumis via developpez.com
Il manquait la methode delete sur le driver mysql.Note: je préconise l'utilisation du driver pdo qui est plus sécurisé contre les injections sql grâce à ces "prepare statements"
Référence du bug: http://projets.developpez.com/issues/1563
2012/10/27 Correction bug sur set cookie (pour la session)
L'appel à la fonction session_set_cookie_params ne prenait pas en compte les parametres du fichier de config ini.Ajout d'une sécurisation supplémentaire: on regénère le session id lors de la connexion/déconnexion.
Amélioration du builder, correction de la page de génération d'un index xml.
note: on vérifie qu'on est bien en https avant d'activer le mode secure du cookie de session.
2012/10/26 Correction bug sur plugin plugin_datetime
Correction pour la methode toString(): ajout d'une methode getMktime prenant en compte les heures,minutes et secondes.2012/10/24 Refonte des plugin plugin_date,plugin_datetime et correction du plugin plugin_html
Les plugins plugin_date et plugin_datetime ont été réécrit en partie pour prendre au maximum appuie sur les fonctions mktime et date de php.Les fonctions en français ont été supprimées au profit de leur version anglaises, on utilise la methode toString() pour retourner la date en utilisant les formats de la fonction date()
la documentation de la fonction date pour connaitre les parametres de la fonction toString()
La documentation de ces deux classes sera mise à jour rapidement.
Le plugin plugin_html a été corrigé: sa methode getSelect() utilise le tableau tOption passé en dernier paramètre, permettant notamment d'indiquer un "onChange".
2012/10/22 Améliorations du builder
1. Lors de la création du CRUD, si l'on choisit pour un champ le type "upload", il verifiera au moment de l'update la taille du fichier uploadé (pour éviter d'ecraser l'information dans le cas d'une édition)2. Lors de la génération de la couche modèle, il y a désormais un bouton pour selectionner/deselectionner toutes les tables proposées (pratique lorsqu'il y a beaucoup de tables).
2012/10/17 Correction d'un bug sur le builder
Une correction a été appliquée sur le modèle de methode getSelect généré par le builder.Un seconde correction du builder: il manquait l'interface sqlite de création.
2012/10/09 Correction d'un bug sur plugin_date et plugin_datetime
Une correction a été appliquée sur la méthode getMonth() de ces classes.2012/10/07 Ajout d'une fonctionnalité dans le builder
On peut desormais créer une base sqlite via l'interface du builder. C'est un formulaire simplifié qui permet de definir des champs integer,varchar et texte (en plus d'une clé primaire)2012/10/07 Correction d'un bug sur le builder
Suite à la publication de l'article, j'ai eu un retour d'un utilisateur qui m'a trouvé un bug que je me suis empressé de corriger.Merci kyrilkarlier :)
2012/10/04 Publication d'un article sur developpez.com
Un article de présentation du framework vient d'être publié sur le site developpez.com à l'adresse :http://php.developpez.com/index/redirect/14907/Presentation-du-mkframework-par-Imikado/
Bonne lecture,
2012/09/23 Ajout de documentations concernant l'url rewriting, le virtualhost et l'utilisation de classes du ZendFramework 1
L'url rewriting est désormais documenté dans la FAQ, (vous verrez qu'il est en effet simple de l'activer et l'utiliser) ainsi que le paramétrage du virtualhost.Enfin un tutorial permettant d'utiliser facilement des classes sur ZendFramework 1 a été ajouté dans la rubrique "tutoriaux".
2012/09/11 Amelioration de la classe _root, et _file
La classe racine, colonne vertebrale du framework a été optimisée, elle gagne la possibilité de créer un cache pour charger les classes (fonctions autoload): en ajoutant à vos projets dans le fichier conf/site.ini.php, dans la section cache[cache]
autoload.enabled=0
en passant cette variable à 1, un fichier autoload.php est créé dans votre repertoire de cache.
Celui-ci contient un tableau associatif contenant pour chaque classe son fichier php accélérant le chargement des classes.
note: cette fonctionnalité accélère le chargement des classes, mais il ne faut le passer à 1 qu'au moment de la mise en production, car sinon, le fichier de cache sera généré et vous ne pourrez plus charger de nouvelles classes sans supprimer le fichier autoload.php de votre répertoire de cache à chaque fois (par défaut data/cache)
Donc il est conseillé de ne passer cette variable à 1 qu'à la fin du projet, au moment de la mise en production :)
La classe _file a été allégée en remplacant les appel fopen,fclose... par le couple file_get_contents/file_put_contents.
2012/08/24 Modification du plugin plugin_rss
La méthode addNews a été modifiée pour permettre de gerer des balises xml manquantesLa méthode show a été remplacée par une methode getContent permettant de récupérer le flux xml
Dans le builder, il a été ajouté un flux rss dynamique sur le projet "source" avec exemples
2012/08/20 Ajout de l'upload
Il est désormais possible facilement d'ajouter l'upload à votre applicationCette mise à jour voit l'arrivée d'un nouveau plugin plugin_upload, ainsi que sa prise en compte dans le builder.
Désormais dans le builder, lors du CRUD, vous pouvez sélectionner dans le menu déroulant "upload": quand vous uploadez, le fichier est uploadé dans data/upload, et l'adresse du fichier est enregistrée dans le champ de la table.
2012/08/14 Amélioration du builder
Lors de la création de la couche modèle, le builder indique si la classe n'existe pas déjà (la supprimer si on veut la regénérer)Lors de la création du CRUD, on peut choisir le nom du module à créer, il indique également si le module n'existe pas déjà.