Extensions du plugin Phocadownload

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • Extensions du plugin Phocadownload

    Bonjour à tous,
    Cela fait un bail que je n'ai pas pu venir ici !
    Je devrai pouvoir y venir plus souvent à partir de mi juillet (mais je ne rien promettre encore...)

    Je reviens vers vous pour avoir l'aide d'experts SQL. Je ne suis pas moi-même un expert SQL et je dois me planter dans ma démarche.

    Je vous explique.
    Pour appeler une liste de fichier de PhocaDownload dans un article, on peut utiliser un tag comme ceci par exemple : {phocadownload view=filelist|id=51}.
    C'est le plugin de Phocadownload qui va ensuite parser le code et fournir la liste.

    Je me suis dit, "tiens, je vais améliorer le truc pour voir !" (oui, oui, je sais, des fois, on a des idées un peu bête... mais j'aime bien apprendre .

    Ok.
    Alors du coup, j'ai analysé le fichier plugin de Phocadownload et la conception est assez simple :
    - le plugin découpe la chaine du tag
    - le plugin à l'aide des éléments trouvé dans le tag va remonter la liste des fichiers.

    OK.
    Alors j'ai tenté un truc : je vais ajouter un tag possible à la chaine pour ne lister que les fichiers des 60 derniers jours !

    J'ai donc ajouté cela dans la chaine : {phocadownload view=filelist|id=51|day=60}
    Juste le "day=60".

    Ensuite, j'ai regardé le fichier plugin et je l'ai modifié.
    A la ligne 122, j'ai ajouté la reconnaissance du tag "day" et récupéré la valeur :
    Code:
    else if($values[0]=='url') {$url = $values[1];}
    else if($values[0]=='day') {$day = $values[1];}
    }
    Ok, ça marche : la variable $day stocke la valeur 60.

    Ensuite, je suis descendu à l'endroit où le "Filelist" est géré et j'ai simplement voulu modifier la requête pour ne garder que les valeurs que je souhaite :

    Code:
    case 'filelist':
    
    $fileOrdering = PhocaDownloadOrdering::getOrderingText($ordering, 3);
    
    if ($day !='') {
    
    
    $query = 'SELECT a.id, a.title, a.alias, a.filename_play, a.filename_preview, a.link_external, a.image_filename, a.filename, a.date as date, c.id as catid, a.confirm_license, c.title as cattitle, c.alias as catalias'
    . ' CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(\':\', a.id, a.alias) ELSE a.id END as slug,'
    . ' CASE WHEN CHAR_LENGTH(c.alias) THEN CONCAT_WS(\':\', c.id, c.alias) ELSE c.id END as catslug'
    . ' FROM #__phocadownload AS a'
    . ' LEFT JOIN #__phocadownload_categories AS c ON a.catid = c.id'
    . ' WHERE date BETWEEN DATE_SUB(NOW(), INTERVAL 60 DAY) AND NOW()';
    
    
    } else {
    
    
    $query = 'SELECT a.id, a.title, a.alias, a.filename_play, a.filename_preview, a.link_external, a.image_filename, a.filename, c.id as catid, a.confirm_license, c.title as cattitle, c.alias as catalias,'
    . ' CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(\':\', a.id, a.alias) ELSE a.id END as slug,'
    . ' CASE WHEN CHAR_LENGTH(c.alias) THEN CONCAT_WS(\':\', c.id, c.alias) ELSE c.id END as catslug'
    . ' FROM #__phocadownload AS a'
    . ' LEFT JOIN #__phocadownload_categories AS c ON a.catid = c.id';
    
    }
    Vous pouvez voir dans le else la requête originale et dans mon test vérifiant que $day a été trouvé la requête que j'ai créée : j'ai juste ajouté le champ "date" et ajouté un "where" pour filtrer sur l'intervalle (ici, je n'ai pas cherché à récupérer la valeur, j'ai juste mis 60 pour tester).

    Bah oui... mais apparemment, ma requête est foireuse et génère une erreur sql...

    Après une après midi passée à tenter de trouver le pourquoi du comment, je sèche : je n'arrive pas à comprendre pourquoi la requête ne marche pas alors que l'original elle fonctionne...

    Voilà : si l'un d'entre vous est capable de me filer un coup de main pour m'aider à comprendre et m'aider à trouver où est mon erreur, et bien, ce sera cool

    A bientôt tout le monde

    Bien à vous tous,
    Xavier
    PS : vous voyez, je continue de jouer avec Joomla
    Chabi01 - http://www.xlformation.com

  • #2
    Personne n'a d'idée ?
    Chabi01 - http://www.xlformation.com

    Commentaire


    • #3
      Hello.

      Le + simple dans ce cas est déjà de tester la requête via phpmyadmin.

      Regarde ici pour recupérer le sql : https://forum.joomla.fr/forum/d%C3%A...le#post2011839
      Dernière édition par roland_d_alsace à 04/07/2022, 17h36
      A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
      Rejoignez le Joomla Users Groupe Alsace...
      roland_d_alsace va-t-il devenir roland_du_grand_est ?

      Commentaire


      • #4
        Bonjour tout le monde !

        J'ai trouvé !!

        J'ai contourné le problème en faisant la vérification dans le code php mais pas dans la requête !

        Je vous explique, cela pourra peut-être servir à d'autres

        La requête est légèrement différente de l'originale : on inclut simplement le champ date en plus dans le résultat.
        Code:
        $query = 'SELECT a.id, a.title, a.alias, a.filename_play, a.filename_preview, a.link_external, a.image_filename, a.filename, c.id as catid, a.confirm_license, a.date, c.title as cattitle, c.alias as catalias,'
        . ' CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(\':\', a.id, a.alias) ELSE a.id END as slug,'
        . ' CASE WHEN CHAR_LENGTH(c.alias) THEN CONCAT_WS(\':\', c.id, c.alias) ELSE c.id END as catslug'
        . ' FROM #__phocadownload AS a'
        . ' LEFT JOIN #__phocadownload_categories AS c ON a.catid = c.id';
        C'est dans le traitement de la liste de fichier (filelist dans le fichier) que l'on va filtrer en fait :

        Code:
        if (!empty($items)) {
        
        $output .= '<div class="phocadownloadfilelist">';
        foreach ($items as $item) {
        
        //Debut CODE Xavier
        if (isset($item->date) && ($item->date != '') && $day !='') {
        
        $dateString = strtotime($item->date) ;
        $dateStringtoday = strtotime(date("Y-m-d H:i:s")) ;
        
        if (floor(($dateStringtoday - $dateString)/24/60/60) > $day) {
        continue;
        }
        }
        //Fin CODE Xavier
        En clair, on prend la date de création du fichier et on la compare à la date du jour en la soustrayant. Si le résultat est supérieur à la valeur de $day, on a dépassé la date des x derniers jours et on saute à l'élément suivant dans la boucle avec "continue".

        Et voilà !
        Ca marche très bien !

        Maintenant, il pourra y avoir quelques améliorations.
        Je me suis rendu compte que le plugin parse tout le code en une fois dans la page.
        Cela veut dire que si j'ai plusieurs appels de liste de fichiers de catégories différentes, si le plugin voit "day=une_valeur", il appliquera cette valeur pour toute la page.
        Du coup, on ne peut pas avec cette solution avoir une catégorie limité au 60 derniers jours et dessous une autre catégorie sans filtrage.
        J'ai posté en même temps sur le forum Phoca et je verrai si Jan (de Phoca) a du temps et l'envie de, pourquoi pas, faire évoluer cette fonctionnalité et comment, ou encore m'aider à trouver une solution pour donner un filtrage différent dans la même page sur plusieurs catégorie

        De la même manière, il va me falloir d'un point de vue personnel continuer de voir pourquoi cette requête n'a jamais voulu fonctionner, mais ceci est une autre histoire !!

        Merci à tous ceux qui m'ont filé un coup de main en tout cas
        Bien à vous tous,
        Xavier

        [EDIT] Je ne passe pas le sujet en "réglé" pour l'instant, si d'autres solutions ou compléments à cette solution sont trouvés, on ne sait jamais )
        Dernière édition par chabi01 à 08/07/2022, 15h55
        Chabi01 - http://www.xlformation.com

        Commentaire

        Annonce

        Réduire
        Aucune annonce pour le moment.

        Partenaire de l'association

        Réduire

        Hébergeur Web PlanetHoster
        Travaille ...