<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Hoa Forum]]></title>
	<link rel="self" href="http://forum.hoa-project.net/feed/atom/forum/10/"/>
	<updated>2010-05-18T14:37:03Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.hoa-project.net/</id>
		<entry>
			<title type="html"><![CDATA[A propos de gettext]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/203/a-propos-de-gettext/new/posts/"/>
			<summary type="html"><![CDATA[gettext c'est bien, c'est sur, mais ca souffre quand même d'une dépendance plus qu'embettante au système: les locales doivent être configurée de façon adéquate.

cad: si vous voulez votre site en en_US, fr_FR vous devez avoir ces locales installées, on n'a pas toujours la main sur ces choses la quand on utilise un framework comme HoA :)]]></summary>
			<author>
				<name><![CDATA[Cyrano]]></name>
				<uri>http://forum.hoa-project.net/user/69/</uri>
			</author>
			<updated>2010-05-18T14:37:03Z</updated>
			<id>http://forum.hoa-project.net/topic/203/a-propos-de-gettext/new/posts/</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Hoa_Form_element_Other]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/370/hoaformelementother/new/posts/"/>
			<summary type="html"><![CDATA[Il me manquait à chaque fois dans les formulaires pouvoir ajouter du texte entre des champs

Maintenant c'est possible :D

1/ Ajouter dans [b]Library/Form/Form.php[/b] :
[code]const ELEMENT_OTHER             = 'other';[/code]

2/ Ajouter dans [b]Library/Form/Element/Form.php[/b] dans la variable privé [b]$matching [/b]:
[code]'label'    => 'Label'[/code]

3/ Ajouter l'élément suivant dans Library/Element/Other.php
[code]<?php

/**
 * Hoa Framework
 *
 *
 * @license
 *
 * GNU General Public License
 *
 * This file is part of Hoa Open Accessibility.
 * Copyright (c) 2007, 2009 Ivan ENDERLIN. All rights reserved.
 *
 * HOA Open Accessibility is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * HOA Open Accessibility is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with HOA Open Accessibility; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 *
 * @category    Framework
 * @package     Hoa_Form
 * @subpackage  Hoa_Form_Element_Textarea
 *
 */

/**
 * Hoa_Framework
 */
require_once 'Framework.php';

/**
 * Hoa_Form_Exception
 */
import('Form.Exception');

/**
 * Hoa_Form_Element_Abstract
 */
import('Form.Element.Abstract');

/**
 * Class Hoa_Form_Element_Textarea.
 *
 * Describe the textarea element.
 *
 * @author      Antoine DARCHE <darche.antoine@gmail.com>
 * @copyright   Copyright (c) 2010 Antoine DARCHE.
 * @license     http://gnu.org/licenses/gpl.txt GNU GPL
 * @since       PHP 5
 * @version     0.1
 * @package     Hoa_Form
 * @subpackage  Hoa_Form_Element_Other
 */

class Hoa_Form_Element_Other extends Hoa_Form_Element_Abstract {

    /**
     * List of attributes.
     *
     * @var Hoa_Form_Element_Abstract array
     */
    protected $attributes = array();

    /**
     * Value of the textarea.
     *
     * @var Hoa_Form_Element_Textarea string
     */
    protected $value = null;

    /**
     * Built a textarea.
     *
     * @access  public
     * @param   mixed   $attributes    Attributes.
     * @param   mixed   $rest          Rest of options.
     * @return  void
     */
    public function __construct ( $attributes, $rest = array() ) {

        parent::__construct($attributes, 'id');

        if(is_array($rest)) {

            if(isset($rest['value'])) {
                $this->setValue($rest['value']);
            }
            $this->setDecorator('Other');
        }
        else
            $this->setDecorator('Other');
    }

    /**
     * Set the textarea value.
     *
     * @access public
     * @param  string  $value    The textarea value.
     * @return string
     */
    public function setValue ( $value ) {

        $old         = $this->value;
        $this->value = $value;

        return $old;
    }

    /**
     * Get the textarea value.
     *
     * @access  public
     * @return  string
     */
    public function getValue ( ) {

        return $this->value;
    }

    /**
     * Transform the object into a string.
     *
     * @access  public
     * @return  string
     */
    public function __toString ( ) {

        try {

            return $this->getValue();
        }
        catch ( Hoa_Form_Exception $e ) {

            return $e->__toString();
        }
    }
}
[/code]

3/ Ajouter le décorateur suivant dans Library/Decorator/Other.php
[code]<?php

/**
 * Hoa Framework
 *
 *
 * @license
 *
 * GNU General Public License
 *
 * This file is part of Hoa Open Accessibility.
 * Copyright (c) 2007, 2009 Ivan ENDERLIN. All rights reserved.
 *
 * HOA Open Accessibility is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * HOA Open Accessibility is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with HOA Open Accessibility; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 *
 * @category    Framework
 * @package     Hoa_Form
 * @subpackage  Hoa_Form_Decorator_Textarea
 *
 */

/**
 * Hoa_Framework
 */
require_once 'Framework.php';

/**
 * Hoa_Form_Exception
 */
import('Form.Exception');

/**
 * Hoa_Form_Decorator_Abstract
 */
import('Form.Decorator.Abstract');

/**
 * Class Hoa_Form_Element_Textarea.
 *
 * Describe the textarea element.
 *
 * @author      Antoine DARCHE <darche.antoine@gmail.com>
 * @copyright   Copyright (c) 2010 Antoine DARCHE.
 * @license     http://gnu.org/licenses/gpl.txt GNU GPL
 * @since       PHP 5
 * @version     0.1
 * @package     Hoa_Form
 * @subpackage  Hoa_Form_Element_Other
 */

class Hoa_Form_Decorator_Other extends Hoa_Form_Decorator_Abstract {

    /**
     * Make a render of a textarea.
     *
     * @access  public
     * @param   Hoa_Form_Element_Abstract  $element      The element.
     * @param   Hoa_Form_Element_Label     $label        The associated label
     *                                                   element.
     * @param   Hoa_Validate_Abstract      $validator    The element validator
     *                                                   collection.
     * @return  string
     */
    public function render ( Hoa_Form_Element_Abstract $element,
                             Hoa_Form_Element_Label    $label=null,
                             Hoa_Validate_Abstract     $validator ) {

        return $element . "\n";
    }
}
[/code]


Maintenant l'installation terminé, vous pouvez l'utiliser comme bon vous semble.

[b]exemple simple :[/b]
[code]
'titrePartOne' = array(
    'type'      => Hoa_Form::ELEMENT_OTHER,
    'value'        => '<br /><br /><h3>Langue du site</h3>'
);
[/code]]]></summary>
			<author>
				<name><![CDATA[Hywan]]></name>
				<email><![CDATA[darche.antoine@gmail.com]]></email>
				<uri>http://forum.hoa-project.net/user/77/</uri>
			</author>
			<updated>2010-05-14T21:07:12Z</updated>
			<id>http://forum.hoa-project.net/topic/370/hoaformelementother/new/posts/</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Hoa_Form_Element_InputCaptcha]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/348/hoaformelementinputcaptcha/new/posts/"/>
			<summary type="html"><![CDATA[Hey tout le monde,

J'ai confectionné un Hoa_Form_Element_InputCaptcha avec [url]http://www.captcha.net/[/url]
Je vous partage ça ce soir, par contre c'est la version 0.1 !, assez propre mais pas paramétrable entièrement.
A ce soir ! :)]]></summary>
			<author>
				<name><![CDATA[Hywan]]></name>
				<email><![CDATA[darche.antoine@gmail.com]]></email>
				<uri>http://forum.hoa-project.net/user/77/</uri>
			</author>
			<updated>2010-03-29T08:50:41Z</updated>
			<id>http://forum.hoa-project.net/topic/348/hoaformelementinputcaptcha/new/posts/</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Hoathis_Pagination]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/328/hoathispagination/new/posts/"/>
			<summary type="html"><![CDATA[Yep,

Alors voilà je soumet ma petite classe à la critique... (aie aie aie :o )
L'utilisation est simple:[code]<?php

// Import du module
importModule('Pagination.~');


$pagi = new Hoathis_Pagination(
    array(
        'sql'=>'SELECT * FROM matable',
        'sqlcount'=>'SELECT count(*) FROM videos',
        'nbelmts'=>2,
        'actions'=>PUBLIC_URL.'Medias/Videos-%d.html',
        'default'=>PUBLIC_URL.'Medias/Videos.html',
        'page'=>!empty($params['data.array']['page']) ? $params['data.array']['page']:1
    )
);

// récupération du code html généré de la navigation
$this->view->navi = $pagi->navi();

try {

    // éxécution de la requête modifiée afin de ne prendre en compte
    // que les données de la page courante
    $statement = $pagi->query();
    $videoListSql = $statement->fetchAll();
}
catch ( Hoa_Database_Dal_Exception $e ) {
 
    $statement->closeCursor();
}[/code]


Bon voilà les points qui me semblent à revoir:
[list=*]
[*]La gestion des erreurs (j'utilise les exceptions, mais pas partout, et pas uniformément)
Faut-il faire une classe d'exceptions personnalisée?[/*]
[*]Une meilleure gestion des paramètres passés au constructeur?[/*]
[*]Une uniformisation des paramètres (dans leurs noms notamment)[/*]
[/list]

Ensuite viendront tout ceux que vous trouverez ;)
Pour l'instant la classe ne gère que les requêtes de types "LIMIT x,y", mais je l'améliorerais au besoin pour gérer des requêtes de type BETWEEN ou d'autres si vous en avez besoin :)

Bien sûr c'est encore en test donc ça reste là, mais une fois finalisée et approuvée, elle pourra rejoindre les autres sur hoap our sur le futur gestionnaire de plugins de hoa :p

Voilou merci d'avances pour vos critiques!

EDIT: J'ai pas dit à quoi servait la classe, mais est-ce bien utile? :-°

j'ai faillit oublier:
[code]<?php
/**
 * Hoa Framework
 *
 *
 * @license
 *
 * GNU General Public License
 *
 * This file is part of HOA Open Accessibility.
 * Copyright (c) 2007, 2008 Ivan ENDERLIN. All rights reserved.
 *
 * HOA Open Accessibility is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * HOA Open Accessibility is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with HOA Open Accessibility; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 *
 * @category    Framework
 * @package     Hoa_Framework
 *
 */

/**
 * Hoa_Framework
 */
require_once 'Framework.php';

/**
 * Hoa_Database
 */
import('Database.Dal.~');

/**
 * Hoathis_Pagination_Exception
 */
importModule('Pagination.Exception');

/**
 * Class Hoathis_Pagination
 *
 * @author      joris MULLIEZ <joris.mulliez@gmail.com>
 * @license     http://gnu.org/licenses/gpl.txt GNU GPL
 * @since       PHP 5
 * @version     0.1
 * @package     Hoathis_Pagination
 */
class Hoathis_Pagination {

    /**
     * Instance d'Hoa_Database
     */
    private $db=null;

    /**
    *  variable contenant la requète d'origine (sans condition LIMIT)
    */
    private $requete=null;    
    
    /**
    *  variable contenant la requète de comptage
    */
    private $reqCount=null;
    
    /**
    *  variable contenant le nombre d'éléments à  afficher sur une page
    */
    private $nbElmts=1;
    
    /**
    *  variable contenant le nombre de résultats de la requête
    */
    private $nbResults=0;    
    
    /**
    *  variable contenant le numéro de la page courante
    */
    private $currentPage=1;
    
    /**
    *  variable contenant le début de la barre de navigation
    */
    private $prefix='';    
    
    /**
    *  variable contenant le séprateur de la barre de navigation
    */
    private $nbPageGrp=0;    
    
    /**
    *  variable contenant les caractères d'elipse
    */
    private $elipse='';    
    
    /**
    *  variable contenant le title du <a>
    */
    private $titlelink='';
    
    /**
    *  variable contenant la page à appeler php
    */
    private $url='';
    
    /**
    *  variable contenant l'instruction js à éxécuter
    */
    private $js='';
    
    /**
    *  variable contenant le code html qui entoure la page courante
    */
    private $arroundCurrentPage='';
    
    /**
    *  A true si on veut afficher la pagination alors qu'il n'y a qu'une page
    */
    private $needPagi1=false;
    
    /**
    *  Page à donner par défaut (page 1)
    */
    private $urlDefault=null;



    /**
    * pagination::__construct
    *
    * Initialise les variables
    *
    * @access public
    * @param  array      $arguments    tableau contenant les différents arguments : 
    *         'sql'            requête de selection (Sans clause LIMIT)
    *        'sqlcount'         requête de comptage
    *         'nbresults'        Si nombre de résultats connus, remplace sqlcount
    *         'nbelmts'        Nombre d'éléments par pages
    *         'actions'         Actions à effectuer (php ou js) forme:
    *                                 array(
    *                                   'js'  =>'alert(%d)',
    *                                   'php' =>'urlscript.php?page=%d'
    *                                 )
    *                               ou si uniquement php:
    *                                 'urlscript.php?page=%d'
    *                               (%d correspond au numéro de la page concernée)
    *         'page'            Page courante (paramètre get ou encore
    *                           valeur par défaut pour le JS)
    *        'nbpagesgrpes'    Nombre de page par groupement de page
    *                           ex si = 2:
    *                           1 2 3 ... 5 6 [7] 8 9 ... 15 16 17
    *         'prefix'          Texte de début de la pagination
    *         'elipse'           Caractères affichés pour les élipses
    *         'needPagi1'        Indique si on affiche la pagination lorsqu'il
    *                         n'y a qu'un seule page
    *         'titlelink'        title du <a>
    *         'arroundCurrent'Code html pour habiller la page courante
    *                         ex: <b>%d</b>
    *         'default'        Page par défaut (page n°1), si l'on ne souhaite
    *                         pas avoir par exemple de lien du type
    *                         videolist-page-1.html, mais seulement
    *                         videolist.html (duplicate content,SEO,etc...)
    *
    * @return none
    */
    public function __construct( $arguments ){
        
        // Récupération de l'instance de connexion
        if($this->db===null){
            $this->db = Hoa_Database_Dal::getLastInstance();
            
            // A garder ou non celon la configuration serveur
            $this->db->query("SET NAMES 'utf8'");
        }

        // Requête d'affichage (obligatoire)
        if(!empty($arguments['sql'])){
          $this->requete      = $arguments['sql'];
        }
        else {
            throw new Exception('You have to give an sql request');
        }

        // Requête de comptage (obligatoire)
        if(!empty($arguments['sqlcount'])){
          $this->reqCount = $arguments['sqlcount'];
          $this->queryCount();
        }
        // Ou nombre de résultats
        elseif (isset($arguments['nbresults']) && (int)$arguments['nbresults']>=0) {
          $this->nbResults=(int)$arguments['nbresults'];
        }
        else {
          throw new Exception('You have to give a counting sql request
            or directly the number of results');
        }

        // Nombre d'éléments affichés par page
        if(!empty($arguments['nbelmts'])){
          $this->nbElmts      = (int)$arguments['nbelmts'];
        }
        // Valeur par défaut
        else {
          $this->nbElmts      = 10;
        }

        // Page actuelle
        if(isset($arguments['page'])){
          $this->currentPage  = (int)$arguments['page'];
        }
        // Valeur par défaut
        else {
          $this->currentPage  = isset($_GET['page']) ? (int)$_GET['page'] :1;
        }

        // Prefixe de la barre de navigation
        if(isset($arguments['prefix'])){
          $this->prefix = $arguments['prefix'];
        }
        // Valeur par défaut
        else {
          $this->prefix = 'Page(s) : ';
        }

        // besoin de pagination si une seule page
        if(!empty($arguments['needPagi1'])){
          $this->needPagi1 = (bool)$arguments['needPagi1'];
        }

        // Groupements de pages
        if(!empty($arguments['nbpagesgrpes'])){
          $this->nbPageGrp  = (int)$arguments['nbpagesgrpes'];
        }
        // Valeur par défaut
        else {
          $this->nbPageGrp  = 2;
        }
        
        // Texte de l'elipse
        if(!empty($arguments['elipse'])){
          $this->elipse = ' '.$arguments['elipse'];
        }
        // Valeur par défaut
        else {
          $this->elipse = ' ...';
        }

        // Title des liens
        if(!empty($arguments['titlelink'])){
          $this->titlelink  = $arguments['titlelink'];
        }
        // Valeur par défaut
        else {
          $this->titlelink  = 'Aller à la page ';
        }

        // Arround current page
        if(!empty($arguments['arroundCurrentPage'])){
          $this->arroundCurrentPage = ' '.$arguments['arroundCurrentPage'];
        }
        // Valeur par défaut
        else {
          $this->arroundCurrentPage = ' <b>%d</b>';
        }
    
        if(!empty($arguments['default'])){
          $this->urlDefault=$arguments['default'];
        }
    
        // Action(s) à effectuer sur les liens
        if(!empty($arguments['actions'])){
          if(is_array($arguments['actions'])){

            // Url => action php
            if(!empty($arguments['actions']['url'])){
              $this->url = $arguments['actions']['url'];
            }
            else {
              // Valeur par défaut
              $this->url = $this->buildUrl();
            }

            // Js
            if(!empty($arguments['actions']['js'])){
              $this->js=$arguments['actions']['js'];
            }
          }
          // Seulement url
          else {
              $this->url=$arguments['actions'];
          }
        }
        // Valeur par défaut
        else {
          $this->url  = $this->buildUrl();
        }
    }
    
    /**
    * pagination::buildUrl
    *
    * Retourne l'url de la page avec tout les arguments formaté pour
    * le sprintf à venir (ie ajout du page=%d)
    *
    * @access private
    * @param  none
    * @return string    L'url utilisé dans la fonction navi
    */
    private function buildUrl(){
        $args='';
        foreach($_GET as $key=>$val){
          if($key!=='page'){
            $args.=(!empty($args) ? '&':'').$key.'='.urlencode($val);
          }
        }
        
        if(empty($this->urlDefault)){
          $this->urlDefault=PUBLIC_URL.'/index.php?'.$args;
        }
        
        return PUBLIC_URL.'/index.php?'.$args.'&page=%d';
    }

    /**
    * pagination::queryCount
    *
    * Initialise le nombre de résultats avec la requête de comptage
    *
    * @access private
    * @param  none
    * @return none
    */
    private function queryCount(){
          
        try {
            $statement = $this->db->query( $this->reqCount );
            list($results) = $statement->fetchAll();
        }
        catch ( Hoa_Database_Dal_Exception $e ) {
         
            $statement->closeCursor();
        }
        
        $this->nbResults= (int)reset($results);
    }

    /**
    * pagination::navi
    *
    * Produit le code html de navigation
    *
    * @access   public
    * @param    none
    * @return   string  Le code html de la barre de navigation
    */
    public function navi(){
    
        // Comptage des résultats
        $nbResults = $this->nbResults;
        
        // Nombre de pages nécessaires
        $nbPages=ceil($nbResults/$this->nbElmts);
        
        // Construction de l'évènement js
        $js=empty($this->js) ? '':' onclick="'.$this->js.'"';
        
        
        
        // Si il y a au moins une page à afficher
        if($nbPages >= 1){
        
          //si la page demandée n'existe pas, alors on blance une exeption
          if($this->currentPage > $nbPages){
            throw new Exception('This page ('.$this->currentPage.') does\'nt exist...');
          }
          elseif($this->currentPage < 0){
            throw new Exception('This page ('.$this->currentPage.') does\'nt exist...');
          }
        
          // On préfixe la $navi
          if ($this->needPagi1 == true || $nbPages > 1) {
            $navi=$this->prefix;
          }
        
          // Si il y a plus d'une page
          // C'est partit pour les calculs
          if($nbPages > 1){
              
            // Pages précédentes
            for($i=1;$i<$this->currentPage;$i++){
              $navi.=' <a href="'.($i == 1 ? $this->urlDefault : sprintf($this->url,$i)).'" '.sprintf($js,$i).'title="'.$this->titlelink.$i.'">'.$i.'</a>';
        
              // Si on arrive à l'elipse
              if($this->nbPageGrp==$i && ($this->currentPage-$i) > ($this->nbPageGrp+1)){
                $navi.= $this->elipse;
                // On sort de la boucle
                $i=$this->currentPage-$this->nbPageGrp-1;
              }
            }
        
            //page en cours
            if($this->currentPage>0){
              $navi.= sprintf($this->arroundCurrentPage,$this->currentPage);
            }
        
            // Pages suivantes
            for($j=($this->currentPage+1);$j<=$nbPages;$j++){
              $navi.=' <a href="'.($j == 1 ? $this->urlDefault : sprintf($this->url,$j)).'" '.sprintf($js,$j).'title="'.$this->titlelink.$j.'">'.$j.'</a>';
        
              // Si on arrive à l'elipse
              if(($this->nbPageGrp+$this->currentPage)==$j && ($nbPages-$j)>$this->nbPageGrp){
                $navi.=$this->elipse;
                // On sort de la boucle
                $j=$nbPages-$this->nbPageGrp;
              }
            }
        
          }
          // Une seule page, on ne fait pas de traitement
          else {
            if ($this->needPagi1 == true) {
              $navi.=' <b>1</b>';
            }
        
          }
        }
        // Pas de résultats
        else {
          $navi='';
        }
        return $navi;
    
    }
    
    /**
    * pagination::query
    *
    * Execute la requète avec le limit, et renvoi une resource
    *
    * @access   public
    * @param    none
    * @return   mixed    Hoa_Database_Dal_DalStatement  or false when 
    *                     errors occurs
    */
    public function query(){
        
        $limit=" LIMIT ".(($this->currentPage-1)*$this->nbElmts).",".$this->nbElmts;
        
        try {
            
            $statement = $this->db->query( $this->requete.$limit );
            return $statement;
            
        }
        catch ( Hoa_Database_Dal_Exception $e ) {
         
            echo $e;
            $statement->closeCursor();
            return false;
        }
        
    }

}
[/code]]]></summary>
			<author>
				<name><![CDATA[Hywan]]></name>
				<uri>http://forum.hoa-project.net/user/20/</uri>
			</author>
			<updated>2010-02-04T17:43:04Z</updated>
			<id>http://forum.hoa-project.net/topic/328/hoathispagination/new/posts/</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Contributions utilisateurs : FAQ/Mini-Tutos/Gros-Tutos ?]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/310/contributions-utilisateurs-faqminitutosgrostutos/new/posts/"/>
			<summary type="html"><![CDATA[Bonsoir bonsoir,

Je voulais proposer une idée (peut-être un peu en avance) à propos des contributions utilisateurs.
Il y a déjà sur cette catégorie des personnes qui proposent des "plugins/paquets/classes", mais il manque à mon sens un endroit où nous pourrions contribuer à transmettre le (maigre pour ma part) savoir que l'on a sur Hoa.
En effet tu auras beau mettre toute ton énergie dans la doc et les tutos, tu ne pourras pas approfondir tout les aspect de Hoa dans des tutoriels spécifiques...

Du coup tu pourrais profiter de l'expérience que nous avons (ou allons acquérir) pour alléger la masse de travail de ce côté là.

j'imagine assez bien les tutoriels "officiels" peut-être assez généraux, et par exemple des contributions sur un point particulier, genre:
"Comment mettre en place l'url rewriting avec Hoa" ou "Manipulation d'un xml" ou que sais-je encore...

J'ai dit "peut-être un peu avance", parce que moi même, je ne me sens pas de re-transmettre quoi que ce soit pour l'instant... (qui a dit que je n'y comprend rien à Hoa? :p ) Mais d'autres utilisateurs sont surement plus chevronnés!

Après techniquement, les solutions sont multiples:
Un wiki à accès restreint (ou pas)
Rester sur le forum (à la manière de phpfrance)
Dev spécifique (pour le coup le temps gagné sera perdu à dev l'outil :p )

Voili voilou!!!]]></summary>
			<author>
				<name><![CDATA[jojolapine]]></name>
				<uri>http://forum.hoa-project.net/user/20/</uri>
			</author>
			<updated>2009-12-14T20:28:29Z</updated>
			<id>http://forum.hoa-project.net/topic/310/contributions-utilisateurs-faqminitutosgrostutos/new/posts/</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Hoa_Image]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/272/hoaimage/new/posts/"/>
			<summary type="html"><![CDATA[Hey tout le monde,

J'apporte moi aussi ma contribution pour cette communauté en rendant officiel mon package [b]Hoa_Image[/b] qui sera composé de :

[list=*]
[*][b]Hoa_Image_Resize :[/b]  redimensionner une image ou un répertoire d'images[/*]
[/list]
[list=*]
[*][b]Hoa_Image_Color :[/b] changer les niveaux de d'une image couleur ou d'un répertoire[/*]
[/list]
[list=*]
[*][b]Hoa_Image_Font :[/b] crée un texte image à partir d'une police pré donné[/*]
[/list]
[list=*]
[*][b]Hoa_Image_Font_Background :[/b] crée une texte image à partir d'une police pré donné avec une image en background[/*]
[/list]

Toutes ces librairies seront accompagné d'une panoplie d'options.

Je vous en dis pas plus pour le moment.

Je vous pris de bien vouloir patientez un bon moment car l'objet clean (à la Hoa) ça prend du temps !]]></summary>
			<author>
				<name><![CDATA[Hywan]]></name>
				<email><![CDATA[darche.antoine@gmail.com]]></email>
				<uri>http://forum.hoa-project.net/user/77/</uri>
			</author>
			<updated>2009-10-19T10:20:20Z</updated>
			<id>http://forum.hoa-project.net/topic/272/hoaimage/new/posts/</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Hoa_Kml]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/252/hoakml/new/posts/"/>
			<summary type="html"><![CDATA[Bonjour à tous !

Je vous annonce la venue d'un petit nouveau: Hoa_Kml 0.1 !

KML (Keyhole Markup Language) est un langage basé sur le formalisme XML et destiné à la gestion de l'affichage de données géospatiales dans les logiciels Google Earth, Google Maps, Google Mobile, World Wind et biens d'autres...

Les fichiers KML utilisent le format COLLADA et peuvent également se présenter avec l'extension .kmz qui est la version zippée du fichier KM.

Au menu dans ce package :

- Formats de sortie: kml, kmz
- Répertoire pour documents
- Documents
- Points de repère
- Points
- Tracés - lignes
- Volumes
- Polygones
- Personnalisation des styles (couleurs, icônes,  fonds, etc...)
- Personalisation des bulles (texte, html)
- Animations
- Visites guidées
- et pleins d'autres choses...

Téléchargement:
[url]http://code.google.com/p/hoap/[/url]

Référence:
[url]http://code.google.com/intl/fr-FR/apis/kml/documentation/kmlreference.html[/url]
[url]http://kml-samples.googlecode.com/svn/trunk/interactive/index.html[/url]
[url]http://code.google.com/intl/fr-FR/apis/earth/[/url]

Pour en savoir plus:
[url]http://fr.wikipedia.org/wiki/Keyhole_Markup_Language[/url]
[url]http://code.google.com/intl/fr-FR/apis/kml/documentation/[/url]

[img]http://code.google.com/apis/kml/documentation/Images/jimmybuffettscreen.png[/img]]]></summary>
			<author>
				<name><![CDATA[Hywan]]></name>
				<uri>http://forum.hoa-project.net/user/65/</uri>
			</author>
			<updated>2009-09-30T16:37:33Z</updated>
			<id>http://forum.hoa-project.net/topic/252/hoakml/new/posts/</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Hoa_VideoPlayer béta]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/237/hoavideoplayer-beta/new/posts/"/>
			<summary type="html"><![CDATA[Hey !

Je vous présente [b]Hoa_VideoPlayer béta[/b] !
Comme son nom l'indique, [b]ce package est un lecteur de vidéos partagées[/b].


[u][b]Téléchargement :[/b][/u] 

Voici un lien pour le téléchargement car je ne dispose pas des permissions pour déposer sur le SVN.
[url]http://www.netiva.fr/Sources/Hoa/VideoPlayer_beta_0.3.7z[/url]
autres versions :
[url]http://www.netiva.fr/Sources/Hoa/VideoPlayer_beta_0.2.7z[/url]
[url]http://www.netiva.fr/Sources/Hoa/VideoPlayer_beta_0.1.7z[/url] (sans parser d'url)

[u][b]Au menu :[/b][/u]

- Une gestion de serveurs: Dailymotion, Youtube, Vimeo
- Une gestion de players: Flash
- Un parseur d'url: Dailymotion, Youtube, Vimeo

[u][b]A corriger :[/b][/u]

- VideoPlayer.php -> ligne 133 methode __string()

[u][b]A faire :[/b][/u]

- Traduction des fichiers

[u][b]Exemples :[/b][/u]

[code]
<?php

/**
 * Demo VideoPlayer
 *
 * @author      Grégory DARCHE <gregory.darche@netiva.fr>
 * @copyright   Copyright (c) 2009 Grégory DARCHE.
 * @license     http://gnu.org/licenses/gpl.txt GNU GPL
 * @since       PHP 5
 * @version     0.1
 * @package     Hoa_VideoPlayer
 */

error_reporting(E_ALL);

/**
 * Hoa_Framework
 */

set_include_path('./'            . PATH_SEPARATOR .
                 './Application' . PATH_SEPARATOR .
                 './Framework'   . PATH_SEPARATOR .
                 get_include_path());

require_once 'Framework.php';

/**
 * Importation du package
 */
import('VideoPlayer.~');

/**
 * Configuration pour l'exemple
 */
define('DEBUG', true);

/**
 * Fonction pour l'exemple
 */
function player ( array $param ) {

    echo $player = new Hoa_VideoPlayer($param);

    if (DEBUG) {
        echo '<br />';
        echo '<br />Nom du serveur: '.$player->getServerName();
        echo '<br />Id de la video: '.$player->getVideoId();
        echo '<br />URL de la video: <a href="'.$player->getVideoUrl().'" target="_blank">'.$player->getVideoUrl().'</a>';
        echo '<br />Parametre du player: <pre>'.print_r($player->getPlayerParam(), true).'</pre>';
        echo '<br />Parametre du serveur: <pre>'.print_r($player->getServerParam(), true).'</pre>';
        echo '<br />Code HTML: <pre style="background:#EFEFEF;">'.htmlentities($player).'</pre>';
        echo '<hr />';
    }
}

/**
 * Exemple simple avec parseur 
 */
$param = array(
    'server' => array(
        'server' => 'Vimeo'
    ),
    'parser' => array(
        'url' => 'http://www.vimeo.com/5757662'
    ),
    'player' => array(
        'width' => 800,
        'height' => 600
    )
);
player($param);

/**
 * Exemples simples sans parseur
 */
$param = array(
    'server' => array(
        'server' => 'Vimeo',
        'id' => '5757662'
    )
);
player($param);

$param = array(
    'server' => array(
        'server' => 'youtube',
        'id' => 'lz6cjVTSZ3I'
    )
);
player($param);

$param = array(
    'server' => array(
        'server' => 'dailymotion',
        'id' => 'x7qvmh_kitesurf-perou_sport'
    )
);
player($param);

/**
 * Exemple avancé
 */
$param = array(
    'player' => array(
        'player' => 'Flash',
        'url' => null,
        'width' => 800,
        'height' => 600,
        'param' => array(
            'allowFullScreen' => 'true',
            'allowscriptaccess' => 'always'
        )
    ),
    'server' => array(
        'server' => 'Vimeo',
        'param' => array(
            'server' => 'vimeo.com',
            'show_title=' => '0',
            'show_byline' => '0',
            'show_portrait' => '0',
            'color' => 'FF0000',
            'fullscreen' => '1'
        )
    ),
    'parser' => array(
        'url' => 'http://www.vimeo.com/5757662'
    )
);
player($param);

?>
[/code]

En attente de vos tests et réactions,
A bientôt ^^]]></summary>
			<author>
				<name><![CDATA[Hywan]]></name>
				<uri>http://forum.hoa-project.net/user/65/</uri>
			</author>
			<updated>2009-07-30T11:24:58Z</updated>
			<id>http://forum.hoa-project.net/topic/237/hoavideoplayer-beta/new/posts/</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Hoa_Database_Xml]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/240/hoadatabasexml/new/posts/"/>
			<summary type="html"><![CDATA[Voici un topic pour parlé de mon idée de base de données en XML.

Je vois les choses comme ceci :
-Un Dossier par base de donnée
- Un fichier par table (Pour que ce soit plus léger et parsable)
Dans les fichiers une structure de base en XML.



<?xml ... > 
<header>
<col1>array('ID' , 'INT(11)' , 'NULL' , 'A-I')</col1> // Pour faciliter l'export vers du SQL ou autre
<col2>....</col2>
</header>
<content>
<row1>
<id>0</id>
<autrecolonne></autrecolonne>
</row1>
</content>


Qu'en pensez vous ?
Ensuite on gere le tout avec SimpleXML ou tout autre moyen de gestion de flux (Hoa_XML).

J'avais pensé a garder la base du language SQL , comme : "SELECT DISTINCT WHERE LIMIT GOUP BY'

Et une utilisation du genre :

$xml = new Hoa_Database_xml('My Database');
$xml->location('My_table');
$output = $xml->selectall()->where(array('id' => 0))->limit(0,10)->group('id')->output();

où output est un array comme il faut.

Ou encore en prenant le principe de PDO avec : $xml->query('SELECT * FROM My_table WHERE id = 0 LIMIT 0,10 GROUP BY id');

Aussi gerer la communication avec les autres BDD (Mysql , SQLite ...) , avec des fonctions d'export , et de sauvegarde.

Tout en sachant que c'est pour des opérations de base (UPDATE, DELETE , ...).

Pas de chose comme les jointures et tout 

Voici mon idée qu'en pensez vous ?


Bonne aprem Hawk]]></summary>
			<author>
				<name><![CDATA[thehawk]]></name>
				<uri>http://forum.hoa-project.net/user/75/</uri>
			</author>
			<updated>2009-07-28T11:13:21Z</updated>
			<id>http://forum.hoa-project.net/topic/240/hoadatabasexml/new/posts/</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Hoa_Head - Episode 1]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/228/hoahead-episode-1/new/posts/"/>
			<summary type="html"><![CDATA[Hey !

[b]Présentation du Package Hoa_Head[/b]

[b]Hoa_Head[/b] est [b]un assistant de vue[/b] (merci Hywan pour la description simplifiée) pour [b]générer une balise <head> avec ses balises enfant[/b].



[b]Objectifs[/b]

- Générer des balises à la volée :
[list=*]
[*]titre de page,description,mots clé,fichier JS,code JS,fichier CSS,code CSS,favicon,auteur[/*]
[*]clé de référencement pour les moteurs de recherche: google, bing, yahoo,etc...[/*]
[*]etc... voir la doc W3C sur l'ensemble des possibilitées...[/*]
[/list]

- Ajouter de règles suivant le navigateur
[list=*]
[*]<!--[if lte IE 5>...<![endif]-->[/*]
[*]<!--[if lte IE 6>...<![endif]-->[/*]
[*]<!--[if lte IE 7>...<![endif]-->[/*]
[*]etc... voir doc W3C...[/*]
[/list]

- Utiliser des outils divers
[list=*]
[*]Générateur de mots clé pertinents suivant un ensemble de textes[/*]
[*]Analyseur de média: iphone, smartphone, wap, mobile, etc...[/*]
[/list]



[b]La structure des fichiers qui pour le moment n'est qu'une proposition[/b]

[code]
Element/Abstract.php
Element/Head.php
Element/Link.php
Element/Meta.php
Element/...

Rule/Abstract.php
Rule/Default.php.php
Rule/IE5.php
Rule/IE6.php
Rule/IE7.php
Rule/...

Tool/Keyword.php
Tool/Media.php
Tool/...

Head.php
Exception.php
[/code]



[b]Idée d'utilisation (inspiré de Hoa_Form)[/b]

[code]
import('Head.~');

$head = Hoa_Head::getInstance();

$head->addElements(array(

        'metaTitle'       => array(
            'type'        => Hoa_Head::ELEMENT_META,
            'attribute'   => array(
                'name'    => 'title',
                'content' => 'Package Hoa_Head'
            )
    ),
        'metaDescription' => array('type' => Hoa_Head::ELEMENT_META, 'attribute' => array('name' => 'description','content' => 'Package Hoa_Head')),
        'metaKeyword' => array('type' => Hoa_Head::ELEMENT_META, 'attribute' => array('name' => 'keyword', 'content' => 'Package Hoa_Head')),

        'linkGlobal'      => array(
            'type'       => Hoa_Head::ELEMENT_LINK,
            'attribute'  => array(
                'href'     => 'global.css'
            )
    ),

    'linkPrint'      => array(
            'type'       => Hoa_Head::ELEMENT_LINK,
            'attribute'  => array(
                'href'     => 'style-cleaner.css',
                'media'     => 'print'
            ),
            'rule' => array(
                'name' => 'IE7'
      )
    )

));

$head->addElement(array(
    'type'       => Hoa_Head::ELEMENT_LINK,
    'attribute'  => array(
        'href'   => 'print.css'
    )
));
[/code]



[b]Exemple de la portion de code HTML généré à passer a la vue[/b]
[code]
<!-- HEAD -->
<meta name="title" content="Package Hoa_Head" />
<meta name="description" content="Package Hoa_Head" />
<meta name="keyword" content="Package Hoa_Head" />
<link rel="stylesheet" type="text/css" href="global.css" media="screen" charset="utf-8" />
<link rel="stylesheet" type="text/css" href="print.css" media="print" charset="utf-8" />
<link rel="stylesheet" type="text/css" href="style-cleaner.css" media="screen" charset="utf-8" />
<!-- /HEAD -->
[/code]



A la recherche d'idées... (je vous fait confiance)

Voilou :)]]></summary>
			<author>
				<name><![CDATA[tetardo]]></name>
				<uri>http://forum.hoa-project.net/user/65/</uri>
			</author>
			<updated>2009-07-24T11:39:00Z</updated>
			<id>http://forum.hoa-project.net/topic/228/hoahead-episode-1/new/posts/</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[A propos du référencement de Hoa]]></title>
			<link rel="alternate" href="http://forum.hoa-project.net/topic/226/a-propos-du-referencement-de-hoa/new/posts/"/>
			<summary type="html"><![CDATA[Hey,

par curiosité j'ai regardé la source de hoa de la page d'accueil en ce qui concerne le référencement.
J'ai relevé aucune balise méta (description, titre, keywords, author, etc...) est ce un oubli ?!

[code]
<head> 
  <title>Page principale — Hoa Framework</title> 
  <meta http-equiv="content-type"        content="application/xhtml+xml; charset=utf-8" /> 
  <meta http-equiv="content-script-type" content="text/javascript; charset=utf-8" /> 
  <meta http-equiv="content-style-type"  content="text/css; charset=utf-8" /> 
 
  <link type="image/png" href="Media/Image/Favicon.png" rel="shortcut icon" /> 
 
  <link type="text/css" href="Css/Reset.css"  rel="stylesheet" media="all" /> 
  <link type="text/css" href="Css/Base.css"   rel="stylesheet" media="screen,projection" /> 
  <link type="text/css" href="Css/Layout.css" rel="stylesheet" media="screen,projection" /> 
  <link type="text/css" href="Css/Print.css"  rel="stylesheet" media="print" /> 
  <!--[if lte IE 6]>
  <link type="text/css" href="Css/IE.css"     rel="stylesheet" media="screen,projection" />
  <![endif]--> 
 
  <script type="text/javascript" src="Asset/Script/Mootools.js"></script> 
  <script type="text/javascript" src="Asset/Script/Site.js"></script> 
</head> 
[/code]

---

Il y a un bout de temps de ça, j'avais bricolé une classe HEAD pour facilité la gestion du head, et ressemant j'ai créé une classe pour générer des mots clés suivant des contenus.

Il me semble pas mal de créer un Package similaire à hoa_form, je me suis donc lancé il y a 2 jours dans la[b] création d'un package Hoa_Head[/b].

Je ne peux pas dire combien de temps ce Package va prendre car je suis assez charrette en ce moment, mais bon, petit à petit...

Voici les classes bricolées il y a longtemps, pour donner quelques idées sur le principe. bien sur le Package aura rien a voir dans la méthodologie utilisée.

A la recherche d'idées avant de me mettre pour de bon à la création...

[code]
/**
 * Classe de balise HEAD
 * Générateur de balises d'en-tête HEAD
 *
 * @version 1.5
 * @date 27/03/2008
 * @author Grégory Darche
 * @url http://netiva.fr
 */

class head {

    private $elements;       //!< (array) Tableau des balises ajoutées

    /**
     * Constructeur
     * Initialise la tableau des valeurs par default pour les balises
    */
    public function __construct () {
        $this->elements = array(
           # Commentaires
            'comments' => "<!-- ".date('Y-d-m H:i:s')." -->\r\n",
            # META
            'meta' => array(
                'http-equiv' => array(
                    'Content-Type' => 'text/html; charset=UTF-8',
                    'Content-language' => 'fr',
                    'Robots' => 'all,follow,index',
                    'expires' => '',
                    'refresh' => '',
                    'set-cookie' => ''
                    ),
                'schemes' => array(
                    'ISBN' => '',
                    ),
                'name' => array(
                    'title' => 'Ma page',
                    'keywords' => 'mot1,mot2,mot3',
                    'description' => 'Ma description',
                    'author' => 'Grégory Darche - Netiva.fr',
                    'copyright' => 'Netiva.fr 2007',
                    'rev' => 'support@netiva.fr',
                    'generator' => 'Netiva.fr !',
                    'rating' => 'general',
                    'revisit-after' => '7 days',
                    'robots' => 'all',
          'verify-v1' => '',      /* Clé de référencement google */
          'msvalidate.01' => '',  /* Clé de référencement bing */
          'y_key' => ''           /* Clé de référencement yahoo */
                    )
                ),
            # Link
            'link' => array(
                'favicon' => 'favicon.png',
                'stylesheet' => array(
          'files' => array(
                        'screen' => array(),
                        'print' => array(),
                        'media' => array(),
                        'aural' => array(),
                        'tty' => array(),
                        'tv' => array(),
                        'projection' => array(),
                        'handheld' => array(),
                        'braille' => array(),
                        'all' => array(),
                 'scripts' => array(),
                    )
                )
            ),
            # Scripts
            'script' => array(
                'javascript' => array(
                    'files' => array(),
                    'scripts' => array(),
                    )
                )
        );
        }

    #----------------------------------------------------------------------------
    # Fonctions title, http, metatags, keywords, description
    #----------------------------------------------------------------------------

    /**
     * setTitle
     * Définir la balise META TITLE
     *
     * @param     $str      (string)    Titre de la page
     * @param     $opt    (string)  optionnel - traitement de la variable
     *                            + permet l'ajout a la valeur actuelle (default)
     *                            = permet le remplacement de la valeur actuelle
    */
    public function setTitle($str, $opt='+') {
        if ($opt=='=')
        $this->elements['meta']['name']['title'] = $str;
        else
        $this->elements['meta']['name']['title'].= $str;
        }

    /**
     * setKeywords
     * Définir la balise META KEYWORD
     *
     * @param     $str      (string)  Mots clés de la page
     * @param     $opt    (string)  optionnel - traitement de la variable
     *                            + permet l'ajout a la valeur actuelle (default)
     *                            = permet le remplacement de la valeur actuelle
    */
    public function setKeywords($str, $opt='+') {
    if ($opt=='=') 
        $this->elements['meta']['name']['keywords'] = $str;
        else
        $this->elements['meta']['name']['keywords'].= ','.$str;
        }

    /**
     * setDescription
     * Définir la balise META DESCRIPTION
     *
     * @param     $str      (string)  Description de la page
    */
    public function setDescription($str) {
        $this->elements['meta']['name']['description'] = $str;
        }

    /**
     * setMetaName
     * Définir les balises META avec l'attribut NAME
     *
     * @param     $name      (string)  Contenu de l'attribut NAME
     * @param   $content(string)  valeur de l'attribut CONTENT
    */
    public function setMetaName($name, $content) {
        $this->elements['meta']['name'][$name] = $content;
        }

    /**
     * setMetaHttp
     * Définir les balises META avec l'attribut HTTP
     *
     * @param     $name      (string)  Contenu de l'attribut HTTP
     * @param   $content(string)  valeur de l'attribut CONTENT
    */
    public function setMetaHttp($name, $content) {
        $this->elements['meta']['http-equiv'][$name] = $content;
        }

    /**
     * setMetaSchemes
     * Définir les balises META SHEMES
     *
     * @param     $name      (string)  Contenu de l'attribut HTTP
     * @param   $content(string)  valeur de l'attribut CONTENT
    */
    public function setMetaSchemes($name, $content) {
        $this->elements['meta']['schemes'][$name] = $content;
        }

    /**
     * setFavicon
     * Définir la balise LINK FAVICON
     *
     * @param     $file      (string)  URL de l'icone
    */
    public function setFavicon($file) {
        $this->elements['link']['favicon'] = $file;
        }

    #----------------------------------------------------------------------------
    # Fonctions feuilles et scripts Javascript et CSS
    #----------------------------------------------------------------------------

    /**
     * addCssFile
     * Ajouter un fichier de style CSS
     *
     * @param     $file      (string)  URL du fichier
     * @param   $media  (string)  Optionnel - type de media (default:screen)
    */
    public function addCssFile($file, $media='screen') {
        array_push($this->elements['link']['stylesheet']['files'][$media], $file);
        }

    /**
     * addCssScript
     * Ajouter une portion de code CSS
     *
     * @param     $file      (string)  portion de code
    */
    public function addCssScript($script) {
        $this->elements['link']['stylesheet']['scripts'][] = $script;
        }

    /**
     * addJsFile
     * Ajouter un fichier javascript
     *
     * @param     $file      (string)  URL du fichier
    */
    public function addJsFile($file) {
        array_push($this->elements['script']['javascript']['files'], $file);
        }

    /**
     * addJsScript
     * Ajouter une portion de code Javascript
     *
     * @param     $file      (string)  portion de code
    */
    public function addJsScript($script) {
        $this->elements['script']['javascript']['scripts'][] = $script;
        }

    #----------------------------------------------------------------------------
    # Fonctions pour créer le code HTML <HEAD>
    #----------------------------------------------------------------------------

    /**
     * create
     * Créer la portion HTML contenant l'ensemble des balises générées
     *
     * @return     (string)  Portion HTML
    */
    private function create() {
        $h = $this->elements['comments'];
        $h.= "<title>".$this->cutString($this->elements['meta']['name']['title'], 80)."</title>\r\n";
        foreach($this->elements['meta']['http-equiv'] as $key => $value) {
        if (!empty($value))
        $h.= "<meta http-equiv=\"".$key."\" content=\"".$value."\" />\r\n";
        }
        foreach($this->elements['meta']['schemes'] as $key => $value) {
        if (!empty($value))
        $h.= "<meta schemes=\"".$key."\" name=\"identifier\" content=\"".$value."\" />\r\n";
        }
        foreach($this->elements['meta']['name'] as $key => $value) {
    if (!empty($value)) {
        if ($key=='keywords')
        $value = $this->cutString($value, 1000);
        else if ($key=='description')
        $value = $this->cutString($value, 200);
        $h.= "<meta name=\"".$key."\" content=\"".$value."\" />\r\n";
        }
        }
        foreach($this->elements['link']['stylesheet']['files'] as $media => $files) {
        foreach($files as $value) {
        $h.= "<link rel=\"stylesheet\" type=\"text/css\" href=\"".$value."\" media=\"".$media."\" />\r\n";
        }
      }
        if (!empty($this->elements['link']['favicon']))
        $h.= "<link rel=\"shortcut icon\" href=\"".$this->elements['link']['favicon']."\" />\r\n";
    $code='';
    if (isset($this->elements['link']['stylesheet']['scripts'])) {
        foreach($this->elements['link']['stylesheet']['scripts'] as $value) {
        $code.= $value;
        }
        }
        if ($code!=='')
    $h.= "<style type=\"text/css\">".$code."</style>\r\n";
        foreach($this->elements['script']['javascript']['files'] as $value) {
        $h.= "<script type=\"text/javascript\" src=\"".$value."\"></script>\r\n";
        }
      $code='';
        foreach($this->elements['script']['javascript']['scripts'] as $value) {
        $code.= $value;
        }
        if ($code!=='')
        $h.= "<script type=\"text/javascript\">".$code."</script>\r\n";
        $h = substr($h, 0, -2);
        return $h;
        }

    /**
     * __toString
     * Retourne la portion HTML contenant l'ensemble des balises générées
     *
     * @return     (string)  Portion HTML
    */
    public function __toString() {
      return $this->create();
        }

    #----------------------------------------------------------------------------
    # Fonctions privées diverses, debug et destructeur
    #----------------------------------------------------------------------------

    private function cutString($str, $nbChars) {
        if(strlen($str)>=$nbChars)
        return $str=substr($str,0,$nbChars);
        else
        return $str;
        }

    public function debug() {
        $str = nl2br(htmlentities($this->create()));
        $str.= '<pre>';
        $str.= print_r($this, true);
        $str.= '</pre>';
        return $str;
        }

    private function __destructor () {
        unset($this);
        }
        
//fin.
}
[/code]


[code]

/**
 * Classe Native_Keyword
 * Générateur de mots clés pour un ensemble de textes
 *
 * @version 1.5
 * @date 28/06/2008
 * @author Grégory Darche
 * @url http://netiva.fr
 */

/**
 * Mises à jour
 * 
 * 01/07/2008  MODIF   Fonction addExceptions ajout d'option + ou = 
 * 01/07/2008   MODIF   Fonction addTxt ajout d'option + ou =
 * 01/07/2008   MODIF   Amélioration des conditions d'exclusion
 * 01/07/2008   MODIF   Amélioration des performances du regex de détection des verbes
 * 01/07/2008   AJOUT   Fonction addExceptions()
 * 29/06/2008   AJOUT   Suppréssion des verbes (er, ir, ez)
 */ 

class Native_Keyword {

    public $txt = '';
    public $keywords = array();
    public $min_word_length = 5;
    public $exceptions = 'center|justify';
    private $is_make = false;
    
    public function __construct ( $txt='' ) {
        
        self::addTxt($txt, '=');
    }

    public function addTxt ( $txt='', $opt='+' ) {

        // Remplacement
        if ($opt=='=') 
                $this->txt = $txt;

        // Ajout
            else if ($opt=='+') 
                $this->txt.= ' '.$txt;
    }

    public function addExceptions ( $exceptions='', $opt='+' ) {

        // Remplacement
        if ($opt=='=') 
                $this->exceptions = $exceptions;

            // Ajout
        else if ($opt=='+') 
                $this->exceptions.= '|'.$exceptions;
    }

    public function get ( $nb=10 , $remake=false ) {
    
        // on explore le texte si cela n'est pas fait
        if (!$this->is_make || $remake!==false)
            self::explode();
        
        $this->is_make = true;
        
        // On retourne le tableau des mots clés
        return array_keys(array_slice($this->keywords, 0, $nb));
    }

    public function explode ( ) {
    
        // On nettoie le texte
        $txt = self::clean($this->txt);

        // On démonte chaque mot du texte et on le place dans un tableau
        $this->keywords = explode('-', $txt);
        
        // on retire les mot de moins de 3 lettres ainsi que les exceptions
        $exceptions = explode('|', $this->exceptions);
        foreach($this->keywords AS $v => $k) {

            // si trop petit ou dans les exceptions
            if ( strlen($k) <= $this->min_word_length )
                unset($this->keywords[$v]);

            // si verbe
            if ( preg_match('/[^.]er|ir|ez$/', $k) )
                unset($this->keywords[$v]);

            // si dans les exceptions
            if ( in_array($k, $exceptions) )
                unset($this->keywords[$v]);

        }
        
        // On rassemble les mots et on les comptes
        $this->keywords = array_count_values($this->keywords);

        // On trie le tableau des mots clés par importance
        arsort($this->keywords, SORT_NUMERIC);
    }

    private function clean ( $txt='' ) {

        // Suppression des espaces en début et fin de chaîne
          $txt = trim($txt);

          // Mise en minuscule
          $txt = mb_strtolower($txt, 'UTF-8');
  
        // Suppression des balise HTML
        $txt = html_entity_decode($txt);
        $txt = strip_tags($txt);

          // Suppression des accents
          $remplace = array(
            'Š'=>'S', 'š'=>'s', '?'=>'Dj', '?'=>'dj', 'Ž'=>'Z', 'ž'=>'z', '?'=>'C', '?'=>'c', '?'=>'C', '?'=>'c',
            'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
            'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',
            'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',
            'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e',
            'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o',
            'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',
            'ÿ'=>'y', '?'=>'R', '?'=>'r'
        );
        $txt = strtr($txt, $remplace); 

          // Suppression des espaces et caracteres spéciaux
          $txt = str_replace(' ', '-', $txt);
          $txt = preg_replace('#([^a-z0-9-])#', '-',$txt);

          // Suppression des tirets multiples
          $txt = preg_replace('#([-]+)#', '-', $txt);
       
          // Suppression du premier caractère si c'est un tiret
          if($txt{0} == '-')
              $txt = substr($txt,1);
       
          // Suppression du dernier caractère si c'est un tiret
          if(substr($txt, -1, 1) == '-')
              $txt = substr($txt, 0, -1);
       
          return $txt;
    }
// fin.
}
[/code]]]></summary>
			<author>
				<name><![CDATA[Hywan]]></name>
				<uri>http://forum.hoa-project.net/user/65/</uri>
			</author>
			<updated>2009-07-11T08:10:51Z</updated>
			<id>http://forum.hoa-project.net/topic/226/a-propos-du-referencement-de-hoa/new/posts/</id>
		</entry>
</feed>

