Tutoriel : Création d'un projet avec FuelPHP

Bookmark and Share
Mercredi 14 décembre 2011

Tutoriel : Création d'un projet avec FuelPHP
La semaine dernière, j’ai rejoint l’équipe du projet open-source Novius OS basé sur le framework FuelPHP. Mes collègues de Novius Labs m’ont initié à ce nouveau framework. Je prends donc la suite de Julian pour vous en expliquer le fonctionnement. Aujourd’hui, on rentre dans le détail et passons à un cas concret.

 

 

Note du 20/12/2011 : cet article a été mis à jour par rapport à la nouvelle version 1.1 de Fuel sortie récemment. Les codes affichés, les commandes ainsi que certaines prises d'écran ont donc sensiblement changés depuis la version initiale.

Objectif

Sommaire du tutoriel
Développer sous FuelPHP

  1. Choix du framework
  2. Mise en place
  3. Création d'un projet
  4. Application type
  5. Cheat sheet
  6. L'ORM : gestion des relations

L’objectif de cet article n’est pas d’être exhaustif sur le framework, mais de vous donner les armes nécessaires pour commencer un projet. La connaissance d’un framework PHP ou autre (Ruby on Rails, Symfony, CakePHP...) est un plus mais n’est pas nécessaire pour suivre ce tutoriel.

Tout au long des articles 3 et 4 de notre tutoriel FuelPHP, nous allons nous baser sur un exemple : l’élaboration d’un agenda accessible via internet (où il est possible d’écrire des notes, d’entrer ses contacts etc...).

Pour les curieux, voici un aperçu :

Vous vous en doutez, la réalisation graphique ne fait pas partie des objectifs de ce tutoriel. Je tiens néanmoins à donner le crédit des icônes issues de l’excellent site the Noun Project.

Ce tutoriel part du principe que vous avez lu l’article précédent de Julian et installé une instance du projet. Nous utiliserons MySQL et un logiciel de gestion de base de données (phpMyAdmin).

 

Configuration de la base de données

Via votre logiciel de gestion de base de données préféré, créez une base de données que vous nommerez tuto_agenda.

Il faut maintenant configurer FuelPHP pour qu’il puisse accéder à cette base.

Il faut d’abord modifier le fichier fuel/app/config/db.php qui va vous permettre d’accéder à votre serveur MySQL. Voici ce que contient le fichier de base :

return array(
	'active' => 'default',

	/**
	 * Base config, just need to set the DSN, username and password in env. config.
	 */
	'default' => array(
		'type'        => 'pdo',
		'connection'  => array(
			'persistent' => false,
		),
		'identifier'   => '`',
		'table_prefix' => '',
		'charset'      => 'utf8',
		'caching'      => false,
		'profiling'    => false,
	),

	'redis' => array(
		'default' => array(
			'hostname'  => '127.0.0.1',
			'port'      => 6379,
		)
	),

);

On peut voir qu’on peut ici spécifier les informations de connexion (le type, l’adresse et le port du serveur - type, hostname et port) ainsi que certaines options (gestion du cache, le préfixe à utiliser devant chaque table...).

Le type de base est PDO. Il est possible de le laisser tel quel, cependant certaines opérations de migration de ce type ne sont pas encore supportées par FuelPHP. Nous allons donc modifier ce type en MySQL. Nous ne modifierons aucun des autres paramètres, ce n’est pas l’objet de ce tutoriel.

return array(
	'active' => 'default',

	/**
	 * Base config, just need to set the DSN, username and password in env. config.
	 */
	'default' => array(
		'type'        => 'mysql',
		'connection'  => array(
			'persistent' => false,
		),
		'identifier'   => '`',
		'table_prefix' => '',
		'charset'      => 'utf8',
		'caching'      => false,
		'profiling'    => false,
	),

	'redis' => array(
		'default' => array(
			'hostname'  => '127.0.0.1',
			'port'      => 6379,
		)
	),

);

Il faut maintenant spécifier les identifiants et la base sur laquelle se connecter. Le framework FuelPHP propose, par défaut, de séparer cette partie de la configuration entre mode de développement et mode de production. Nous allons suivre cette démarche, mais sachez qu’il est possible de tout configurer dans le fichier précédent. A l'inverse, il est possible de spécifier des bases de données différentes et d’autres configurations dans les fichiers de configuration développement / production.

Si la configuration n’a pas été modifiée, nous sommes normalement en mode développement. Ouvrez donc le fichier fuel/app/config/development/db.php. Le contenu de base est le suivant :

return array(
	'default' => array(
		'connection'  => array(
			'dsn'        => 'mysql:host=localhost;dbname=fuel_dev',
			'username'   => 'root',
			'password'   => 'root',
		),
	),
);

Cette configuration est adaptée au type de connexion PDO. Il faut l’adapter au type MySQL et à vos propres informations de connexion. Remplacez par le code ci-dessous en modifiant votre identifiant et votre mot de passe :

return array(
	'default' => array(
		'connection'  => array(
		    'hostname'   => 'localhost',
		    'database'   => 'tuto_agenda',
			'username'   => 'IDENTIFIANT',
			'password'   => 'MOT DE PASSE',
		),
	),
);

La configuration de la base de données est normalement maintenant terminée. Il est temps de passer à la création de l'agenda.

 

Le principe

1. Génération de code par Scaffold

Nous allons maintenant générer un code de base, qui va nous permettre d’avoir un aperçu du fonctionnement de FuelPHP. Il existe, dans beaucoup de frameworks (comme Rails), la possibilité de générer du code via Scaffold. Ce code permet de gérer les actions de base d’un objet (visualisation, création, modification, suppression - CRUD en anglais). C’est l’idéal pour avoir une base de développement !

Beaucoup d’opérations peuvent s’effectuer sous FuelPHP avec le script Oil (remarquez fuel / oil). Ce script permet notamment de générer des migrations, des modèles, des contrôleurs... et le scaffolding.

Un agenda contient notamment une partie où il est possible de gérer des notes, qui contiennent un titre et une description. Nous allons générer le code via la ligne de commande suivante (après s’être rendu dans le répertoire root du projet) :

php oil generate scaffold/crud notes titre:string description:text

Vous pouvez remarquer que l’écriture de cette ligne de commande est assez simple :

php oil generate scaffold/crud <NOM DE LA TABLE> <ATTRIBUT>:<TYPE> <ATTRIBUT>:<TYPE> <ATTRIBUT>:<TYPE>...

Notez que l'extension scaffold/crud indique que l'on souhaite utiliser la structure CRUD. Oil peut générer du code suivant d'autres structure (comme orm). La différence se fera notamment voir au niveau du code généré dans les modèles (qui n'étenderont pas les mêmes classes).

Lorsque la commande est exécutée, Oil nous indique l’ensemble des fichiers qui ont été modifiés :

Vous pouvez voir qu’il y en a un certain nombre :

  • fuel/app/classes/model/note.php : le modèle associé aux notes
  • fuel/app/migrations/001_create_notes.php : le fichier migration, qui nous permettra de migrer la base de donnée en créant la table notes.
  • fuel/app/classes/controller/notes.php : le contrôleur associé aux notes
  • tous les fichiers dans fuel/app/views/notes/ qui sont les vues associées aux actions
  • fuel/app/views/template.php qui est la vue implémentant la structure de la page

 

2. Migration de la base de données

Si le fichier migration a bel et bien été généré, la table n’a pas été créée pour autant. Il y a dans Oil une commande permettant d’éxécuter ces fichiers migration.

php oil refine migrate

Oil permet une liberté beaucoup plus grande au niveau des migrations, nous y reviendrons plus tard.

Une fois la commande executée, vous pouvez voir que la base de données n’est plus vide. Elle contient maintenant deux tables :

Il y a la table migration, qui enregistre quelles migrations ont été effectuées. Nous y reviendrons plus tard.

Il y a ensuite la table notes que nous voulions créer. Jetons un coup d’œil à la structure :

A partir des deux colonnes que nous avons spécifiées à Oil pour le scaffold (titre et description), il en a généré cinq :

  • id : identifiant de la note avec son index primary associé
  • titre : le titre de la note. Nous avons spécifié un type string, vous savez maintenant que l’équivalence MySQL est varchar(255)
  • description : la description de la note
  • created_at : date de création de la note. Est gérée par défaut dans le modèle.
  • updated_at : date de modification de la note. Est gérée par défaut dans le modèle.

A noter qu’il est possible de désactiver la création des colonnes created_at et updated_at en éditant le fichier de migration (si vous générez le modèle via generate model, il y a aussi l’option --no-timestamp, mais pour le moment elle ne semble pas prise en compte pour le scaffolding).

La présence de ces colonnes n’est pas gênante et sera probablement utile, donc laissons les.

 

3. Aperçu

La page d’accueil n’a toujours pas changé, mais il est possible maintenant d’accéder aux notes via l’adresse suivante (si vous avez suivi l’installation de Julian) :

http://localhost/mon_site_fuel/public/notes si la redirection est activée
http://localhost/mon_site_fuel/public/index.php/notes sinon

Le tout doit normalement ressembler à :

Liste des notes

Création / édition d'une note

Vue d'une note

Le code généré gère même les notifications :

Après mise à jour d'une note

4. Le code généré

Maintenant que le système fonctionne, nous pouvons jeter un coup d’œil au code généré.

Le scaffold a généré un modèle, situé dans fuel/app/classes/model/note.php qui contient :

<?php
class Model_Note extends Model_Crud
{
	protected static $_table_name = 'notes';
	
	public static function validate($factory)
	{
		$val = Validation::forge($factory);
		$val->add_field('titre', 'Titre', 'required|max_length[255]');
		$val->add_field('description', 'Description', 'required');

		return $val;
	}

}

Le contenu est assez simple, car notre modèle étend la classe Model_Crud, qui contient déjà les fonctions de bases, nous permettant de manipuler l’objet dans le code. Il y a une seule variable, $_table_name qui, comme son nom l’indique, définit le nom de la table associée au modèle. Il y a aussi une fonction, validate, qui permet d'imposer des conditions lors de la sauvegarde d'un élément. Par exemple, lors de la sauvegarde d'une note, le titre ne doit pas être vide et sa longueur ne doit pas dépasser 255 caractères. La description elle aussi ne doit pas être vide. Il est possible d'avoir dans ce domaine un degré beaucoup plus grand de liberté, nous y reviendrons plus tard.

Le scaffold a aussi généré un contrôleur, situé dans fuel/app/classes/controller/notes.php, qui contient (j’ai résumé certaines actions) :

<?php
class Controller_Notes extends Controller_Template 
{

	public function action_index()
	{
		$data['notes'] = Model_Note::find_all();
		$this->template->title = "Notes";
		$this->template->content = View::forge('notes/index', $data);

	}

	public function action_view($id = null)
	{
		$data['note'] = Model_Note::find_by_pk($id);

		$this->template->title = "Note";
		$this->template->content = View::forge('notes/view', $data);

	}

	public function action_create($id = null)
	{
		//...
	}

	public function action_edit($id = null)
	{
		//...
	}

	public function action_delete($id = null)
	{
		//...

	}


}

On peut voir que le contrôleur est composé de cinq fonctions, commençant toutes par action_. Il s’agit des actions du contrôleur. Si, par exemple, vous vous rendez sur :

http://localhost/mon_site_fuel/public/notes/create ou
http://localhost/mon_site_fuel/public/index.php/notes/create sans redirection

C’est la fonction action_create qui sera appelée dans le contrôleur.

Quant à l’adresse :
http://localhost/mon_site_fuel/public/notes/
elle est équivalente (par défaut) à l’adresse :
http://localhost/mon_site_fuel/public/notes/index
Donc appelera bien l’action action_index.

Analysons la fonction action_index (qui, comme vous pouvez le déduire de l’adresse, liste l’ensemble des notes qui ont été créées) :

  • La première ligne charge l’ensemble des notes grâce à la fonction statique find_all. Cette fonction peut bien sûr recevoir d’autres paramètres, je vous invite à consulter la documentation associée.
  • La seconde et la troisième lignes modifient toutes les deux des attributs de $this->template, un attribut title (qui est vraisemblablement le titre de la page) et un attribut content, auquel est affectée la vue. Je reviendrai un peu plus tard sur cette affectation.

L’objet qui a été modifié est l’instanciation d’un template (qui est la structure de la page). Pour faire court, les attributs de cet objet vont pouvoir être récupérés par le template. Ce template a lui aussi été généré via le scaffold. Il est présent dans l’adresse fuel/app/views/template.php. Son contenu est le suivant (j’ai résumé le style pour plus de lisibilité) :

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title><?php echo $title; ?></title>
	<?php echo Asset::css('bootstrap.css'); ?>
	<style>
		body { margin: 40px; }
	</style>
</head>
<body>
	<div class="container">
		<div class="row">
			<div class="span16">
				<h1><?php echo $title; ?></h1>
				<hr>
<?php if (Session::get_flash('success')): ?>
				<div class="alert-message success">
					<p>
					<?php echo implode('</p><p>', (array) Session::get_flash('success')); ?>
					</p>
				</div>
<?php endif; ?>
<?php if (Session::get_flash('error')): ?>
				<div class="alert-message error">
					<p>
					<?php echo implode('</p><p>', (array) Session::get_flash('error')); ?>
					</p>
				</div>
<?php endif; ?>
			</div>
			<div class="span16">
<?php echo $content; ?>
			</div>
		</div>
		<footer>
			<p class="pull-right">Page rendered in {exec_time}s using {mem_usage}mb of memory.</p>
			<p>
				<a href="http://fuelphp.com">FuelPHP</a> is released under the MIT license.<br>
				<small>Version: <?php echo e(Fuel::VERSION); ?></small>
			</p>
		</footer>
	</div>
</body>
</html>

Ainsi, la valeur de l’attribut $this->template->title est accessible via la variable $title dans le template. Si on modifie dans action_index :

$this->template->title = "Mes notes";

Lorsqu’on se rendra de nouveau sur http://localhost/mon_site_fuel/public/notes/, le titre aura été modifié :

Sachez qu’il est possible de modifier tous les attributs de $this->template (comme $this->template->description par exemple). Cet attribut sera alors accessible en tant que variable ($description) dans le template. Il est aussi possible de changer de template, nous y reviendrons plus tard.

Revenons au contrôleur, la dernière affectation, comme je le disais, affecte le contenu de la vue :

$this->template->content = View::forge('notes/index', $data);

View::forge retourne la vue située dans fuel/app/views/notes/index.php avec les variables définies dans $data. Jetons un coup d’oeil à ce fichier :

<h2>Listing Notes</h2>
<br>
<?php if ($notes): ?>
<table class="zebra-striped">
	<thead>
		<tr>
			<th>Titre</th>
			<th>Description</th>
			<th></th>
		</tr>
	</thead>
	<tbody>
<?php foreach ($notes as $note): ?>		<tr>

			<td><?php echo $note->titre; ?></td>
			<td><?php echo $note->description; ?></td>
			<td>
				<?php echo Html::anchor('notes/view/'.$note->id, 'View'); ?> |
				<?php echo Html::anchor('notes/edit/'.$note->id, 'Edit'); ?> |
				<?php echo Html::anchor('notes/delete/'.$note->id, 'Delete', array('onclick' => "return confirm('Are you sure?')")); ?>

			</td>
		</tr>
<?php endforeach; ?>	</tbody>
</table>

<?php else: ?>
<p>No Notes.</p>

<?php endif; ?><p>
	<?php echo Html::anchor('notes/create', 'Add new Note', array('class' => 'btn success')); ?>

</p>

La fonction View::forge retourne donc le contenu du fichier executé en PHP avec les variables définies dans $data. Ainsi $data[‘notes’] est accessible via la variable $notes dans la vue index.php.

On peut remarquer au passage dans le fichier de nombreux appels à la fonction Html::anchor. Il s’agit d’un helper, c’est à dire d’une fonction retournant des bouts de code en Html. Dans ce cas ci il s’agit d’un lien, avec comme classes css btn success :

<?php echo Html::anchor('notes/create', 'Add new Note', array('class' => 'btn success')); ?>

est équivalent à

<a class="btn success" href="http://localhost/mon_site_fuel/public/notes/create">Add new Note</a>

Il est parfaitement possible de s’en passer et d’écrire ce code HTML directement. Html::anchor permet cependant de se simplifier la vie (vous pouvez voir qu’il écrit l’url complète), et l’utilisation d’helpers de manière générale permet d’améliorer la maintenabilité (on peut imaginer faire une surcouche à Html::anchor pour passer de liens directs à des requêtes en ajax par exemple, le tout en ne modifiant qu’un seul bout de code).

La fonction Html::anchor supporte d’autres paramètres. Je vous invite à consulter la documentation associée.

Pour résumer :

  • Lorsqu’un utilisateur se rend dans une adresse d’un site fuelPHP
    http://localhost/mon_site_fuel/public/notes/
  • Une fonction du contrôleur notes est appelée (le cas présent action_index)
  • Cette fonction charge les variables qui lui sont nécessaires, affecte les attributs de $this->template (que ce soit directement une chaine de caractère ou le retour d’un View::Forge)
  • Le template est affiché à l’utilisateur

Si vous avez eu l’occasion d’utiliser d’autres framework, vous avez probablement remarqué qu’il n’est souvent pas nécessaire de spécifier la vue dans l’action. Par exemple dans l’action action_index :

public function action_index()
{
	$data['notes'] = Model_Note::find_all();
	$this->template->title = "Mes notes";
	$this->template->content = View::forge('notes/index', $data);

}

Il n’est pas là nécessaire de définir $this->template->title, ni $this->template->content (pour chaque action, une vue est attibuée par défaut). Cette politique permet de limiter les répétitions dans le code.

Avec FuelPHP, ce comportement n’est pas disponible par défaut mais, grâce à la fonction after, que nous verrons plus tard, il est possible de l’imiter. C’est donc avant tout une force du framework, qui laisse une liberté plus grande au niveau des templates.

 

5. Paramètres et actions

Le traitement des paramètres dans les actions est un point important, car il va vous permettre notamment d’interagir avec l’internaute.

a. Via les paramètres d’une action

Jetons un coup d’oeil à l’action action_view (qui permet de visualiser une note en particulier) dans le contrôleur notes :

public function action_view($id = null)
{
	$data['note'] = Model_Note::find_by_pk($id);

	$this->template->title = "Note";
	$this->template->content = View::forge('notes/view', $data);

}

On peut remarquer la présence d’un paramètre dans la déclaration, contrairement à action_index. Lorsqu’on fait appel à l’action action_view, c’est qu’on veut charger une note en particulier, que l’on récupère grâce à l’identifiant.

Ainsi, lorsque l’utilisateur accédera à l’adresse :
http://localhost/mon_site_fuel/public/notes/view/1

 La fonction action_view sera appelée avec comme paramètre $id = 1. Il est parfaitement possible de multiplier le nombre de paramètres.

b. Via la classe Input

Si vous jetez un coup d’œil à la fonction action_create, vous pouvez remarquer la présence de Input::post.

Input::post et Input::get permettent de récupérer les valeurs $_POST et $_GET respectivement. Je vous invite à consulter la documentation associée.

 

6. Les partials

Si vous consultez les fichiers vues fuel/app/views/notes/edit.php et fuel/app/views/notes/create.php, vous remarquez une ligne en commun dans les deux fichiers :

<?php echo render('notes/_form'); ?>

Ils incluent tous les deux un partial, c’est à dire un bout de vue. En effet, si on compare le formulaire de création et d’édition, les deux vues sont très similaires. Elles font donc appel toutes les deux à un même partial (bout de vue), reprenant le formulaire. L’appel à des partials permet de limiter la répétition du code et donc d’améliorer la maintenabilité d’un logiciel. A utiliser tant que possible !

La fonction render permet donc de renvoyer le contenu executé d’un partial, dans notre cas fuel/app/views/notes/_form.php. Voici le contenu :

<?php echo Form::open(array('class' => 'form-stacked')); ?>

	<fieldset>
		<div class="clearfix">
			<?php echo Form::label('Titre', 'titre'); ?>

			<div class="input">
				<?php echo Form::input('titre', Input::post('titre', isset($note) ? $note->titre : ''), array('class' => 'span6')); ?>

			</div>
		</div>
		<div class="clearfix">
			<?php echo Form::label('Description', 'description'); ?>

			<div class="input">
				<?php echo Form::textarea('description', Input::post('description', isset($note) ? $note->description : ''), array('class' => 'span10', 'rows' => 8)); ?>

			</div>
		</div>
		<div class="actions">
			<?php echo Form::submit('submit', 'Save', array('class' => 'btn primary')); ?>

		</div>
	</fieldset>
<?php echo Form::close(); ?>

A noter qu’on accède à la variable $note. En effet, cette variable est accessible car dans l'action edit on peut voir cette ligne :

$this->template->set_global('note', $note, false);

Cette variable est affectée au template en tant que globale et est donc accessible à toutes les vues, sans avoir à la passer dans leurs paramètres. Ce comportement peut être pratique si on a une variable qu'on veut accéder partout (comme l'utilisateur enregistré en session ou une configuration globale), mais est peu recommandée pour les autres cas car elle réduit la lisibilité du code.

Le partial fait notamment appel à la classe helper Form, qui permet d’instancier un formulaire et des champs en HTML. Je vous invite à consulter la documentation associée.

 

J'espère que cet article vous a permis de vous lancer sur FuelPHP. N'hésitez pas à me contacter en commentaire ou sur Twitter si vous avez des questions. Dans un article prochain, nous passerons à l'action ! Avec les connaissances acquises dans cet article, nous finaliserons notre agenda en améliorant l'affichage, en organisant un menu, en complexifiant notre modèle de données et, enfin, en mettant en place un système d'authentification.

https://fuelphp.com/blog/2011/12/version-1-1-finally-lands
Catégorie :FuelPHP
42 commentaires
  • Commentaire par Indyana
    Jeudi 15 décembre 2011 10:01
    Excellent article qui donne envie d'essayer le Framework. Fuel semble gommer les défauts de ses prédécesseurs, j’attends la suite de votre tuto pour me faire une idée.
  • Commentaire par Indyana
    Samedi 17 décembre 2011 23:09
    Aie, tuile. j'ai essayé le tuto, mais il semble qu'il ne soit déjà plus à jour ou alors j'ai raté une étape : j’obtiens une erreur lors de l'accès à la page /note:

    ErrorException [ Error ]: Class 'Orm\Model' not found

    Lorsque je compare la classe Model/note.php à celle indiquée dans le tuto, on est loin d'avoir le même code (cf ci desssous). Tuto pas à jour ou mauvaise manip de ma part?


    [code]
    use Orm\Model;

    class Model_Note extends Model
    {
    protected static $_properties = array(
    'id',
    'titre',
    'description',
    'created_at',
    'updated_at',
    );

    protected static $_observers = array(
    'Orm\Observer_CreatedAt' => array(
    'events' => array('before_insert'),
    'mysql_timestamp' => false,
    ),
    'Orm\Observer_UpdatedAt' => array(
    'events' => array('before_save'),
    'mysql_timestamp' => false,
    ),
    );

    public static function validate($factory)
    {
    $val = Validation::forge($factory);
    $val->add_field('titre', 'Titre', 'required|max_length[255]');
    $val->add_field('description', 'Description', 'required');

    return $val;
    }

    }

    [/code]
  • Commentaire par Sébastien
    Dimanche 18 décembre 2011 13:00
    En effet, le tutoriel n'est déjà plus à jour ! Fuelphp est très récemment passé de la version v1.1rc1 à la version v1.1, et des changement majeurs ont eu lieu. Je ne manquerai pas de modifier le tutoriel très prochainement...

    Pour que vous puissiez continuer à découvrir FuelPHP, je vous donne la solution : il suffit de se rendre dans le fichier fuel/app/config/config.php, de trouver la ligne :
    'packages' => array(
    et de décommenter (ou rajouter) 'orm'... Vous devriez obtenir quelque chose comme ça :
    'packages' => array(
    'orm',
    ),

    Je pense que ce package devrait être inclu par défaut, le code généré par oil fait appel à ce package, et on en a besoin si on veut utiliser les modèles. Je vais le proposer à l'équipe de FuelPHP.

    Merci en tout cas de m'avoir signalé le problème !
  • Commentaire par Sébastien
    Mardi 20 décembre 2011 15:15
    L'article a été mis à jour par rapport à la nouvelle version de FuelPHP v1.1. Il devrait maintenant être possible de suivre ce tutoriel sans problèmes. Merci encore à Indiyana !
  • Commentaire par mans
    Jeudi 29 décembre 2011 18:35
    Merci pour ce tuto.
    On espère une suite bientôt.
  • Commentaire par Sébastien
    Mercredi 4 janvier 2012 16:03
    Merci à tous de votre intérêt. La suite vient de paraître dans un nouvel article. Encore une fois, n'hésitez pas à réagir.
  • Commentaire par Richard
    Vendredi 24 février 2012 16:20
    Bonjour,

    Merci pour ce tutorial. Je suis à la recherche d'un framework et les avis sur FuelPHP m'ont poussés à le tester. Malheureusement, je me retrouve un message d'erreur lors de la migration. J'ai réessayé plusieurs fois (port mysql, password, ...) sans succés. Ci-dessous un descriptif.

    Ma configuration (que j'utilise depuis un bon moment pour d'autres sites)
    --------------------------------------------------------------------------------------

    WINDOWS
    version: 7

    UWAMP
    version: 2.1

    APACHE
    version: 2.2.17 (Win32)
    virtualhost:
    <VirtualHost *:80>
    DocumentRoot "F:/UwAmp/www/fuelphp-demo/public/"
    ServerName "fuelphp-demo.local"
    </VirtualHost>

    PHP
    version 5.3.5
    Path: F:\UwAmp\bin\php\php-5.3.5

    MySQL
    version 5.5.9
    port: 3306

    Téléchargement et installation de FuelPHP version 1.1

    Configuration de la base de données
    --------------------------------------------

    F:\UwAmp\www\fuelphp-demo\fuel\app\config\db.php :
    <?php
    return array(
    'active' => 'default',

    /**
    * Base config, just need to set the DSN, username and password in env. config.
    */
    'default' => array(
    'type' => 'mysql',
    'connection' => array(
    'persistent' => false,
    ),
    'identifier' => '`',
    'table_prefix' => '',
    'charset' => 'utf8',
    'caching' => false,
    'profiling' => false,
    ),

    'redis' => array(
    'default' => array(
    'hostname' => '127.0.0.1',
    'port' => 3306,
    )
    ),

    );


    F:\UwAmp\www\fuelphp-demo\fuel\app\config\development\db.php
    <?php
    return array(
    'default' => array(
    'connection' => array(
    'hostname' => 'localhost',
    'database' => 'fuelphp_agenda',
    'username' => 'root',
    'password' => 'myPassword',
    ),
    ),
    );

    Génération de code par Scaffold
    ------------------------------------------

    php oil generate scaffold/crud notes titre:string description:text

    Creating migration: F:\UwAmp\www\fuelphp-demo\fuel\app\migrations/001_create_notes.php
    Creating model: F:\UwAmp\www\fuelphp-demo\fuel\app\classes/model/note.php
    Creating controller: F:\UwAmp\www\fuelphp-demo\fuel\app\classes/controller/notes.php
    Creating view: F:\UwAmp\www\fuelphp-demo\fuel\app\views/notes/index.php
    Creating view: F:\UwAmp\www\fuelphp-demo\fuel\app\views/notes/view.php
    Creating view: F:\UwAmp\www\fuelphp-demo\fuel\app\views/notes/create.php
    Creating view: F:\UwAmp\www\fuelphp-demo\fuel\app\views/notes/edit.php
    Creating view: F:\UwAmp\www\fuelphp-demo\fuel\app\views/notes/_form.php
    Creating view: F:\UwAmp\www\fuelphp-demo\fuel\app\views/template.php

    php oil refine migrate
    Error - Call to undefined function Fuel\Core\mysql_connect() in COREPATH/classes/database/mysql/connection.php on line 96

    Merci d'avance.

    Richard
  • Commentaire par Richard
    Vendredi 24 février 2012 17:00
    J'ai fini par résoudre le problème.

    F:\UwAmp\www\fuelphp-demo\fuel\app\config\db.php :
    return array(
    'active' => 'default',

    /**
    * Base config, just need to set the DSN, username and password in env. config.
    */
    'default' => array(
    'type' => 'mysql',
    'connection' => array(
    'persistent' => false,
    ),
    'identifier' => '`',
    'table_prefix' => '',
    'charset' => 'utf8',
    'caching' => false,
    'profiling' => false,
    ),

    'redis' => array(
    'default' => array(
    'hostname' => '127.0.0.1',
    'port' => 6379,
    )
    ),

    );

    F:\UwAmp\www\fuelphp-demo\fuel\app\config\development\db.php

    return array(
    'default' => array(
    'connection' => array(
    'hostname' => 'localhost',
    'database' => 'fuelphp_agenda',
    'username' => 'root',
    'password' => 'mysql-password',
    ),
    ),
    );


    return array(
    'default' => array(
    'connection' => array(
    'hostname' => 'localhost',
    'database' => 'fuelphp_agenda',
    'username' => 'root',
    'password' => 'maintenance-Oss974',
    ),
    ),
    );

    Récupérer le chemin d'accès du php.ini en faisant un phpinfo (Loaded Configuration File: F:\UwAmp\bin\apache\php.ini).

    F:\UwAmp\www\fuelphp-demo>php -c F:\UwAmp\bin\apache\php.ini oil generate scaffold/crud notes titre:string description:text -f

    F:\UwAmp\www\fuelphp-demo>php.exe -c F:\UwAmp\bin\apache\php.ini oil refine migrate

    Je peux poursuivre le tuto.
  • Commentaire par Sébastien
    Lundi 27 février 2012 14:34
    Bonjour,

    Désolé du retard de la réponse, mais je vois que vous avez réussi à vous en sortir tout seul. Merci en tout cas de nous fournir la solution qui a fonctionné pour vous !

    Donc si j'ai bien compris, vos fichiers de configuration sont au final similaires à ceux du tutoriel (excepté le mot de passe biensûr). Vous avez utilisé lors de l'execution un fichier php.ini différent, qui doit être propre à votre configuration de serveur. Je n'ai pas eu besoin d'une telle manipulation avec php sur ubuntu en tout cas. Je ne sais pas si cette manipulation est nécéssaire pour tous les utilisateurs de windows, mais celà reste une piste intéressante.

    N'hésitez pas à poser d'autres questions si vous rencontrez d'autres problèmes.
  • Commentaire par ghanmi
    Mardi 28 février 2012 16:01
    un débutant
    j'ai commencé la découverte à 13 h il est 15 h j'ai déjà appliqué le tuto sur un hébergement mutualisé

    c'est encourageant

    il approfondir
  • Commentaire par Sébastien
    Mardi 28 février 2012 17:35
    Je suis content que ce tutoriel vous ait permis de débuter dans FuelPHP, celà veut dire que l'objectif a été atteint, au moins pour vous :). N'hésitez pas à poser une question ici où dans la suite si vous rencontrez des problèmes.
  • Commentaire par Nico
    Dimanche 4 mars 2012 10:11
    Bonjour,

    merci pour le tuto, il me tarde de lire la suite :)

    C'est normal que les requêtes ne soient pas comptabilisées / visibles dans le profiler ?
  • Commentaire par Sébastien
    Lundi 5 mars 2012 10:24
    Bonjour,

    Pour les autres lecteurs, en effet, il est possible d'activer un profiler donnant diverses informations telles que le temps de chargement de la page, le nombre de fichiers et les fichiers de configuration chargés, ou les paramètres envoyés via session / POST / GET.

    Ce profiler peut être activé en changeant l'élément "profiling" à true dans le fichier fuel/app/config/config.php.

    Simplement, le profiling des requêtes dans la base de données n'est pas activé par défaut. Il faut pour cela se rendre dans le fichier fuel/app/config/db.php et activer ici aussi l'élément "default" => "profiling" à true.

    J'éspère qu'il s'agissait bien de votre problème :). N'hésitez pas à poser d'autres questions ou signaler d'autres problèmes si vous en avez :).
  • Commentaire par Nico
    Lundi 12 mars 2012 02:07
    Bonjour,

    OK merci Sébastien !
  • Commentaire par JArode
    Dimanche 22 avril 2012 14:47
    Bonjour,

    Pas possible de faire le tuto sans ligne de commande ? :/

    Merci !
  • Commentaire par Sébastien
    Lundi 23 avril 2012 11:43
    Bonjour,

    Je vous conseille fortement de passer par la console, au lieu de créer directement vos propres fichiers. En effet, vu que la génération est automatique, l'intérêt est de commencer sur une base stable.

    Cependant, je vous donne accès à ces fichiers au cas où vous rencontriez des problèmes avec la ligne de commande. N'oubliez pas de copier ces fichiers aux bons emplacements :

    http://www.novius-labs.com/data/document/tutoriel-3.zip

    Merci et bonne journée ! N'hésitez pas à poser d'autres questions :).
  • Commentaire par Jarode
    Lundi 23 avril 2012 14:10
    Merci beaucoup !

    Autre chose, généralement les frameworks (CodeIniter, CakePHP...) proposent comme tutorial la réalisation d'un blog minimaliste. Je pense que ça aurait été mieux de suivre le pas et de proposer un tuto "blog" avec FuelPHP pour que l'on puisse juger Fuel PHP en comparant la réalisation d'un même projet (=Blog) sous différents frameworks.
    Merci encore pour la doc et les tutoriaux que vous fournissez sur FuelPHP, dans la langue de Molière vous êtes leader sur le sujet !

    ;)
  • Commentaire par Jarode
    Lundi 14 mai 2012 19:27
    Version: FuelPHP 1.2 RC1

    Erreur rencontrée:
    # php oil refine migrate
    1046 - No database selected [ CREATE TABLE IF NOT EXISTS `migration` (
    `type` varchar(25) NOT NULL,
    `name` varchar(50) NOT NULL,
    `migration` varchar(100) DEFAULT '' NOT NULL
    ) DEFAULT CHARACTER SET utf8; ] in COREPATH/classes/database/mysql/connection.php on line 220

    Solution:
    Pour régler ce problème il faut garder le 'type' à 'pdo', dans fuel/app/config/db.php et ne pas le changer pour mysql (contrairement à ce qui est proposé sur le tuto).
  • Commentaire par Sébastien
    Mardi 15 mai 2012 09:54
    Bonjour,

    Etrange, je viens de tester sur la branche 1.2 de FuelPHP et ça marche toujours.

    A noter qu'il faut bien modifier deux fichiers db.php : un dans fuel/app/config et l'autre dans fuel/app/config/development (ou votre environnement sélectionné).

    En cherchant un peu j'ai réussi à trouver à ce qui pourrait être à l'origine de votre problème. La structure du tableau dans fuel/app/config/development/db.php doit être modifiée conformément à ce qui a été écrit dans le tutoriel.

    De :

    return array(
    'default' => array(
    'connection' => array(
    'dsn' => 'mysql:host=localhost;dbname=fuel_dev',
    'username' => 'root',
    'password' => 'root',
    ),
    ),
    );

    A :

    return array(
    'default' => array(
    'connection' => array(
    'hostname' => 'localhost',
    'database' => 'tuto_agenda',
    'username' => 'IDENTIFIANT',
    'password' => 'MOT DE PASSE',
    ),
    ),
    );

    Le contenu de dsn est séparé en deux clés hostname et database. Si je n'effectue pas cette séparation, j'obtiens une erreur similaire à la votre lors de la migration (1046 - No database selected...).

    J'espère que ma réponse est satisfaisante. N'hésitez pas à poser d'autres questions :).
  • Commentaire par Jarode
    Mardi 15 mai 2012 14:58
    Bonjour Sébastien,

    Je ne sais pas ce que j'ai fait mais j'ai re-regardé la config et j'ai 'pdo' et pourtant ça fonctionne bien.
    Je met ça sur le compte de la fatigue... :-/
    Désolé de vous avoir fait perdre votre temps à essayer de comprendre ce qui ne pouvait pas être compris.

    ++
  • Commentaire par djik
    Jeudi 5 juillet 2012 17:32
    Bonjour,

    Le coeur du projet est générer par Scaffold. Mais comment ça marche ?

    J'utilise un PC vista avec wamp et l'invité de commande me jette, lorsque je lance la commande.
    Existe il un tutoriel pour les débutants avec le (Scaffold )? Ou existe il une méthode manuelle pour utiliser fuelPHP ?

    Merci
  • Commentaire par Drouyer
    Samedi 7 juillet 2012 13:05
    Bonjour,

    Quel est exactement le message d'erreur affiché ?

    Merci,
  • Commentaire par djik
    Lundi 20 août 2012 12:37
    Bonjour,

    Je suis en train de faire mes premières armes sur le Framework FuelPHP. J’ai installé et suivi les tutoriels suivants (http://www.novius-labs.com/quel-framework-choisir-nous-votons-fuelphp,29.html). J’ai réalisé l’agenda standard.

    Je souhaiterai faire maintenant étendre une classe du Core de FuelPHP, pour me permettre de définir mes propres méthodes :
    J’ai suivi l’exemple suivant avec la classe Lang : http://docs.fuelphp.com/general/extending_core.html

    Dans la classe enfant Lang, j’ai créé une méthode test :
    <?php
    class Lang extends Fuel\Core\Lang {

    public static function test(){
    return 'test';
    }

    }

    J’ai modifier la fonction View de mon objet Note, pour tester l’extension de classe :
    public function action_view($id = null)
    {
    echo Lang::test();
    $this->data['note'] = Model_Note::find_by_pk($id);

    }

    Au moment où, je lance ma page, j’ai l’erreur suivante :

    ErrorException [ Error ]: Call to undefined method Fuel\Core\Lang::test()

    Je ne comprends mon erreur pouvez vous m’aider ?

    Auriez vous un retour d'expérience sur l'extension de classe, ou un futur tutoriel en prévision ?

    Merci
  • Commentaire par ESPERAT Julian
    Lundi 20 août 2012 14:11
    Bonjour djik,

    Il faut bien enregistrer la nouvelle classe dans l'Autoloader de FuelPHP. Cette procédure se déroule dans le fichier bootstrap.php de l'application. Si le fichier n'existe pas, il faut le créer.

    Ce fichier bootstrap.php est exécuté par Fuel lorsqu'il existe, et ainsi la classe Lang étendue sera utilisé à la place de celle de Fuel.

    Cordialement.
  • Commentaire par djik
    Lundi 20 août 2012 14:38
    Re

    Je l'ai déjà fait. J'ai vraiment suivi à la lettre le manuel qui se trouve dans la documentation.

    Autoloader::add_classes(array(
    'Lang' => APPPATH.'classes/lang.php',
    ));

    et le fichier enfant se trouve dans app/classes/lang.php

    Je viens de tester la surcharge de la méthode _init(), mais le problème persiste.

    D'autres idées ?
  • Commentaire par ESPERAT Julian
    Lundi 20 août 2012 15:06
    Malheureusement, non je n'ai pas vraiment d'autre idée...


    Simplement tout revérifier et ajouter du debug pour permettre de tracer l'errreur :

    - Revérifier que le fichier bootstrap.php ressemble bien à ceci : https://github.com/fuel/fuel/blob/1.2/master/fuel/app/bootstrap.php#L13

    Une possibilité : la classe 'Lang' est déjà chargée auparavant, rendant l'appel à Autoloader::add_classes() inopérant. Il faudrait essayer de rajouter du debug pour tester ça :
    \Debug::dump(class_exists('Lang', false)); // Juste après Autoload::register();
  • Commentaire par djik
    Lundi 20 août 2012 17:15
    Je viens de tous recommencer depuis le début.
    Toute la procédures est suivi à la lettre

    fuel/app/classes/lang.php :
    <?php
    class Lang extends Fuel\Core\Lang {
    public static function _init(){
    Debug::dump('Lang is alive');
    }
    }

    fuel/app/bootstrap.php:
    <?php

    // Load in the Autoloader
    require COREPATH.'classes'.DIRECTORY_SEPARATOR.'autoloader.php';
    class_alias('Fuel\\Core\\Autoloader', 'Autoloader');

    // Bootstrap the framework DO NOT edit this
    require COREPATH.'bootstrap.php';


    Autoloader::add_classes(array(
    // Add classes you want to override here
    // Example: 'View' => APPPATH.'classes/view.php',
    'Lang' => APPPATH.'classes/lang.php',
    ));

    // Register the autoloade
    Autoloader::register();
    var_dump(file_exists(APPPATH.'classes/lang.php'));
    Debug::dump(class_exists('Lang', false));

    /**
    * Your environment. Can be set to any of the following:
    *
    * Fuel::DEVELOPMENT
    * Fuel::TEST
    * Fuel::STAGE
    * Fuel::PRODUCTION
    */
    Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);

    // Initialize the framework with the config file.
    Fuel::init('config.php');

    fuel/app/classes/controller/notes.php:
    <?php

    class Controller_Notes extends Controller_Template
    {

    public function action_index()
    {
    Lang::_init();
    $data['notes'] = Model_Note::find_all();
    $this->template->title = "Notes";
    $this->template->content = View::forge('notes/index', $data);

    }
    }

    Y'a du changement, mais je capte pas tout :

    - Le debug du fichier bootstrap.php retourne FALSE.
    - Le var_dump du fichier bootstrap.php retourne TRUE.
    - Le message "Lang is alive" apparait 2 fois sur ma page index (note) alors que j'appelle ma fonction 1 fois. Why ?

    Merci
  • Commentaire par ESPERAT Julian
    Lundi 20 août 2012 18:58
    Donc ça fonctionne ! :)

    Le message s'affiche 2 fois tout simplement parce que l'appel à Lang::_init() est implicite et se fait automatiquement lorsque la classe Lang est chargée.

    L'appel explicite depuis le controller exécute donc une 2e fois la méthode/
  • Commentaire par djik
    Mardi 4 septembre 2012 11:49
    Bonjour,

    Je sais que la vue par défaut est Template.php.
    Je souhaiterai segmenter ce template en plusieurs fichiers (header.php, menu.php, content.php et footer.php).

    Par contre, mes différents fichiers (header, ...), je les mets où dans mon arborescence ?

    Est ensuite, comment faire pour faire appelle à ces morceaux de layout dans mon template ?


    Merci

    Djik
  • Commentaire par Drouyer
    Mardi 4 septembre 2012 12:29
    Bonjour,

    La template est une vue comme une autre, on peut donc appeler d'autres vues à l'intérieur. Je conseille d'utiliser la fonction render qui est en fait un alias de View::forge. La doc est disponible ici : http://docs.fuelphp.com/classes/view.html#/function_render.

    Pour information, dans la partie suivante de ce tutoriel (http://www.novius-labs.com/tutoriel-fuelphp-4-application-type,38.html), on insère aussi des vues dans le template pour l'affichage du menu.

    Après le placement des fichiers vues est selon la préférence, il est possible de le positionner dans la racine du dossier views, mais si il y a beaucoup de fichiers, je conseille de les positionner dans un dossier views/layout par exemple.

    Merci de votre commentaire. N'hésitez pas à poser plus de questions si nécéssaire :).
  • Commentaire par Phil
    Mercredi 5 septembre 2012 23:56
    Un grand merci pour la grande qualité de ce tuto, dans un français sans fautes. C'est vraiment agréable et très didactique.
    Je fais du joomla depuis longtemps et ce tuto m'a fait comprendre qqes notions importantes.
  • Commentaire par djik
    Lundi 10 septembre 2012 13:41
    Bonjour,

    I come back. En ce moment, je me casse les dents sur les Session.
    Donc j'ai un controller qui crée ma variable :

    public function action_index() { Session::set('id', '12'); }

    Et j'ai un autre Controller qui souhaite la récupérer :

    public function action_index() { $this->template->title = Session::get('id'); $this->template->content = View::forge('workflow/index'); }

    J'ai configurer les sessions dynamiquement. Dès que je change d'objet, ma variable de session devient NULL.

    Avez vous déjà rencontrer ce problème ?

    Merci
  • Commentaire par Drouyer
    Lundi 10 septembre 2012 15:02
    Bonjour,

    Désolé je ne suis pas sûr de bien comprendre votre problème. Notamment, que voulez vous dire par "Dès que je change d'objet" (quel objet) ?

    Merci,
  • Commentaire par djik
    Lundi 10 septembre 2012 16:07
    En faite, j'ai une application avec 2 controllers (welcome et book). Dans ma fonction index de Welcome, je crée une valeur de session.

    Dans la fonction index de Book, je veux afficher cette variable de session.
    Lorsque je veux afficher le contenu de ma variable, j'ai NULL.

    Je comprend pas pourquoi ?
  • Commentaire par Drouyer
    Mercredi 12 septembre 2012 11:55
    Désolé je ne vois pas de raison valable. Je vous invite à poser la question dans le forum de FuelPHP : http://fuelphp.com/forums.
  • Commentaire par Alain
    Mardi 24 décembre 2013 15:41
    Bonjour ...et voilà je suis stoppé
    j'ai suivi les instruction et vérifié que je les ait bien suivies pour générer la bdd mais à l'arrivée pas de de table dans ma base
    CR de la premiere requete
    D:\ExpertWeb\sites\FP1>php oil generate scaffold/crud notes titre:string descrip
    tion:text
    Creating migration: D:\ExpertWeb\sites\FP1\fuel\app\migrations/001_creat
    e_notes.php
    Creating model: D:\ExpertWeb\sites\FP1\fuel\app\classes/model/note.php
    Creating controller: D:\ExpertWeb\sites\FP1\fuel\app\classes/controller/
    notes.php
    Creating view: D:\ExpertWeb\sites\FP1\fuel\app\views/notes/index.php
    Creating view: D:\ExpertWeb\sites\FP1\fuel\app\views/notes/view.php
    Creating view: D:\ExpertWeb\sites\FP1\fuel\app\views/notes/create.php
    Creating view: D:\ExpertWeb\sites\FP1\fuel\app\views/notes/edit.php
    Creating view: D:\ExpertWeb\sites\FP1\fuel\app\views/notes/_form.php
    Creating view: D:\ExpertWeb\sites\FP1\fuel\app\views/template.php

    et cela semble avoir marché, je retrouve tout dans le projet
    MAIS voici le CR de la requete

    D:\ExpertWeb\sites\FP1>php oil refine migrate
    Uncaught exception Fuel\Core\Database_Exception:
    Callstack:
    #0 D:\ExpertWeb\sites\FP1\fuel\core\classes\database\mysql\connection.php(207):
    Fuel\Core\Database_MySQL_Connection->connect()
    #1 D:\ExpertWeb\sites\FP1\fuel\core\classes\database\query.php(287): Fuel\Core\D
    atabase_MySQL_Connection->query(1, 'SELECT * FROM `...', false)
    #2 D:\ExpertWeb\sites\FP1\fuel\core\classes\dbutil.php(621): Fuel\Core\Database_
    Query->execute(NULL)
    #3 D:\ExpertWeb\sites\FP1\fuel\core\classes\migrate.php(595): Fuel\Core\DBUtil::
    table_exists('migration')
    #4 D:\ExpertWeb\sites\FP1\fuel\core\classes\migrate.php(74): Fuel\Core\Migrate::
    table_version_check()
    #5 [internal function]: Fuel\Core\Migrate::_init()
    #6 D:\ExpertWeb\sites\FP1\fuel\core\classes\autoloader.php(364): call_user_func(
    'Migrate::_init')
    #7 D:\ExpertWeb\sites\FP1\fuel\core\classes\autoloader.php(247): Fuel\Core\Autol
    oader::init_class('Migrate')
    #8 [internal function]: Fuel\Core\Autoloader::load('Migrate')
    #9 D:\ExpertWeb\sites\FP1\fuel\core\tasks\migrate.php(223): spl_autoload_call('M
    igrate')
    #10 D:\ExpertWeb\sites\FP1\fuel\core\tasks\migrate.php(151): Fuel\Tasks\Migrate:
    :_run('default', 'app')
    #11 D:\ExpertWeb\sites\FP1\fuel\core\base.php(434): Fuel\Tasks\Migrate->__call('
    run', Array)
    #12 D:\ExpertWeb\sites\FP1\fuel\core\base.php(434): Fuel\Tasks\Migrate->run()
    #13 D:\ExpertWeb\sites\FP1\fuel\packages\oil\classes\refine.php(106): call_fuel_
    func_array(Array, Array)
    #14 [internal function]: Oil\Refine::run('migrate', Array)
    #15 D:\ExpertWeb\sites\FP1\fuel\packages\oil\classes\command.php(125): call_user
    _func('Oil\Refine::run', 'migrate', Array)
    #16 D:\ExpertWeb\sites\FP1\oil(57): Oil\Command::init(Array)
    #17 {main}

    sauriez vous me dire quel est le problème
    Merci et très joyeuses fêtes à tous
  • Commentaire par Gilles FELIX
    Jeudi 26 décembre 2013 00:16
    Je pencherais pour un problème de connexion à la base.
    Le tuto date un peu, il se peut qu'il y ai eu des changements dans la façon de spécifier la base de données. Ou plus simplement que tu es une erreur dans le fichier db.config ?

    T'as pas une erreur plus claire dans les logs FuelPHP ?
  • Commentaire par Alain
    Vendredi 27 décembre 2013 09:17
    Bonjour Gilles
    Merci de ta réponse, je vais creuser dans les logs. Coté accès à la base j'ai eu une erreur car j'utilise "root" local comme utilisateur sans mot de passe et j'ai eu un message clair comme quoi l'authentification avait échoué. çà c'est corrigé, mais maintenant c'est sur l'accès lui même peut-être. Je vais essayer de regarder les autres logs en cherchant un peu. Si je trouve je mettrais un mot sur le tuto. Je suis en version 1.7 de fuel (pas la 2 apparemment elle n'est pas encore tout à fait stable)
    A bientot.
  • Commentaire par Alain
    Lundi 30 décembre 2013 10:30
    Merci pour cet excellent tuto et ces explications claires sur le fonctionnement notamment des render et helper, çà donne vraiment envie de passer à la suite ...
  • Commentaire par kada
    Dimanche 21 décembre 2014 20:20
    tout ceci m'a beaucoup aidé pour se lacer avec fuelphp.
    un grand merci pour l'équipe.
  • Commentaire par Askpte
    Mardi 24 février 2015 23:43
    Bonsoir,

    Même soucis que Alain :

    "D:\ExpertWeb\sites\FP1>php oil refine migrate
    Uncaught exception Fuel\Core\Database_Exception:
    Callstack:"

    Une idée ?
  • Commentaire par Askpte
    Mercredi 25 février 2015 00:38
    J'ai résolu le problème !
    (Je suis sur la version 1.7.2)

    Et mon fichier config/db.php à l'origine ressemble à ça :

    <?php
    /**
    * Use this file to override global defaults.
    *
    * See the individual environment DB configs for specific config information.
    */

    return array(

    );
    ?>

    Il est vierge et moi j'avais mis ce que vous aviez mis dans le tuto et au final j'ai remis ce fichier comme à l’origine et résultat ça marche :)
Laissez votre commentaire :