Cím generálása Auto_nodetitle modullal taxonómia alapján php kóddal

szantog képe

Adott egy tartalomtípus. Taxonómia: Irányítószám meghatározza a várost, az meghatározza az utcát. + 3 mező: Házszám, Emelet, Ajtó.
Feladat: Legyen a node cím Irányítószám, Város Utca Házszám Emelet Ajtó

1. Megoldás tokenekkel: Hierarchical Select modullal választom ki a taxonómia értékeit, amihez Token is tartozik: [save-lineage-termpath], ez a leírás szerint nekem tökéletes lenne. Azonban az auto_nodetitle - ha jól vettem ki a fejlesztői oldalon - néhány tokennel nincs túl jóban, különösen ami a taxonómiát illeti. + Nem épp a legszebb címformátumot hozza ki a 1111/Budapest/ABC utca/27

1/a. "Tartalom taxonómia mezők" típusú CCK mezők hozzáadása tartalomtípushoz. Ezeket már használtam automata címgenerálásra, szépen működnek a Tokenek. Viszont így a Hierarchical Selectet kell kikapcsolnom, amit bevallom, nagyon megszerettem.
Eszembe jutott olyan megoldás is, hogy a taxonómia CCK mezőket elrejtem, és Javascripttel töltöm fel, amikor a Hierarchical Select változik. Ezt azért vetettem el, mert épp eléggé bele tudok kavarodni most most a Drupal + php-be, nem hiányzik, hogy még Java, netán Ajax is bonyolítsa az életemet.

2. Az automatic_nodetitle rendelkezik egy Evaluate PHP in pattern checkbox-szal. Szóval ide írva a php kódot vidáman tudom úgy alakítani a címet, ahogy szeretném.
Nézzük a ReadMe-ben szereplő példát:  return "Author: $node->name"; Tökéletes, de nekem nem az kell.
 return "Author: $node->terms"; Itt semmi. Hupsz, a terms ugye egy tömb, nyilván nem lehet csak úgy pikk pakk hivatkozni rá.
Keresés a megfelelő szintakszis/változó után: http://drupal.hu/forum/automatic-nodetitles-taxonomy-alapj%C3%A1n#comments
Az itt leírt megoldás lehet, hogy jó, de modulíráshoz még elég kicsinek érzem magam, minden esetre Ctrl+D - jó lesz későbbre. Viszont a kiinduló hozzászólásból el tudtam kezdeni barkácsolni a kódon:
 return "$node->taxonomy[1]"; , na ez sem jött be
 return "$node->taxonomy AS $term[1]"; persze ez sem, és még sok más próbálkozás.
Ebből rájöttem, hogy abszolút nem értem ezeknek a változóknak a szerkezetét. Nyilván ha $node tömb, akkor a taxonomy ennek a tömbnek a része. Egyáltalán le lehet írni egy mondatban ezt a sort: $node->taxonomy AS $term[1]?
És persze hogyan kapom vissza a node 3 darab taxonómia értékének egyikét?

A végére egy kis rizsa, hogy is kérdezek ilyeneket:
Másfél hónap Drupal nyúzás (kismillió modulinstall, uninstall, manuális táblatörölgetés, Drupal háromszori tönkretevése) után eljutottam idáig, hogy kérdezni merek. :) Jobbára szeretek mindent magamtól megoldani, még ha 3 napig is tart, hogy egy node beviteli form két mezőjét egymás mellé tudjam pakolni CSS babrálással.
Az angollal viszonylag megvagyok, viszont a drupal.org-on nehezen birkózok a szakmai nyelvvel. A php számomra a VB és a Delphi használata után olyan vadidegen, hogy nagyon nehezen áll át az agyam a szintaktikára is, a programozás struktúrája egyelőre szinte követhetetlen számomra.
Ezt azért írtam le, mert a kérdéseimben jórészt ezt a homályt is szeretném oszlatni, ezért mindig leírom azt, hogy milyen logika alapján jutottam el odáig, ameddig eljutottam. Így nem csak a végeredmény érdekel, hanem arra is, hogy egyáltalán jól indultam el a probléma megoldásában.

Drupal verzió: 
pp képe

Devel modul felrak és bekapcsol. Ekkor minden node-nál lesz egy Dev load fülecske erre kattantva megnézheted a $node objektum felépítését. Amire figyelj, hogy Object-nél -> használj Array-nél [] (de ez talán még a delphiben is így van)
Van egy jó kis könyv a C programozási nyelvről Brian W. Kernighan és Dennis M. Ritchie írta. Azt szerezd be és olvasd el. Vékonyka és a szintaxis szinte ugyan olyan a PHP, C, C++, JavaScript, Java stb. nyelvekben, legalábbis az alapvető vezérlési szerkezetek tekintetében. Ha már programozással szeretnél foglalkozni szerintem nem árt, ha megismerkedsz a C nyelvvel.

pp

0
0
szantog képe

Először szerencsétlenkedtem. Kódírás > tartalomtípus mentése > update automatic nodetitles, majd elölről az egész milliószor.
Milyen jó lenne önállóan próbálgatni a kódot! A Devel modul régen megvan, az Execute PHP Code-al már próbálkoztam máskor, 0 sikerrel. Ekkor találtam rá a fórumon a kulcsszóra:
$node = node_load(valahanyasnode-om) ;
Onnan ment, mint a karikacsapás, ez lett a vége:

>
$szaml = 0 ;
foreach ($node->taxonomy AS $term) 
{
  ++$szaml ;
  if ($szaml == 1) print $term->name .", "; 
  elseif ($szaml == 4) print"" ;
  else 
  print $term->name ." " ;
}
print '[field_kozig_cim_hazszam-raw]'. " " ;
print '[field_kozig_cim_emelet-raw]'  ." ";
print '[field_kozig_cim_ajto-raw]' . " ";

Azt hiszem, értem is a kódot: foreach dolga, hogy a teljes tömböt feldolgozza elejétől végéig. A {} között van az, amit minden elemen el fog végezni. A $node objektum taxonomy tömbjét hozzárendeljük a $term saját változónkhoz, és mivel a taxonomy elemei objektumok, ezért a $term->objektumváltozóneve szintakszissal tudunk hivatkozni rá. (Ezt csak úgy magamnak írtam, hogy ne felejtsem el. :))

Itthon a PHP Haladóknak Fekete könyv van, azért az alapok is elég érthetően le vannak írva.

0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

szantog képe

Azaz maga a kód jó, csak némi szervezési hibával szembesültem.
Mivel Mentés előtt még nincs taxonómia, így csak az update automatic nodetitles esetén működik a mutatvány.

Kicsit belenéztem a modulba, és a következőre jöttem rá:
Ez végzi az update-et.

function auto_nodetitle_operations_update($nodes) {
  foreach ($nodes as $nid) {
    $node = node_load($nid);
    if ($node && auto_nodetitle_is_needed($node)) {
      $previous_title = $node->title;
      auto_nodetitle_set_title($node);
      // Only save if the title has actually changed.
      if ($node->title != $previous_title) {
        node_save($node);
      }
    }
  }
}

Van a form_alter rész, és annak ez az utolsó sora:
      $form['#submit'][] = 'auto_nodetitle_node_form_submit';

Kipróbáltam, hogy ezután beszúrom:
auto_nodetitle_operations_update($node->$nid) ;

Egyáltalán végrehajtódik-e a függvény? Ha igen, jól paraméterezem?

Ha nem, akkor hogyan szedhetném ki a legördülő menük tartalmát még mentés előtt

0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

szantog képe

Egy fantasztikus új modul: http://drupal.org/project/rules
Ez gyakorlatilag a triggerek kibővítése. Egyfelől kibővült az így kezelhető események sora, másrészt baromi összetett feltételrendszert lehet vele kialakítani.
Az előre definiált szabályokon túl pedig saját php is futtatható.

Az én esetemben a veszett bonyolult kód "Content is going be viewed" eseményhez rendelten:
auto_nodetitle_set_title($node);
node_save($node);

Így már szépen bele tudja tenni a taxonómiát a generált címbe.

0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

Pasqualle képe

mindig amikor valaki meg akar nezni egy node-ot akkor ujra lemented azt? szerinted ez igy jo?

0
0
szantog képe

De leginkább annak örültem, hogy sikerült megoldani a feladatot.
Todo listben benne, van, hogy foglalkozzak vele, de átmeneti megoldásnak azért tartottam jónak mert a tartalom beküldése után ez a node önmagában nem jelenik meg, csak views-al.
Ha jól gondolom ez az esemény akkor már nem következik be, de ezt leellenőrzöm, hogyha odáig jutok.

0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

drgyz képe

A cél: 1111 Budapest, ABC utca 27.

<?php
$token = '[field_taxonomia-terms-raw]';
 
$token = preg_replace("|(.+)/(.+)/(.+)/(.+)|", "\\1 \\2, \\3 \\4.", $token);
 
if (empty($token))
	{
	return '[field_taxonomia-terms]';
	}
else
	{
	return $token;
	} 
?>
0
0