mardi 11 août 2009

Gérer un projet sous eclipse avec SVN

TUTORIEL ELCIPSE : Gestion d'un projet par Subversion

Subversion (en abrégé svn) est un système de gestion de versions, distribué sous licence Apache et BSD. Il sert à une équipe de pouvoir partager son travail et de réstaurer le travail à un état enregistré, envoyer les données sur le serveur pour pouvoir les sauvegarder et le tester.
Cela fonctionne avec un serveur (dépôt) et se trouve sur le serveur de developpement. http://monurl/SVN On peut interroger un serveur svn par http ou par svn.

Lorsqu'on veut récupérer une version complete, il faut entrer cette commande :

svn checkout -rHEAD http://mon_url
Lorsqu'on veut mettre à jour le serveur avec nos données :

svn commit /monfichier // bien commenter le 'commit'

Lorsqu'on veut récupérer les mises à jour, on tape :

svn update /monfichier


S'il y a un conflit :

svn revert /monfichier


1. Installation de subvserion.

sudo apt-get install subversion
2. Installation d'eclipse

Il faut télécharger la dernière version d'eclipse qui nous interesse (pour nous php)
http://www.eclipse.org/pdt/downloads/


3. Installation des plugins subclipse

Il faut ensuite télécharger le plugin. Il faut se rendre sur le site de subclipse tigris http://subclipse.tigris.org/ et copier le lien associé au plugin subclipse dans la section download.
Maintenant, il faut aller dans l'onglet Help d'eclipse et cliquer sur Install new software. Il faut ajouter l'url et cocher Subclipse AINSI que l'option SVNKIT.
Redémarrer ECLIPSE. Le tour est joué.

4. Il faut désormais qu'un espace SVN soit alloué à votre projet. VOIR Liste de serveurs
Ensuite, il faut cliquer sur Fichier -> importer puis sélection SVN->checkout projects from SVN. Il faut ensuite entrer l'URL du serveur SVN. Il faut entrer ses identifiants. Le reste se fait facilement et sans rien changer normalement.

5. L'application est prête à être partagée et versionnée.

jeudi 6 août 2009

Framework Turbulences : TUTO 5 - Intégration de script à l'application + Utilisation d'une fonction

Intégration de script à l'application

Le script utilisé est jquery.js . Clic droit - enregistrer la cible sous pour obtenir le fichier.
Pour utiliser une fonction présente dans le script JQuery.js (par exemple), il faut inclure la librairie.
* Soit la librairie est pour toute l'application :

+ dans ce cas là, le fichier doit être copié dans le dossier /turbapp/public/script/lib/jquery/jquery.js.
+ pour insérer ce script, il faut écrire dans le fichier /turbapp/modules/layout/LayoutView.php :

$this->assign_js(
'lib:jquery/jquery.js' // de base il va chercher dans le dossier turbapp/public/script/
);
* Soit la librairie est relative à un module en particulier :

+ dans ce cas, le fichier doit être copié dans le dossier du module /turbapp/modules/administrator/views/script/jquery.js.
+ pour insérer ce script, il faut écrire dans la vue du module /turbapp/modules/administrator/AdministratorView.php :
$this->assign_js(
'jquery.js' // de base il va chercher dans le dossier turbapp/modules/administrator/views/script/
);
Le script est maintenant chargé. Il ne reste qu'à l'utiliser.

Utilisation d'une fonction

LA TEMPLATE
On veut pouvoir déplacer des éléments en direct sur la page. Pour cela, une fonction éxiste dans la librairie JQuery Sortable. Cette fonction a besoin de définir quels éléments sont susceptibles d'être déplacés (quels "items" et entre quels groupes d'items ("boxes")) et par quelle poignée ("handle") ils se font déplacer.

On ajoute donc dans la template list.tpl les élements dont on a besoin :
/turbapp/modules/administrator/views/html/list.tpl
.

<div class="maDiv">
<hr/>1ere série d'admins
<div class="maBox">
{if $administrators|@count neq 0}
{foreach from=$administrators item=i}
<div class="
monItem" style="background-color: red"><div class="maPoignee">o</div> {$i->id}-{$i->level}-{$i->address_id}</div>
{/foreach}
{else}
<p>Aucun élément dans la liste</p>
{/if}
</div>
<hr/>2eme série d'admins
<div class="maBox">
{if $administrators|@count neq 0}
{foreach from=$administrators item=i}


<div class="monItem" style="background-color: green">
<div class="maPoignee">o</div>
{$i->id}-{$i->level}-{$i->address_id}</div>
{/foreach}
{else}
<p>Aucun élément dans la liste</p>
{/if}
</div>
</div>


Une fois que l'on a bien formaté la template, on peut passer à l'écriture du script.

LE SCRIPT

Le script jquery est désormais intégré à l'application ou au module.
On veut pouvoir déplacer les utilisateurs sur la plage et les trier à notre gré.
On créé un fichier, ou script, dans le dossier script du module :
/turbapp/modules/administrator/views/script/sortable.js
.
dans lequel on va mettre ce code :

$('.maDiv').sortable(
{items:'.monItem', boxes:'.maBox', handle:'.maPoignee'}
);
Ce code signifie que l'on va effectuer la fonction sortable sur la classe maDiv (il s'agira ici d'une div), que l'on pourra déplacer les élements de classe monItem et que ces items seront déplacables en "cliquant/déplacant" la poignée de classe maPoignee.

ESSAYONS SUR UNE AUTRE FONCTION,
la fonction autogrow (permet d'étirer automatiquement un textarea au besoin )


LA TEMPLATE
On veut pouvoir étirer automatiquement un textarea dans un formulaire. Pour cela, une fonction éxiste dans la librairie JQuery Autogrow. Cette fonction n'a besoin que d'un textarea pour fonctionner.

On ajoute donc dans la template list.tpl un textarea :
/turbapp/modules/administrator/views/html/edit.tpl
.

<textarea id="autogrowableTA" name="name" style="overflow: hidden; height: 105px;"> Test you text, that wil autogrow
</textarea>

LE SCRIPT

On créé un fichier, ou script, dans le dossier script du module :
/turbapp/modules/administrator/views/script/autogrow.js
.
dans lequel on va mettre ce code :

$('#autogrowableTA').autogrow();
Ce code signifie que l'on va effectuer la fonction autogrow sur l'id autogrowableTA. Si on voulait le faire sur tous les textarea, on aurait pu mettre simplement textarea.

mercredi 5 août 2009

Framework Turbulences : TUTO 4 - Validation de formulaire

VALIDATION DE FORMULAIRE :
Le but de ce tutoriel est de protéger l'envoi d'un formulaire. Les champs qui doivent être protégés sont écrits dans le modèle. Ainsi, par exemple, un utilisateur ne peut rentrer un prénom vide.

Ce tutoriel vient à la suite du tutoriel 3. Le module administrator doit être joint avec les modules address et user. De plus le formulaire edit sert à modifier les champs prénom, nom, email, niveau d'administration, rue, ville et code postal.

1.Formulaire
2.Fonction edit
3.Remplir le modèle avec les champs obligatoires

1. Remplissons tout d'abord le formulaire edit.tpl

Il faut faire un formulaire qui récupert les données enregistrées dans la base de donnée (données bleues). On affiche les erreurs SI elles existent (données rouges).
Voici le code complet et final.
<form name="" method="post" action="" enctype="multipart/form-data">
<!-- keep the object id in form -->
<input type="hidden" name="id" value="{$administrator->id}" />
<!-- hardcode the user type -->
<input type="hidden" name="user[user_type]" value="administrator" />

<fieldset>
<legend>
<div class="title">
<div class="title_right"></div>
Administrateur
</div>
</legend>
<p><label for="lastname">Nom :</label>
<input type="text" name="user[lastname]" value="{$administrator->user->lastname}"/>{if isset($error.user.lastname)}{$error.user.lastname}{/if}</p>
<p><label for="firstname">Prénom :</label>
<input type="text" name="user[firstname]" value="{$administrator->user->firstname}"/>{if isset($error.user.firstname)}{$error.user.firstname}{/if}</p>
<p><label for="email">Email :</label>
<input type="text" name="user[email]" value="{$administrator->user->email}" />{if isset($error.user.email)}{$error.user.email}{/if}</p>
<p><label for="level">Level :</label>
<textarea name="administrator[level]" style="overflow: hidden;" >{$administrator->level}</textarea>{if isset($error.administrator.level)}{$error.administrator.level}{/if}</p>
</fieldset>
<fieldset>
<legend>
<div class="title">
<div class="title_right"></div>
Adresse
</div>
</legend>
<p><label for="address">Rue :</label>
<input type="text" name="address[address]" value="{$administrator->address->address}"/>{if isset($error.address.address)}{$error.address.address}{/if}</p>
<p><label for="city">Ville :</label>
<input type="text" name="address[city]" value="{$administrator->address->city}"/>{if isset($error.address.city)}{$error.address.city}{/if}</p>
<p><label for="zip_code">Code postal :</label>
<input type="text" name="address[zip_code]" value="{$administrator->address->zip_code}" />{if isset($error.address.zip_code)}{$error.address.zip_code}{/if}</p>


</fieldset>
<hr />

<ul>
<li class="reset"><input type="reset" value="Annuler" /></li>
<li class="submit"><input type="submit" value="Enregistrer les modifications" /></li>
</ul>
</form>


2. Controlleur


// function to save the object for all action
private function _edit($view)
{
$v = new AdministratorView();

// get the object from request
$obj = $this->getAdministratorFromRequest();
//$obj->setAccessLevel($this->_access_level); // transmission of the access level to the object

// if request type is post
if($this->isPost())
{

// on récupert les informations concernant l'administrateur dont l'ID est passé en paramètre.
$administrator = Administrator::getByPKey('Administrator',$_POST['id']);

if(!is_null($administrator))
{
$field_errors = array(); // on créé un tableau qui contiendra les erreurs sur les champs.
$answer_array =array(); // on créé un tableau de réponse qui va être envoyé à la vue.
// on récupert les informations concernant l'utilisateur dont l'id est égal au user_id de l'admin
$user=User::getByPKey('User',$administrator->user_id);
$user->setFromArray($_POST['user']); // on enregistre les données

$address=Address::getByPKey('Address',$administrator->address_id); // idem que pour les users
$address->setFromArray($_POST['address']); // idem

$administrator->setFromArray($_POST['administrator']); // idem

$user->validate(); // on effectue validate() ici pour les 3 modules. Cette fonction
$address->validate(); // vérifie que tous les champs qui doivent etre remplis le sont.
$administrator->validate(); // si ce n'est pas le cas, il renvoit faux, sinon vrai.
// de plus, la fonction validate(), si elle renvoit faux permet de passer dans la fonction getError().
// C'est pour cette raison que l'on utilise 2 fois pour chaque module la fonction validate()

if($user->validate() && $address->validate() && $administrator->validate())
{

$user->save(); // si la fonction validate() a renvoyé TRUE pour les 3 modules,
$address->save(); // on peut alors enregistrer dans la base de données
$administrator->save();
}
else
{
$field_errors['user'] = $user->getError(); // on remplit ensuite le tableau d'erreur
$field_errors['address'] = $address->getError();
$field_errors['administrator'] = $administrator->getError();
$answer_array['administrator'] = $administrator; // puis on remplit le tableau réponse avec l'objet $adminsitrator
$answer_array['error'] = $field_errors; // ainsi qu'avec le tableau d'érreur.
return $v->html_edit($answer_array);//récupère et affiche les erreurs s'il y en a
}



// s'il n'y a pas d'erreurs , on redirige vers action_list
if(isset($obj->id) && !$obj->hasError())
return $this->action_list();
}

}

$view = 'html_'.$view;
return $v->$view($obj);
}


3- Ecrire la fonction validate() ainsi que les champs obligatoires :


public function validate()
{
$this->error = array();

foreach( $this->getAttributeNames() as $key => $attr )
{
if ( $this->$attr == '' AND $this->isMandatoryValue($attr) === TRUE ){
$this->error[$attr] = sprintf("Merci de renseigner le %s.", $attr);
}
else
{
$val = parent::validateThisValue($attr, $this->$attr);
if ( $val['message'] !== TRUE AND !is_null($attr) AND $this->$attr!=$this->_original[$key] )
$this->error[$attr] = $val['error'];
else
$this->$attr = $val['value'];
}
}
if(count($this->error)>0)
return false;
else
return true;
}

/**
* retourne les erreurs
*/
function getError()
{
return $this->error;
}

var $_mandatory = array(
'default' => array('firstname','lastname','email')
);

Framework Turbulences : TUTO 3 - Validation, relations entre modèles et ACL

Turbulences Tutorial - Chapter 3 : More models : validation, model relationships and access control

Pré-requis
Il faut que turbulences soit installé. Il faut créer les modules user et address de cette manière :

$ cd /myapp $ php script/generate_module.php user $ php script/generate_module.php address
Puis il faut completer les fichiers user.schema.sql et address.schema.sql :

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL auto_increment,
`firstname` varchar(30) NOT NULL,
`lastname` varchar(30) NOT NULL,
`email` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `address`;
CREATE TABLE `address` (
`id` int(10) unsigned NOT NULL auto_increment,
`address` varchar(30) NOT NULL,
`city` varchar(30) NOT NULL,
`zip_code` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Dans ce chapitre, nous allons apprendre à :

* Créer un nouveau module. Créer le module Administrator.
o Un administrator a les mêmes attributs qu'un autre utilisateur du siteweb
o Un administrator a des attributs spécifiques en plus (niveau d'administration et adresse)
* Gérer toutes les erreurs (administrator, user and address) en même temps
* Gérer l'accès aux attributs pour les modèles et pour les actions des controlleurs

Generation du module administrator

* Grace au script de génération de module, on créé le module administrator :

php script/generate_module.php administrator

Créer la table

On va ajouter une table pour les attributs spécifiques des administrators, incluant toutes les clés étrangères pour les utilisateurs(user) et les adresses(address). On va juste créer un script user.schema.sql et address.schema.sql
modules/administrator/DB/administrator.schema.sql.

DROP TABLE IF EXISTS `administrator`;
CREATE TABLE `administrator` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`user_id` INT( 10 ) NOT NULL ,
`level` ENUM( 'super-admin', 'moyen-admin', 'petit-admin' ) NOT NULL ,
`address_id` INT( 10 ) NOT NULL ,
PRIMARY KEY ( `id` ) ,
INDEX ( `user_id` , `level` )
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Pour installer la nouvelle table, vous devez executer le nouveau script ou l'installation complete par le script habituel.

mysql <> var $_joins = array(
'user' => array('User', array('user_id' => 'id')),
'address' => array('Address', array('address_id' => 'id'))
);
On va utiliser les jointures dans notre code pour obtenir quel utilisateur correspond à tel administrator en écrivant une formule très simple : $admin->user. En ce qui concerne les adresses, c'est la même chose : $admin->address. Ceci est appelé une jointure directe.

Créer le controlleur

// cette fonction renvoi un objet administrator // si $_GET['id'] ou $_POST['id'] est vérifié, on charge l'objet correspondant // sinon on retourne un objet vide public function getAdministratorFromRequest() { if(isset($this->__get['id']) && is_numeric($this->__get['id'])) $id = $this->__get['id']; elseif(isset($_POST['id']) && is_numeric($_POST['id'])) $id = $_POST['id']; else $id = NULL; if(!is_null($id)) $u = Administrator::getByPKey('Administrator',$id); else $u = new Administrator(); return $u; } // action for general editing public function action_edit() { return $this->_edit('edit'); } // action for access_level editing public function action_set_level() { return $this->_edit('edit'); } // function to save the object for all action private function _edit($view) { $v = new AdministratorView(); // get the object from request $obj = $this->getAdministratorFromRequest(); // if request type is post if($this->isPost()) { $administrator = Administrator::getByPKey('Administrator',$_POST['id']); if(!is_null($administrator)) { //mise à jour de ce champs avec les données send en POST $administrator->setFromArray($_POST['administrator']); $administrator->update(); //maj du user associé au champ administrator modifié $user=User::getByPKey('User',$administrator->user_id); $user->setFromArray($_POST['user']); $user->update(); //maj de l'addresse associée au champ administrator modifié $address = Address::getByPKey('Address',$administrator->address_id); $address->setFromArray($_POST['address']); $address->update(); } // if no arrors , redirect to action_list if(isset($obj->id) && !$obj->hasError()) return $this->action_list(); } // render the asked view and pass the object $view = 'html_'.$view; return $v->$view($obj); } // action for listing public function action_list() { $v = new AdministratorView(); $objs = Administrator::getFor('Administrator'); return $v->html_list($objs); }
On peut maintenant tester la méthode de listage des administrators en tapant http://turbapp/administrator/list

Les actions basiques : CreateReadUpdateDelete

* En ce qui concerne les vues, elles passent simplement l'objet entier ou un tableau d'objets

public function _edit($obj) { $this->assign('administrator',$obj); } public function _list($objs) { $this->assign('administrators',$objs); }
* La template edit.tpl -- (les widgets sont des plugins smarty)


<!-- Widget to print all errors on our object, including dependant objects -->
{wdgt_print_object_error object=$administrator}

<form name="" method="post" action="" enctype="multipart/form-data">
<!-- keep the object id in form -->
<input type="hidden" name="id" value="{$administrator->id}" />
<!-- hardcode the user type -->
<input type="hidden" name="user[user_type]" value="administrator" />

<fieldset>
<legend>
<div class="title">
<div class="title_right"></div>
Administrateur
</div>
</legend>
<!-- following widget print all inputs, regarding the access_level defined in models (cf following points) -->
{wdgt_input object=$administrator->user field='lastname' label='Nom'}
{wdgt_input object=$administrator->user field='firstname' label='Prénom'}
{wdgt_input object=$administrator->user field='email' label='Email'}
{wdgt_select object=$administrator field='level' label='Niveau d\'admistration'}

</fieldset>

<fieldset>
<legend>
<div class="title">
<div class="title_right"></div>
Adresse
</div>
</legend>
<!-- following widget print all inputs, regarding the access_level defined in models (cf following points) -->
{wdgt_input field=address object=$administrator->address prefix_name=address label='Adresse'}
{wdgt_input field=city object=$administrator->address prefix_name=address label='Ville'}
{wdgt_input field=zip_code object=$administrator->address prefix_name=address label='Code postal'}

</fieldset>
<hr />

<ul>
<li class="reset"><input type="reset" value="Annuler" /></li>
<li class="submit"><input type="submit" value="Enregistrer les modifications" /></li>
</ul>
</form>



* Maintenant, on peut tester le module insert/edit en tapant ceci : http://turbapp/administrator/edit/?id=1

Controle d'accès : ACL

* On va gerer les accès aux champs du modele. On va utiliser un simple modèle de sécurité : les Access Control List (ACL)

Premièrement, le controlleur doit propager les _access_level aux objets (_access_level est le type d'utilisateur dans la session)
private function _edit($view) { $v = new AdministratorView(); $obj = $this->getAdministratorFromRequest(); // HERE $obj->setAccessLevel($this->_access_level); // transmission of the access level to the object if($this->isPost()) { $obj->setFromArray($_POST); $obj->saveDependantObjects(); if(isset($obj->id) && !$obj->hasError()) return $this->action_list(); } $view = 'html_'.$view; return $v->$view($obj); }
On doit définir les règles de lecture d'un champ d'édition. Si vous êtes admin, vous allez pouvoir lire et écrire : admin_read et admin_write. On voit que seul un administrateur ne peut parametrer le niveau d'un administrateur, le default_access ne peut le faire.
var $_access_limit = array( 'default_read' => array(), 'default_write' => array('level'), 'admin_read' => array(), 'admin_write' => array(), );
* On peut définir les access_level pour toutes les actions du controlleur. Si l'access_level courant ne peut acceder à l'action, il est redirigé vers ErrorController::access_not_allowed
administrator.php
var $_allowed_access_level = array( 'edit' => array('admin','default'), 'set_level' => array('admin'), );
public function action_set_level() { return $this->_edit('edit'); }
Vous pouvez maintenant tester l'ACL : seulement les administrateurs sont capable d'accéder à http://turbapp/administrator/set_level

Framework Turbulences : TUTO 2 - Connection Base de données

Framework Turbulences :
Connection Base de données

On va continuer à partir du premier tuto.

Dans ce tutoriel, on va apprendre :

  • Comment installer une table spécifique à un modèle
  • Comment effectuer les actions CRUD (create, read, update, delete) :
    • Ajouter un objet
    • Lister les objets et en afficher un spécifique
    • Modifier les proprietés d'un objet
    • Détruire un objet

Pour plus d'informations sur les CRUD, vous pouvez visiter ce site go!

Schema et données

Turbulences prend en charge les données de la base de données. Il les "serializes". Chaque modèle a sa propre table qui correspond à ses objets.

Pour créer une table qui va être ajoutée dans la base de données lors du lancement du script d'installation, vous devez créer/modifier les fichiers présents dans le dossier modules/hello/db. Voici les 2 fichiers présents et utiles ici :

  • schema - ce script créé la table : hello.schema.sql
  • data - ce script créé les données, il peuple la table : hello.data.sql

Pour que ces scripts soient lancées a l'installation, il faut bien avoir les scripts d'indiqués dans le fichier modules/hello/module.ini comme ceci

:

[tables]
hello=schema,data,trigger; important put the schema before the data

Tous les scripts sauf le schema sont optionnels. Le schema peut l'être si le module n'a pas besoin d'une table.

Les fichiers de base de données

  • hello.schema.sql
    -- table hello
    DROP TABLE IF EXISTS hello;
    CREATE TABLE hello (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY (id),
    INDEX name(name),)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  • hello.data.sql
    INSERT INTO `hello` ( `id` , `name` )
    VALUES ( 1, 'Test' );
    INSERT INTO `hello` ( `id` , `name` )
    VALUES ( 2, 'John' );
    INSERT INTO `hello` ( `id` , `name` )
    VALUES ( 3, 'Kate' );

Vous devez lancer une nouvelle fois le script d'installation (php myapp/script/install.php). Allez vérifier ensuite dans phpmyadmin que la table hello soit bien créée.


Lister des données

On va lister les données présents dans la table hello

Pour cela on va d'abord modifier le modèle du module Hello dans modules/hello/Hello.php:

class Hello extends TURB_Object // les modèles doivent etendre de TURB_Object
{
var $_table = 'hello'; // on défini ici le nom de la table
}

Ensuite il faut définir l'action list dans notre controlleur (HelloController.php); comme ceci :
/**
* Une action est toujours définie comme ceci : action_nomDeLAction; donc ici : action_list
*/
public function action_list()
{
$names = Hello::getFor('Hello'); // see 1.
$view = new HelloView();
return $view->html_list($names);
}

La méthode getFor() est un méthode statique de TURB_Object. Elle retourne un tableau d'objets de la classe que l'on a interrogée (ici, la classe hello) en prenant en compte les conditions que l'on a passé (ici, aucune ). Vous pourriez très bien par exemple ne sélectionner que les entrée dont l'age est 12 et ou le nom est junior. Il faudrait entrer ceci:

Hello::getFor('Hello', array('age' => 12, 'name' => 'junior'));

Maintenant, il faut créer la vue associée dans HelloView:

protected function _list($names)
{
$this->assign('names', $names);
}

Ensuite, on enregistre la template de listage ( modules/hello/views/html/list.tpl):

{if $names|@count neq 0}
{foreach from=$names item=name}
{$name->id}-{$name->name|strip_tags}
{/foreach}
{else}

Nothing in the list.


{/if}

Il est maintenant possible de tester le module de listage en tapant ceci http://turbapp/hello/list


Afficher un objet spécifique

On va afficher un message dynamique "hello $name". Le nom va être lu depuis la base de données.

On ajoute alors l'action show dans le controlleur:

// in HelloController
public function action_show()
{
if (isset($_GET['id']) && is_numeric($_GET['id']))
{
$name = Hello::getByPKey('Hello',$_GET['id']);
$view = new HelloView();
return $view->html_show($name);
}
else
HTTP::redirect('/');
}

On ajoute la vue

// in HelloView
protected function _show($name)
{
$this->assign('name', $name);
}

Et enfin, la template ( views/html/show.tpl):

Hello {$name->name} !


On peut tester le module http://turbapp/hello/show/1. C'est censé afficher "Hello Test !"

Ajout d'objet

On va ajouter un nouveau nom dans la base de données. D'abord, on va ajouter la méthode add dans le controlleur :

// in HelloController
public function action_add()
{
if (isset($_GET['id']) && is_numeric($_GET['id']))
$name = Hello::getByPKey('Hello',$_GET['id']);
else
$name = new Hello();

if (isset($_POST['name']))
{
$name->name = $_POST['name'];
$name->save();
HTTP::redirect('/hello/show/?id='.$name->id);
}
else
{
$view = new HelloView();
$view->assign('name', $name);
return $view->html_add($name);
}
}

On créé la template comprenant le formulaire d'ajout :

// in modules/hello/views/html/add.tpl
<form action="" method="post">
<label for="name">Name: </label><input type="text" name="name" />
<input type="submit" value="Enregister" />
</form>

On peut dores et déjà tester le module http://turbapp/hello/add/ Envoyer une valeur. Un nouvel objet va être créé et enregistré dans la base de donnéeet la page va être redirigée vers l'action show (/hello/show/).

Editer un objet

On va modifier la méthode add() pour que les mises à jour se passent bien. La méthode va recevoir l'id de l'objet dans l'URL comme ceci : /hello/add/?id=2.

// in HelloController
public function action_add()
{
if (isset($_GET['id']) && is_numeric($_GET['id']))
$name = Hello::getByPKey('Hello',$_GET['id']);
else
$name = new Hello();

if (isset($_POST['name']))
{
$name->name = $_POST['name'];
$name->save();
HTTP::redirect('/hello/show/?id='.$name->id);
}
else
{
$view = new HelloView();
$view->assign('name', $name);
$view->html_add($name);
}
}

On ajoute le lien d'édition :


// in views/html/show.tpl
{if $names|@count neq 0}
{foreach from=$names item=name}
{$name->id}-{$name->name|strip_tags}
<a href="'/hello/add/{$name-">id}/'>Edit</a>
{/foreach}
{else}

Aucun élément dans la liste


{/if}
On modifie aussi la valeur que doivent prendre les champs dans le
formulaire add.tpl :

<form action="" method="post">
<label for="name">Name: </label><input type="text" name="name"
value="{$name->name}" />
<input type="submit" value="Enregister" />
</form>


On peut tester en entrant /hello/list, et en cliquant sur un des liens d'édition.

Sources - turbulences.com

Framework Turbulences : TUTO 1 - Hello

Framework Turbulences :
Premier module = Hello

Pour utiliser ce tutoriel, votre installation de turbulences doit être faite. Si ce n'est pas le cas ou si vous ne savez pas, faites d'abord ceci.

Les modules

Tout le code relatif au module sera situé ici myapp/modules/nomdumodule .Un module est un ensemble données/role. Il est divisé en 3 blocs selon le modèle MVC:

  • un controlleur qui va définir les actions et le comportement du module
  • un modèle qui va gérer les données, leur accès et la validation
  • une vue qui va définir les pages visibles du module

Il s'agit du schéma classique du modèle MVC. Ce modèle permet la séparation de ces parties et est très utilisé dans le web et dans les frameworks les plus utilisés. Vous pouvez visiter la page Wikipedia ou cet excellent site : ADC introduction.

Le fait de créer des modules permet la réutilisation des programmes du fait de leur séparation avec le reste des composants.

Comment créer un module

Manuellement

Un générateur de module existe et il est recommandé de l'utiliser, car il automatise toutes les taches de création du module. Son utilisation est décrité dans la section suivante. Ces instructions sont données pour comprendre totalement comment fonctionne un module.

  • créer le répertoire hello dans myapp/modules
    $ cd myapp/modules
    $ mkdir hello
  • créer la hierarchie dans le dossier hello :
    myapp/modules/hello
    + HelloController.php // hosts class HelloController extends TURB_Controller {}
    + HelloView.php // hosts class HelloView extends TURB_View_Smarty {}
    + Hello.php // hosts class Hello extends TURB_Object {}
    + views
    + html // hosts Smarty HTML templates
    + script // hosts view specific javascript code
    + style // hosts view specific css code

file tree view

Automatiquement

Il faut juste taper

$ cd /myapp
$ script/generate_module hello

Cela va créer la hierarchie des fichiers.

Créer le modèle

Nous allons désormais créer chaque composants du modèle MVC en commencant par le modèle : (le modèle du module est le fichier modules/hello/Hello.php)

  • definir un modèle vide comme ceci :
    class Hello extends TURB_Object
    {
    }

Créer le controlleur

(le controlleur du module est le fichier modules/hello/HelloController.php)
  • definir le controlleur comme ceci :
    class HelloController extends TURB_Controller
    {
    // must be declared; called after the constructor
    public function setup() {}

    public function action_default()
    {
    $name = 'world';
    $view = new HelloView();
    $view->assign('firstname', 'Walt');
    return $view->html_hello($name);
    }
    }

Créer la vue

(la vue du module est le fichier modules/hello/HelloView.php)
  • definir la vue comme ceci:
    class HelloView extends TURB_View_Smarty
    {
    public function _hello($arg)
    {
    $this->assign('name', $arg);
    }
    }

Créer la template

La template est etroitement liée à la vue. Il s'agit du code HTML, de l'apparence de la page pour l'utilisateur.

(le template hello du module hello se situe ici modules/hello/views/html/hello.tpl)

Le fait d'appeler $view->html_hello($name); va controler et appeler la méthode _hello présente dans la vue (HelloView), dans une réponse HTML (on va y revenir) ; cette méthode va automatiquement chercher la template hello.tpl pour le rendu.

Tester le module Hello

Maintenant, entrez http://turbapp/hello/ - ce qui va afficher la nouvelle page.

Le chemin d'éxecution est le suivant :

index.php lance le dispatcher, instancie le controlleur du module hello

HelloController.php lance action_default() qui instancie la vue HellowView, attribue les variables qu'il faut et appelle html_hello()

HellowView.php Lance html_hello() qui va chercher la template html/hello.tpl

Enfin, le dispatcher rend la vue et les données dans le navigateur du client

Notes

Sources - turbulences.com

Framework Turbulences : TUTORIEL D'INSTALLATION

L'entreprise dans laquelle je fais mon stage utilise pour son application le framework turbulences
Le framework est très peu documenté donc plus on en parle, mieux ce sera. Voici comment installer Turbulences sur votre machine ubuntu :

Installation de Turbulences

Pré-requis

  • Linux (Ubuntu 8.10 par exemple)
  • Apache 2
    • "mod rewrite" activé

  • MySQL version 5 ou +
  • ImageMagick
  • PHP version 5.2 ou + avec le module
    • mbstring

Installation

  • Se mettre en mode Super Utilisateur (commande : su )
  • Créer un répertoire pour le projet (par exemple sur le bureau)
    $ mkdir myproject
    $ cd myproject
    

  • Installer une copie du framework

    $ svn export -rHEAD svn://turb.ulenc.es/turb/trunk .
    $ ls -l
    trunk
    $ cd trunk
    $ ls -1
    base
    whitecopy
    

  • Vous avez 2 répertoires : base qui contient toutes les librairies du framework et whitecopy qui est un squelette de votre application. Il faut donc renommer ce :
    $ rename whitecopy myapp
    

Créer une base de donnée dans http://localhost/phpmyadmin et appelez là turb_db
Créer le dossier var dans votre dossier de projet. Dans votre dossier var, créez aussi le dossier data, log, tmp et users.
Dans le dossier logs, créez un fichier appelé app.log, dans tmp, créez un dossier appelé compile.
 
Créez les liens symboliques pour l'appli :
#lien symb dans dyb_app/
ln -s var/tmp tmp

#lien symb dans dyb_app/public
ln -s ../var/data/public var

#lien symb dans dyb_app/public/script
ln -s ../../tmp/cache/script cache

#lien symb dans dyb_app/public/style
ln -s ../../tmp/cache/style cache

Configurer

Maintenant, on va configurer l'application

Le virtualhost

Configurer un virtualhost dans la config d'apache (/etc/apache2/httpd.conf)
  • Vérifiez que ces variables soient bien parametrées :
  • AllowOverride -> All
  • DocumentRoot to myproject/myapp/public
Voici le code à entrer pour définir le virtualhost :

  • NameVirtualHost dyb.local <VirtualHost dyb.local> ServerAdmin l.bernard@doyoubuzz.com DocumentRoot /home/leny/workspace/dybmig/public/ <Directory /home/leny/workspace/dybmig/public/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride All Options ExecCGI -MultiViews SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> LogLevel warn </VirtualHost>

Le fichier myapp/var/host

Créer le fichier host dans le dossier var du dossier myapp et l'éditer. Mettre le nom du virtualhost et le nomero du port si besoin dans le fichier.
touch /myapp/var/host
gedit /myapp/var/host

écrirer turbapp et quitter

Le fichier myapp/conf/conf.yaml

Mettre à jour le fichier de configuration conf.yaml( myproject/myapp/conf/conf.yaml):
  • la section "env" permet de définir la liste des environnements (dev, test, prod), La liste commence par "vhost:port": nom_de_lenvironnement
  • Ensuite, il faut définir la configuration détaillée comme ci-dessous :
    
    
    app: id: myapp name: myapp version: 0.1 env: vhosts: 'turbapp': dev dev: public_url: http://$vhost/ db: user: root pass: base: turb_db host: localhost privileges: ALL imagemagick_path: /usr/bin/ mysql_filename: /usr/bin/mysql

Permissions FS

Maintenant, assurez vous que les permissions de myapp/var sont correctement parametrés :
$ chgrp -R www-data myapp/var
$ chmod -R g+w myapp/var
$ find myapp/var -type d -exec chmod g+s {} \;

Lancez le script d'installation :

$ php myapp/script/install
Le script va controler que tout est bien parametré et va installer la base de données correctement.

Modifiez maintenant le fichier /etc/hosts et ajouter à la suite de localhost trubapp ou le nom de votre vhost
$ sudo gedit /etc/hosts
127.0.0.1 localhost turbapp
L'installation est finie. Testez en allant sur http://turbapp dans firefox. Si une page avec un logo rosé écrit turbulences apparait et que le message suivant apparait :

Your setup succeeded!

Vous pouvez alors vous attaquer au premier tutoriel. Sinon, relisez attentivement le tutoriel d'installation et au besoin écrivez un ticket sur le site de tubulences.com
Sources : turbulences.com

Les meilleures applications iPhone !

//TODO : faire du dernier iPhone le smart le plus complet du marché !

LOGICIELS
*** TOMTOM (le meilleur GPS) et NAVIGON
*** IM+ (client de messagerie et de réseaux sociaux comme msn, gtalk, facebook, twitter, Y!, etc toujours connecté en arrière plan. Vous recevez des messages comme des sms)
*** WinterBoard (Pour installer des thèmes sur l'iPhone)
*** FastSketch (Permet à partir d'une photo de faire un effet dessin au crayon de bois ou au crayon de couleur vraiment épatant)
*** AutoStitch (Permet de faire des diaporamas à partir de plusieurs photos qui se suivent)
*** ezShare (Permet d'avoir ses fichiers présents sur un espace de stockage sur internet ou sur le réseau local)
*** Air Mouse (Remplace souris et clavier pour piloter l'ordinateur)
*** Fame (Permet d'insérer une photo dans une autre photo pour lui affecter un effet vraiment sympa)
*** Peeps (Une sorte d'alternative au carnet de contact avec les photos des contacts qui s'affiche, peu utile mais sympa)
*** Print n Share (Permet le partage de fichiers et la mise en impression directe depuis l'iPhone vers les imprimantes partagées du réseau WIFI)
*** Quickoffice (Permet de gérer et modifier ses fichiers de style office (WORD, EXCEL, PPT etc) et de les envoyer par mail ou de les enregistrer sur un espace de stockage défini)
*** Poof (Permet de cacher des icones du genre Bourse,Boussole,Freeze, Maps,iTunes,VoiceMemos,Météo)
*** Camera Zoom (Permet de zoomer en prenant une photo)
*** dismoiou (lorsque l'on recherche quelque chose de particulier, cette application est utile)
*** PdaNet (Permet de partager ou d'utiliser la connexion internet avec le PC)

JEUX :
*** Worms (incarnez votre équipe de petits vers de terre et dominez le monde)
*** Les sims 3 (Jeu de simulation de vie)
*** Asphalt4 (Jeu de simulation de course de voiture)
*** Need for Speed Underground (Jeu de simulation de course de voiture)
*** Yetisports (Jeu délirants entre pingouins et yéti)
*** Manager (Jeu de gestion d'équipe de football)
*** RSoccer09 (Meilleur jeu de Foot)
*** Brick3D (Jeu de casse brique trop bien)
*** Tetris (faut il une description ?)
*** Spore (Jeu de simulation de l'évolution de votre espèce)
*** iCombat (Jeu de combat de tank)
*** RealTennis (Jeu de Tennis)
*** ResidentEvil4 (Jeu de zombie bien fait)
*** FaceFighter (Jeu de boxe délirant)




Jailbreak/Désimlockage de l'iPhone 3GS 3.1.2

Ce sujet va vous permettre d'utiliser n'importe quelle application même payante gratuitement. Ce n'est cependant pas légal. Vous êtes avertis. Cela vous permet aussi de modifier votre iPhone en personnalisant l'apparence ou en débloquant de nouvelles fonctionnalités comme l'accès SSH ou le désimlockage.
 

JAILBREAK

Cette méthode fonctionne pour toutes les générations d'iPhone. Si vous avez un iPhone déjà jailbreaké et que par conséquent vous avez une multitude d'applications pirates installées sur votre téléphone, sachez que grace à cette méthode, vous récupererez tout ca ainsi que votre configuration (code wifi, contacts, etc).

La première étape si ce n'est pas un iPhone vierge est de synchroniser/enregistrer votre iPhone avec iTunes.
Cette étape sera peut etre un peu long si vous ne l'avez jamais fait (ce serait étonnant tout de même) mais est primordiale pour récupérer les informations stockées sur l'iPhone.

Une connexion WIFI est préférée pour une bonne installation.

*Mettez à jour votre iPhone avec la version 3.1.2
*Téléchargez ce logiciel : Pour windows ou Pour Mac
*Installez la dernière version d'iTunes
*Branchez l'iPhone au PC grace au cable USB fourni avec le téléphone
*Pour mac, dézippez le fichier.
*Lancez le fichier.
*Cliquez sur "Make it rain".
//L'iphone affiche une photo du pirate et redémarre.
// Une nouvelle application est apparue : BlackRa1n
*Paramétrez votre wifi pour accélerer la procédure.
*Lancez l'application blackra1n et cliquez sur "Cydia"
// L'application Cydia est opérationnelle et apparait sous forme d'une icone dans vos applications*Lancez Cydia puis dans l'onglet Gestion : touchez Source -> Editer -> Ajouter
puis entrez cette source :http://cydia.hackulo.us
// La source s'ajoute à Cydia, ses paquets sont désormais disponibles
*Touchez l'onglet recherche puis tapez : "appsync". Une seule application apparait normalement, l'application AppSync for OS 3.1
*Installez la, redémarrez ensuite le springboard(ou l'iPhone).
// Votre iPhone est désormais capable d'installer des applications présentes en téléchargement sur certains sites sans vérifier que vous ayez bien le droit de les installer. A vous Navigon, IM+, Les sims 3 etc.
*Allez sur http://appulo.us/ ou http://ihacks.ru pour obtenir des liens d'applications craquées.
*Choisissez l'application que vous désirez obtenir en cliquant sur l'icone puis choisissez un lien disponible pour les dernieres version proposées de préférence.
//Soit le fichier téléchargé est un fichier ***.ipa et dans ce cas, il s'ouvre directement avec iTunes, soit c'est un fichier ***.ipa.rar ou ***.ipa.zip et dans ce cas il faut renommer le fichier en ***.ipa et l'ouvrir ensuite avec iTunes (un simple double clique doit suffir), iTunes sait qu'il doit ouvrir les fichiers finissant par ipa
*Il faut alors synchroniser l'iPhone avec iTunes à l'aide d'un clique droit sur l'icone de l'iPhone dans iTunes (bandeau gauche) -> Synchroniser.
//L'iPhone se synchronise, les applications s'installent sur l'iPhone.

DESIMLOCKAGE

// Cette partie était vraie pour le jailbreak avec le logiciel purplera1n qui jailbreak les iPhone sous OS 3.0
// Elle ne l'est plus pour blackra1n.
*Il faut ajouter la source : http://repo666.ultrasn0w.com
(attention c'est http://repo666.ultrasn(ZERO)w.com )
*Ensuite, il faut cliquer sur la source repo666.ultrasn0w.com, un seul paquet s'affiche, le paquet "ultrasn0w", il faut l'installer. L'iPhone redémarre, il est désimlocké (vous pouvez l'utiliser avec n'importe quel opérateur).

mardi 4 août 2009

L'élu : Apple iPhone 3GS

Et voilà, j'ai fait mon choix, me voilà dans la grande famille des mac-users. J'ai succombé à l'attraction de l'iPhone 3GS. Plus rapide que le prédecesseur, plus complet et surtout qui comporte plus d'applications interessantes (malgré le fait qu'elles soient payantes) que chez Nokia, Android ou autre.
J'ai pris le forfait IDEO de Bouygues Telecom, qui coute 45€/mois ce qui fait un forfait sms/mms/internet/mail/TV illimités + 2h de communication à 15€/mois + un forfait internet à la maison BBOX à 30€/mois... L'affaire de l'année en ce qui concerne les offres téléphoniques.

VOUS AVEZ BIEN ENTENDU : 15€/mois pour tout illimité + 2h de communication

Ensuite, je l'ai jailbreaké et désimlocké. Méthode très facile, en 5 minutes, tout est fait. Il faut brancher l'iPhone à l'ordinateur, télécharger et lancer le fichier purplera1n.exe. Le tour est joué. L'icone freeze qui permet d'installer cydia apparait après le redémarage de l'appareil. Une fois cydia installé, pour avoir accès à toutes les applications payantes, il faut ajouter la source cydia.hackulo.us puis chercher sur cydia et installer le paquet "appsync". Ensuite on peut allez télécharger les applications sur des sites de piratage com http://ihacks.ru ou http://hakulo.us/appdb.

C'est à partir de ce moment, lorsque l'on installe les applications payantes gratuitement que l'iPhone montre son interet et pourrie literalement tous les autres téléphones.

DONC, voici mon conseil, NE PAS HESITER !! L'iPHONE 3GS EST MONSTRUEUX ! Allez-y !