```<?php use Drupal\node\Entity\Node; /** ...
# chat
m
Copy code
<?php  

use Drupal\node\Entity\Node;

 /**
   * Create nodes from JSON feed.
 */

  function updateNodes(string $json_url) {

    // Get JSON contents
    $json = file_get_contents(__DIR__ . $json_url);
    $jsonout = json_decode($json, TRUE);
    
    // Loop through JSON
    foreach ($jsonout['places'] as $store) {

      // Set for email
      for ($i = 0; $i < count($store['embed_payload']['blocks']); $i++) {
        if ($store['embed_payload']['blocks'][$i]['type_id'] == 'email') {
          $email = $store['embed_payload']['blocks'][$i]['content'];
        } 
      }

      $nodes = \Drupal::entityTypeManager()->getStorage('node')->loadByProperties(['type' => 'katastimata']);

      foreach ($nodes as $node) {
        $node->set('langcode', 'en');
        $node->set('uid', '1');
        $node->set('status', 1);
        $node->set('title', $store['title']);
        $node->set('field_titlos', $store['title']);  
        $node->set('field_ypotitlos', 'HOME');
        $node->set('field_katigoria', $store['subtitle']);
        $node->set('field_dieythynsi', $store['address']['address']);
        $node->set('field_latitude', $store['address']['latitude']);
        $node->set('field_longitude', $store['address']['longitude']);
        $node->set('field_email_epiheirisis', $email);
        $node->set('field_istotopos', [
            'uri'=> $website,
            'title' => 'Ιστότοπος',
        ]);
        $node->set('field_poli', explode(", ", $store['address']['address'])[1]);
        $node->set('field_hora', explode(", ", $store['address']['address'])[2]);
        $node->save();
      }
    }
    }

    // Enter JSON path
    $json = '/2_gift.json';

    // Call function
    updateNodes($json);
Παιδιά, έχω φτιάξει ένα scriptaki με σκοπό την ενημέρωση ήδη υπάρχων nodes σε συγκεκριμένα content type. Η πληροφορία παίρνετε από ένα JSON. Παρόλα αυτά μου ενημερώνει μόνο το τελευταίο κατάστημα από το JSON. Κάποιο πρόβλημα υπάρχει στον συνδυασμό των δύο foreach. Καμία ιδέα?
d
καλως τον
👋 2
e
Στο πρώτο foreach σου, loopάρεις μέσα στο json. Για κάθε store που βρίσκεις, φορτώνεις όλα τα katastimata-nodes και στο καθένα από αυτά αποθηκεύεις το τρέχον json-element.
👀 1
Άρα, για κάθε store που βρίσκεις μέσα στο json, αποθηκεύεις τα στοιχεία του σε ΚΑΘΕ node. Αν το json σου έχει 5 καταστήματα και έχεις 10 nodes, το κάθε node θα αποθηκευτεί 5 φορές, άρα όλα τα nodes σου θα πάρουν τις ίδιες τιμές του τελευταίου store απ' το json.
👀 1
m
Copy code
$node = Node::load(233);
      $node->set('field_ypotitlos', 'RANDOM');
      $node->set('field_katigoria', $store['subtitle']);
      $node->save();
Έτσι μια χαρά δουλεύει, με ένα node.
e
Δηλαδή θα τρέξεις 5*10=50 φορές το $node->save()
Προφανώς αντί για
Copy code
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties(['type' => 'katastimata']);
θα πρέπει να φορτώσεις το συγκεκριμένο node που αντιστοιχεί στο store που εξετάζεις σε εκείνο το foreach-step
φαντάζομαι πως στο json σου δεν έχεις το nid του κάθε καταστήματος
αν ναι (δλδ αν το έχεις), problem solved
αν όχι, θα πρέπει να βρεις ποια από τις τιμές του store σου μπορούν να προσδιορίσουν μοναδικά το node, και να κάνεις αναζήτηση με ένα entityQuery στο κατάλληλο field
m
Όχι, δεν υπάρχει το nid στο JSON, γιατί δημιουργούνται με άλλο scriptaki
Δεν ξέρεις από πριν ποιο είναι το nid.
d
ξερεις ομως τον τιτλο
m
Ναι, τον τίτλο τον ξέρεις.
d
αρα μπορεις να κανεις
Copy code
$node = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties(['field_titlos' => $store['title']);

$node = current($node);
και πανω στο $node να αλλαξεις τις τιμες των πεδιων
m
Δεν πιάνεις το content type όμως έτσι.
Copy code
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadByProperties(['type' => 'katastimata']);
e
Copy code
\Drupal::entityQuery('node')->condition('field_titlos', $title)->condition('type', 'katastimata')->execute()
👀 1
d
αν εχεις πολλα content types με αυτο το πεδιο, ναι σωστα. κανεις το παραπανω του Σταθη
ουσιαστικα αυτο που εγραψε ο Σταθης ειναι το ιδιο πραγμα με το \Drupal::entitytypemanager() κωδικα που στελναμε πιο πριν
m
Copy code
$node = \Drupal::entityQuery('node')->condition('field_titlos', $title)->condition('type', 'katastimata')->execute();

      foreach ($nodes as $node) {
        $node->set('field_ypotitlos', 'TEST4');
        $node->set('field_katigoria', $store['subtitle']);
        $node->set('field_titlos', $store['title']);
        $node->save();
      }
Κάτι σαν αυτό, δεν κάνει αλλαγές...
e
Διάβασέ το λίγο πιο προσεκτικά και θα δεις πού είναι το πρόβλημα 🙂
karampouzouklis 1
m
Τελικά παρατήρησα ότι μέσα στο JSON υπάρχει και ένα μοναδικό αναγνωριστικό ID.
Γιατί μπορεί να υπάρχουν καταστήματα, που μπορεί να έχει και υποκαταστήματα, οπότε να έχει ίσως ίδιο τίτλο
Copy code
$nid = \Drupal::entityQuery('node')->condition('field_ypotitlos', "CLOTHES")->condition('type', 'katastimata')->execute();

      print_r($nid);

      foreach($nid as $x => $x_value) {
        print_r("Value = " . $x_value . PHP_EOL);

        $node = Node::load($x_value);
        $node->set('field_dieythynsi', $store['address']['address']);
        $node->save();
      }
Τελικά έκανα αυτό, αλλά και πάλι όταν τραβάει από το JSON την διεύθυνση, σε όλα τα nodes παίρνει την τελευταία διεύθυνση του καταστήματος.