[phpboost 4.1.3 ] Afficher un flux rss des news
jpalbert92 Membre non connecté
Booster Fuzil
-
Booster Fuzil
- Voir le profil du membre jpalbert92
- Inscrit le : 27/04/2014
Reprise du message précédent
Bonjour,Alors en fait je viens de regarder et effectivement il y a un petit changement que j'avais fais déjà pour commencer :
- J'ai rajouter dans la requête SQL une limite de caractère (SUBSTRING) pour n'afficher que les 250 premier du module news et 128 du module articles (comme la configuration de base sur phpboost)
- Et effectivement j'ai publier la ressources un peu vite parce que j'ai pas fais attention je pensais que le LEFT JOIN équivalait à un WHERE donc sur la requête distribué j'ai mis un AND pour prendre en compte la date de création alors que pas du tout c'est un SQL PHP ça je n'avais jamais vu de LEFT JOIN auparavant.
Voilà la requête SQL qui est à mon avis la plus complète pour le module news :
Code SQL :
SELECT news.id, news.id_category, news.name, news.rewrited_name, news.picture_url, SUBSTRING(news.contents,1,250) AS contents, news.short_contents, news.creation_date, member.login, cat.rewrited_name AS rewrited_name_cat FROM ' . PREFIX . 'news news LEFT JOIN ' . PREFIX . 'news_cats cat ON cat.id = news.id_category LEFT JOIN ' . DB_TABLE_MEMBER . ' member ON member.user_id = news.author_user_id WHERE (approbation_type = 1 OR (approbation_type = 2 AND start_date < :timestamp_now AND (end_date > :timestamp_now OR end_date = 0))) ORDER BY news.creation_date DESC
Et pour le module article :
Code SQL :
SELECT articles.id, articles.id_category, articles.title, articles.rewrited_title, articles.picture_url, SUBSTRING(articles.contents,1,128) AS contents, articles.description, articles.date_created, member.login, cat.rewrited_name AS rewrited_name_cat FROM ' . PREFIX . 'articles articles LEFT JOIN ' . PREFIX . 'articles_cats cat ON cat.id = articles.id_category LEFT JOIN ' . DB_TABLE_MEMBER . ' member ON member.user_id = articles.author_user_id WHERE (published = 1 OR (published = 2 AND publishing_start_date < :timestamp_now AND (publishing_end_date > :timestamp_now OR publishing_end_date = 0))) ORDER BY articles.date_created DESC
De ce fait je te propose ce fichier php que je vais mettre à jour dans l'autre sujet :
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(false); //passer à "true" pour désactiver $columns_disabled->set_disable_right_columns(false); $columns_disabled->set_disable_top_central(false); $columns_disabled->set_disable_bottom_central(false); 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() { /**************************************************** ************* DEBUT REQUETE SQL ARTICLES ************ *****************************************************/ $now = new Date(); $querier = PersistenceContext::get_querier(); $results_articles = $querier->select('SELECT articles.id, articles.id_category, articles.title, articles.rewrited_title, articles.picture_url, SUBSTRING(articles.contents,1,128) AS contents, articles.description, articles.date_created, member.login, cat.rewrited_name AS rewrited_name_cat FROM ' . PREFIX . 'articles articles LEFT JOIN ' . PREFIX . 'articles_cats cat ON cat.id = articles.id_category LEFT JOIN ' . DB_TABLE_MEMBER . ' member ON member.user_id = articles.author_user_id WHERE (published = 1 OR (published = 2 AND publishing_start_date < :timestamp_now AND (publishing_end_date > :timestamp_now OR publishing_end_date = 0))) ORDER BY articles.date_created DESC', array( 'timestamp_now' => $now->get_timestamp() )); /* SELECT = On selectionne tous les champs liés aux articles (id, id_category, title, rewrited_title, picture_url, contents, description, date_created) ATTENTION j'ai limité le contents à 128 caractères : SUBSTRING(articles.contents,1,128) FROM = Dans quelles entités sont issues les champs LEFT JOIN = On fait la jointure afin de dire que les clefs primaire sont identiques. Donc on regarde dans quel catégories est l'articles (cat.rewrited_name AS rewrited_name_cat | cat.rewrited_name <=> cat.id = articles.id_category) N'oublions pas la jointure sur la table de membre afin de récupérer les info sur le membre (member.login <=> member.user_id = articles.author_user_id) AND = On fait bien attention a récupérer un article qui a été publié avec autorisation ou différé après heure (on recup pas les articles en attente de contribution). ODRDER BY = On classe les articles par la date de création et par ordre décroissant (DESC, le plus récent en premier et le plus anciens en dernier) */ $this->build_articles_view($results_articles); /**************************************************** ************* FIN REQUETE SQL ARTICLES ************** *****************************************************/ /**************************************************** ************* DEBUT REQUETE SQL NEWS **************** *****************************************************/ $now = new Date(); $querier = PersistenceContext::get_querier(); $results_news = $querier->select('SELECT news.id, news.id_category, news.name, news.rewrited_name, news.picture_url, SUBSTRING(news.contents,1,250) AS contents, news.short_contents, news.creation_date, member.login, cat.rewrited_name AS rewrited_name_cat FROM ' . PREFIX . 'news news LEFT JOIN ' . PREFIX . 'news_cats cat ON cat.id = news.id_category LEFT JOIN ' . DB_TABLE_MEMBER . ' member ON member.user_id = news.author_user_id WHERE (approbation_type = 1 OR (approbation_type = 2 AND start_date < :timestamp_now AND (end_date > :timestamp_now OR end_date = 0))) ORDER BY news.creation_date DESC', array( 'timestamp_now' => $now->get_timestamp() )); /* Même principe que précédemment */ $this->build_news_view($results_news); /**************************************************** ************* FIN REQUETE SQL NEWS ****************** *****************************************************/ } /**************************************************** ************* DEBUT BUILD ARTICLES ****************** *****************************************************/ private function build_articles_view(SelectQueryResult $results) { // ici les résultats seront envoyé dans articles.tpl $tpl = new FileTemplate('HomeCustom/articles.tpl'); $i = 0; foreach ($results as $row) { if ($i >= 1) //si plus de 3 on casse { break; } // si "rewrited_name_cat" est vide c'est que c'est la categorie racine (root) $row['rewrited_name_cat'] = !empty($row['id_category']) ? $row['rewrited_name_cat'] : 'root'; // je me prend pas la tête j'utilise le builder du module articles, comme ça je suis sure que le lien généré sera correct. $link = ArticlesUrlBuilder::display_article($row['id_category'], $row['rewrited_name_cat'], $row['id'], $row['rewrited_title']); // ici sa boucle et on fait correspondre le tableau extrait de la BDD avec des variables TPL $tpl->assign_block_vars('articles_items', array( 'U_LINK' => $link->absolute(), 'TITLE' => $row['title'], 'CONTENTS' => $row['contents'], 'PSEUDO' => $row['login'], 'DESCR' => $row['description'], 'URL_IMG' => $row['picture_url'] )); $i++; } // ici c'est pour "pousser" articles.tpl via # INCLUDE ARTICLES # dans le home.tpl $this->template->put('ARTICLES', $tpl); } /**************************************************** ************* FIN BUILD ARTICLES ******************** *****************************************************/ /**************************************************** ************* DEBUT BUILD NEWS ********************** *****************************************************/ private function build_news_view(SelectQueryResult $results) { // ici les résultats seront envoyé dans news.tpl $tpl = new FileTemplate('HomeCustom/news.tpl'); $i = 0; foreach ($results as $row) { if ($i >= 3) //si plus de 3 on casse { break; } // si "rewrited_name_cat" est vide c'est que c'est la categorie racine (root) $row['rewrited_name_cat'] = !empty($row['id_category']) ? $row['rewrited_name_cat'] : 'root'; // je me prend pas la tête j'utilise le builder du module articles, comme ça je suis sure que le lien généré sera correcte. $link = NewsUrlBuilder::display_news($row['id_category'], $row['rewrited_name_cat'], $row['id'], $row['rewrited_name']); // ici sa boucle et on fait correspondre le tableau extrait de la BDD avec des variables TPL $tpl->assign_block_vars('news_items', array( 'U_LINK' => $link->absolute(), 'NAME' => $row['name'], 'CONTENTS' => $row['contents'], 'PSEUDO' => $row['login'], 'DESCR' => $row['short_contents'], 'URL_IMG' => $row['picture_url'], 'DATE' => gmdate_format('date_format_short', $row['creation_date']), )); $i++; } // ici c'est pour "pousser" news.tpl via # INCLUDE NEWS # dans le home.tpl $this->template->put('NEWS', $tpl); } /**************************************************** ************* FIN BUILD NEWS ************************ *****************************************************/ } ?>
Et je viens de remarquer que pour le code TPL, pour utiliser le SHORTCONTENT ou le CONTENT (ce qui dépend s'il y a une description on affiche la description sinon on affiche le contenu limité à un certain nombre de caractères) j'ai rajouter un algorithme :
Code TPL :
# IF news_items.DESCR #{news_items.DESCR}# ELSE #{news_items.CONTENTS}...# ENDIF #
ce qui donne pour le fichier news.tpl :
Code TPL :
# START news_items # <hr> <div class=""> <img src="{PATH_TO_ROOT}{news_items.URL_IMG}" /> <a href="{news_items.U_LINK}"><p class="">{news_items.TITLE}</p></a> <p class=""># IF news_items.DESCR #{news_items.DESCR}# ELSE #{news_items.CONTENTS}...# ENDIF #</p> <p class=""> par : <span>{news_items.PSEUDO}</span></p> </div> # END news_items #
Je modifie tout ça dans l'autre sujet et après libre à toi de modifier les noms si tu le souhaite même si je n'en vois pas grande utilité lol !

En espérant t'avoir aidé ! Si tu as une question n'hésite pas !!
Jpa92, don't panik !
Because I need a signature... You were supposed to know ! 

Theswat Membre non connecté
Booster Minigun
-
Booster Minigun
- Voir le profil du membre Theswat
- Inscrit le : 10/09/2009
- Groupes :
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie


