THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Hello,

J'utilise le plugin => http://thelia.net/contributions/plugins … e-en-ligne

En me basant sur la doc du plugin j'essaye une simple boucle.

<THELIA_mel_sorti type="MISEENLIGNE" mode="sorti" num="10" genre="contenu" classement="datemax" >
<ul>
<THELIA_prod type="#MEL_GENRE" id="#MEL_ID" >
<li>#TITRE</li>
</THELIA_prod>
</ul>
</THELIA_mel_sorti>

et il me sort 4 résultats

Si je modifie juste le num=20, il me sort 13 résultats ???

Ou est la logique ??? J'avoue y perdre mon latin !

Merci
Paulbe


Ce qui est fait n'est plus à faire ;-)

Offline


<THELIA_prod type="#MEL_GENRE" id="#MEL_ID" >

type="#MEL_GENRE" ? Vraiment ?


OpenStudio Toulouse

Offline


Hello,

C'est ce que la doc indique en tous cas...


EXEMPLES SIMPLES

Tous les produit
<THELIA_mel type="MISEENLIGNE" mode="tous"  genre="produit" >
    <THELIA_prod type="#MEL_GENRE" id="#MEL_ID">
        #TITRE
    </THELIA_prod>
</THELIA_mel>

---------------------------------

Produits déjà sortis
<THELIA_mel type="MISEENLIGNE" mode="sorti"  genre="produit" >
    <THELIA_prod type="#MEL_GENRE" id="#MEL_ID">
        #TITRE
    </THELIA_prod>
</THELIA_mel>

---------------------------------

Produits à venir ce mois-ci
<THELIA_mel type="MISEENLIGNE" mode="nonsorti" periode="mois" genre="produit" >
    <THELIA_prod type="#MEL_GENRE" id="#MEL_ID">
        #TITRE
    </THELIA_prod>
</THELIA_mel>

---------------------------------

Produits de demain
<THELIA_mel type="MISEENLIGNE" mode="nonsorti" periode="jour" decalage="1" genre="produit" >
    <THELIA_prod type="#MEL_GENRE" id="#MEL_ID">
        #TITRE
    </THELIA_prod>
</THELIA_mel>

---------------------------------

Produits du jour
<THELIA_mel type="MISEENLIGNE" mode="sorti" periode="jour" genre="produit" >
    <THELIA_prod type="#MEL_GENRE" id="#MEL_ID">
        #TITRE
    </THELIA_prod>
</THELIA_mel>



ETC....


Ce qui est fait n'est plus à faire ;-)

Offline


Ou est la logique ??? J'avoue y perdre mon latin !

Je suppose que parmi les produits retournés, par la boucle THELIA_mel, certains sont hors lignes, et donc non retournés par la boucle THELIA_prod.

Regarde dans ton B.O, ou affiche #MEL_ID (<p>#MEL_ID</p>) juste avant la boucle THELIA_prod


OpenStudio Toulouse

Offline


Hello,

En effet la boucle me sort TOUS les produits, qu'ils soient en ligne ou non  !



    93     SERON - Les Petits Hommes
    81
    80
    8     Catalogue de L'EXPO DU CHAT
    9     MANARA - Les Vénus de Milo
    10     TRANS-BD1 - Silvio Cadelo
    15
    17
    19
    20     Sérigrapies de Philippe Geluck



J'ai donc l'impression que le mode="sorti" ne fonctionne pas mais que l'on a le mode="tous'... par contre le mode="nonsorti" fonctionne lui très bien !

Me trompe-je ?

Amitié
Paulbe


Ce qui est fait n'est plus à faire ;-)

Offline


Je suppose que pour que le plugin marche, il faut que le produit soit "en ligne".


OpenStudio Toulouse

Offline


Hello,

J'ai 2 comportement différents en fait

Oui c'est bien le cas avec les produits "nonsorti" il faut donc la case à cocher "en ligne" et une date dans le futur

Voici la boucle :

<THELIA_mel type="MISEENLIGNE" mode="nonsorti" genre="contenu" >
<ul>
<p>#MEL_ID</p>
<THELIA_contenu type="#MEL_GENRE" id="#MEL_ID">
<li>#TITRE</li>
</THELIA_contenu>
</ul>

voici le résultat :

    11    DRUILLET - REPLIQUANTE(S)
    2    L'EXPO DU CHAT - Philippe Geluck

C'est donc correct !


Mais avec cette boucle :

<THELIA_mel_sorti type="MISEENLIGNE" mode="sorti" num="10" genre="contenu" classement="datemax" >
<ul>
<p>#MEL_ID</p>
<THELIA_prod type="#MEL_GENRE" id="#MEL_ID" >
<li>#TITRE</li>
</THELIA_prod>
</ul>
</THELIA_mel_sorti>

C'est pas le cas avec les produits "sorti" car même la case à cocher "en ligne" n'est pas sélectionnée la boucle me sort les résultats suivants :

    93     SERON - Les Petits Hommes
    81
    80
    8     Catalogue de L'EXPO DU CHAT
    9     MANARA - Les Vénus de Milo
    10     TRANS-BD1 - Silvio Cadelo
    15
    17
    19
    20     Sérigrapies de Philippe Geluck

Et si je coche la case "En ligne" en effet il m'ajoute le titre....


Ce qui est fait n'est plus à faire ;-)

Offline


Je répète qu'il faut que le produit soit "en ligne" ( case "en ligne" cochée) pour que ça fonctionne.


OpenStudio Toulouse

Offline


roadster31 wrote:

Je répète qu'il faut que le produit soit "en ligne" ( case "en ligne" cochée) pour que ça fonctionne.

Oui et non... relis bien mon message précédent  et regarde les résultats !

Pour num=10 on ne peut pas y arriver alors ?

Puisqu'il compte 10 mais en affiche que 5 forcément ....

Last edited by paulbe (03-03-2014 11:09:52)


Ce qui est fait n'est plus à faire ;-)

Offline

Offline


Hello,

On dirait que mode"sorti" et mode"tous" c'est le même combat dans la boucle, il doit y avoir une condition qui ne s'applique pas dans Miseenligne.class.php !


<?php
include_once(realpath(dirname(__FILE__)) . '/../../../classes/PluginsClassiques.class.php');
include_once(realpath(dirname(__FILE__)) . '/../../../classes/Parseur.class.php');

class Miseenligne extends PluginsClassiques {
    var $genre;
    var $id;
    var $date;
    var $table = 'miseenligne';
    var $bddvars = array('genre', 'id', 'date');

    function miseenligne(){
        $this->PluginsClassiques();   
        Parseur::ajouter_variable_conditionnelle('MEL_ETAT');
    }

    function init(){
        $cnx = new Cnx();
        $query = 'CREATE TABLE IF NOT EXISTS `' . $this->table . '` (
           `genre` text NOT NULL,
          `id` int(11) NOT NULL,
          `date` datetime NOT NULL
        ) ;';
       
        mysql_query($query, $cnx->link);
    }   
   
    function check_date($date) {
        global $check_date;

        $check = preg_split('/[\s,\-,\:]/', $date);
        $check_date = checkdate($check[1], $check[2], $check[0]);

        if($check_date == TRUE){
           $h = $check[3];
           $m = $check[4];
           $s = $check[5];
       
           if(($h >= 0 AND $h <= 23) AND ($m >= 0 AND $m <= 59) AND ($s >= 0 AND $s <= 59)) {
               $check_date = TRUE;
           } else {
               $check_date = FALSE;
           }
        }

        return $check_date;

    }
   
    function pages_admin($id) {
   
        $mel = new Miseenligne();

        global $check_date;

        // Genre
        $genre = explode('/' , $_SERVER['SCRIPT_NAME']);
        $i = count($genre) - 1;
        $genre = substr($genre[$i],0,-13);

        // Recherche
        $result=mysql_query("SELECT * FROM $this->table WHERE id = $id AND genre = '$genre'");
        if(!empty($result)) {
            $row = mysql_fetch_array($result);
            $date = $row['date'];
        }
       
        if($date) {
            $jour_mel = strftime('%d/%m/%Y', strtotime($date));
            $heure_mel = strftime('%H:%M:%S', strtotime($date));
            $action = 'maj';
            $value = 'Modifier';
        } else {
            $action = 'add';
            $value = 'Ajouter';
        }

        // Traitement
        if (isset($_POST['submit_mel'])) {
            $jour_mel = $_REQUEST['jour_mel'];
            $heure_mel = $_REQUEST['heure_mel'];       
       
            if (preg_match('^[0-9]{2}/[0-9]{2}/[0-9]{4}$^' , $jour_mel)) {
                $dateMySQL = explode('/',$jour_mel);
                $dateMySQL = $dateMySQL[2].'-'.$dateMySQL[1].'-'.$dateMySQL[0].' '.$heure_mel;
                $mel->check_date($dateMySQL);
                if($check_date == TRUE){
                    if ($_POST['action'] == 'maj') {
                        mysql_query("UPDATE $mel->table SET date = '$dateMySQL' WHERE id = '$id' AND genre = '$genre'");
                    } elseif ($_POST['action'] == 'add') {
                        mysql_query("INSERT INTO $mel->table (genre,id,date) VALUES('$genre','$id','$dateMySQL') ");
                        $action = 'maj';
                        $value = 'Modifier';
                    }
                } else {
                    echo '<script type="text/javascript">alert("La date de mise en ligne n\'est pas valide");</script>';
                }
            } else {
                echo     '<script type="text/javascript">alert("Aucune date choisie ou problème de syntaxe");</script>';
            }
        }
        if (isset($_POST['delete'])) {
            mysql_query("DELETE FROM $mel->table WHERE id = '$id' AND genre = '$genre'");
            $action = 'add';
            $value = 'Ajouter';
            unset($jour_mel);
            unset($heure_mel);
        }
       
        $html = '<!-- Mise en ligne -->'."\n";
        $html .= '</form>'."\n";
        $html .= '<link rel="stylesheet" type="text/css" href="../client/plugins/miseenligne/datepick/jquery.datepick.css"/>'."\n";
        $html .= '<script type="text/javascript" src="../client/plugins/miseenligne/datepick/jquery.datepick.js"></script>'."\n";
        $html .= '<script type="text/javascript" src="../client/plugins/miseenligne/datepick/jquery.datepick-fr.js"></script>'."\n";
        $html .= '<script type="text/javascript">'."\n";
        $html .= ' $(function() {'."\n";
        $html .= "  $('#datepicker').datepick();"."\n";
        $html .= ' });'."\n";
        $html .= '</script>'."\n";
        $html .= ' <li style="margin:0 0 10px 0">'."\n";
        $html .= '  <div class="entete">'."\n";
        $html .= "   <div class=\"titre\" onclick=\"$('#pliantmiseenligne').show('slow');\" style=\"cursor: pointer;\">DATE DE LA MISE EN LIGNE</div>"."\n";
        $html .= '  </div>'."\n";
        $html .= '  <div id="pliantmiseenligne" class="blocs_pliants_prod">    '."\n";   
        $html .= '   <ul class="ligne1">'."\n";
        $html .= '    <li class="cellule">'."\n";
        $html .= '     <form action="'.$_SERVER['REQUEST_URI'].'" method="post">'."\n";
        $html .= '      <input size="15" name="jour_mel" type="text" id="datepicker" value="'.$jour_mel.'"/>'."\n";
        $html .= '    <select name="heure_mel">'."\n";
        for ( $heure = 0 ; $heure <= 23 ; $heure++ ) {
             for ( $minutes = 0 ; $minutes <= 30 ; $minutes += 30 ) {
                $heure = sprintf("%02d", $heure);
                $minutes = sprintf("%02d", $minutes);
                   $html .= '<option value="'.$heure.':'.$minutes.':00"';
                if($heure_mel == $heure.':'.$minutes.':00') {
                $html .=' selected="selected"';
                }
                $html .='>'.$heure.':'.$minutes.'</option>'."\n";
             }
          }
        $html .= '</select>'."\n";
        $html .= '      <input type="hidden" name="action" value="'.$action.'"/>'."\n";
        $html .= '      <input type="submit" name="submit_mel" value="'.$value.'"  />'."\n";       
        $html .= '      <input  style="color:red;" type="submit" name="delete" value="Effacer"  />'."\n";       
        $html .= '     </form>'."\n";
        $html .= '    </li>'."\n";
        $html .= '   </ul>'."\n";
        $html .= "   <div class=\"bloc_fleche\" onclick=\"$('#pliantmiseenligne').hide();\" style=\"cursor: pointer;\">"."\n";
        $html .= '    <img src="gfx/fleche_accordeon_up.gif"/>'."\n";
        $html .= '   </div>'."\n";
        $html .= '  </div>'."\n";
        $html .= ' </li>'."\n";
        $html .= '<!-- Mise en ligne  -->'."\n";
       
        echo $html;
       
    }

    function boucle($texte, $args){
       
        global $check_date;
       
        $mel = new Miseenligne();   

        /* Paramètres ------------------------------------------------------------------*/
        $param = array('genre','mode');
        for($i=0;$i<sizeof($param);$i++) {
            ${$param[$i]} = lireTag($args, $param[$i]);
        }

        /* Mode ------------------------------------------------------------------*/
        if($mode != 'tous' && $mode != 'sorti' && $mode != 'nonsorti' && $mode != 'dates')
        exit('Boucle MISEENLIGNE : <em><strong>mode</strong></em> n\'a pas été correctement renseigné');
                           
        /* Min & Max ------------------------------------------------------------------*/
        $now = date('Y-m-d h:i:s');
       
        if($mode == "dates") {
               
            $param = array('start','end');
            for($i=0;$i<sizeof($param);$i++) {
                ${$param[$i]} = lireTag($args, $param[$i]);
            }
           
            $pattern = '^[0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}$^';
            $clean_comp = array('-',' ',':');
           
            if($start && preg_match($pattern , $start)) {
                $mel->check_date($start);
                if($check_date != TRUE)
                exit('Boucle EVENEMENT : <em><strong>start</strong></em> n\'est pas une date valide');
                $start_comp = str_replace($clean_comp,'',$start);
                $min = $start;
            } else {
                exit('Boucle MISEENLIGNE : <em><strong>start</strong></em> doit être au format aaaa-mm-jj hh:mm:ss');
            }
           
            if($end && preg_match($pattern , $end)) {
                $mel->check_date($end);
                if($check_date != TRUE)
                exit('Boucle EVENEMENT : <em><strong>end</strong></em> n\'est pas une date valide');
                $end_comp = str_replace($clean_comp,'',$end);
                $max = $end;
            } else {
                exit('Boucle MISEENLIGNE : <em><strong>end</strong></em> doit être au format aaaa-mm-jj hh:mm:ss');
            }
           
            if(($end && $start) && ($start_comp > $end_comp))
            exit('Boucle MISEENLIGNE : <em><strong>end</strong></em> ne peut pas être antérieur à <em><strong>start</strong></em>');
                               
        } else {
           
            $param = array('periode','duree','decalage');
            for($i=0;$i<sizeof($param);$i++) {
                ${$param[$i]} = lireTag($args, $param[$i]);
            }
           
            if(!$periode && ($decalage || $duree))
            exit('Boucle MISEENLIGNE<br><em><strong>duree</strong></em> et/ou <em><strong>decalage</strong></em> ont été renseigné mais <em><strong>periode</strong></em> est absent');

            if($periode && $periode != 'jour' && $periode != 'semaine' && $periode != 'mois'  && $periode != 'annee')
            exit('Boucle MISEENLIGNE : <em><strong>periode</strong></em> n\'a pas été correctement renseigné');

            if($duree < 0)
            exit('Boucle MISEENLIGNE : <em><strong>duree</strong></em> n\'a pas été correctement renseigné');

            if($decalage < 0)
            exit('Boucle MISEENLIGNE : <em><strong>decalage</strong></em> n\'a pas été correctement renseigné');
           
           
            $h_min = ' 00:00:00';
            $h_max = ' 23:59:59';
           
            if(!$duree) $duree = 1;
       
            switch($mode) {
                case 'tous'        : $start = 0                        ; $end = 0            ; break;
                case 'sorti'    : $start = 1 - ($decalage + $duree)    ; $end = $duree - 1    ; break;
                case 'nonsorti'    : $start = $decalage                ; $end = $duree - 1    ; break;
            }
       
            switch ($periode) {
                case 'jour'        : $periodetype = 'day'        ; $formatdate_min = 'Y-m-d'.$h_min        ; $formatdate_max = 'Y-m-d'.$h_max        ; break;
                case 'semaine'    : $periodetype = 'week'        ; $formatdate_min = 'Y-m-d'.$h_min        ; $formatdate_max = 'Y-m-d'.$h_max        ; break;
                case 'mois'        : $periodetype = 'month'    ; $formatdate_min = 'Y-m-01'.$h_min        ; $formatdate_max = 'Y-m-t'.$h_max        ; break;
                case 'annee'    : $periodetype = 'year'        ; $formatdate_min = 'Y-01-01'.$h_min    ; $formatdate_max = 'Y-12-31'.$h_max    ; break;
            }
       
            if($mode=='nonsorti' && $decalage==0 ){
                $min = $now;
            } else {
                $min = date_format(date_add(date_create($now), date_interval_create_from_date_string("$start $periodetype")), $formatdate_min);
                if($periodetype == 'week') {
                    $lundi = date_format(date_sub(date_create($now), date_interval_create_from_date_string("$decalage week")),'N') - 1;
                    $min = date_format(date_sub(date_create($min), date_interval_create_from_date_string("$lundi day")), $formatdate_min);
                }
            }
       
            if($mode=='sorti' && $decalage==0){
                $max = $now;
            } else {   
                $max = date_format(date_add(date_create($min), date_interval_create_from_date_string("$end $periodetype")), $formatdate_max);
                if($periodetype == 'week') {
                    $dimanche = 7 - date_format(date_sub(date_create($max), date_interval_create_from_date_string("$decalage week")),'N');
                    $max = date_format(date_add(date_create($max), date_interval_create_from_date_string("$dimanche day")), $formatdate_max);
                }
            }
        }
           
        /*    Existence de 'genre' ou non ------------------------------------------------------------------*/
        if($genre){

            if($genre != 'contenu'  &&  $genre != 'produit' && $genre != 'rubrique' && $genre != 'dossier')
            exit('Boucle MISEENLIGNE : <em><strong>genre</strong></em> n\'a pas été correctement renseigné');

            switch ($genre) {
                case 'produit'    : $parent = 'produit.rubrique'    ; break;
                case 'rubrique'    : $parent = 'rubrique.parent'    ; break;
                case 'contenu'    : $parent = 'contenu.dossier'    ; break;
                case 'dossier'    : $parent =    'dossier.parent'    ; break;
            }
           
            $genredesc = $genre.'desc';

            /* Paramètres ------------------------------------------------------------------*/
            $param = array('id','exclusion','in','out','deb','num','classement');
           
            for($i=0;$i<sizeof($param);$i++) {
                ${$param[$i]} = lireTag($args, $param[$i]);
            }

            /* Requête ------------------------------------------------------------------*/
            /* $query="SELECT $mel->table.* FROM $mel->table, $genre, $genredesc WHERE $genre.id = $mel->table.id AND $genre.id = $genredesc.$genre AND genre = '$genre'"; */
            $query="SELECT $mel->table.* FROM $mel->table, $genre, $genredesc WHERE $genre.id = $mel->table.id AND $genre.id = $genredesc.$genre AND $genredesc.lang = ".ActionsLang::instance()->get_id_langue_courante()." AND genre = '$genre'";

            /* ---- Min & Max */       
            if($min) $query .= " AND date >= '$min'";
            if($max) $query .= " AND date <= '$max'";
                           
            /* ---- Id, Exclusion, In & Out */       
            if($id) $query .=  " AND $mel->table.id IN ($id)  ";
            if($exclusion) $query .=  "AND $mel->table.id NOT IN ($exclusion)  ";
            if($in) $query .= " AND $parent IN ($in)";
            if($out) $query .= " AND $parent  NOT IN ($out)";
           
            /* ---- Classement */
            switch ($classement) {
                case 'datemin'        : $query .= ' ORDER BY date'                                ; break;
                case 'datemax'        : $query .= ' ORDER BY date DESC'                            ; break;
                case 'titre'        : $query .= ' ORDER BY titre'                                ; break;
                case 'titreinverse' : $query .= ' ORDER BY titre DESC'                            ; break;
                case 'ref'             : if($genre=='produit') $query .= ' ORDER BY ref'            ; break;
                case 'refinverse'     : if($genre=='produit')    $query .= ' ORDER BY ref DESC'        ; break;
                case 'manuel'        : $query .= ' ORDER BY classement'                            ; break;
                case 'inverse'        : $query .= ' ORDER BY classement DESC'                        ; break;
                case 'prixmin'        : if($genre=='produit')    $query .= ' ORDER BY prix'            ; break;
                case 'prixmax'        : if($genre=='produit')    $query .= ' ORDER BY prix DESC'        ; break;
                case 'promomin'        : if($genre=='produit')    $query .= ' ORDER BY prix2'            ; break;
                case 'promomax'        : if($genre=='produit')    $query .= ' ORDER BY prix2 DESC'    ; break;
                case 'aleatoire'    : $query .= ' ORDER BY RAND()'                                ; break;
                default                : $query .= ' ORDER BY date';
            }
           
            /* ---- Deb & Num */
            if($deb) $deb = $deb-1;
                   
            if($deb && $num) {
                $query .= " LIMIT $deb,$num";
            } elseif(!$deb && $num) {
                $query .= " LIMIT $num";
            }     elseif($deb && !$num) {
                $query .= " LIMIT $deb,99999";
            }
            $resul = $this->query($query) or die('Boucle MISEENLIGNE : problème de requête MySQL');

            /* Substitutions ------------------------------------------------------------------*/
            while ($row = mysql_fetch_assoc($resul)) {
                $temp = $texte;
                $temp = str_replace('#MEL_GENRE', strtoupper($genre), $temp);
                $temp = str_replace('#MEL_ID', $row['id'], $temp);
                $temp = str_replace('#MEL_DATE', $row['date'], $temp);
                               
                if(str_replace('-','',$now) >= str_replace('-','',$row['date']) ) {
                    $temp = preg_replace('/\#MEL_ETAT\[([^]]*)\]\[([^]]*)\]/', '\\1', $temp);
                } else {
                    $temp = preg_replace('/\#MEL_ETAT\[([^]]*)\]\[([^]]*)\]/', '\\2', $temp);
                }
                $res .= $temp;
            }           
        } else {
            /* Substitutions ------------------------------------------------------------------*/
            $temp = $texte;
            $temp = str_replace('#MEL_MIN', $min, $temp);
            $temp = str_replace('#MEL_MAX', $max, $temp);
            $res .= $temp;
        }
        return $res;
    }
}

?>


Ce qui est fait n'est plus à faire ;-)

Offline


Ben merdu c'est même pas le même combat... "tous" et "sorti"

Il semblerait que dès qu'il y a une date, il apparait dans le comptage, qu'il soit "En ligne" ou pas...

Donc si je met une date il compte 1, 2, 3, ... mais n'affiche que 2 si 2 est en ligne...

Du coup j'ai pas de relation entre num=10 et l'affichage qui m'en donne 2 par exemple ! Ce qui fait que si un rédacteur prépare un produit, contenu, ... en lui ajoutant une date mais ne publie pas encore celui-ci, ça fout la merde :-( Pour que cela soit correct jamais de date si le produit n'est pas en ligne !!!


Alors que le mode "nonsorti" semble en tenir compte ...

Il faudrait donc ajouter un test en ligne ou pas avant de vérifier si le mode "sorti" est activé

Quelqu'un confirme ?

Merci Roadster31 de tes remarques, elles m'ont permis de cerner le problème, pas encore de le résoudre mais de l'identifier !

Merci

Last edited by paulbe (03-03-2014 12:17:36)


Ce qui est fait n'est plus à faire ;-)