Node és taxonomy term felvitele kódból

MrPrise képe

Az 5.1-es Drupal alá szeretnék importálni dolgokat (HTML táblázatból adatok), amelyeket már az alábbi formára hoztam (XSL-lel):

AddNewNode("node title","field1","field2","tax1","tax2","taxn");

Már "csak" a fenti fv-t kellene megírnom ;-) Ennek az lenne a feladata, hogy egy új node-t rögzítsen a rendszerbe (ami egy saját típus, tehát csak azt kell kezelnie) a megadott névvel és mezőkkel, valamint a felsorolt taxonomy termeket is hozzárendeli, ha nincs még ilyen term, akkor létrehozza. A termek egy taxvoc-ban vannak. Ehhez keresgéltem példakódot a drupal.org-on, még nem találtam. Van valakinek vmi kis példakódja? Hogy tudok node-t kódból felvinni ill hogy tudom megnézni van-e már egy term, ill hogy tudok termet felvinni?
Máshogy megfogalmazva, hogy tudom kódból szimulálni a kitöltött node készítő formot és az elküldését?

Köszi!

Hojtsy Gábor képe

Ajánlom a node_save függvényt kiindulásnak.

0
0
Illyés Edit képe

Pont ma néztem ezt a kis drágát (node_save), de nem tudtam rajta kiigazodni. Végül egy sima php szkripttel rámoltam be az "esemény" rekordokat az adatbázisba: node, event, node_comment_statistics, node_revision, term_node és a sequences tábla nid értékének korrigálása. Remélem, nem hagytam ki semmit...:)

Mindenesetre ha valaki talál gyakorlati példát node_save alkalmazására, legyen szíves ossza meg velünk.

0
0
pp képe

4.7-ben kb így volt.

require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
global $user;
//belép az adminisztrátor, ez akkor nem kell, ha bejelenetkezünk a szájton és a session-ban már benne van egy bejelentkezett felhasználó
$user=user_load(array('pass' => 'jelszó','name' => 'admin'));
 
//ciklus
//foreach(){
 
unset($node);
//feltöltjük adatokkal
   $node->type = 'típus';
    $node->uid = 1;
    $node->status = 1;
    $node->created = time();
    $node->promote = 0;
    $node->moderate = 0;
    $node->changed = time();
    $node->sticky = 0;
    $node->format = 3;
    $node->author = 'Admin';
    $node->title='Cím';
    $node->body='Tartalmi rész';
 //plusz adatok
  $node->nemutdommi = '';
 
//a node save majd jól meghívogatja a megfelelő hook-okat
 
node_save($node);
// $node->nid tartalmazza a frissen létrehozott node id-jét/ját (ájdíját ;))
 
//$taxonomy_name változó tartalmazza a szótár nevét
$terms = taxonomy_get_term_by_name($taxonomy_name);
// mindig egy tömböt kapunk vissza, ami tartalmazza a szavaknak megfelelő kifejezések teljes lenyomatát(tid, vid, pid stb) Ha nincs akkor egy üres tömböt, ha van akkor annyit ahány van. A példában felévtelezzük, hogy csak egy van. Vagyis az első megtalált term-hez fogja rendelni a "program" a node-ot
 
if(!count($terms)){
 unset($edit); // no nem az az edit ;))
// nincs ilyen term létre kell hozni
  $edit['name'] = $taxonomy_name;
  $edit['description'] = 'ide jön a leírás';
  $edit['vid'] = 1; //ez a szótár azonosítója, legegyszerűbb létrehozni és megnézni mi az azonosító
  $edit['weight'] = 0;
// parent és relations is tölthető itt ;)
 taxonomy_save_term($edit);
 $tid = $edit['tid'];
}else{
  //nem kezeljük azt az esetet, ha több azonos nevű taxonomy van már az adatbázisban.
 $tid = $terms[0]['tid'];
}
 
taxonomy_node_save($node->nid, array($tid));
//ciklus vége
// }

nem próbáltam, de kb jó ;)

0
0
blast_art képe

Ez nagyon jó volt, köszi!
Kéne még sok ilyen.

0
0

blast

Illyés Edit képe

MrPrise-nak valami CCK-s színezetű problémája van, nekem Event-es volt. Az a $node->nemtudommi lehet contrib modul által meghatározott mező is? Nekem úgy tűnt, hogy nem, de lehet, hogy nem látok a szememtől...

Már nem először néztem ezt a node_save()-et, de pár perc után mindig feladtam és maradtam a sima mysql_query() megoldásnál, mert olyan még sose volt, hogy valami zűr ne lett volna. Például most amerikai szerveren közép-európai időre beállított Drupal — Amerikában a nyári időszámítás eddig április első vasárnapjától október utolsó vasárnapjáig tartott, 2007-től március második vasárnapjától november első vasárnapjáig, Európában március utolsó vasárnapjától október utolsó vasárnapjáig — ettől az Event modul kissé kiakadt :) meg én is :), és nagyon figyelni kellett, hogy mikor mit csinál a ciklus. A Drupal függvények használata (számomra) teljesen áttekinthetetlenné tette volna a programot.

0
0
pp képe

A node_save szépen végighívja az összes nodeapi hook-ot, a form_alter-es megoldásokkal nem tudom mit csinál. gyanítom ott elhasal. Tehát ha a modul nodeapi-n keresztül működik akkor ez a megoldás jó, ha form alterrel akkor nem.
Sem a cck, sem az event modult nem ismerem ilyen mélységig. Eddig csak saját moduloknál/tartalom típusoknál volt szükségem erre, főleg előző adatok migrációja miatt.
a nemtudommi azért nem tudom mi, mert ott az egyes tartalom típusoknál jellemző adat kell, hogy belekerüljön. (valamikor majd belekukkantok az eventbe, de az se ma lesz...)

pp
(bocs, de a második mondatod nem tudtam feldolgozni, a szemantikus értelmezőm kiakadt.) ;)

0
0
Illyés Edit képe

Az a $node->nemtudommi lehet contrib modul által meghatározott mező is?

Erre a mondatra gondoltál? Az Event modul event táblájának event_start, event_end, timezone mezőjére vonatkozott. Mert ha ez menne, az szuper lenne:

    $node->type = 'event';
    $node->uid = 1;
    $node->status = 1;
    $node->created = time();
    $node->promote = 0;
    $node->moderate = 0;
    $node->changed = time();
    $node->sticky = 0;
    $node->format = 3;
    $node->author = 'Admin';
    $node->title='Cím';
    $node->body='Tartalmi rész';
//plusz adatok
    $node->event_start = 1345678899;
    $node->event_end = 1342536364;
    $node->timezone = 314

De szerintem nem megy.

P.s.: Pedig nodeapi.

P.p.s.: Úgy tűnik, bug volt. Frissítettem a legfrissebb verzióra és most ha jól látom megy.

0
0
pp képe

nem mondat, hanem bekezdés...

0
0
Anonymous képe

Nekem is hasonlo gondom van és mar teljesen gubanc a kod (es persze nem azt csinalja amit szeretnek), lehetne egy egyszeru peldat erre a mysql_query megoldasra? JS-ben benne vagyok de nem ismerem a PHP-t, meg hogy mit hova kell menteni a Drupal adatbazisban. Köszi.

0
0
Illyés Edit képe

A tartalmat tömbbe rendezed, megnyitsz egy kapcsolatot az adatbázis felé, foreach ciklussal végiglépegetsz a tömbön, és beírod az értékeket az adatbázis táblákba:

// Node létrehozása
$sql = "INSERT into node (nid, vid, type, title, uid, status, created, changed, comment, promote, moderate, sticky) VALUES ($nid, $nid, 'tartalomtipus', '$cim', 2, 1, $most, $most, 0, 0, 0, 0)";
mysql_query($sql, $kapcsolat);
 
// Node comment statistics
$sql = "INSERT into node_comment_statistics (nid, last_comment_timestamp, last_comment_name, last_comment_uid, comment_count) VALUES ($nid, $most, NULL, 2, 0)";
mysql_query($sql, $kapcsolat);
 
// Node revisions
$sql = "INSERT into node_revisions (nid, vid, uid, title, body, teaser, log, timestamp, format) VALUES ($nid, $nid, 2, '$cim', '$szoveg', '', '', $most, 3)";
mysql_query($sql, $kapcsolat);

Tömbbe rendezés, adatbázis kapcsolat megnyitása, (karakter-kódolási problémák), foreach ciklus, időbélyeg ($most) lekérdezése : Weblabor fórum.

0
0
pp képe

Bocs Edit, de ezt inkább ne javasoljuk egy kezdőnek ;)

- a node-ot így nem lehet felvenni, mert a sequences tábla nem frissül.
- nem hajtódnak végre a bekapcsolt modulok spec funkciói amiben ugye van node-api
- Nem alapértelmezett node típust így nem lehet létrehozni
- mi van, ha tábla prefixet használ? akkor ez a kód nem fog működni
- nem véletlenül van db_query ha már hekkerkedünk ;)
- mi van akkor ha a $cim így néz ki: I'm ready -> megfekszik a legkérdezés http://hu.php.net/mysql_real_escape_string
- nem véletlenül van db_query ha már hekkerkedünk ;)

Mivel itt arról van szó, hogy emberünk instant megoldást keres és nem szeretné (most) megtanulni a PHP-t ezért bátorkodom szólni, hogy az én általam javasolt megoldást használja, bár tudom, hogy isszonyú bonyolultnak tűnik. (nekem is kerekedett a szemem amikor megláttam, elkellene rá egy kódszépítő ;))
Amennyiben tanulásról lenne szó természetesen jó megoldás lenne. Többek között én is így tanítok, hogy olyan kóddal kezdünk ami működik és sorra fedezzük fel benne a hibákat. (önállóan vagy kis segítséggel) Mivel a tanulás folyamata az első, ezeket a hibás kódokat aztán szépen kikukázzuk és mosolygunk egyet rajta közösen, hogy hát igen... a kedző szerencséje, hogy működtek egyáltalán. Belátjuk mennyire nem érdemes ilyen úton elindulni egy fejlesztés során.

Kezdetben én is adatbázisba nyúlkáltam közvetlenül, aztán rájöttem, hogy mennyire nem jó szemlélettel közelítettem meg a dolgot. A Drupal-nak van egy csodálatos API felülete ami nem utolsó sorban nagyon szépen van dokumentálva.
Viszonylag könnyen lehet benne keresni, hisz az adott modulhoz kapcsolódó fügvények mindig az adott modul nevével kezdődnek(node_, taxonomy_), a drupal core függvények pedig.. na gyerekek ki tudja megmondani? .. igen, igen "drupal_" szóval kezdődnek.

Talán nem tűnik önfényezésnek, hogy a fent vázolt feladatból a kategória létrehozását még sose csináltam, kizárólag a kézikönyv alapján írtam a kódot mindenfajta tesztelés nélkül. Most vagy én vagyok király vagy a leírás nagyon jó. ;)

pp

0
0
Illyés Edit képe

A kérdés azza kezdődött, hogy mi van akkor, ha nem akarja az API-t használni. Hogy miért nem, az az ő dolga (lentebb meg is indokolja).

Pont azért nem másoltam be teljes működő kódot, hogy ne lehessen ész/gondolkodás nélkül ráereszteni az adatbázisra.

0
0
Anonymous képe

Koszi sikerult. 9015 node megvan :))

@pp:

Csak egy kis utjelzot akartam hogy megis merre induljak, erre jo volt.

Edit korabban irta, hogy a sequencest javitani kell. Csak nid-et irta de magamtol is rajottem hogy a revision_videt is kell.

A foreachen belul 14 helyen kellett if-et, belso fort vagy foreachet hasznalni. Az API biztos szep es jo de olyan gubanc lett belole hogy a vegen nem tudtam a sajat kodomban kiigazodni.

Koszi mindenkinek megegyszer.

baangyuri

0
0
MrPrise képe

Na, most jutottam idáig, hogy ezt kipróbáljam. Örömmel tapasztaltam, hogy működik 5.1-gyel is! Köszönöm szépen!
Szerk. Most próbáltam a taxonomy részt is. A fenti példában engem félrevezetett a taxonomy_name változó. Pontosabban a megjegyzés felette, miszerint az a szótár neve, pedig az maga a term.

0
0
MrPrise képe

Több termet is szeretnék megadni egy-egy node-hoz. A fenti kódból kiszedtem a term megadása részt, viszont ha ezt többször hajtom végre, akkor mindig csak az utolsó term marad meg a node-nál. Hogy tudom ezt megoldani?

0
0
MrPrise képe

Közben úgy néz ki megtaláltam a megoldást:

function AddNewTerm($node,$newterms)
{
	$tid=array();
	foreach ($newterms as $vid=>$newterm)
	{
		//$taxonomy_name változó tartalmazza a szótár nevét
		$terms = taxonomy_get_term_by_name($newterm);
		// mindig egy tömböt kapunk vissza, ami tartalmazza a szavaknak megfelelő kifejezések teljes lenyomatát(tid, vid, pid stb) Ha nincs akkor egy üres tömböt, ha van akkor annyit ahány van. A példában felévtelezzük, hogy csak egy van. Vagyis az első megtalált term-hez fogja rendelni a "program" a node-ot
 
		if(!count($terms)) 
		{
			unset($edit); // no nem az az edit ;))
			// nincs ilyen term létre kell hozni
  		$edit['name'] = $newterm;
  		//$edit['description'] = 'nincs tax description';
  		$edit['vid'] = $vid; //ez a szótár azonosítója, legegyszerűbb létrehozni és megnézni mi az azonosító
  		$edit['weight'] = 0;
			// parent és relations is tölthető itt ;)
			taxonomy_save_term($edit);
			$tid = $edit['tid'];
		}
		else
		{
  		//nem kezeljük azt az esetet, ha több azonos nevű taxonomy van már az adatbázisban.
   		//$tid = $terms[0]['tid'];
			$tid[]=$terms[0]->tid;
		}
	}
	taxonomy_node_save($node->nid, $tid);
}

Használata (a node_save() után kell hívni):

// A számok az egyes category-k id-jai (vid), a változók pedig a termek nevei
$myterms=array(1=>$category,3=>$publisher,2=>$published);
 
AddNewTerm($node,$myterms);
0
0