Trucs et astuces
added the 07/11/2008
Création composant avec contrôleur, modèle, et vue
Installation composant
Je veux installer un composant dans le backend
Je
vais d'abord mettre une table ici
membres.
Dans
exporter choisir SQL40 pour être sur de la réussite.
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é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é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' ).': <