CCK tartalomtípus frissítése kódból

Balogh Zoltán képe

A CCK-val állítok elő különböző tartalom típusokat. (kutya, kennel, kennelnév, kiállítás, tenyésztő, ember, stb) Természetesen nodereference kapcsolat is van közöttük, pl kutya->tuladonosa egy ember, és így számtalan nodereference kapcsolat van a node-ok között. Eddig semmi gond, mindegyikből van X darab.

Ekkor jön a views modul, és kiegészülne minden CCK tartalomtípus egy-pár kapcsolódó listával. Igen ám, de a node-ok csak akkor frissülnek a listákkal, ha egyesével belemegyek mindegyikbe, majd szerkesztés, mentés.

Tehát ezt kódból kellene végrehajtani. Google anyón, drupal.orgon a CCK mass update, és hasonlókra keresve sajnos használható kódot nem találtam, de másnak is hasonló a problémája, pl: http://drupal.org/node/290867

Illetve innen http://drupal.org/node/164817 van egy kódra mutató link ide http://www.lullabot.com/articles/quick_and_dirty_cck_imports, de ahogy nézem ez valami régi lehet, mert a drupal_execute() már más paramétereket vár.

Szóval a feladat annyi lenne, hogy node->load, majd valahogy menjen át a modulokon, pont úgy, mintha a felhasználó egyesével szerkesztené, és nyomna rá egy mentést.

Előre is köszi.
Zoli

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

Először is nézd meg, mi van a $node-odban (beviteli mód PHP-ra átállítva, előnézet gomb):

<?php
// Node id = 1234
$node = node_load(1234);
?>
<pre><?php print_r($node); ?></pre>

Innen látni fogod, hogyan kell tárolni a CCK mezőidet. Utána behívod a $node-okat egyesével, megadod a mező értékét, és lemented:

<?php
$node = node_load(1234);
$node->field_valamimezo[0]['value'] = "valami érték";
node_save($node);
?>
0
0
Balogh Zoltán képe

Köszi.

A node_save() előtt az a $ csak elírás ugye, az egy sima függvénynek látszik. Nem "sima" CCK mező értékadásáról van szó, mert a kérdéses mező típusa viewfield. Ekkor nem tudom mit kell értékül adni (még), de megnézem egy létezőben és próbálkozom. Amúgy a node_save() hatására lefut minden? Gondolok itt a validálásra, valamint a különböző modul hookoknak is le kellene futnia, pl. az auto_nodetitle modul, ami kihív egy függvényt a saját modulba. Ennek a hooknak mindenképpen mennie kell egy node_save előtt.

Köszönöm még1x, próbálkozom.

0
0
Illyés Edit képe

Igen, elírás, helyesen node_save(). Lefut minden, ami beküldéskor le szokott futni.

0
0
pp képe

pp

0
0
Balogh Zoltán képe

Ha minden lefut, akkor logikusan semmit nem kell értékül adnom, hiszen ez a viewfield szerkesztés esetén meg sem jelenik. Tehát elvileg load és egyből utána save, és működnie kell. Kösz a segítséget.

0
0
Balogh Zoltán képe

A kód leegyszerűsítve, így megy a devel execute ablakba:

node_save(node_load(18));

Az eredmény, hogy a kérdéses 18-as node a friss tartalom élére ugrik, és megjelenik mellette a "frissült" flag. Ez eddig rendben is lenne. Node!!!

A tartalom típusra be van állítva, hogy a mentés új revizíót hoz létre. Ez egyáltalán nem történik meg. A másik hiányom, hogy a felhasználó helyett az auto_nodetitle generálja a címet PHP kóddal, a cím mező meg sem jelenik. Direkt úgy állítottam be az időjárást, hogy változnia kéne a címnek, de sajnos ez sem fut le, minden marad a régi. Szóval valami még hibádzik. Természetesen, ha belemegyek szerkesztéssel, és semmit nem teszek, csak rámentek, akkor minden rendben, tehát nem errefelé van a gond.

Néztem a node_save kódját az api.drupal.org-on, de nincs több paramétere, sajnos nem lettem okosabb tőle. Valakinek van ötlete?

A következő kérdésem majd az lenne, hogy mindez ráadásul a hook_cron-ból futna, ami ugye Anonymous-ként fut. Annak meg nincs joga a node_save()-re, ha jól tévedek, tehát be kéne loginoltatni a cront egy szolgálati felhasználónévvel :) Erre se találtam semmit, de ez itt off kérdés, majd nyitok neki másikat.

0
0
aboros képe

nem vagyok biztos benne, de szerintem egy ilyen esetben (erőszakolt node_save) neked kell a $node->revision értékét megadni, magától nem készül új rev. akármi is van beállítva. nézd meg jobban a node_save kódját, van benne egy ilyen rész:

...
elseif (!empty($node->revision)) {
    $node->old_vid = $node->vid;
  }
...

próbáld ki azt, hogy a node_save előtt kiíratod ezt az értéket, nem tudom ez boolean e vagy mi a bánat, azért mondom, írasd ki, aztán meglátod mi az, ha semmi, akkor próbálj megadni egy true -t neki, hátha úgy jó lesz. egy próbát megér. ;)

<?php
$node = node_load(42);
$node->revision = TRUE;
node_save($node);
?>

a hook_cron-ból futna, ami ugye Anonymous-ként fut

ez nem így van, szívás is lenne, ha így lenne, gondold csak el, kéne külön egy felhasználó, aki a 'cron' és neki kéne, hogy legyen joga mindenre?? elég sutaság lenne. a cronnak semmi köze a felhasználókhoz, se a jogosultságokhoz.

0
0

-
clear: both;

Balogh Zoltán képe

Köszi, de közben rájöttem, hogy sokkal jobb ez így, hogy cron esetén nincs új revízió. Hiszen nem módosult maga az adat, csak esetleg a kapcsolódó node-ok változása miatt megváltozott ennek a címe. De magában a tartalomban nem történik változás, így nem kell új revízió.

0
0
Balogh Zoltán képe

Ez (vagyis az eredeti probléma) még mindig nem oldódott meg.

Tehát van egy tartalom típus, be van rögzítve belőle X darab node. Később módosítja az ember a tartalom típust, hozzáad egy Viewfield típusú mezőt. Ebben az adott node-hoz tartozó lista van, természetesen minden node-ban más a tartalma. Ez a Viewfield azonban csak akkor jelenik meg a tartalomban, ha szerkesztéssel belemegyek egyesével(!) a node-okba, és mindegyikre rámentek. A node_save(node_load(X)) kevés, ettől nem jön létre a Viewfield.

Van valami ötlet esetleg?

0
0
Balogh Zoltán képe

function encyclopedia_cron() {
  $allObject = db_query("SELECT nid,type FROM {node} WHERE type IN ('affiliate','dog','kennel','membership','organization','person') ORDER BY rand() LIMIT 0,100");
  while ($currentObject = db_fetch_object($allObject)) {
    $node = node_load($currentObject->nid);
    $currentTitle = _encyclopedia_nodetitle($node);
    if($currentTitle <> $node->title) {
      watchdog('catalogue',$node->title.' => '.$currentTitle);
      $node->title = $currentTitle;
      node_save($node);
    }
  }
}

A fenti kód jól működik esetemben, nem kell login a cron-nak, simán felülvágja a rekordot Anonymousként is. Viszont egy sima node_load(), node_save() esetén gyakorlatilag nem fut le túl sok minden. Azt tapasztalom, hogy a drupal nem veszi figyelembe ilyenkor, hogy új reviziót kéne létrehoznia, holott ez van beállítva a tartalom típusnál, valamint nem nagyon futkároznak a modulok hookjai sem. Konkrétan az _encyclopedia_nodetitle($node); sort az auto_nodetitle modulnak kéne meghívnia, de ez is elmarad.

0
0
Illyés Edit képe

A fenti kód jól működik esetemben, nem kell login a cron-nak, simán felülvágja a rekordot Anonymousként is.

Amint már fent is írta aboros, ez félreértés.

Azt tapasztalom, hogy a drupal nem veszi figyelembe ilyenkor, hogy új reviziót kéne létrehoznia

Kipróbáltad, amit aboros javasolt ($node->revision = TRUE;)? Mi történt?

valamint nem nagyon futkároznak a modulok hookjai sem

A hook_nodapi() megvalósítások lefutnak, a hook_form_alter()-ek valóban nem, de ez logikus is. Az Automatic Nodetitles hook_form_alter()-rel dolgozik, ezért neked kell meghívnod a címet beállító függvényt (így első ránézésre úgy tűnik, ez az auto_nodetitle_set_title).

0
0
Balogh Zoltán képe

Kipróbáltad, amit aboros javasolt ($node->revision = TRUE;)? Mi történt?

Az a helyzet, hogy mint fentebb írtam, a revíziókkal már nincs gond, jó így, ahogy van. Azonban van egy dolog, amit nem tudok megoldani a CCK-ban.

Van mondjuk sok-sok lerögzített node, mind saját, CCK-s típus. Egyszercsak kitalálja az egyik user, hogy milyen jó lenne ebben a típusban plusz egy listát is megjeleníteni. Az adatok valóban rendelkezésre állnak, Views segítségével 5 perc alatt megvan a lista is, melynek argumentuma lesz az adott node.id. Eddig minden szép és jó, a lista működik.

Bemegy az ember a tartalomtípusba, hozzáadja a listát, mint viewfield, beállítja hogy "Force default = %nid", vagyis ez nem lesz szerkeszthető node-onként, hanem minden tartalomban az alapértelmezés szerinti listát fogja produkálni. De még eddig is minden szép és jó.

A gond csak annyi, hogy ez a lista egyik (az adott típusú) node-ban sem jelenik meg mindaddig, míg szerkesztés segítségével bele nem mászik valaki minden egyes node-ba, és csinál rá egy mentést. Semmit nem kell átírni, csak rá kell menteni egyet. És az új lista megjelenik.

Ezt szeretném kódból megoldani, vagyis cron bácsi másszon bele mindbe, mintha egy user szerkesztené, és mentsen rá helyette. 10 node-nál nem lenne gond, de ha nagyon sok van...

0
0
Balogh Zoltán képe

De miután ezt leírtam, elkezdtem ám komolyan gondolkodni is a problémámon (időben? :D). Nevezetesen, hogy hozzáadom a tartalom típushoz a viewfieldet, kiválasztok egy adott típusú node-ot, és betöltöm Dev load segítségével. Megsasolom, mi van az új mezőben (valszeg semmi). Rámentek normál módon, és ismét a Dev load fület alkalmazom. Valószínűleg más lesz az adott viewfield mező "értéke", és innentől cron bácsi feladata adott. Remélem...

0
0
Illyés Edit képe

Nem értem, mi a problémád. :)

Van egy Viewfield típusú meződ, ennek van valami neve, mondjuk 'mezoneve'. Lementesz 1 db node-ot, megnézed print_r()-ral, hogyan tárolja ennek a mezőnek az értékét – gyanítom, hogy a view nevét teszi le szöveges formában, de nem próbáltam – majd egyenként node_load()-dal behívod a node-jaidat, megadod az értéket és lemented.

<?php
$node = node_load($nid);
$node->mezoneve = 'nezetneve'; // Vagy valami más, nézd meg print_r()-ral
node_save($node);
?>
0
0