Joomla! API Framework MVC 1.5 : création d’une application (tuto CRUD)


Joomla! Api

Voici un tutorial pour créer une application “composant” sur Joomla! grâce à la nouvelle API basé sur Joomla framework MVC 1.5

Le gros avantage de la version 1.5 par rapport à la version 1.0, c’est qu’elle propose une API bien mieux construire et rend beaucoup plus agréable le développement d’applications. Le nouveau framework est basé sur le design-pattern MVC bien que la couche modèle est quelque peu inutile, étant donné que Joomla 1.5 ne fonctionne avec rien d’autre que MySQL, cela dit, on a le choix entre les drivers “mysql” ou “mysqli”.

Nous illustrerons une application simple qui saisie des utilisateurs dans une table et qui les affiche sous la forme d’une liste. Cette application nous permettra de voir d’une façon pragmatique la structure des applications Joomla! et les fonctions de base du framework : création d’une classe modèle (ajout, mise à jour, suppression et requêtes en base de données), création d’un controller avec les actions de base (une action pour création et édition et une autre pour le listing), gestion des templates, redirections et notifications des erreurs et succès.

Télécharger Joomla! 1.5.x : Joomla_1.5.15

Télécharger l’application : Joomla! Crud Tutoriel

Voici ci-dessous la hiérarchie de notre application, il s’agit d’un répertoire à créer dans le dossier “components” de Joomla! :

joomla! component hierarchy

Voici le script SQL correspondant à la table “jos_crud_users” qui contient les données :

Voici le premier fichier à créer, “crud.php” il s’agit du fichier d’entrée qui est exécuté dès qu’un utilisateur visite l’application :

Voici maintenant le contrôleur, chaque méthode correspond à une tâche accessible par l’url : “index.php?option=com_crud&task=lamethode”

La couche modèle qui gère les transactions avec la base de données dans le fichiers “models/crud.php” :

Voici un exemple de fichier “View.html.php”, il s’agit de celui de l’écran de listing :

Le template de la vue “edit” :

Le template de la vue “list” :

On pourra également créer un package Joomla! qui automatisera l’installation des fichiers et des tables SQL grâce à un fichier de configuration d’installation “hello.xml” :

Voici des “screenshots” de notre application finale :

Joomla Crud Tuto MVC
List Joomla Tuto MVC

L’application est disponible ici dans cette archive : Tutoriel Joomla! CRUD (installation package)

<?php

// Pas d’accès direct

defined(‘_JEXEC’) or die(‘Restricted access’); ?>

<h1>Edition d’un utilisateur</h1>
<form name=”utilisateur” method=”POST”
action=”<?php echo JRoute::_(‘index.php?option=com_crud&task=save’) ?>”>
<input type=”hidden” name=”user_id” value=”<?php echo $this->data->user_id ?>” />
<table>
<tbody>
<tr>
<th>Prénom de l’utilisateur</th>
<td><input type=”text” name=”user_name”
value=”<?php if (isset($this->data)) { echo $this->data->user_name; } ?>” /></td>
</tr>
<tr>
<th>Nom de l’utilisateur</th>
<td><input type=”text” name=”user_lastname”
value=”<?php if(isset($this->data)) { echo $this->data->user_lastname; } ?>” /></td>
</tr>
<tr>
<th>Email de l’utilisateur</th>
<td><input type=”text” name=”user_email”
value=”<?php if(isset($this->data)) { echo $this->data->user_email; } ?>”></input></td>
</tr>
</tbody>
</table>

<br />
<br />
<input type=”submit” value=”Enregistrer” /></form>

  • Céline G

    bonjour,
    je débute avec joomla et suis très interessée par votre tuto.
    Après installation de ce composant, la création des users depuis la partie administration fonctionne.
    PB je n’arrive pas à afficher la liste des users depuis le site (accès menu avec le lien : list)
    Dois je mettre en place le fichier crud.xml à la racine du composant ?
    merci pour vos infos

  • http://www.alexandre-julien.com Alexandre JULIEN

    En effet, le tutorial se limite à la partie développement d’un composant. Ce qu’il faut savoir c’est qu’un composant Joomla! s’installe via une archive zip contenant le code source et un fichier XML qui définit les paramètres de l’installation.

    C’est en effet ce fichier crud.xml qui doit être rajouter au projet. Il faut déplacer le contenu du tuto dans un répertoire “crud/site” et rajouter le fichier XML à la racine du dossier “crud/crud.xml”.

    Voici une ébauche de fichier XML qui devrait vous aider, je publierai prochainement une mise à jour pour expliquer comment cela fonctionne.

    Voici le fichier XML

    Une fois cela fait, vous zipper le tout, n’oubliez pas qu’il n’y aura que le fichier xml à la racine de cette archive et installer le avec Joomla! dans le backoffice.

    N’hésitez pas me contacter si vous avez des problèmes.

  • Céline G

    merci pour le retour et le tuto
    c’est ok

  • Manu

    Bonjour,
    Juste pour vous signaler une faille de sécurité dans votre code :
    if($controller = JRequest::getVar(‘controller’)) {
    $path = JPATH_COMPONENT.DS.’controllers’.DS.$controller.’.php’;
    if (file_exists($path)) {
    require_once $path;

    Ici, un utilisateur malveillant peut modifier le paramètre controller passé en GET pour inclure n’importe quel fichier (dont le /etc/password).

    Manu

    • http://www.alexandre-julien.com Alexandre JULIEN

      Merci pour votre remarque mais le paramètre “controller” passé dans le GET ne peut appeler rien d’autre qu’un contrôleur, le dossier du répertoire est protégé et l’extension .php aussi, sinon l’utilisateur est redirigé sur la page mère du composant Joomla!. D’ailleurs la pluparts, la plupart des composants de Joomla! utilisent le même schéma d’entrée que celui-ci.

  • http://localhost/inetpub/Montest ROLLANDIN

    bonjour,
    je débute avec joomla, interessée par votre tuto, j’aurais aimé pouvoir le tester, mais le xml me bloque.
    Il n’est surement pas complet car j’ai l’erreur “Le fichier XML ne contient pas d’élément d’administration. ”
    Si vous pouviez me guider.
    merci.

  • Nabil

    merci pour le tuto,
    j’ai suivi à la lettre votre tuto et ça marche bien , par contre quand je voulais ajouter l’action supprimer (delete) , ça n’a pas fonctionné, je me suis rendu compte que le nom de la table dans la requête( function removeUser) est mal tapé ( #__users_crud au lieu de #__crud_users ) , je l’ai corrigé mais malheureusment ça fonctionne tjrs pas sachant que j’ai ajouter une ligne dans “/components/com_crud/views/list/tmpl/default.php” qui normalement sert à supprimer un user de id= $value->user_id.
    merci de m’orienter svp
    la ligne ajouté aprés l’action Editer :
    <a
    href="user_id) ?>”>
    Supprimer

  • Nabil

    merci pour le tuto,
    j’ai suivi à la lettre votre tuto et ça marche bien , par contre quand je voulais ajouter l’action supprimer (delete) , ça n’a pas fonctionné, je me suis rendu compte que le nom de la table dans la requête( function removeUser) est mal tapé ( #__users_crud au lieu de #__crud_users ) , je l’ai corrigé mais malheureusment ça fonctionne tjrs pas sachant que j’ai ajouter une ligne dans « /components/com_crud/views/list/tmpl/default.php » qui normalement sert à supprimer un user de id= $value->user_id.
    merci de m’orienter svp

  • http://www.alexandre-julien.com Alexandre JULIEN

    Pour le fichier XML, il suffit de rajouter les balises suivantes :

    files folder=”admin” // Ajouter les fichiers concernés /files

    Ce noeud dans le XML sert à spécifier les fichiers qui seront destinés au backoffice de Joomla!.

  • http://www.alexandre-julien.com Alexandre JULIEN

    En effet, il y a une erreur c’est bien #__crud_users le nom de la table, normalement la requête doit marcher l’url de suppression doit être de la forme suivante : “index.php?option=com_crud&task=delete&id=xx”

  • http://www.societe-econcept.com/ e-concept

    Merci pour ce beau tuto. Ce n’est finalement pas très compliquer de réaliser une application Joomla. Je garde la méthodo sous le coude.

  • Thierry

    Bonjour,

    Ton tuto fait parti de ce qui m’ont aidé dans Joomla :) donc merci.

    Néanmoins, j’ai une question, je suis débutant dans Joomla et php mais j’arrive à m’en sortir mais là… à $this->setRedirect(‘chemin’,'message à afficher’) moi il me redirige vers la page de connexion de joomla alors que l’adresse indique bien celle que je veux :( Par contre si je met l’attribut false au lieu du message la redirection fonctionne bien.
    Sais tu d’où vient le problème ?

    Merci d’avance

    Thierry

  • http://www.alexandre-julien.com Alexandre JULIEN

    Normalement le fait d’ajouté une notification n’a pas d’incidence sur la redirection.
    Essaie de forcer le type de redirection par exemple :
    $this->setRedirect(‘index.php?option=‘, ‘message à afficher’, ‘typemessage’);
    typemessage peut être : ‘message’, ‘error’ ou ‘notice’
    Autre chose qui peut être la source du problème c’est tu as plusieurs $this->setRedirect() dans ton controlleur : la redirection ne se fait pas à l’execution de cette ligne mais à la fin de la méthode du controleur du coup si tu as un autre setRedirect en dessous de celui-ci, ça sera le deuxième qui sera executer !

  • Rugal

    Bonjour et merci pour ce tuto,

    Il y avait une erreur supplémentaire dans la fonction removeUser dans la condtion WHERE de la requete SQL.
    Il faut remplacer “id” par “user_id”, qui est la bonne dénomination du champ dans la table.

    Par ailleurs, il y a aussi un soucis avec la fonction d’edition.
    Lorsque l’on clique sur le lien “Editer” on ajoute un nouvel utilisateur au lieu d’editer les infos de celui en cours.

  • http://www.alexandre-julien.com Alexandre JULIEN

    La condition WHERE a été modifié, pour ce qui est de l’édition, apparement j’ai oublié de mettre un champs input type hidden contenant l’identifiant de l’enregistrement conserné.

    Je ferai une mise à jour très prochainement de cet article avec des corrections de bugs et plus d’explication de code.

  • Rugal

    Exact, j’allais justement poster un commentaire.

    Il faut aussi utiliser la meme denomination que le champ hidden pour l’id dans la fonction updateUser et ca marche niquel.

    Merci encore pour ce tuto, qui m’a permis d’apprendre pas mal de choses.

  • http://www.alexandre-julien.com Alexandre JULIEN

    Oui en effet, l’attribut “name” du champs est “id”

  • http://www.alexandre-julien.com Alexandre JULIEN

    Voilà j’ai fais une mise à jour du tutoriel, voici les nouveautés :
    - correction d’un petit bug (faute de frappe)
    - ajout du lien pour la suppression
    - packaging en .zip avec le fichier “hello.xml”
    - création de fichiers d’installation sql

  • http:/ goncalves

    Salut les gars pour moi “supprimer ne fonctionne toujours pas,

    extrait de mon controller :

    function delete()
    {
    if (isset($_GET) && isset($_GET['id']))
    {
    $model =& $this->getModel();
    $model->removeUser($_GET['id']);
    $this->setRedirect(‘index.php?option=com_crud’, “L’utilisateur a bien été supprimé”, ‘message’);
    }
    else
    {
    $this->setRedirect(‘index.php?option=com_crud’, “L’identifiant est manquant”, ‘error’);
    }
    }

    extrait du model :

    function removeUser ($id)
    {
    $db =& JFactory::getDBO();
    $query = ‘DELETE FROM #__crud_users WHERE user_id = ‘.(int)$id;
    $db->setQuery($query);
    return $this->query();
    }

    extrait de la vue :

    data as $key => $value) { ?>

    user_lastname ?>
    user_name ?>
    user_email ?>
    <a
    href="user_id) ?>”>
    Editer | <a
    href="user_id) ?>”>Supprimer

    mon message d’erreur

    Fatal error: Call to undefined method CrudModelCrud::query() in /homepages/10/d246622170/htdocs/wsb4943941101/www/components/com_crud/models/crud.php on line 41

  • http:/ goncalves

    j’ai réglé mon problème en modifiant la fontion “removeUser” dans le model, j’ai remplacé :
    return $this->query(); par $db->query();

    et ça fonctionne je peux supprimer mes utilisateurs, faut pas me demander pourquoi je ne suis pas une masse en php. mais si vous pouvez me donner des explications ça serait cool.

    • http://www.alexandre-julien.com admin

      Oui en effet, je viens de voir ça c’est bien $db->query();, l’objet $db est une abstraction de la base de données, on lui injecte une requête SQL pour faire la suppression, ensuite il faut exécuter cette dernière via la méthode query() : $db->query();

      Merci pour votre participation.

  • Marie-Luce

    Bonjour,
    Un grand merci pour ce tutoriel.
    Je débute sur tous les sujets : web, php, joomla, html, la seule chose que j’avais en main était une expérience en vieilles technos…
    Après avoir avalés quelques livres, testé la création d’un template joomla, l’ajout d’une zone dans le formulaire d’identification, je me suis attaqué à la création d’un composant et miracle je suis tombée sur votre tuto.
    Avec votre composant en modèle, J’ai donc écrit un composant, adapté à mes besoins (sondage). Je commence à m’amuser, ça se concrétise mais il me reste 2 problèmes :
    - je n’affiche pas les accents sur ma page de formulaire, ni dans les messages d’erreur que j’envoie
    - je ne sais pas comment faire pour réafficher les données déjà saisies par l’utilisateur suite au refus d’enregister le sondage car zones incomplêtes. le $_POST est null
    Donc je creuse…et j’apprends des choses en cherchant mais si vous pouviez me conseiller…
    Merci encore

    • http://www.alexandre-julien.com admin

      Bonjour,

      pour vos problèmes d’accents vérifiez l’encodage de vos fichiers avec votre IDE, mettez tout en UTF-8.
      Pour le ré-afficage de données, vous devez mettre en session les données en $_POST et les ré-afficher en cas de postback.

  • Marie-Luce

    Donc pour mon problème d’accents, c’est vu :
    effectivement il fallait enregistrer mes .php (surtout le contrôleur et template …) en encodage UTF-8, j’utilise comme Editeur NOTEPAD++ et par défaut il crée les fichiers en ANSI
    Pour mon problème de réaffichage des données :
    1 – dans la méthode “save” de mon contrôleur et en cas d’erreur de saisie, je récupère les infos saisies, le $_POST, pour les mettre dans des variables de SESSION avec
    $userSession = &JFactory::getSession();
    $userSession -> set(‘nomchamp1′, $_POST['nomchamp1'];
    $userSession -> set(‘nomchamp2′, $_POST['nomchamp2'];
    etc ….
    (à ce stade j’ai encore le contenu du $_POST mais après quand on fait la méthode “display” je n’ai plus rien (c’était ça mon problème)
    2 – Ensuite dans la méthode “display” de mon contôleur, j’ai ajouté la lecture de ces variables de SESSION avec
    $userSession = &JFactory::getSession();
    $nomchamp1 = $userSession->get(‘nomchamp1′);
    $nomchamp2 = $userSession->get(‘nomchamp2′);
    etc…
    puis ajout de propriété à l’objet vue
    $view->nomchamp1=$nomchamp1;
    $view->nomchamp2=$nomchamp2;
    etc…
    et hop je garde les valeurs déjà saisies dans ma page.
    Mais le problème que j’ai eu ensuite était que je gardais TOUT le temps ces valeurs, impossible de faire de “reset” (bouton reset) et même après enregistrement sans erreur.
    Donc j’ai ajouté un flag “erreur” en SESSION que je positionne quoi qu’il arrive à ‘non’ en début de template puis dans ma méthode “display” du contrôleur, je teste ce flag “erreur”, s’il est à ‘non’ j’initialise mes valeurs des champs à “”, s’il est à ‘oui’ cela veut dire que je viens du contrôle avant enregistrement et qu’il y a eu une erreur donc j’initialise les valeurs des champs avec les variables de session.
    Voilà et j’ai laissé tombé le bouton RESET (je n’arrive pas à le faire fonctionner)
    Je ne sais pas si c’est fait dans les règles de l’art ou s’il y a plus simple mais merci pour vos conseils cela m’a permis d’avancer

  • http://www.alexandre-julien.com admin

    Non cette méthode est correcte à part que l’on pouvait directement passer le tableau de paramètre à la vue plutôt que d’énumérer chaque champ dans le contrôleur.
    Pareil pour la vue, on peut faire par exemple un $view->data = $_POST;
    Et ensuite sur le template : $this->data['name'] par exemple.
    Merci pour votre participation

  • kakashi

    Bonjour,
    je suis tombé sur votre tuto, j’ai installé le module crud mais malheureusement il ne fonctionne pas ni dans la partie backend ou frontend.
    Savez-vous d’où peut venir mon problème ?
    PS : Je suis novice dans joomla et surtout dans le développement de composant.

  • kakashi

    euh dsl
    sa ne fonctionne pas seulement dans la partie backend (dans la partie frontend c’était parce qu’il n’y avait pas de données dans la base)

    • http://www.alexandre-julien.com admin

      Il n’y a rien dans la partie backend, c’est uniquement un exemple de type CRUD en front-office.

  • kakashi

    oki merci
    juste une petite question la fonction _getList() comment on l’utilise ? Elle n’est pas déclarée dans L’API Joomla et je ne trouve nulle part sa déclaration de votre code

    • http://www.alexandre-julien.com admin

      oui, c’est vrai que le navigation dans l’API de Joomla! n’est pas top.
      La méthode _getList() vient de la classe JModel -> http://api.joomla.org/Joomla-Framework/Application/JModel.html#_getList.
      Elle permet d’exécuter une requête et de retourner la liste d’enregistrement sous forme d’un objet stdClass je crois.

  • kakashi

    merci pour votre réponse
    malheureusement, je suis toujours bloqué (j’essai de créer un composant à partir de votre tuto).
    La fonction _getList($query) n’est pas trouvé pourtant je fais l’import joomla.application.component.model et ma classe hérite bien de JModel
    Je ne comprends vraiment pas pourquoi sa ne fonctionne pas. J’ai aussi essayé avec &_getList($query) mais rien ne fonctionne
    Je suis complètement perdu à cause d’une simple erreur je suppose

  • kakashi

    j’ai trouvé d’où venait mon erreur
    merci pour votre aide

    • http://www.alexandre-julien.com admin

      de rien, la manipulation des données avec Joomla! est assez simple mais il est vrai qu’elle est assez mal documentée, du coup on peut facilement se retrouver bloqué par faute de doc !

  • naifar

    Merci pour votre tuto,
    j’ai un question hors de ce tuto,
    si je veut construire plusieurs liens appartient a un seul composant et chaque lien possède un tel fonctionnalité, commant faire ça en suivant l’architecture MVC, etant donné qu’on peut gérer ces lien dé le backend “main menue/add”

    • http://www.alexandre-julien.com admin

      Dans une architecture MVC, les actions du contrôleur correspondent généralement à une page ou à un traitement que l’on peut appeler via une URL.
      Vous pouvez donc diviser vos fonctionnalités en actions sur les contrôleurs de votre module.
      Cependant si vous avez des applications avec des fonctionnalités nettement indépendantes je vous recommande de bien diviser vos applications en “composants” Joomla!
      Plus votre application est modulaire, meilleure sera votre architecture et plus elle sera facile à maintenir.

  • Neeraj

    Fatal error: Call to a member function getUser() on a non-object in C:wampwww2ijobcomponentscom_jobscontroller.php on line 73

  • http://NotYet totoche

    Bonsoir, il semble que votre .zip (plus bas) soit la version avant corrections, car même en suivant les procédures décrites plus haut, joomla 1.5 ne trouve pas l’XML (j’ai même essayé en mettant vos crud.xml et hello.xml à la racine). Une suggestion ?

  • N@2O

    Bjr eric, merci pr ce tuto, il me permet de comprendre un certain nombre de truc. mais là suis en train de vouloir l’implémenter afin de connaitre créer un composant, vu k je suis nouveau avc joomla. sof k là j comprend pas certains points pas trop clair ds ma tête.

    -d’abord pour le fichier views.html.php. bref, j’ai modifié les synthaxe view par edit ds le code

    - où est c k j doi prendre le fichier index.html de la partie admin.
    et commen structurer cette partie admin là. bref je comprend pa commen structurer les fichiers finaux avant de les zipper

    • http://www.alexandre-julien.com admin

      Salut,

      Le fichier views.html.php est un intermédiaire entre le contrôleur et le template, il sert notamment à faire passer les données à la couche finale et à préparer les données avant de les afficher.

      Le fichier index.html ne sert à rien, c’est une convention Joomla! je crois que c’est en cas de panne de serveur PHP que cela est utile.

      Pour ce qui est de la structure, c’est le fichier XML qui régit l’installation des fichiers. Pour le reste tout ce qui est contenu dans le répertoire admin va dans le répertoire admin. C’est la même chose que pour la partie frontend.

  • http://www.alexandre-julien.com admin

    Bonjour,

    Pour répondre aux questions de quelques uns d’entre vous, le fichier crud.zip qui est à la fin de l’article fonctionne très bien sur les version 1.5.x de Joomla!
    Le lien qui est sur l’interface d’administration est inactif car il n’y a pas d’application sur le backoffice de Joomla! mais seulement une application en frontoffice.
    Pour l’installation je rappelle qu’il faut télécharger le zip sur Joomla! dans la rubrique d’installation de plugins et composants.
    Je vois que cet article a eu pas mal de succès sur le blog, je vous remercie tous de votre participation.

  • http://www.m4ucode.be Philippe Lambotte

    Merci, un grand merci, cela m’a permis de remettre de l’ordre dans mes idées, avant j’appelai le modèle à partir de la vue, et je comprend que tout passe par le controlleur, ce qui est beaucoup plus logique… je garde le lien dans mes favoris, merci d’avoir donné de votre temps

  • Richard FROMENT

    Bonjour,
    Super tuto, il a le mérite d’être simple et permet de bien comprendre les mécanismes du développement d’un composant Joomla . Toutes fois, j’ai une question, je suis assé surpris que vous utilisiez les variable $_GET et $_POST dans controller.php. En effet l’API Joomla offre une méthode pour obtenir ce genre de donnée JRequest::getVar . ne serais ti pas plus conventionnelle d’utiliser JRequest::getVar plus tôt qu’accéder aux variables $_POST et $_GET en direct ?
    Merci d’avance

    • http://www.alexandre-julien.com admin

      Effectivement le JRequest::getVar est plus approprié pour récupérer les données en GET ou POST, en fait il surtout la particularité de générer un message d’erreur facilement s’il manque des arguments par exemple : $address = JRequest::getVar(‘address’, “L’adresse est vide”);
      Pour ma part, sur un projet j’ai créé une classe spéciale pour gérer cela, mais la classe JRequest est très bien aussi.

      Merci pour votre contribution.

  • Richard FROMENT

    Bonjour,
    Super tuto, il a le mérite d’être simple et permet de bien comprendre les mécanismes du développement d’un composant Joomla . Toutes fois, j’ai une question, je suis assé surpris que vous utilisiez les variable $_GET et $_POST dans controller.php. En effet l’API Joomla offre une méthode pour obtenir ce genre de donnée JRequest::getVar . ne serais ti pas plus conventionnelle d’utiliser JRequest::getVar plus tôt qu’accéder aux variables $_POST et $_GET en direct ?
    Merci d’avance

  • http://maracatudobem.fr Pedro

    Merci beaucoup pour ce tuto, c’est exactement ce que je cherchais, il donne un bon complément du tuto Hello wrld : http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1

    Cordialement

  • Fayez Naccache

    Bonjour,
    Je ne sais pas si vous avez rédigé ce tuto avant d’avoir entendu parler de Joomla 1.6 mais je ne suis pas d’accord avec votre avis du modèle inutile dans le MVC car un framework est la pour évoluer et justement Joomla 1.6 fonctionnera avec autre que MySQL.
    Joomla a un bel avenir à mon avis.
    Merci. :)

    • http://www.alexandre-julien.com admin

      Bonjour,

      Effectivement, quand j’ai écris cette article, il n’y avait pas les spécifications de Joomla! 1.6
      Ma petite critique ne concerne pas vraiment la couche modèle mais plutôt d’un terme qu’emploie Joomla! dans sa documentation quand ils parlent de “Abstract Layer”.
      Une couche d’abstraction est pour moi avant tout une couche générique qui permet d’adapter une application à n’importe quelle base de données.
      Or, on ne peut pas taper sur une base de données autre que MySQL avec Joomla! 1.5.
      C’est juste cela que je voulais soulever.

      @+

  • Fayez Naccache

    Bonjour,
    Je ne sais pas si vous avez rédigé ce tuto avant d’avoir entendu parler de Joomla 1.6 mais je ne suis pas d’accord avec votre avis du modèle inutile dans le MVC car un framework est la pour évoluer et justement Joomla 1.6 fonctionnera avec autre que MySQL.
    Joomla a un bel avenir à mon avis.
    Merci. :)

    • http://www.alexandre-julien.com admin

      Bonjour,

      Effectivement, quand j’ai écris cette article, il n’y avait pas les spécifications de Joomla! 1.6
      Ma petite critique ne concerne pas vraiment la couche modèle mais plutôt d’un terme qu’emploie Joomla! dans sa documentation quand ils parlent de “Abstract Layer”.
      Une couche d’abstraction est pour moi avant tout une couche générique qui permet d’adapter une application à n’importe quelle base de données.
      Or, on ne peut pas taper sur une base de données autre que MySQL avec Joomla! 1.5.
      C’est juste cela que je voulais soulever.

      @+

  • Olivier

    Merci !!!!!!!

  • fatihaa

    Bonjour a vs tous
    j’ai une probleme hors du sujet :( si quelqu’un pourrait m’aider: je n’arrive plus à faire des liens entre des articles implementant des pages php evec jumi :d
    !!!!
    C’est urgent !!!!

  • pierre


    Alexandre JULIEN:

    Pour le fichier XML, il suffit de rajouter les balises suivantes :
    files folder= »admin » // Ajouter les fichiers concernés /files
    Ce noeud dans le XML sert à spécifier les fichiers qui seront destinés au backoffice de Joomla!.

    Bonsoir,
    Je reste bloquer sur les fichiers
    install.sql
    uninstall.sql

    de la partie admin du fichier xml
    Où trouver ses fichiers ?
    Merci pour votre réponse

  • pierre

    Dépuis j’ai compris, il fallait les créer …
    et les insérer dans la partin admin du fichier xml.
    Depuis, votre exemple fonctionne.
    Merci pour cette aide..

  • pierre

    Dépuis j’ai compris, il fallait les créer …
    et les insérer dans la partin admin du fichier xml.
    Depuis, votre exemple fonctionne.
    Merci pour cette aide..

  • Adil

    salut je suis très intéressé de mettre en place une application web avec joomla qui respecte le pattern MVC.j’ai tout suivi :j’ai ajouté le composant crud .mais comment je px tester l’application? quand je met l’adresse :http://localhost/monsite j’obtient toujours la page d’acceil vierge qui contient juste Mainmenu–>Home

  • Adil

    salut je suis très intéressé de mettre en place une application web avec joomla qui respecte le pattern MVC.j’ai tout suivi :j’ai ajouté le composant crud .mais comment je px tester l’application? quand je met l’adresse :http://localhost/monsite j’obtient toujours la page d’acceil vierge qui contient juste Mainmenu–>Home

  • http://www.frantz-daribo.me Petit_Fwanz


    Adil:

    salut je suis très intéressé de mettre en place une application web avec joomla qui respecte le pattern MVC.j’ai tout suivi :j’ai ajouté le composant crud .mais comment je px tester l’application? quand je met l’adresse :http://localhost/monsite j’obtient toujours la page d’acceil vierge qui contient juste Mainmenu–>Home

    Bonjour,
    Pour voir le composant il faut le publier.
    Menu->(choisir un menu)->Nouveau(lien)->Dans sélection il faut choisir le composant
    OU
    Il faut tout simplement taper l’url du site et à la suite: /index.php?option=com_crud comme indiqué dans le tutoriel xD

  • http://www.frantz-daribo.me Petit_Fwanz


    Adil:

    salut je suis très intéressé de mettre en place une application web avec joomla qui respecte le pattern MVC.j’ai tout suivi :j’ai ajouté le composant crud .mais comment je px tester l’application? quand je met l’adresse :http://localhost/monsite j’obtient toujours la page d’acceil vierge qui contient juste Mainmenu–>Home

    Bonjour,
    Pour voir le composant il faut le publier.
    Menu->(choisir un menu)->Nouveau(lien)->Dans sélection il faut choisir le composant
    OU
    Il faut tout simplement taper l’url du site et à la suite: /index.php?option=com_crud comme indiqué dans le tutoriel xD

  • http://www.frantz-daribo.me Petit_Fwanz

    Pour vos problèmes de redirect avec la méthode setRedirect(‘chemin’,’message à afficher’), j’ai eu le même problème lors du dev d’une appli côté admin. Il faut enlever les accents dans le message à afficher (donc remplacer plutôt par leurs équivalents en HTML)!

    Super tuto!

    Je tiens a préciser que pour le développement côté Backend c’est exactement le même principe sauf qu’il faut placer le dossier du composant dans “/administrator/components/”, les actions (ajouter,supprimer…) sont automatiquement gérées du moment où l’on appelle par nos fonctions (add,delete,edit…).

  • http://www.frantz-daribo.me Petit_Fwanz

    Pour vos problèmes de redirect avec la méthode setRedirect(‘chemin’,’message à afficher’), j’ai eu le même problème lors du dev d’une appli côté admin. Il faut enlever les accents dans le message à afficher (donc remplacer plutôt par leurs équivalents en HTML)!

    Super tuto!

    Je tiens a préciser que pour le développement côté Backend c’est exactement le même principe sauf qu’il faut placer le dossier du composant dans “/administrator/components/”, les actions (ajouter,supprimer…) sont automatiquement gérées du moment où l’on appelle par nos fonctions (add,delete,edit…).

  • rourou

    Bonjour,
    S’il vous plaît y a-t-il quelqu’un qui sait comment le contrôleur va afficher la liste des utilisateurs en premier lieu.
    Comment savoir que la fonction display va être exécutée la première ?
    Merci d’avance

  • Manar

    salut,

    l’ajout marche bien, sauf que lors de la mise à jour, un utilisateur nouveau est ajouté.
    faut modifier le fichier com_crud/views/edit//tmpl/default.php , ligne 32 comme suite:

    <input type="hidden" name="id" value="data)) { echo $this->data->user_id; } ?>" />

  • joe

    salut,
    merci pour le tutorial,ça m’a aidé à comprendre pas mal de chose mais pour la partie edit, la fonction de la suppression ne marche pas, il y a t-il quelques modifications que je doive faire?

  • aida

    j’ai bien suivi votre tuto,jé bien installé le com_crud avec succés mais dans la partie admin lorsque je clikc sur joomla_crud ,il m’affiche 404 – Une erreur est survenue….Impossible de trouver le composant.svp aider moi à resoudre ce problm,,merci infinement

  • shevaton

    Bonjour,
    Tout d’abord je tiens à vous remercier pour votre tutoriel sur la création d’une application composant sur joomla 1.5 en mvc. Je suis débutant sur joomla, et je suis actuellement en train de faire une application intranet permettant de gérer le matériel informatique. étant développeur je souhaite créer mes propres composants, j’ai lu ton tutoriel mais étant donnée la différence des versions je ne m’en sors pas du tout. Je souhaite donc savoir si c’était possible d’avoir le même tutoriel mais avec la version 1.7 car il y a beaucoup de choses qui ont changées entre les deux versions, j’ai trouvé des tutoriels sur la v7 mais je trouve que ton exemple est exactement ce que je souhaite faire en terme de structure et de style, c’est pourquoi je parlais du même tutoriel mais en v7.
    petite précision j’utilise une base de données externe à celle de joomla.
    J’ai vraiment besoin de votre aide s’il vous plait.
    En espérant une réponse de votre part, je vous souhaite une bonne fin année et encore merci pour ce que vous faites sur ce site.

    • http://www.alexandre-julien.com Alexandre JULIEN

      Bonjour,

      Je vais avoir du mal à vous aider, je ne suis plus l’avancement de Joomla! au niveau CMS et développement depuis un bon moment.
      L’origine de cet article était de partager une structure de développement facile que j’ai mis en place lors que j’ai eu à faire un projet de développement avec l’API de Joomla!.
      Depuis la version 1.5, je ne suis plus du tous les évolutions de l’API de Joomla! et il doit y en avoir en grands nombres.
      Je vous recommande de chercher des exemples sur d’autres sites qui proposent de bons tutoriaux, le Web est bien fourni maintenant et ce que vous trouverez sur ce blog concernant le développement Joomla!, vous le trouverez certainement ailleurs avec les dernières versions de l’API.

      Merci pour l’intérêt que vous avez porté à cet article.

  • joe

    Salut, merci pour le tuto mais j’ai un problème avec avec l’édition,elle ajoute un nouveau utilisateur au lieu de le modifier.J’ai essayé de faire tout mais j’ai pas trouvé de solution.Merci pour me répondre :)

  • Cédric

    joe > C’est parce qu’il y a une petite erreur (il me semble): il manque une information.
    function save()
    {
    if (isset($_POST))
    {
    $model =& $this->getModel();
    if (isset($_POST['id']) && $model->getUser($_POST['id']))
    {
    $model->updateUser($_POST);
    }
    else
    {
    $model->addUser($_POST);
    }
    $this->setRedirect('index.php?option=com_crud', "Les modifications ont bien été enregistrées", 'message');
    }
    else
    {
    $this->setRedirect('index.php?option=com_crud', "Les données sont manquantes", 'error');
    }
    }

    Or on ne récupère aucun id en post depuis le formulaire de la page edit.html. Par conséquent on ne passe pas dans la condition où il y a le updateUser.

    Tu peux tester en remplaçant
    if (isset($_POST['id']) && $model->getUser($_POST['id']))
    {
    $model->updateUser($_POST);
    }
    else
    {
    $model->addUser($_POST);
    }
    $this->setRedirect('index.php?option=com_crud', "Les modifications ont bien été enregistrées", 'message');
    }

    par ceci:
    if (isset($_POST['id']) && $model->getUser($_POST['id']))
    {
    $model->updateUser($_POST);
    $this->setRedirect('index.php?option=com_crud', "Ceci est une modification d'utilisateur ", 'message');
    }
    else
    {
    $model->addUser($_POST);
    $this->setRedirect('index.php?option=com_crud', "Ceci est une création d'utilisateur ", 'message');
    }
    }

    J’essaie justement de mettre à jour mais ça ne fonctionne toujours. :/

  • Cédric

    (default.php, pas edit.html pardon*)

    Bon voilà ça fonctionne. Donc dans ta page default.php (celle qui se trouve dans le dossier edit/tmpl), il faut que tu rajoutes un champ id comme ceci:

    <input type="text" name="id" value="data)) echo($this->data->user_id); ?>" />
    (Tu peux remplacer “text” par “hidden” si tu ne veux pas que le champ se voit)

    Voilà avec ça normalement ça marche :).