mercredi 5 août 2009

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

Aucun commentaire:

Enregistrer un commentaire

Bonjour,