Se connecter

Informatique

Création de sites web

Sujet : Trier des articles selon leur date de création
1
ScientistLambda
Niveau 10
08 juillet 2020 à 15:48:42

Salut, je cherche à mettre en place une section qui pourra m'afficher les 10 derniers articles créés dans une table de ma base de données.

Avec les fichiers TWIG de Symfony je peut déjà appliquer un IF sur l'id de mon article pour qu'il ne m'affiche que les dix derniers articles mais ce qui est embêtant c'est que si je rajoute de nouveaux articles, je vais avoir 11 articles dans l'affichage au lieu de 10.

Car ma condition affiche tout les articles qui possèdent un id au delà de 40.

La je suis en panne sèche d'idées, mon champs article possède une createdAt avec la date et l'heure, un id propre à chaque article mais je n'ai aucune idée de comment, avec TWIG, je pourrais avoir une fonction autonome qui me sélectionnera les 10 derniers article créés dans la table article de ma base de données :(

Si vous avez une piste en utilisant TWIG je suis preneur

Je laisse le code là


    {% for article in articles  %}
   
  {% if article.id > 38 %}
    
            <div class="col-sm article" style="background-image: url('{{article.image}}');">
             <article>
            <a href=""{{ path('blog_show', {'id': article.id}) }}"">
                <div class="extrait">
                    <p> {% set strategy = 'html' %}

                      {% autoescape 'html' %}
                          

                          {{ article.content|length > 50 ? article.content|slice(0, 80) ~ '...' : article.content  }}
                      {% endautoescape %}</p>

                </div>

                </a>
              </article>
    </div>
    {% endif %} 
{% endfor %}

Marav
Niveau 28
08 juillet 2020 à 16:54:02

Pourquoi tu ne fais pas ça directement en SQL ou dans tes controllers ?
Et j'imagine que dans tes articles tu dois avoir une date de création, donc tu peux jouer là dessus au lieu de pointer sur l'ID, si tu tiens à faire ça seulement sur Twig, tu peux faire dans ta boucle for :

{% for article in articles if [ ta condition ] %}

Seulement voilà ( et je me suis fait avoir là dessus aussi, ça a été déprécié à la version 3 il me semble.
Du coup les gens renvoient aux filter.

https://twig.symfony.com/om/doc/3.x/filters/filter.html

EDIT : je sais plus exactement comment j'avais fait j'ai eu le même soucis, car je voulais absolument gérer ça via Twig, grosse erreur à mon gout. Je te renvoie à ma première phrase du coup.

ScientistLambda
Niveau 10
08 juillet 2020 à 16:54:07

Le 08 juillet 2020 à 16:19:59 Marav a écrit :
Pourquoi tu ne fais pas ça directement en SQL ?

Je cherche à le faire sous TWIG comme ça si jamais je trouve ça pourrait me faire un gain de temps lors de la création de contenu similaire je ne voulais pas utiliser autre chose en fait

J'ai déjà fait des requêtes pour sélectionner les 10 derniers champs d'une table mais c'était sur du vanilla ou j'avais juste à changer la requête dans le code PHP, j'apprends Symfony et je ne sais pas exactement où prendrais place ma requête

Et pour les filters de TWIG je ne sais pas lequel pourrait me sélectionner les 10 derniers champs d'une table, j'ai bien essayé le slice mais c'était sans rapport :(

ScientistLambda
Niveau 10
08 juillet 2020 à 17:04:09

Pourquoi tu ne fais pas ça directement en SQL ou dans tes controllers ?

Je vais voir dans mes controllers ça devrait être plus simple merci

Si tu te souviens de comment tu as fait je t'en serais reconnaissant :hap:

VinkingBanni
Niveau 10
08 juillet 2020 à 17:32:56

ça ne se fait que dans le controller !
Et hop encores un exemple qu'il faut connaitre php pour faire du twig...

car oui il y'a |filter ()

https://twig.symfony.com/om/doc/3.x/filters/filter.html

Marav
Niveau 28
08 juillet 2020 à 17:40:57

J'ai déjà fait des requêtes pour sélectionner les 10 derniers champs d'une table mais c'était sur du vanilla ou j'avais juste à changer la requête dans le code PHP, j'apprends Symfony et je ne sais pas exactement où prendrais place ma requête

Tu fais une requête sur ton repository mais il faudra savoir manier Doctrine , le DQL et/ou le QueryBuilder.
Sinon tu peux juste faire du DQL grâce aux outils createQuery, tu ne sera pas forcément depaysé :ok:
Le soucis c'est qu'il me semble que tu ne peux pas faire de LIMIT ( pour ton cas ça pourrait être interessant ) via le DQL pur.
Pourquoi ? Je ne sais pas.


$query = $entityManager->createQuery("
            { Ta requête } ")
        ->setMaxResults(10);

Le setMaxResults fait office de LIMIT que l'on connait sur le SQL.

Ouais j'ai pas trop le temps de voir où ce que je l'ai implanté, c'était un très vieux projet mais je te dirais ça :ok:

VinkingBanni
Niveau 10
08 juillet 2020 à 17:41:43

Le 08 juillet 2020 à 16:54:02 Marav a écrit :
Pourquoi tu ne fais pas ça directement en SQL ou dans tes controllers ?
Et j'imagine que dans tes articles tu dois avoir une date de création, donc tu peux jouer là dessus au lieu de pointer sur l'ID, si tu tiens à faire ça seulement sur Twig, tu peux faire dans ta boucle for :

{% for article in articles if [ ta condition ] %}

Seulement voilà ( et je me suis fait avoir là dessus aussi, ça a été déprécié à la version 3 il me semble.
Du coup les gens renvoient aux filter.

https://twig.symfony.com/om/doc/3.x/filters/filter.html

EDIT : je sais plus exactement comment j'avais fait j'ai eu le même soucis, car je voulais absolument gérer ça via Twig, grosse erreur à mon gout. Je te renvoie à ma première phrase du coup.

if n'a jamais pue faire un filtre de trie sur la date.

VinkingBanni
Niveau 10
08 juillet 2020 à 17:49:53

Le 08 juillet 2020 à 17:40:57 Marav a écrit :

J'ai déjà fait des requêtes pour sélectionner les 10 derniers champs d'une table mais c'était sur du vanilla ou j'avais juste à changer la requête dans le code PHP, j'apprends Symfony et je ne sais pas exactement où prendrais place ma requête

Tu fais une requête sur ton repository mais il faudra savoir manier Doctrine , le DQL et/ou le QueryBuilder.
Sinon tu peux juste faire du DQL grâce aux outils createQuery, tu ne sera pas forcément depaysé :ok:
Le soucis c'est qu'il me semble que tu ne peux pas faire de LIMIT ( pour ton cas ça pourrait être interessant ) via le DQL pur.
Pourquoi ? Je ne sais pas.


$query = $entityManager->createQuery("
            { Ta requête } ")
        ->setMaxResults(10);

Le setMaxResults fait office de LIMIT que l'on connait sur le SQL.

Ouais j'ai pas trop le temps de voir où ce que je l'ai implanté, c'était un très vieux projet mais je te dirais ça :ok:

NON !

google : doctrine repository class api github :

https://github.com/doctrine/orm/blob/master/lib/Doctrine/ORM/EntityRepository.php

ctrl + f findBy

public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null)
$articles = $em->getRepository(Maclass::class)->findBy([], ['datecreation' => 'asc']), 10);

voilà apprenez déja la base au lieux de faire du vanilla ! avant de donner des conseille foireux !

Tons DQL ta query moitier SQL/DQL tu la garde pour un cas particulier ...
ET si via DQL tu peux faires des limites !

Donc non ne fais jamais ça !

VinkingBanni
Niveau 10
08 juillet 2020 à 17:56:46

PS: y'a meme la pagination avec findBy

Mais tu as le droit de créer une requete de count dans ton repository de taClass genre :
https://github.com/darkiron/LittleCMS/blob/master/src/CMS/BlogBundle/Repository/ArticleRepository.php

ScientistLambda
Niveau 10
08 juillet 2020 à 18:42:46

Merci de votre aide je viens de trouver une solution en créant une requête dans mon repository


public function findLast5()
    {
        $queryBuilder = $this->createQueryBuilder("a")
            ->orderBy("a.id","desc")
            ->setMaxResults(5)
        ;
        return $queryBuilder->getQuery()->getResult();    
    }

Ça marche bien j'ai les cinq derniers articles de ma table articles qui s'affichent, 10 ça faisait trop de contenu sur la page.

merci pour les liens je vais en avoir besoin. :ok:

Marav
Niveau 28
08 juillet 2020 à 19:43:28

VinkingBanni :d) Merci de me corriger, on ne peut pas être un expert partout après tout :)
Cela dit c'est assez fatiguant de lire ton agressivité à chaque message que tu postes, sache le.

Et si tu peux me dire ou trouver le LIMIT de SQL en DQL je suis preneur, pas faute d'avoir zieuté leur documentation. :(
T'avais l'air plus motivé à nous montrer comment ctrl-f un repo Github.

Marav
Niveau 28
08 juillet 2020 à 19:56:40

Le 08 juillet 2020 à 17:41:43 VinkingBanni a écrit :

Le 08 juillet 2020 à 16:54:02 Marav a écrit :
Pourquoi tu ne fais pas ça directement en SQL ou dans tes controllers ?
Et j'imagine que dans tes articles tu dois avoir une date de création, donc tu peux jouer là dessus au lieu de pointer sur l'ID, si tu tiens à faire ça seulement sur Twig, tu peux faire dans ta boucle for :

{% for article in articles if [ ta condition ] %}

Seulement voilà ( et je me suis fait avoir là dessus aussi, ça a été déprécié à la version 3 il me semble.
Du coup les gens renvoient aux filter.

https://twig.symfony.com/om/doc/3.x/filters/filter.html

EDIT : je sais plus exactement comment j'avais fait j'ai eu le même soucis, car je voulais absolument gérer ça via Twig, grosse erreur à mon gout. Je te renvoie à ma première phrase du coup.

if n'a jamais pue faire un filtre de trie sur la date.

https://twig.symfony.com/om/doc/3.x/functions/date.html
https://twig.symfony.com/doc/3.x/filters/date.html

{% if foo.timestamp|date('U') < '2020-08-15'|date('U') %}

??

VinkingBanni
Niveau 10
08 juillet 2020 à 21:58:27

Le 08 juillet 2020 à 19:43:28 Marav a écrit :
VinkingBanni :d) Merci de me corriger, on ne peut pas être un expert partout après tout :)
Cela dit c'est assez fatiguant de lire ton agressivité à chaque message que tu postes, sache le.

Effectivement tu peux pas tous connaitre ....
Je suis pas agressifs, mais bon je dois passé après certains mecs dont le profile corresponds aux profiles de beaucoup de gens ici ...
Surtout que tu apporte des réponses inexactes et qui montre ta méconnaissance du dev. Ce qui implique que tu réponds à côté de la plaque... ça apporte plus de confusion et de code pourris....

Et si tu peux me dire ou trouver le LIMIT de SQL en DQL je suis preneur, pas faute d'avoir zieuté leur documentation. :(
T'avais l'air plus motivé à nous montrer comment ctrl-f un repo Github.

Justement c'est un parfait example ta question....
Tu dis que DQL on peux pas faire de limit horst tu gérer bien tes limite avec Doctrine.
Que fais Doctrine ?
Du DQL !
Si tu avais fais plus de ctrl +f (c'est con à dire) tu aurais ta réponses ...

public function findLast5()
    {
        $queryBuilder = $this->createQueryBuilder("a")
            ->orderBy("a.id","desc")
            ->setMaxResults(5)
        ;
        return $queryBuilder->getQuery()->getResult();    
    }

je prends l'exemple de notre amis que fais la fonction setMaxResults(5) ?

un dump du DQL est une recherche de la fonction et tu as surement une réponses viable....
D'ailleurs j'ai pas la réponses sous la main mais je te laisse checker (en tous cas je ferais comme ça )

https://twig.symfony.com/om/doc/3.x/functions/date.html
https://twig.symfony.com/doc/3.x/filters/date.html

{% if foo.timestamp|date('U') < '2020-08-15'|date('U') %}
??

Le 08 juillet 2020 à 19:56:40 Marav a écrit :

Le 08 juillet 2020 à 17:41:43 VinkingBanni a écrit :

Le 08 juillet 2020 à 16:54:02 Marav a écrit :
Pourquoi tu ne fais pas ça directement en SQL ou dans tes controllers ?
Et j'imagine que dans tes articles tu dois avoir une date de création, donc tu peux jouer là dessus au lieu de pointer sur l'ID, si tu tiens à faire ça seulement sur Twig, tu peux faire dans ta boucle for :

{% for article in articles if [ ta condition ] %}

Seulement voilà ( et je me suis fait avoir là dessus aussi, ça a été déprécié à la version 3 il me semble.
Du coup les gens renvoient aux filter.

https://twig.symfony.com/om/doc/3.x/filters/filter.html

EDIT : je sais plus exactement comment j'avais fait j'ai eu le même soucis, car je voulais absolument gérer ça via Twig, grosse erreur à mon gout. Je te renvoie à ma première phrase du coup.

if n'a jamais pue faire un filtre de trie sur la date.

https://twig.symfony.com/om/doc/3.x/functions/date.html
https://twig.symfony.com/doc/3.x/filters/date.html

{% if foo.timestamp|date('U') < '2020-08-15'|date('U') %}

??

C'est encore plus flagrant

IF == SI
Le if teste si la conditions est vrai ou fausse !
Ici vrai. Il te trie pas les articles par date croissantes ! tu vas juste en avoir moins.

Si a est vrai tu affiche ta news sinon elle passe ) la benne !

1
Sujet : Trier des articles selon leur date de création
   Retour haut de page
Consulter la version web de cette page