page.tpl be view

errata képe

Sziasztok!

A következő kérdésem lenne szeretnék 1 view kimenetét pl blockot a page.tpl -be belerakni úgy hogy tudjam paraméterezni (megadni az argumentumokat), ezt hogyan tudom megvalósítani kerestem de nem találtam releváns írást?

Amit szeretnék elérni hogy bizonyos tartalom típusokhoz rendelek 1-1 node-t ami ott jelenik meg lehet ezt máshogy is csinálni?
eddig úgy álltam neki hogy csináltam egy info-box tartalmat a többi mellé ami taxanomiával kijelölöm melyik tartalom típus összes nodja mellet jelenjen meg, és ezt view-al előszedem és argumentumban menne a taxanomy term ami a tartalom típus neve.
Van ennél jobb megoldás?

válaszokat előre is köszönöm
Péter

Drupal verzió: 
szantog képe

"Amit szeretnék elérni hogy bizonyos tartalom típusokhoz rendelek 1-1 node-t ami ott jelenik meg lehet ezt máshogy is csinálni?"
Ha ez a cél, akkor az csak egy node_reference mező, és tartalomtípusonként beállítani egy alapértelmezett értéket.

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.

aboros képe

Amit szeretnék elérni hogy bizonyos tartalom típusokhoz rendelek 1-1 node-t ami ott jelenik meg lehet ezt máshogy is csinálni?

akkor átgondolnám azt, hogy hány tartalom típusom is van? 4? 6? 24? :) milyen gyakran változik (2nap? 1hét? 3hónap? soha?;) ez a leírás és kik, milyen csoport hányan kell, hogy tudják a leírást szerkeszteni?

a legegyszerűbb eset, hogy kevés típusod van, ritkán változik, senki nem szerkeszti csak te vagy aki szerkeszti nem csinál butaságot és megért egy három klikkes művelet.

ebben az esetben blokkokat hozok létre mindegyik leírás számára, belerakom a szöveget, embert megtanitom nézd ide kattints, akkor tudod szerkeszteni azt. (a sminkben szépen úgy is van edit link ha hoverel a jóember)

mindegyik ilyen blokkot berakom egy régióba amit esetleg spec ezeknek csinálok (mert collapsible lesz vagy mittudomén) és mindegyiket egy kis egyszerű php snippet irányítja. láthatósági szabály php kód (kell hozzá az alaprendszer része php modul vigyázz) és:

if (arg(1) == 'node' && is_numeric(arg(2))) {
  $node = node_load(arg(2)); //megszereztuk a node
  if ($node->type == 'story') {
    //ha ez a 'story' tipus leirasa blokk, akkor ez jelenjen meg
    return TRUE;
  }
} else {
  return FALSE;
}

ezt szépen bemásolom a csodálatos vágólap segítségével rendre a leírás blokkok láthatósági kódjába és értelem szerűen a 'story' részt mindenhol kicserélem elegánsan az ujjajjjimmal arra amelyiknek éppen az a leírása. (tömör, rövid mondat;)

ha bonyolultabb a helyzet, akkor esetleg érdemes tartalom típust erre létrehozni. egy nézet kell, ami blokkot jelenít meg. szűr a leírás típusra, argumentumként egy tartalom típust vár. ha nincs argumentum, ad egyet... áh, inkább összekattintom, kattintás közbe tudom iszogatni az esti söröm gépelés közbe meg nem.. vákicsi

0
0

-
clear: both;

aboros képe

vázoltam itt egy másik megoldást, csatolva is van a nézet exportja.

0
0

-
clear: both;

errata képe

nagyon köszönöm a tutoriált ezen elindulva sikerült amit szerettem volna :)
sajnos nem fogalmaztam 1értelműen szóval 1-2 dolgot még bele kellet raknom, ezeket leírom hátha még kelleni fog valakinek:

az info_box-ba kicsit átírtam a php-t ez csak ilyen egyéni dolog:

$node_types = node_get_types();
unset($node_types['info_box']);
unset($node_types['panel']);
unset($node_types['page']);
unset($node_types['story']);
$allowed = array();
 
$allowed["evrywhere"] = "Mindenhol";
 
foreach ($node_types as $machine_name => $type_obj) {
    $allowed[$machine_name] = $type_obj->name;
}
return $allowed;

nekem így átláthatóbb, és hozzáfűztem 1 mindenhol megjelenést is, illetve nem vizsgál minden ciklusban egy feltételt a kód...

na de jön a view paraméter kódja :)

if ((arg(0) == 'node' && is_numeric(arg(1)))) {
  $node = node_load(arg(1));
  return $node->type;
} else {
  foreach (views_get_all_views() as $name => $obj) {
    foreach ($obj->display as $display_name => $display_obj) {
        if(isset($display_obj->display_options['path']) && arg(0) == $display_obj->display_options['path']) {
            return str_replace('_prew', '', $obj->name);
            break;
        }
    }
  }   
}

nekem még voltak view-aim is amiknek a [node-type]_prew volt a neve és ott is meg kellet jelenítenem nem tudom hogy szép-e a megoldás amit csináltam de az egyszerű megoldások sehogy se akartak működni :(
szóval a lényeggel meg is vagyok köszön a segítséget.
Már csak 1 dolog van hátra ha a paraméter alapján nincs találat akkor 1 alapértelmezett info box-ot jelenítsen meg (ez lenne az everywhere), ennek a kérdésemnek nyissak új fórum témát vagy felesleges? remélem rájövök a megoldásra de ha valaki gyorsabb nálam ne habozzon írja meg nyugodtan :)

köszi még egyszer
Péter

0
0
aboros képe

a nézet beállításainál a basic settings részben van ilyen, hogy "empty text". oda írjad az alapértelmezett info boxot és az argumentum validálásnál mondjad meg, hogy ha nem valid az argumentum, akkor display empty text.

így átalakítva már igen kacifántosnak tűnik, persze hogy mást javasoljak ahhoz a követelményt kéne tudnom. lehetőleg úgy megfogalmazva, hogy a 'node' meg 'view' meg 'cck' meg ilyen szavak egyszer sem szerepelnek benne. :)

csinálhatnád például azt is, hogy a [node-type]_prew nézeteid gondolom egy-egy page megjelenítőt adnak valamilyen útvonalon. na, ezeket én _egy_ nézettel oldanám meg, valahogy úgy, hogy a node:type lenne az argumentum és az útvonal pedig a teasers/% ... tehát pl a story teaserek a 'teasers/story' útvonalon lennének. ha kell, kézzel adok ezeknek álnevet. (az álnév az arg() fgv működését nem befolyásolja ugye)

ezáltal az info_box view argumentum kezelő kódja:

if (arg(0) == 'node' && is_numeric(arg(1))) {
  $node = node_load(arg(1));
  return $node->type;
} else if (arg(0) == 'teasers') {
  return arg(1);
} else {
  return FALSE;
}

és nem kell minden oldalbetöltéskor betölteni _minden_ nézetet és az _összesen_ végigiterálni és sztinget vagdosni meg miegymás.. :) (a foreachen beluli iffel meg problemad volt, de minden page loadnal egy views_get_all_views() az nem gond.. raadasul teljesen feleslegesen csinalod, gondold mar el, minden oldalletolteskor betoltesz minden nezetet es mindig vegigiteralsz mindegyik nezet mindegyik displayen, amig meg nem leled a magaded.. inkabb szaz if akkor a foreachembe:)

0
0

-
clear: both;

errata képe

az ötlet nagyon jó, és tényleg erőforrás spóroló, de sajnos az egyes view-ok teljesen más cck-mezőket használnak és máshogy is jelenek meg, talán több page megjelenés 1 view megoldás lehetne, de sajnos az seo szempontból nem az igazi, mert igaz az én hibámból, de a belső neveik a node-type-oknak angolul vannak (megszokás hogy változok nálam mindig angolul vannak) de az url meg magyarul...

szerk: mégis csak jó path aliasal megvan a seo és az arg() -ot nem zavarja össze szóval ez tökéletes :)

másik (talán káros) megszokásom, hogy nem teszem fel a konkrét problémát 1-az 1-ben mert a legtöbb fórumon mindig ez a választ kapják akik ezt megteszik: "na konkrét kód-ot kérj, hanem mond miben akadtál el és abban segítünk" szóval itt is ebből indultam ki :)

a foreach-if és az én örült erőforrásos igényes feltételem-re meg hát csak annyit tudok mondani, ahogy fentebb is írtam több megfontolás miatt vettem ki az if-et illetve mivel a 2 php kód teljesen máshol helyezkedik el így sajnos nem tudok spórolni azzal ha 100if-t teszek a foreach-be a másik oldalon ahol a view van :( (természetesen ismerem a mikro-optimalizálásban rejlő veszélyeket, de ez itt úgy érzem nem áll fent) és igen a sajátommal is bajom van :D csak hát arra nem tudok jobbat. (valószínűleg az én drupal-ban való járatlanságom miatt, ezt aláírom)

szerk: de legalább ez is megoldódott

az empty text-es megoldást pedig nagyon köszönöm, és tökéletes is lenne, de az ügyfélnek nem merem oda tenni a view-ot hogy szerkessze, és csak textarea mezőt enged, pedig nekem az everywhere field_ct-s mezők kellenének... szóval még ez is agyalás kérdése...

0
0
errata képe

empty textbe php kód és minden müxik rendesen:)

<?php
$view = views_get_view('info_box_view');
$view->set_display('block_1');
$view->set_arguments(array('evrywhere'));
print ($view->render());
?>
0
0
errata képe

az info_box-ban ki kel kapcsolni a peger-t (paginátort) mert a view-ban ha lépünk a köv oldalra az info_box azt hiszi rá is vonatkozik a pager, és empty-textet kap megint és végtelen ciklusba fut...

0
0