[HomeCustom] Ajout d'élements récuperés dans la base de donnée

Introduction



Ce tutoriel va vous expliquer comment ajouter dans votre page d'accueil des éléments provenant de la base de donnée.



La fonction PHP



Nous allons prendre pour exemple la récupération d’éléments du module download.


Récupérer les données de la base de donnée



Nous allons ajouter la fonction suivante dans le fichier HomeCustomHomePageExtensionPoint.class.php du répertoire /HomeCustom/PHPBoost.
Code PHP :
private function build_view()
{
 
}


Dans notre cas, nous allons récupérer les éléments de deux catégories.
Notre fonction build_view doit contenir l’élément suivant :
Code PHP :
$id_cats = array('25', '74');


Pour récupérer les données, nous devons réaliser une requête SQL :
Code PHP :
$querier = PersistenceContext::get_querier();
    $results = $querier->select('SELECT file.id, file.idcat, file.title, file.short_contents, file.timestamp, file.image, 
        user.login
        FROM ' . PREFIX . 'download file
        LEFT JOIN ' . DB_TABLE_MEMBER . ' user ON user.user_id = file.user_id
        WHERE visible = 1 AND approved = 1 AND file.idcat IN (' . implode(', ', $id_cats) . ')
        ORDER BY timestamp DESC');
Cette fonction permet de récupérer les éléments id, idcat, title, short_contents, timestamp, image de la table download ainsi que le login.

Une fois la base de données récupérer, nous faisons appel à une nouvelle fonction (que nous allons créer) pour traiter les données.
Code PHP :
$this->build_modules_view($results);



Le traitement des données



Toujours dans le fichier HomeCustomHomePageExtensionPoint.class.php du répertoire /HomeCustom/PHPBoost , nous allons ajouter la fonction suivante :
Code PHP :
private function build_modules_view(SelectQueryResult $results)


Pour rester assez simple, nous allons séparer le chaque élement dans un fichier HTML différent.
Nous allons faire appel au fichier modules.tpl que nous allons créer par la suite.
Code PHP :
$tpl = new FileTemplate('HomeCustom/modules.tpl');


Dans notre exemple, nous allons afficher les 3 premier élements (les 3 plus récents)
Pour récuperer les 3 plus anciens, il suffit de remplacer 'DESC' par 'ASC' dans la requête SQL

Code PHP :
foreach ($results as $row)
{
    if ($i >= 3)
    {
        break; 
    }
 
    $link = new Url('/download/download' . url('.php?id=' . $row['id'], '-' . $row['id'] .  '+' . Url::encode_rewrite($row['title']) . '.php'));
 
    $tpl->assign_block_vars('item', array(
        'U_LINK' => $link->absolute(),
        'U_IMG' => Url::to_absolute($row['image']),
        'C_IMG' => !empty($row['image']),
        'TITLE' => $row['title'],
        'DESC' => $row['short_contents'],
        'PSEUDO' => $row['login']
    ));
    $i++;
}

Nous allons parcourir tous les résultats (foreach ($results as $row)), si on dépasse trois, on arrête ( if ($i >= 3) { break; } ).
On créer la référence du lien pour aller sur la page du module download ( $link = new Url ... )
On créer les différents élements pour l'affichage dans le code HTML avec comme nom 'item'

Enfin pour finaliser, on transmet toutes les donnés au tpl concerné
Code PHP :
$this->template->put('MODULES', $tpl);



Faire appel à notre nouvelle fonction



Bien sûr il est nécessaire de faire appel à la fonction build_view().

Ajouter dans la fonction get_view l'appel à la fonction build_view de la manière suivante :
Code PHP :
private function get_view()
{
    $this->template = new FileTemplate('HomeCustom/home.tpl');
 
    $this->build_view();
 
    return $this->template;
}



Le code complet



Caché :
Code PHP :
<?php
/*##################################################
 *                     HomeCustomHomePageExtensionPoint.class.php
 *                            -------------------
 *   begin                : August 25, 2012
 *   copyright            : (C) 2012 Kevin MASSY
 *   email                : kevin.massy@phpboost.com
 *
 *
 ###################################################
 *
 * This program 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.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 ###################################################*/
 
class HomeCustomHomePageExtensionPoint implements HomePageExtensionPoint
{
    private $template;
 
    public function get_home_page()
    {
        $columns_disabled = Environment::get_graphical_environment()->get_columns_disabled();
          $columns_disabled->set_disable_left_columns(true);
          $columns_disabled->set_disable_right_columns(true);
          $columns_disabled->set_disable_top_central(true);
          $columns_disabled->set_disable_bottom_central(true);
        return new DefaultHomePage($this->get_title(), $this->get_view());
    }
 
    private function get_title()
    {
        return LangLoader::get_message('title', 'common', 'HomeCustom');
    }
 
    private function get_view()
    {
        $this->template = new FileTemplate('HomeCustom/home.tpl');
 
        $this->build_view();
 
        return $this->template;
    }
 
    private function build_view()
    {
        $id_cats = array('24', '74');
 
        $querier = PersistenceContext::get_querier();
        $results = $querier->select('SELECT file.id, file.idcat, file.title, file.short_contents, file.timestamp, file.image, 
            user.login
            FROM ' . PREFIX . 'download file
            LEFT JOIN ' . DB_TABLE_MEMBER . ' user ON user.user_id = file.user_id
            WHERE visible = 1 AND approved = 1 AND idcat IN (' . implode(', ', $id_cats) . ')
                ORDER BY timestamp DESC');
 
        $this->build_modules_view($results);
    }
 
    private function build_modules_view(SelectQueryResult $results)
    {
        $tpl = new FileTemplate('HomeCustom/modules.tpl');
        $i = 0;
        foreach ($results as $row)
        {
            if ($i >= 3)
            {
                break; 
            }
 
            $link = new Url('/download/download' . url('.php?id=' . $row['id'], '-' . $row['id'] .  '+' . Url::encode_rewrite($row['title']) . '.php'));
            $tpl->assign_block_vars('item', array(
                'U_LINK' => $link->absolute(),
                'U_IMG' => Url::to_absolute($row['image']),
                'C_IMG' => !empty($row['image']),
                'TITLE' => $row['title'],
                'DESC' => $row['short_contents'],
                'PSEUDO' => $row['login']
            ));
            $i++;
        }
        $this->template->put('MODULES', $tpl);
    }
}
?>




Le code HTML



Il vous suffit de créer le fichier modules.tpl dans le répertoire /HomeCustom/templates et d'y ajouter l'affiche que vous souhaitez avec le code CSS que vous souhaitez.
Code TPL :
# START item #
<div class="votre classe CSS">
    <a href="{item.U_LINK}">
        <p class="lm_img_container">
            # IF item.C_IMG #
                <img src="{item.U_IMG}" title="{item.TITLE}" alt="{item.TITLE}" class="votre classe CSS" />
            # ENDIF #
            </p>
        </div>
        <p class="votre classe CSS">{item.TITLE}</p>
        <p class="votre classe CSS">{item.DESC}</p>
        <p class="votre classe CSS"> par : <span>{item.PSEUDO}</span></p>
    </a>
</div>
# END item #
Chaque élément récupéré dans la base de donnée sera affiché de la manière précedente.

Finalement, il faut appeler ce second tpl dans le tpl principal home.tpl

Pour cela, il suffit d'ajouter
Code TPL :
# INCLUDE  MODULES #
dans le fichier home.tpl à l'endroit souhaité.



Utilisation des flux



Nous pouvons aussi utiliser simplement les flux disponible par PHPBoost. C'est beaucoup plus rapide en code, mais moins personnalisable.

Pour ce faire, il vous suffit :
  1. D'ajouter dans le fichier HomeCustomHomePageExtensionPoint.class.php la fonction suivante :
    (Nous avons pris comme exemple l'ajout du flux des news.
    Code PHP :
    private function build_feed_news_view()
    {
        $feed_template = new FileTemplate('HomeCustom/feed_news.tpl');
        $this->template->put('FEED_NEWS', Feed::get_parsed('news', Feed::DEFAULT_FEED_NAME, 0, $feed_template, 5, 1));
    }

    Dans notre exemple, on récupère les 5 dernières news en excluant la dernière
  2. D'ajouter une appel à cette fonction dans build_view ou get_view si vous n'avez pas besoin de build_view:
    Code PHP :
    $this->build_feed_news_view();
  3. De créer votre fichier feed_news.tpl :
    Code TPL :
    # START item #
    <!-- ITEM -->
    <div class="votre classe CSS">
        <a href="{item.U_LINK}" class="votre classe CSS">{item.TITLE}</a>
        <p class="votre classe CSS">{item.DATE_TEXT}</p>
    </div>
    <!-- END ITEM -->
    # END item #
  4. Faire appel au nouveau tpl dans le home.tpl :
    Code TPL :
    {FEED_NEWS}

Cette page a été vue 2731 fois