Installation composant
Je veux installer un composant dans le backend
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' ).': <