cck mező módosítása kódból

pentike képe

Sziasztok!

Szeretnék egy olyan modult csinálni, ami egy csv fájl mezőit betölti egy adott tartalom típus megfelelő mezőibe. A node_import modul pont ezt csinálja, csak új node-okat hoz létre. Picit átrtam, a node-ot megcsinálja szépen, de a node_save() nem csinál semmit. A CCK mező nem mentődik el.

Gondoltam megpróbálom direktbe:

$nid = 10;
$node = node_load($nid);
$node->cck_mezo_neve[0]['value'] = 'teszt';
node_save($node);

node_load($nid); // és itt már a régi node-ot adja vissza

Keresgéltem, de nem találom, hogy hogy kéne működnie a CCK save-nek.
Tud valaki segíteni?

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
Illyés Edit képe

a node-ot megcsinálja szépen, de a node_save() nem csinál semmit...node_load($nid); // és itt már a régi node-ot adja vissza

Mit kellene visszaadnia? Ha megcsinálja a node-ot akkor miből gondolod, hogy a node_save() nem csinál semmit? Nekem nem világos a kérdés, lépésenként írd le, hogy mit csinálsz, milyen eredményt vársz, helyette mi történik.

0
0
pentike képe

Tényleg félreérthető volt. A "node-ot megcsinálja szépen" alatt azt értettem, hogy a node_save() előtti sorban a $node objektum tartalmazza a csv-ből kiszedett értéket a megfelelő CCK mezőben.
Aztán jön a node_save($node) amitől azt várnám, hogy mentse is el az értéket, tehát az utánna következő node_load() az elmentett node-omat adja vissza.
Viszont a node_load() a változtatás előtti node-ot adja vissza. Odáig eljutottam, hogy a cck text mező text_field() függvényébe az 'update' lefutása után még a helyes node érték van, szóval valahol később kell megváltoznia.

0
0
Illyés Edit képe

Van egy ilyen okosság a Drupalban, hogy betárazza a node-okat, tehát ha egy oldalon többször hívod be ugyanazt a node-ot, akkor csak először jön az adatbázis node, stb. táblájából, a második és minden további hívás már a gyorstárból keresi elő a lementett értéket. Ezért van az, hogy a második node_load() is az első értéket adja neked vissza. Ki kell lépned a programból a második node_load() előtt ahhoz, hogy friss $node példányt kapj.

0
0
crt képe

Esetleg a második betöltéskor a $revision és a $reset paraméterekkel lehet játszadozni, így már az új példányt kapja vissza.

Üdv: Zoli

0
0
pentike képe

Nincs valami parancs, amivel törölni lehet a cache-t?

0
0
Désiré képe

Használd a devel modult, sok hasznos dolgot tud, többek között a menüjében van egy "Empty cache" pont is.

http://drupal.org/project/devel

0
0

- - -
Juhász Márton

http://juhaszmarton.hu

pentike képe

megnézem, köszi!

0
0
Illyés Edit képe

crt-nél van a jó megoldás, használd a második híváskor a $reset-et. A Devel modulban az Empty cache link nem erre való.

<?php
node_load($node->nid, $revision = NULL, $reset = 1);
?>
0
0
Sweetchuck képe

Lehet hogy D5-ben is így volt

$node = new stdClass();
$node->type = 'valami';
//...
$node = node_submit($node);
node_save($node);
0
0
pentike képe

Az alábbi teszt kódot készítettem: (a d() debug fv. kiírja az objektumok értékét)

$node = node_load(63);
d($node);
    // Assign the mapped fields to the $node.
    foreach ($row as $i => $value) {
      if (strlen($match[$i]) > 0) {
        $fieldname = $match[$i];
$fieldname = preg_replace('/_value/','',$fieldname);
d($fieldname);
        $field = $node->$fieldname;
        $field[0]['value'] = $value;
        $node->$fieldname = $field;
      }
    }
d($node);
      $node = node_submit($node);
      node_save($node);
      $success++;

A node_load() utáni és a node_save() előtt $node objektumok ennyiben különböznek:
$ diff -u a b
--- a 2008-11-23 22:55:28.000000000 +0100
+++ b 2008-11-23 22:55:41.000000000 +0100
@@ -34,7 +34,7 @@
(
[0] => Array
(
- [value] => 11111
+ [value] => 12345
)

[label] => Ár:

tehát csak a value értéke változott, semmi más.
Miután lefut a node_save() a teszt node minden mezőjének értéke törlődik és a mező nevek kezdőbetűjét tartalmazza, tehát valamit elment, csak rosszul.

0
0
pentike képe

$node = node_load(63);
$node = node_submit($node);
node_save($node);

és kitörli a mezőket a node-ból :(

0
0
Illyés Edit képe

Minek kell a node_submit(), ha úgyis te állítod össze a $node tartalmát? Csak mentsd le node_save()-vel és jó lesz.

0
0
pentike képe

Sajnos nem működik úgy sem. Megcsinálom sima SQL-el. Gány megoldás lesz, de legalább működő.

0
0
aboros képe

ha beállítod a $node->revision értékét TRUE -ra (ezt hogy ragozzuk? truera vagy truere?:) akkor készül csak új verzió. volt nemrég egy téma ezzel kapcsolatban, most nem találom hirtelen.
ha beállítod azt, hogy új verzió jöjjön létre, akkor se ok?

0
0

-
clear: both;

Sweetchuck képe

... de kell a node_submit().
Én is csináltam olyat, hogy programból node létrehozás, és node_submit() nélkül nem működött. (Erre viszont emlékszem, mert szívtam vele sokat)
A drupal_execute() is használható, de nekem nem volt jó mert batch process-en belül kellett a node létrehozás.

0
0
Illyés Edit képe

Pár százezer node-ot létrehoztam már CSV-ből ezzel a módszerrel.

0
0