Problème accès données JSON

Fermé
Ipoote Messages postés 45 Date d'inscription dimanche 23 septembre 2018 Statut Membre Dernière intervention 21 mai 2023 - Modifié le 19 mai 2023 à 22:45
jordane45 Messages postés 38353 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 27 décembre 2024 - 21 mai 2023 à 22:43

Bonjour,

Je poste ce message car je suis en train de recréer un site que j'avais fait en Symfony il y a quelque temps, en VueJS 3. 

Je voudrai à terme récupérer les données générées par mon Symfony via API Platform, mais actuellement j'ai juste mis mes données JSON en dur dans mon VueJS.

Mon site est un album photo avec un système d'utilisateur, de tags etc, et je veux récupérer chaque photo et l'afficher sous l'utilisateur correspondant, ce que j'ai réussi à faire, mais le problème est que cela ne fonctionne pas pour les tags : je boucle en HTML sur mes données JSON et je n'arrive pas à afficher les tags correctement, voici mon code : 

JSON :

import { defineStore } from 'pinia'

export const useDefaultStore = defineStore({
  id: 'default',
  state: () => ({

      users: [
        {
          "@context": "/api/contexts/User",
          "@id": "/api/users",
          "@type": "hydra:Collection",
          "hydra:totalItems": 2,
          "hydra:member": [
            {
              "@id": "/api/users/1",
              "@type": "User",
              "id": 1,
              "username": "Fabrice",
              "password": "$2y$13$FpK40kmNQ4HZqwx26JMNTOQ3roMLOL7XIV7qdZ05l.Q0YV.qqdh7u",
              "photos": [
                "/api/photos/1",
                "/api/photos/2",
                "/api/photos/3"
              ],
              "tags": [
                "/api/tags/1",
                "/api/tags/2",
              ],
              "roles": [
                "ROLE_USER"
              ],
              "userIdentifier": "Fabrice"
            },
            {
              "@id": "/api/users/2",
              "@type": "User",
              "id": 2,
              "username": "Alex",
              "password": "$2y$13$veBfXHieQ1bRxympVlZ1RuZ6IcciT2E961TKA1hzmPKww1/g4M8g6",
              "photos": [],
              "tags": [
                "/api/tags/3",
              ],
              "roles": [
                "ROLE_USER"
              ],
              "userIdentifier": "Alex"
            }
          ]
        }
    ],

      photos: [
        {
          "@context": "/api/contexts/Photo",
          "@id": "/api/photos",
          "@type": "hydra:Collection",
          "hydra:totalItems": 4,
          "hydra:member": [
            {
              "@id": "/api/photos/1",
              "@type": "Photo",
              "id": 1,
              "description": "des planetes",
              "path": "uploads/images/Planetes.jpg",
              "nom": "Planetes",
              "categorie": "/api/categories/1",
              "user": "/api/users/1",
              "tags": [
                "/api/tags/1",
                "/api/tags/2"
              ]
            },
            {
              "@id": "/api/photos/2",
              "@type": "Photo",
              "id": 2,
              "description": "un arbre",
              "path": "uploads/images/Arbre.jpg",
              "nom": "Arbre",
              "categorie": "/api/categories/2",
              "user": "/api/users/1",
              "tags": []
            },
            {
              "@id": "/api/photos/3",
              "@type": "Photo",
              "id": 3,
              "description": "encore des planetes",
              "path": "uploads/images/Planetes 2.jpg",
              "nom": "Planetes 2",
              "categorie": "/api/categories/1",
              "user": "/api/users/1",
              "tags": [
                "/api/tags/1"
              ]
            },
            {
              "@id": "/api/photos/4",
              "@type": "Photo",
              "id": 4,
              "description": "planetesss",
              "path": "uploads/images/planneete.jpg",
              "nom": "planneete",
              "categorie": "/api/categories/1",
              "user": "/api/users/2",
              "tags": [
                "/api/tags/3"
              ]
            }
          ]
        }
      ],
    
      tags: [
        {
          "@context": "/api/contexts/Tag",
          "@id": "/api/tags",
          "@type": "hydra:Collection",
          "hydra:totalItems": 1,
          "hydra:member": [
            {
              "@id": "/api/tags/1",
              "@type": "Tag",
              "id": 1,
              "nom": "mon tag",
              "photos": [
                "/api/photos/1",
                "/api/photos/3"
              ],
              "user": "/api/users/1"
            },

            {
              "@id": "/api/tags/2",
              "@type": "Tag",
              "id": 2,
              "nom": "mon deuxieme tag",
              "photos": [
                "/api/photos/1",      
              ],
              "user": "/api/users/1"
            },

            {
              "@id": "/api/tags/3",
              "@type": "Tag",
              "id": 3,
              "nom": "mon alex tag",
              "photos": [
                "/api/photos/4",            
              ],
              "user": "/api/users/2"
            }
          ]
        }
      ],
          
     
  }),
  getters: {

  },
  actions: {

})

HTML (composant Tag) :

<template>
<span v-for="(tag, i) in props.tags[0]['hydra:member']" :key="i">
  <span v-if="props.actualPhoto.tags[i]===tag['@id']">
    {{ props.tags[0]['hydra:member'][i].nom }} <br>
  </span>
</span>
</template>
  
  <script setup>  
  import { useDefaultStore } from '../stores/index'
  import { onMounted, ref, computed } from 'vue'
  import { useRouter, useRoute } from 'vue-router'
  
  const store = useDefaultStore()
  const router = useRouter()
  const route = useRoute()
      
  onMounted(() => {

  })  

  
  
  const props = defineProps({
    tags: {
      type: Array,
    },
    actualPhoto: {
      type: Object,
    },
    actualUser: {
      type: Object
    }
  })
    
  </script>
  
  <style>
  </style>

HTML (composant Photo) :

<template>
  <div v-for="user in props.users[0]['hydra:member']">
    <h1>Album de {{ user.username }}</h1>
      <figure v-for="photo in props.photos[0]['hydra:member']">
        <span v-if="user['@id'] == photo.user">
          <img :src="'http://127.0.0.1:8000/' + photo.path">
        <figcaption>
          <div v-if="photo.tags.length>0">
            <Tags :tags="tags" :actualPhoto="photo" :actualUser="user"/> 
          </div>
          <p>{{ photo.nom }}</p>
          <p>{{ photo.description }}</p>
        </figcaption>
        </span>
      </figure>
  </div>
</template>

<script setup>
import { useDefaultStore } from '../stores/index'
import { onMounted, ref, computed } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import Tags from './Tags.vue'
const store = useDefaultStore()
const router = useRouter()
const route = useRoute()
const tags = store.tags
    
    onMounted(() => {
        console.log('Le composant Photos est chargé')
    })  

const props = defineProps({
  photos: {
    type: Array,
  },
  users: {
    type: Array,
  }
})
</script>

<style>
</style>

HTML (composant Home) :

<template>
 
  
  <Photos :photos="photos" :users="users"/>

    
</template>
    
    <script setup>
    import User from './Home.vue'
    import Photos from './Photos.vue'
    import { useDefaultStore } from '../stores/index'
    import { useRouter, useRoute } from 'vue-router'
    import { onMounted, ref, computed } from 'vue'

    const router = useRouter()
    const route = useRoute()
    
    onMounted(() => {
        console.log('Le composant Home est chargé')
    })  
    
    const store = useDefaultStore()
    const photos = store.photos
    const users = store.users
    
    </script>

    <style>
    </style>

Je passe mes données entre composants etc, et j'ai bien accès aux données dans le HTML que j'envoie, le problème vient de la boucle et je ne trouve pas où il est.

Merci pour votre lecture !

3 réponses

jordane45 Messages postés 38353 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 27 décembre 2024 4 719
20 mai 2023 à 10:21

Bonjour,

Tu ne trouves pas la boucle ? c'est bien ça ta question ?

Dans ce cas, regarde ceci : https://vuejs.org/guide/essentials/list.html


0
Ipoote Messages postés 45 Date d'inscription dimanche 23 septembre 2018 Statut Membre Dernière intervention 21 mai 2023
20 mai 2023 à 15:25

Mon problème c’est que je n’arrive pas à boucler correctement et afficher ce que je veux :

 « Album de xxx »

Photo1 de xxx

Les tags de la photo1 de xxx

Photo2 de xxx

Les tags de la photo2 de xxx

 « Album de yyy »

Photo1 de yyy

Les tags de la photo1 de yyy

<br>

Il faut que je boucle sur mon tableau « tags » qui contient tous les tags créés ainsi que leur nom etc, mais aussi que je cherche dans les tags de la photoActuelle afin de trouver la référence de ses tags (je sais pas si c’est clair), je ne peux pas directement extraire le nom du tag depuis les tags de photoActuelle vu que je n’ai que les références des tags qu’elle contient, donc il faut que je compare à chaque fois les références et que, si la référence est la même, j’affiche le nom du tag.

 J’imagine bien que ça doit ne doit pas être si compliqué que ça, mais j’ai pas l’habitude de faire des boucles en html et… je sais pas, je n’y arrive pas 

Je suis pas sûr d’être très clair dis-moi si jamais tu comprends pas ^^
Merci beaucoup !

0
Ipoote Messages postés 45 Date d'inscription dimanche 23 septembre 2018 Statut Membre Dernière intervention 21 mai 2023
21 mai 2023 à 17:28

up

0
jordane45 Messages postés 38353 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 27 décembre 2024 4 719
21 mai 2023 à 22:43

Je te renvoie encore une fois.. à la doc :

https://vuejs.org/guide/essentials/list.html

ça te permettra de corriger ton code

et d'écrire un truc du genre

  <div v-for="user in props.users[0]['hydra:member']">
    <h1>Album de {{ user.username }}</h1>
      <figure v-for="photo in user.photos ">

puis, pour les tags

<figure v-for="tag in user.tags">

Pour le reste.. je ne fais pas de vue.js

Je t'invite donc à utiliser la documentation par toi même afin de résoudre tes problèmes.

Et puis

Je voudrai à terme récupérer les données générées par mon Symfony via API Platform, mais actuellement j'ai juste mis mes données JSON en dur dans mon VueJS.

N'hésites pas à retourner les informations de façon pertinentes directement dans ton JSON au lieu de chercher à faire des boucles dans des boucles au niveau de tes vues.

Il est préférable de structurer les données de sorties ( ton JSON ) de façon à disposer des données utiles et utilisables simplement... ( en faisant des jointures sur tes requêtes sql par exemple)..

.


0