Fork me on GitHub

Flux RSS

Chronique : DEFACER

201324
Janvier
  alain01 Documentations 5205

Bonjour,

Comme indiqué il y a quelques temps déjà sur un sujet du forum "Chronique d'Alain01 : Un module sous toutes ses coutures", nous allons commencer cette toute nouvelle chronique avec un objectif d'un module détaillé par mois.

Note: 0.00 (0 votes) - Noter cet article - Lire la suite...

Utilisation de modèles / gabarits

201310
Janvier
  alain01 Documentations 7267

Bonjour,

Beaucoup d'entre vous réalisent des sites web avec un contenu qui, pour certaines rubriques auraient besoin d'uniformisation.

Il s'agit ici de vous indiquer assez simplement comment créer des modèles (ou gabarit) de fiches (fiche cuisine, fiche livre, fiche cinéma, fiche voiture).

Note: 8.00 (3 votes) - Noter cet article - Lire la suite...

Bien débuter avec xoops

201227
Juillet
  grosdunord Documentations 8703

Afin de faciliter la réalisation et la mise en place d'un site Web réalisé sous Xoops, je viens de développer ce petit tutoriel qui j'espère vous aidera dans vos réalisations. Bonne lecture

La création d'un site web avec Xoops peut être très simple ou plus complexe si l'on veut faire des modifications. Malgré l'impatience que l'on peut avoir à vouloir rapidement publier son site sur le web, il est plus prudent de commencer à se familiariser avec Xoops sur son ordinateur personnel.

XOOPS est conçu sur une architecture modulaire, basé sur les droits des utilisateurs. L'une des erreurs communes aux débutants est de se demander comment rajouter des pages. Le noyau de XOOPS ne se charge en fait que de la gestion des droits d'accès, de l'affichage général du site et de la gestion des commentaires, des notifications, de la recherche...

Pour toutes les autres fonctionnalités (galerie photo, pages HTML...), il vous faudra rajouter des modules, c'est-à-dire des scripts qui étendent les capacités initiales du noyau. Les modules sont gérés via l'interface administration à Modules > Système > Modules. Vous trouverez de nombreux modules à télécharger dans notre référentiel.

Note: 9.00 (5 votes) - Noter cet article - Lire la suite...

Héritage de la class xoopsForm

201219
Janvier
  br_750 Documentations 5612

Héritage de la class xoopsForm

Qu'est ce que l'héritage ?

L'héritage est un principe propre à la programmation orientée objet (POO), permettant de créer une nouvelle classe à partir d'une classe existante. La nouvelle classe "hérite" des propriétés et méthodes de la classe dont elle hérite, appelée classe "mère". La classe qui hérite est appelée classe "fille".

Cette définition est très succincte vous pouvez compléter vos connaissances en programmation orienté objet sur le web, un petit lien concernant l'héritage : http://wind.developpez.com/tutoriels/windev/windev-poo-heritage/

Xoops et l'héritage

Comme tout bon projet informatique, xoops utilise la POO. En effet ses développeurs (que je remercie au passage) ont écrit un ensemble de classes qui régissent ce projet.
Donc nous pouvons utiliser l'héritage pour ajouter, modifier le comportement de XOOPS.

Tout ça, c'est très bien, mais pourquoi faire ?

  • on peut modifier n'importe quelles classes directement dans le projet.

Ces modifications sont appelées des "HACKs".

C'est a ce moment précis, que vous introduisez dans votre code le grain de sable qui risque de vous miner la vie, pour l'évolution et la maintenance de votre site.
- Que vas t'il se passer à la prochaine mise à jour ? Dans 1 an.......
Plus rien ne vas fonctionner correctement, il va falloir recommencer toutes les modifica-tions une par une; Comme vous êtes un développeur compétent vous avez pris soin de consigner dans un fichier ou sur un "petit cahier" toutes les modifications à faire.

Dans le cas contraire : je vous souhaite bon courage !

L'autre solution c'est d'utiliser l'héritage, allons y !

Prenons un exemple avec un formulaire dans XOOPS.
Les formulaires dans XOOPS, bien que souvent suffisants, ne peuvent pas répondent à l'ensemble de vos besoins spécifiques.

Nous allons ici, voir 2 applications de l'héritage avec XOOPS et plus précisément avec les éléments xoopsThemeForm et xoopsElement , ce n'est que des exemples et absolument pas restrictif.

  • changer l'url de action du formulaire à la volé
  • ajouter un nouvel élément, pas disponible dans le projet initial

Nous partons du principe, que nous avons un module appelé myModule et que ce module tout à fait standard contient un répertoire class dans lequel nous allons pouvoir placer nos nouvelles classes.

La première chose, c'est comprendre comment sont hiérarchisées les classes qui génèrent le formulaire.

La classe XoopsForm est la classe de base du formulaire, c'est une classe abstraite, ce qui signifie que cette classe ne doit pas être utilisée directement mais qu'elle doit être étendue, généralisée. C'est en faite une sorte de gabarit, des propriétés et des méthodes.
Je vous laisse vous plonger dans la POO pour plus de détail.

La classe XoopsThemeForm est la classe qui généralise XoopSForm et qui vas afficher le formulaire sous forme de table, c'est cette classe dont nous hériterons, pour modifier le comportement général du formulaire.

xoopsform

Note : si nous voulons que notre formulaire ne s’affiche plus sous forme de tableau, alors il nous suffirait de partir directement de XoopsForm et refaire le travail à notre sauce; Pour ça, s'en se prendre la tête, il suffit de partir de xoopsThemeForm et de modifié la méthode render() qui est responsable de l'affichage.

Comme vous l'aurez remarqué, dans XoopsForm (voir API) la méthode render() est vide, et oui ! C'est ça une classe abstraite; Elle nous dit juste que cette méthode doit être redé-finie dans la classe qui l'étend.

Donc dans XoopsThemeForm la méthode est redéfinie pour affiché un formulaire sous forme de table :

function render()
    {
        
$ele_name $this->getName();
        
$ret '<form name="' $ele_name '" id="' $ele_name '" action="' $this->getAction() . '" method="' $this->getMethod() . '" onsubmit="return xoopsFormValidate_' $ele_name '();"' $this->getExtra() . '>
            <table width="100%" class="outer" cellspacing="1">
            <tr><th colspan="2">' 
$this->getTitle() . '</th></tr>
        '
;
        
$hidden '';
        
$class 'even';
        foreach (
$this->getElements() as $ele) {
            if (!
is_object($ele)) {
                
$ret .= $ele;
            } else if (!
$ele->isHidden()) {
                if (!
$ele->getNocolspan()) {
                    
$ret .= '<tr valign="top" align="left"><td class="head">';
                    if ((
$caption $ele->getCaption()) != '') {
                        
$ret .= '<div class="xoops-form-element-caption' . ($ele->isRequired() ? '-required' '') . '">';
                        
$ret .= '<span class="caption-text">' $caption '</span>';
                        
$ret .= '<span class="caption-marker">*</span>';
                        
$ret .= '</div>';
                    }
                    if ((
$desc $ele->getDescription()) != '') {
                        
$ret .= '<div class="xoops-form-element-help">' $desc '</div>';
                    }
                    
$ret .= '</td><td class="' $class '">' $ele->render() . '</td></tr>' NWLINE;
                } else {
                    
$ret .= '<tr valign="top" align="left"><td class="head" colspan="2">';
                    if ((
$caption $ele->getCaption()) != '') {
                        
$ret .= '<div class="xoops-form-element-caption' . ($ele->isRequired() ? '-required' '') . '">';
                        
$ret .= '<span class="caption-text">' $caption '</span>';
                        
$ret .= '<span class="caption-marker">*</span>';
                        
$ret .= '</div>';
                    }
                    
$ret .= '</td></tr><tr valign="top" align="left"><td class="' $class '" cols-pan="2">' $ele->render() . '</td></tr>';
                }
            } else {
                
$hidden .= $ele->render();
            }
        }
        
$ret .= '</table>' NWLINE ' ' $hidden '</form>' NWLINE;
        
$ret .= $this->renderValidationJS(true);
        return 
$ret;
    }

Mise en pratique

Dans notre premier exemple nous souhaitons envoyer notre formulaire à un traitement différent en fonction d'une action utilisateur.

Notre formulaire est le suivant :

// Création de l'objet formulaire
$my_form = new ThemeForm("mon formulaire"'Form_bien'"han-dle_bien.php?action=save");

// Création des éléments de formulaire
$reference = new XoopsFormText("Référence""reference"50100);

$prix= new XoopsFormText("Prix","prix",50,100);

// Ajout des éléments au formulaire
$my_form->addElement($reference,true);
$my_form->addElement($prixtrue);

// Idem pour un bouton
$button = new XoopsFormButton('''post'_SEND'submit');
$my_form->addElement($button);
// Affichage du formulaire
$my_form->display();

Jusqu'ici rien de bien sorcier ! Nous allons donc modifier le comportement de XoopsThemeForm pour cela,nous créons un fichier php dans le répertoire class, que nous nommons de manière très original : my_form.php

Nous obtenons maintenant la séquence d’héritage suivante :

xoopsform

Pour que cette classe hérite de XoopsThemeForm, on dit aussi pour qu'elle étend, ou en-core qu'elle généralise, on écrit en php :

<?php
class MyForm extends XoopsThemeForm{

}
?>

Bien sûr pour que cela fonctionne, il faut que la classe "fille" trouve sa classe "mère", donc il faut inclure la classe XoopsThemeForm ce qui donne :

<?php
include_once(./../XoopsThemeForm.php)

class 
MyForm extends XoopsThemeForm{

}
?>

Vous pouvez aussi utiliser xoops_load de la manière suivante :

<?php

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

xoops_load('XoopsThemeForm');

class 
MyForm extends XoopsThemeForm {}

Ensuite on peut soit ajouter de nouvelles propriétés ou de nouvelles méthodes ou bien redéfinir des méthodes existantes, on dit dans ce cas "Que l'on surcharge (override) la méthode".

Nous allons ajouter à notre formulaire une nouvelle méthode, actuellement la classe XoopsThemeForm ne permet pas de changer le paramètre action du formulaire après avoir déclaré le constructeur, ce paramètre est passé au constructeur une fois pour toute; Mais on veut le modifier en fonction des actions utilisateurs et diriger le formulaire vers des traitement différents.

Nous allons donc ajouter une méthode :

<?php
xoops_load
('XoopsThemeForm');

class 
MyForm extends XoopsThemeForm {

    private 
$newAction;

     public function 
setNewAction($url=null){
        
        
$url===null?$this->newAction=$this->getAction():  $this->newAction=$action;
  
        }
}
?>

Cette nouvelle méthode (appelé aussi "setter") affecte l'url a la nouvelle propriété $newAc-tion si le paramètre de la fonction est passé.

Note importante :
La classe xoopsForm, n'a pas était optimisée pour être généralisée de manière a donner a ux développeurs la possibilité de faire ce qu'ils veulent, à mon grand regret. Pour cela il aurait fallu que les propriétés de la classe xoopsForm soit "protected" et non "private" (je vous renvois à la POO) ou alors que : chaque propriété soit associée à un "setter" et à un "getter". j'ignore les raisons de cette absence.
Ceci vas nous obliger a redéfinir la fonction render(). Ceux qui n'aurait pas été obligatoire si nous avions eu des "setter" ou que les propriétés eût étées "protected"

La classe avec la fonction render() redéfinie, on remplace $this->getAction par notre nouvelle propriété $newAction, ce qui donne :

<?php
xoops_load
('XoopsThemeForm');

class 
MyForm extends XoopsThemeForm {

    private 
$newAction;

     public function 
setNewAction($url=null){
        
            
$url===null?$this->newAction=$this->getAction():  $this->newAction=$action;
  
        }

    function 
render()
    {
        
$ele_name $this->getName();
        
$ret '<form name="' $ele_name '" id="' $ele_name '" action="' $this->newAction'" method="' $this->getMethod() . '" onsubmit="return xoopsFormValidate_' $ele_name '();"' $this->getExtra() . '>
            <table width="100%" class="outer" cellspacing="1">
            <tr><th colspan="2">' 
$this->getTitle() . '</th></tr>
        '
;
        
$hidden '';
        
$class 'even';
        foreach (
$this->getElements() as $ele) {
            if (!
is_object($ele)) {
                
$ret .= $ele;
            } else if (!
$ele->isHidden()) {
                if (!
$ele->getNocolspan()) {
                    
$ret .= '<tr valign="top" align="left"><td class="head">';
                    if ((
$caption $ele->getCaption()) != '') {
                        
$ret .= '<div class="xoops-form-element-caption' . ($ele->isRequired() ? '-required' '') . '">';
                        
$ret .= '<span class="caption-text">' $caption '</span>';
                        
$ret .= '<span class="caption-marker">*</span>';
                        
$ret .= '</div>';
                    }
                    if ((
$desc $ele->getDescription()) != '') {
                        
$ret .= '<div class="xoops-form-element-help">' $desc '</div>';
                    }
                    
$ret .= '</td><td class="' $class '">' $ele->render() . '</td></tr>' NWLINE;
                } else {
                    
$ret .= '<tr valign="top" align="left"><td class="head" colspan="2">';
                    if ((
$caption $ele->getCaption()) != '') {
                        
$ret .= '<div class="xoops-form-element-caption' . ($ele->isRequired() ? '-required' '') . '">';
                        
$ret .= '<span class="caption-text">' $caption '</span>';
                        
$ret .= '<span class="caption-marker">*</span>';
                        
$ret .= '</div>';
                    }
                    
$ret .= '</td></tr><tr valign="top" align="left"><td class="' $class '" cols-pan="2">' $ele->render() . '</td></tr>';
                }
            } else {
                
$hidden .= $ele->render();
            }
        }
        
$ret .= '</table>' NWLINE ' ' $hidden '</form>' NWLINE;
        
$ret .= $this->renderValidationJS(true);
        return 
$ret;
    }

}
?>

Maintenant nous pouvons l'utiliser de la manière suivante :

$my_form=new MyForm(paramètres);

If(
condition){
// maintenant on change l'url du formulaire
   
$MyForm->setNewAction('test.php')
}

Vous pouvez faire une mise à jour s'en risque......

Deuxième exemple on souhaite ajouter un élément qui n'existe pas dans les classes de XOOPS, par exemple on veut que notre formulaire affiche des images précédemment téléchargées sur le serveur, pour informer l'utilisateur.

Il n'y a pas d'élément, affiche image, dans les formulaires de XOOPS. Nous allons donc le créer en étendant la classe XoopsFormElement, qui est la classe chargée de créer un élément de formulaire, comme formcolorpicker etc....


ce qui donne comme héritage :

xoopsform

classe :


<?php

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

class 
MyElement extends XoopsFormElement
{
    
    var 
$_content;
    
    function 
__construct($caption ''$value ''$name '')
    {
        
$this->setCaption($caption);
        
$this->setName($name);
        
$this->_value $value;
    }
    
    function 
setContent($content)
    {
        
$this->_content=$content;
        
    }
    
    function 
getContent($encode=false){
        
        return 
$encode htmlspecialchars($this->_contentENT_QUOTES) : $this->_content;
        
    }
    
    function 
render()
    {
        return 
$this->getContent();
    }
}
?>

La méthode fonction setContent($content) vas nous permettre d’insérer du contenu.

  • Utilisation :
$planchePhoto=new myElement();
$planchePhoto->setContent('<div class="photos">vos photos</div>');

Maintenant que nous avons créer un nouvel élément de formulaire , ajoutons le à notre formulaire

$my_form->addElement($planchePhoto);

Voilà nous avons ajouté un élément à notre formulaire

Note: 9.00 (3 votes) - Noter cet article - Lire la suite... |

Comment créer votre logo Xoops ?

200912
Février
  Anonyme Documentations   11729

Pour réaliser votre logo Xoops, vous devez disposer du logiciel Adobe Photoshop et télécharger le fichier .psd (document attaché)

Note: 9.00 (2 votes) - Noter cet article - Lire la suite...
(1) 2 3 4 ... 7 »
Propulsé avec XOOPS | Graphisme adapté par Tatane, Grosdunord, Montuy337513

81 Personne(s) en ligne (2 Personne(s) connectée(s) sur Articles) | Utilisateur(s): 0 | Invité(s): 81 | Plus ...