Bonjour,

J'ai créer tout un petit système sur mon App, le but étant d'avoir une div qui contiendra des widgets.

Voila comment j'ai fais

function widgetSidebar($ext){

    global $db;

    $dirname = 'inc/plugins/widgets';
    $dir = @ opendir($dirname); //on masque l'erreur si le chemin est incorect
    $extensions = [$ext];
    $nb_fichier = 0;
    if($dir !== false) {
        while(false!==($file = readdir($dir))) {
            if($file != "." && $file != ".." && stristr($file,'.'.$ext)){ 
                $nb_fichier++; 
                include_once 'inc/plugins/widgets/'.$file; 
            }
        }
    }
    closedir($dir);
}

C'est archaique vous me direz ! mais j'ai pas trouver mieux et créer un système a la wordpress ce serai le top du top.

vous me conseillerais quoi pour amélioré ce système ?

5 réponses


neecride
Auteur

Salut !

J'ai retravailler mon système de widget avec ma toute première class et évidement que c'est du mal fait

<?php

Class WidgetSidebarre{

    public static function BlocLogin(){

        require_once ('inc/plugins/widgets/a-bloclogin.php');

    }

    public static function BlocForum(){

        require_once ('inc/plugins/widgets/z-widget-forum.php');

    }

    public static function BlocAlert(){

        require_once ('inc/plugins/widgets/c-widget-alert.php');

    }

    public static function PanelAdmin(){

        require_once ('inc/plugins/widgets/b-paneladmin.php');

    }

    public static function RenderAllWidgets($PageVisibleWidget = ['home','post']){

        $get = isset($PageVisibleWidget) && !empty($PageVisibleWidget) ? $PageVisibleWidget : '';

        if(!empty($_GET['page'] == in_array($_GET['page'], $get))){

            $return = WidgetSidebarre::BlocLogin();
            $return .= WidgetSidebarre::BlocForum();
            $return .= WidgetSidebarre::BlocAlert();
            $return .= WidgetSidebarre::PanelAdmin();

            return $return;
        }
        return false;
    }

}

C'est surtout RenderAllWidgets() que je trouve limite, en gros ça doit inclure tout mes widgets en un simple appel WidgetSidebarre::RenderAllWidgets(['home','post']); cela fonctionne mais forcément il doit y avoir beaucoup mieux que des $return .=

Et aussi logiquement je ne peut plus créer de widget a la volet, bien que ce ne soit pas si grave mais ça m'élloigne d'un système wordpress, ou on pourrai en créer dans l'administration avec une tructure par défaut etc... .

Que pensez vous de ce premier teste ? le but est de rendre mon app le plus complet possible.

neecride
Auteur

Salut !

je vois que je me répond a moi même lol, mais au moins ça permet de donner des solutions a ceux qui voudrez faire la même chose que moi

Alors je commence doucement a mettre mon CMS en orienté objet, et je commence en retravaillant mon système de widgets

Vous avez les premier jet au dessus, et maintenant j'en suis la :

<?php

Class WidgetSidebarre{

    private $filename;
    private $PageVisibleWidget;
    private $return;
    private $get;

    private function Widget($filename){

        require_once ('inc/plugins/widgets/'.$filename.'.php');
    }

    private static function RequestForum(){

            global $db;

            return $db->query("
            SELECT 

                f_topics.id,
                f_topics.f_topic_name,
                f_topics.f_topic_slug,
                f_topics.f_forum_id,
                f_topics.f_topic_date,
                f_forums.f_authorization

            FROM f_topics

            LEFT JOIN f_forums on f_forums.id = f_topics.f_forum_id

            ORDER BY f_topics.f_topic_date ASC LIMIT 10
            ");

    }

    private static function LastComment(){

        global $db;

        return $db->query("SELECT post_id,slug,date,username FROM comments ORDER BY id DESC LIMIT 10");   
    }

    public function RenderAllWidgets($PageVisibleWidget = ['home','post'],$tab=['widget-login','widget-admin','widget-lastcomment','widget-alert','widget-forum']){

        $get = isset($PageVisibleWidget) && !empty($PageVisibleWidget) ? $PageVisibleWidget : '';

        if(!empty($_GET['page'] == in_array($_GET['page'], $get))){

            $return = new WidgetSidebarre();

            foreach ($tab as $v) {
                $widget = $return->Widget($v);
            }

            return $widget;
        }
        return false;
    }

}

le but est d'inclure simplement pour l'utilisateur des widgets sans avoir a trop toucher au code, pour ce faire il me faut coter user créer un système simple c'est pourquoi j'ai fait cette fonction

private function Widget($filename){

        require_once ('inc/plugins/widgets/'.$filename.'.php');
}

Qui inclu simplement le widget qui est appeler par la fonction RenderAllWidget ou je fais un foreach ainsi je met un widget dans le dossier widget et il me reste qu'a l'afficher dans le echo de la fonction <?php $sidebarre->RenderAllWidgets(); ?> c'est la seul chose que j'ai trouver a part foutre des .= partout comme on le vois juste avant.

Cela dit j'ai une question, j'ai fais mon autoloader qui fais ce qu'on attend de lui, par contre la ou ça me gène c'est qu'on a inventé l'autoloading pour evité d'inclure des fichiers mais on est quand même obliger de faire $machin = new class(); donc si on a 200 class on aura 200x $machin = new class(); je trouve qu'on fuck un peut la logique de l'objet ou le but est d'avoir un code aéré avec le moins de lignes possible.

neecride
Auteur

Je pense avoir compris.

Depuis mes poste au dessus je me suis attaquer a ma pagination qui utilise ias-ajax et ça fonctionne très bien.

Ce que je crois comprendre outre le fait de pourvoir faire $new = new Class() et $new->function() dans une fonction pour appeler une fonction contenue dans la même class, on peut faire $this->function() dans une autre fonction de cette même class "je sais ça fout mal au crane"

J'ai regarder et essayez de comprendre le $this j'ai donc regarder la formation POO de Grafikart mais je ne l'ai vue l'utiliser que avec des variable y a t-il une raison ?

par-ce-que si j'ai pas fais complétement n'importe quoi ça mérite d'être mieux expliquer. self reste facile a comprende mais $this j'ai eu du mal.

En attendant une réponse voici ma version de pagination qui fonctionne superbement bien elle est volontairement minimal car j'utilise ias et donc pas besoin d'autre chose.

<?php

Class Home{

    //instance de la class parameters 
    private function Params(){
        return new Parameters();
    }   

    //total de page a afficher
    private function PagesMax(){

        return $this->Params()->GetParam(2);

    }

    //nombre d'article en base
    public function CountWorks(){

        global $db;

        $CountWorks = $db->query('SELECT id FROM works WHERE posted=1');

        return $CountWorks->rowCount();

    }

    //on divise le total des page
    private function PageTotales(){

        return ceil($this->CountWorks()/$this->PagesMax());
    }

    //demarrage de la pagination
    private function StartPager(){

        return ($this->CurrentPage()-1)*$this->PagesMax();

    }

    //la limite de la pagination
    private function Limited(){

        return $this->StartPager() .','. $this->PagesMax();

    }

    //la page courante
    private function CurrentPage(){

        if(isset($_GET['pager']) AND !empty($_GET['pager']) AND $_GET['pager'] > 0 AND $_GET['pager'] <= $this->PageTotales()) {

           $CurrentPage = $_GET['pager'];

        } else {
            //si id null alors page sera egal 1 
            $CurrentPage = 1;

        }

        return $CurrentPage;

    }

    //la vue de la pagination
    public function Pagination($nb=2){

        //pagination current
        $pagination = '<div id="pagination">';
        for($i=1; $i <= $this->PageTotales(); $i++) {

            if($i <= $nb || $i > $this->PageTotales() - $nb ||  ($i > $this->CurrentPage()-$nb && $i < $this->CurrentPage()+$nb)){

                if($i == $this->CurrentPage()){

                    $pagination .=  $i.' ';   

                }elseif($i == $this->CurrentPage()+1){ 

                    $pagination .= '<a href="'.WEBROOT.'home/'.$i.'" class="suivant">'. $i .'</a>' ;

                }else{

                    $pagination .= '<a href="'.WEBROOT.'home/'.$i.'">'. $i .'</a>' ;

                }

            }

        }
        $pagination .= '</div>';

        return $pagination;
    }

    //la requette qui affiche les article use ias-ajax infinita scroll
    public function HomeWorks(){

        global $db;

        $limited = $this->Limited();

        return $db->query("

           SELECT   works.id,
                    works.name,
                    works.writer,
                    works.content,
                    works.posted,
                    works.date,
                    works.slug,
                    images.name AS image_name,
                    categories.cat_name,
                    categories.id AS catid,
                    users.email,
                    users.username,
                    users.avatar,
                    comments.post_id,
                    COUNT(comments.post_id) AS nbcoms

            FROM works

            LEFT JOIN users ON users.username = works.writer

            LEFT JOIN categories ON works.category_id=categories.id

            LEFT JOIN comments ON comments.post_id = works.id

            LEFT JOIN images ON images.id = works.image_id

            WHERE works.posted=1

            GROUP BY works.id

            ORDER BY works.date DESC LIMIT $limited

        ");

    }

}

Disons que si tu as une question précise, on pourra te répondre, là le soucis c'est que tu nous demandes de t'expliquer la POO, et un sujet n'est pas vraiment fait pour ça. Mais en soit, tu fais le bon chemin, tu t'améliores petit à petit en testant et en voyant bien que ça ne va pas, tu cherches à comprendre.

Pour info, ton idée de "require" n'est pas une bonne idée. Tes widgets devraient être une classe, classe qui devrait répondre à un "cahier des charges" via une interface par exemple.

Wordpress n'est pas forcement le bon exemple pour apprendre à coder en POO, il garde son style historique, accessible au plus grand nombre, mais en soit, au niveau architecture, ce n'est pas forcement du grand art.

Autre petite coquille "isset($PageVisibleWidget)" n'est pas utile, ta variable étant forcement déclaré, il est donc inutile de le vérifier.

neecride
Auteur

Je commence a comprendre en effet ! petit a petit maintenant je n'ai plus les global db qui ne sont pas propre.

je plussoie pour le isset.

Par contre je ne comprend pas pour le require je suis maintenant sur ma page post qui liste les commentaire et si je ne me trompe Graphikart fais un inclide qui s'inclu lui même etc...

Mon code est quand même différent je ne me suis appuyer sur le tuto que pour les imbrications

Hors si je ne fait pas de require :

public function SortComment(){

        $responses = $this->Comment(); //instance de la req commentaire

        if($responses != false){
            foreach($responses as $response){
                $result[$response->id] = $response;
            }
            foreach($responses as $k => $response){
                if($response->parent_id != 0){

                    $result[$response->parent_id]->children[] = $response;
                    unset($responses[$k]);
                }

            }
            foreach($responses as $response){

                require ('inc/plugins/comment.php');

            }
        }

        return $responses;
    }

Je ne vois pas comment faire ?

les interfaces j'en suis loin encore : mais si ce n'est pas déprécier je vais regarder ça https://openclassrooms.com/courses/programmez-en-oriente-objet-en-php/les-interfaces-1

Même si je ne veut pas copier wordpress je cherche quand même a ce qu'il y est moins de trucs a faire pour l'utilisateur ou un integrateur de themes.

pour ma pagination j'ai choisis de faire comme ça "la vue dans un objet" pour ne faire q'un seul echo et ne pas mettre des if des for et des $i partout dans la sutruqture html.