Informations
Joomla - created by james
Trucs et astuces
Public Group
Date : the 01/11/2008
Visited : 9577
SpotRank : 14431
Channel: Computer, Internet
Permalink :
AUTHOR(S)
READER(S)
 

Joomla Follow

Création composant avec contrôleur, modèle, et vue

Installation composant

 

 

 

Je  veux installer un composant dans le backend

 

  1. Je vais d'abord mettre  une table ici membres.
  2. Dans exporter choisir SQL40 pour être sur de la réussite.
  3. Si je veux garder mes accents. J'exporte la table avec sql40, puis les données avec insert et ANSI

 

 

Maintenant j'ai une table membres avec mes données.

Il me faut un composant dans le backend,

 avec Joomla on va placer un dossier com_membres

Et il nous faudra un point d'entrée dans ce composant le nom sera

 admin.membres.php

 

Pour vérifier son fonctionnement on peut écrire

<?php

// pas d'accès direct sur le site

defined('_JEXEC') or die('Restricted access');

echo "Voici l'entr&eacute;e dans le composant backend de membres <br>";

?>

 

Dans la partie administration, il suffira de taper en url

(chemin vers mon site)/ /administrator/index.php?option=com_membres

Dans mon cas ce sera

http://localhost/MesSites/joomlavide/administrator/index.php?option=com_membres

réponse Voici l'entrée dans le composant backend de membres

Mais compliquons nous voulons gérer une base de données

On va demander un contrôleur

/////////////////////////////////////////////////////////////////////////////////////////////////////

administratorcomponentscom_membresadmin.membres.php

//////////////////////////////////////////////////////////////////////////////////////////////////////

<?php

// pas d'accès direct sur le site

defined('_JEXEC') or die('Restricted access');

// Demande du contrôleur de base

require_once (JPATH_COMPONENT.DS.'controller.php');

// Exigez le contrôleur spécifique si demandé

if($controller = JRequest::getVar('controller')) {

            require_once (JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php');

}

// Creer le contrôleur

$classname      = 'MembresController'.$controller;

$controller = new $classname( );

// Perform the Request task

$controller->execute( JRequest::getVar('task'));

// Redirect if set by the controller

$controller->redirect();

?>

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

/////////////////////////////////////////////////////////////////////////////////////////////////////

administratorcomponentscom_membrescontroller.php

//////////////////////////////////////////////////////////////////////////////////////////////////////

<?php

jimport('joomla.application.component.controller');

class MembresController extends JController

{

 

 

            function __construct($config = array())

            {

                        parent::__construct($config);

 

                        // Register Extra tasks

                        $this->registerTask( 'add',  'display' );

                        $this->registerTask( 'edit', 'display' );

            }

            function display( )

            {

                        switch($this->getTask())

                        {

                                   case 'add'     :

                                   {

                                               JRequest::setVar( 'hidemainmenu', 1 );

                                               JRequest::setVar( 'layout', 'form'  );

                                               JRequest::setVar( 'view'  , 'membre');

                                               JRequest::setVar( 'edit', false );

 

                                               // Checkout the weblink

                                               $model = $this->getModel('membre');

 

                                   } break;

 

 

                                   case 'edit'    :

                                   {

                                               JRequest::setVar( 'hidemainmenu', 1 );

                                               JRequest::setVar( 'layout', 'form'  );

                                               JRequest::setVar( 'view'  , 'membre');

                                               JRequest::setVar( 'edit', true );

 

                                               // Le modèle

                                               $model = $this->getModel('membre');

 

                                   } break;

                        }

 

                        parent::display();

            }

 

 

 

            function remove()

            {

                        $model = $this->getModel('membre');

                        if(!$model->delete()) {

                                   $msg = JText::_( 'Erreur: Un ou plusieurs membres pas supprimees' );

                        } else {

                        $cids = JRequest::getVar( 'cid', array(0), 'post', 'array' );

            $texte=count( $cids );

 

 

                        $msg = JText::_('Membres(s) supprimees' );

$message=$texte." avec".$msg;

 

                        }

 

                        $this->setRedirect( 'index.php?option=com_membres', $message );

 

            }

 

 

            function save()

            {

                        $model = $this->getModel('membre');

 

                        if ($model->store($post))

                        {

                                   $msg = JText::_( 'Membre sauvegarde OK !' );

                        } else {

                                   $msg = JText::_( 'Erreur de sauvegarde pour ce membre' );

                        }

                        $link = 'index.php?option=com_membres';

                        $this->setRedirect($link, $msg);

            }

 

 

}

?>

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

Puis on met en place le  modèle là où joomla ira le chercher

/////////////////////////////////////////////////////////////////////////////////////////////////////

administratorcomponentscom_membresmodels membre.php

//////////////////////////////////////////////////////////////////////////////////////////////////////

 

<?php

// Check to ensure this file is included in Joomla!

defined('_JEXEC') or die( 'Restricted access' );

 

jimport('joomla.application.component.model');

class MembresModelMembre extends JModel

{

var $_id = null;

var $_data = null;

 

                        function __construct()

            {

                        parent::__construct();

 

                        $array = JRequest::getVar('cid',  0, '', 'array');

                        $this->setId((int)$array[0]);

            }

 

 

            function setId($id)

            {

                        // Set id and wipe data

                        $this->_id                   = $id;

                        $this->_data   = null;

            }

 

 

            function &getData()

            {

                        // Load the data

                        if (empty( $this->_data ))

                        {

                                   $query = ' SELECT * FROM #__membres'.

                                                           '  WHERE id_membre = '.$this->_id;

                                   $this->_db->setQuery( $query );

                                   $this->_data = $this->_db->loadObject();

                        }

 

 

                        if (!$this->_data) {

                                   $this->_data = new stdClass();

                                   $this->_data->id_membre = 0;

                                   $this->_data->nom = null;

                                   $this->_data->prenom = null;

                                   $this->_data->naissance = null;

                                   $this->_data->adresse = null;

                                   $this->_data->ville = null;

                                   $this->_data->departement = null;

                                   $this->_data->tel = null;

                                   $this->_data->email = null;

                                   $this->_data->photo = null;

                        }

                        return $this->_data;

            }

 

 

 

            function store()

            {

                        $row =& $this->getTable();

 

                        $data = JRequest::get( 'post' );

 

                        // Bind the form fields to the auto table

                        if (!$row->bind($data)) {

                                   $this->setError($this->_db->getErrorMsg());

                                   return false;

                        }

 

                        // Make sure the auto record is valid

                        if (!$row->check()) {

                                   $this->setError($this->_db->getErrorMsg());

                                   return false;

                        }

 

                        // Store the web link table to the database

                        if (!$row->store()) {

                                   $this->setError( $row->getErrorMsg() );

                                   return false;

                        }

 

                        return true;

            }

 

 

            function delete()

            {

                        $cids = JRequest::getVar( 'cid', array(0), 'post', 'array' );

 

                        $row =& $this->getTable();

 

                        if (count( $cids ))

                        {

                                   foreach($cids as $cid) {

                                               if (!$row->delete( $cid )) {

                                                           $this->setError( $row->getErrorMsg() );

                                                           return false;

                                               }

                                   }

                        }

                        return true;

            }

 

 

}

//////////////////////////////////////////////////////////////////////////////////////////////////////

Comme nous le voyons on utilise une fonction getTable()

Elle utilise une interface table  (fichier membre.php dans le dossier table)

 

 

/////////////////////////////////////////////////////////////////////////////////////////////////////

administratorcomponentscom_membrestables membre.php

//////////////////////////////////////////////////////////////////////////////////////////////////////

 

<?php

defined('_JEXEC') or die('Restricted access');

class TableMembre extends JTable

 

{

/** @var int Primary key */

            var $id_membre                                                        = 0;

            var $nom                                            = '';

            var $prenom                                       = '';

            var $naissance                                    = '';

            var $adresse                                       = '';

            var $ville                                 = '';

            var $departement                   = '';

            var $cpostal                = '';

            var $tel                                               = '';

            var $email                                          = '';

           var $photo                                     = '';

            function TableMembre(& $db) {

                        parent::__construct('#__membres', 'id_membre', $db);

            }

}

?>

 

///////////////////////////////////////////////////////////////////////////////////////////////////////

Voilà tout est en place on a mis le modèle et le contrôleur

MC  il reste à mettre en place la vue V

MVC (Modèle Vue Contrôleur)

 

La vue dossiers VIEWS

D'abord avec dossier membres avec template (tmpl) default.php

D'abord dans membre view.html.php

Là on peut choisir l'ordre d'affichage

 

            $query = ' SELECT *  FROM #__membres ORDER BY nom';

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

administratorcomponentscom_membresviewsmembresview.html.php

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

<?php

defined('_JEXEC') or die();

jimport( 'joomla.application.component.view' );

class MembresViewMembres extends JView

{

            function display($tpl = null)

            {

                        global $mainframe;

                        $db                 =& JFactory::getDBO();

                        $context                                 = 'com_membres.membres.list.';

                        JToolBarHelper::title(   JText::_( 'Gestion des Membres du Club' ), 'generic.png' );

                        JToolBarHelper::deleteList();

                        JToolBarHelper::editListX();

                        JToolBarHelper::addNewX();

 

 

                        $limit              = $mainframe->getUserStateFromRequest( 'global.list.limit','limit',$mainframe->getCfg('list_limit'), 'int' );

                        $limitstart       = $mainframe->getUserStateFromRequest( $context.'limitstart',    'limitstart',       0, 'int' );

                        echo "limit:".$limit."<br>".$limitstart."<br>";

                        // Get data from the model

                        $query = ' SELECT *  FROM #__membres';

                        $db->setQuery( $query );

                        $db->query();

                        $total = $db->getNumRows();

                        jimport('joomla.html.pagination');

                        $pageNav = new JPagination( $total, $limitstart, $limit );

//Page navigation

                                   $db->setQuery( $query, $pageNav->limitstart, $pageNav->limit );

                        $items = $db->loadObjectList();

                        $this->assignRef('items',                    $items);

 

                        $this->assignRef('pageNav',$pageNav);

                        parent::display($tpl);

            }

}

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Et le fichier HTML pour voir les données

(dans view.html on a assigné :

$this->assignRef('items',                    $items);

$this->assignRef('pageNav',$pageNav);

Donc deux variables dans default.php    items et pageNav

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

administratorcomponentscom_membresviewsmembrestmpldefault.php

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

<?php defined('_JEXEC') or die('Restricted access'); ?>

 

<form action="index.php" method="post" name="adminForm">

<div id="editcell">

            <table class="adminlist">

            <thead>

                        <tr>

                        <tr>

                                   <th width="5">

                                               <?php echo JText::_( 'NUM' ); ?>

                                   </th>

                                   <th width="20">

                                               <input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count( $this->items ); ?>);" />

                                   </th>

                                   <th  class="title">

                                               <?php echo JHTML::_('grid.sort',   'Membres', 'a.nom', @$lists['order_Dir'], @$this->lists['order'] ); ?>

                                   </th>

                                   <th width="1%" nowrap="nowrap">

                                               <?php echo JHTML::_('grid.sort',   'Pr&eacute;nom', 'a.id_prenom', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>

                                   </th>

                                   <th width="1%" nowrap="nowrap">

                                               <?php echo JHTML::_('grid.sort',   'ID', 'a.id_membre', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>

                                   </th>

 

                        </tr>

 

            </thead>

 

 

                                   <tfoot>

                                   <tr>

                                               <td colspan="6">

                                                           <?php

                                                           $pageNav=&$this->pageNav;

 

                                                            echo "ici page navigationave pageNav->getListFooter();";

                                                           echo $pageNav->getListFooter();

                                                            ?>

 

                                               </td>

                                   </tr>

                                   </tfoot>

            <?php

            $k = 0;

            for ($i=0, $n=count( $this->items ); $i < $n; $i++)

            {

                        $row = &$this->items[$i];

                        $checked        = JHTML::_('grid.id',   $i, $row->id_membre );

                        $link                = JRoute::_( 'index.php?option=com_membres&task=edit&cid[]='. $row->id_membre );

 

                        ?>

                        <tr class="<?php echo "row$k"; ?>">

                                   <td>

            <?php echo $pageNav->getRowOffset( $i ); ?>

                                   </td>

                                   <td>

                                               <?php echo $checked; ?>

                                   </td>

                                   <td>

                                               <a href="<?php echo $link; ?>"><?php echo $row->nom; ?></a>

                                   </td>

                                               <td>

                                               <a href="<?php echo $link; ?>"><?php echo $row->prenom; ?></a>

                                   </td>

                                                                       </td>

 

                                   <td align="center">

                                               <?php echo $row->id_membre; ?>

                                   </td>

                        </tr>

                        <?php

                        $k = 1 - $k;

            }

 

 

            ?>

 

 

            </table>

</div>

 

<input type="hidden" name="option" value="com_membres" />

<input type="hidden" name="filter_order" value="<?php echo $lists['order']; ?>" />

<input type="hidden" name="filter_order_Dir" value="<?php echo $lists['order_Dir']; ?>" />

<input type="hidden" name="task" value="" />

<input type="hidden" name="boxchecked" value="0" />

<input type="hidden" name="controller" value="" />

</form>

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

Nous avons mis un lien

$link= JRoute::_( 'index.php?option=com_membres&task=edit&cid[]='. $row->id_membre );

 

Nous enverrons les Post

option=com_membres

task=edit

cid[]='. $row->id_membre                                    (  l'id du membre)

 

Quand on va cliquer on enverra ces données et comme on a des fichiers cachés

option" value="com_membres

name="task" value=""

name="boxchecked" value="0"

name="controller" value=""  on revient au contrôleur de depart

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

On édite   ave le bouton créé dans view.html.php de membres////////////////

/administrator/index.php?option=com_membres&task=edit&cid[]=17

 

 

Et comme dans le contrôleur on a

case 'edit'    :

                                   {

                                               JRequest::setVar( 'hidemainmenu', 1 );

                                               JRequest::setVar( 'layout', 'form'  );

                                               JRequest::setVar( 'view'  , 'membre');

                                               JRequest::setVar( 'edit', true );

 

                                               // Le modèle

                                               $model = $this->getModel('membre');

 

                                   } break;

Nous allons vers view member et tmpl form et edit true et le bon modèle

Donc d'abord view.html.php de membre

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

administratorcomponentscom_membresviewsmembreview.html.php

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

<?php

 

// Check to ensure this file is included in Joomla!

defined('_JEXEC') or die();

 

jimport( 'joomla.application.component.view' );

 

class MembresViewMembre extends JView

{

            /**

             * display method of Hello view

             * @return void

             **/

            function display($tpl = null)

            {

                        $membre                     =& $this->get('Data');

                        $isNew                       = ($membre->id_membre< 1);

                        $text = $isNew ? JText::_( 'New' ) : JText::_( 'Edit' );

                        $text =  JText::_( 'Edit' );

                        JToolBarHelper::title(   JText::_( 'Membre' ).': <

TAGS
YOUR REACTION
YOUR REACTION