Views Content Type

twixzor képe

Sziasztok!

Egy olyan kérdéssel fordulnék hozzátok, hogyan lehet azt megoldani, hogy van egy block amit a views modulal hoztam létre, ez az összes oldal alján látható és azt szeretném, hogy ennek a blocknak a tartalma az oldal tartalom típusától változzon.
Szóval van nekem kb 5-6 tartalom típusom és az azokkal létrehozott nodeok és ha Én a "2"-es tartalom típusú nodeon vagyok akkor megmutassa a block a "2"-es tartalom típusú nodeokat.

Előre is köszönöm a válaszokat!

Üdv,
András

Drupal verzió: 
Fórum: 
nevergone képe

Szia!

Sajnos most nem lesz lehetőségem részletesebb howto-t elkészíteni (bár eléggé adja magát a kérdésed), de én két irányt látok:

  1. Context modul: Emlékeim szerint blokkcsoportokat definiálhatsz és azokra mondhatsz kiválasztási szabályt.
  2. Page manager (Ctools része), összeraksz egy oldalt, Panelssel berakod a blokkokat, majd Viewsben nem blokkokat csinálsz, hanem nézettáblát (views_content modul), abban tudsz szűrni arra, hogy éppen milyen típusú tartalom látható.

Én biztosan a másodikkal mennék neki, az több lehetőséget ad, de macerásabb is.

1
0
twixzor képe

Köszönöm szépen! Holnap meg is nézem őket aztán írom, hogy mire jutottam.

0
0
balazsgabi képe

Ha már a Views-zal kezdtél neki, akkor talán egyszerűbb ott megoldani.

Szűröd azokat a tartalomtípusokat amikről szó van, majd minden tartalom típusnak csinálsz egy oldal display-t (path=node/%) ahol a szövegkörnyezetiben még egy szűrést beteszel de ott már csak egy-egy tartalomtípus szerint. Érvényesítési feltétel -> Tartalom -> (adott)tartalomtípus -> szűrőérték: Node ID. Így mindig azokat a tartalmakat fogja kilistázni amelyek "rokonai" az adott node-nak.

2
-1
aboros képe

a nézeted tartalmakat listáz, nem szűr tartalom típusra. közzétettre azért érdemes szűrni így is. egy contextual filtert használ, content: type. provide default value -ra van állítva és php code. máshogy tisztán views modullal nem megy, kivéve persze ha csinálsz annyi nézetet ahány tartalom típusod van és valahogy bevuduzod, hogy mindig csak egyik blokk jelenjen meg (pl a validálós trükkel amit már írtak)

esetleg azt is lehetne még, hogy pathauto modullal olyan útvonal álneveket generálsz a nodeoknak, hogy szerepeljen benne a tartalom típusuk neve, article, news, event, akármi és akkor azt eszi majd meg a contextual filter és akkor nem is kell php kód, simán visszadhatod az útvonal egy részét direktbe.

itt egy ilyen nézet lent, importáld be és nézd meg hogyan működik. persze nem igazán szép és elegáns, mert php kód van benne, ezt nem szoktuk szeretni. page manager modullal könnyű lenne mindig az adott node típusát átadni a contextual filternek, php kód nélkül, de akkor ahhoz kéne még panels modul is, ráadásul ha ezt sidebarba akarod, akkor az külön macera lesz. persze érdemes ismerkedni a lehetőségekkel azért, ha van időd.

szóval a nézet:

$view = new view();
$view->name = 'same_content_type';
$view->description = 'Displays nodes of the same type on node pages in a block.';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'Same content type';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
 
/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'Nodes of same type';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'some';
$handler->display->display_options['pager']['options']['items_per_page'] = '5';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* No results behavior: Global: Text area */
$handler->display->display_options['empty']['area']['id'] = 'area';
$handler->display->display_options['empty']['area']['table'] = 'views';
$handler->display->display_options['empty']['area']['field'] = 'area';
$handler->display->display_options['empty']['area']['empty'] = TRUE;
$handler->display->display_options['empty']['area']['content'] = 'No results.';
$handler->display->display_options['empty']['area']['format'] = 'filtered_html';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = '';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Field: Content: Type */
$handler->display->display_options['fields']['type']['id'] = 'type';
$handler->display->display_options['fields']['type']['table'] = 'node';
$handler->display->display_options['fields']['type']['field'] = 'type';
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Contextual filter: Content: Type */
$handler->display->display_options['arguments']['type']['id'] = 'type';
$handler->display->display_options['arguments']['type']['table'] = 'node';
$handler->display->display_options['arguments']['type']['field'] = 'type';
$handler->display->display_options['arguments']['type']['default_action'] = 'default';
$handler->display->display_options['arguments']['type']['title_enable'] = TRUE;
$handler->display->display_options['arguments']['type']['title'] = '%1 nodes';
$handler->display->display_options['arguments']['type']['default_argument_type'] = 'php';
$handler->display->display_options['arguments']['type']['default_argument_options']['code'] = '$node = menu_get_object();
return $node->type;';
$handler->display->display_options['arguments']['type']['summary']['number_of_records'] = '0';
$handler->display->display_options['arguments']['type']['summary']['format'] = 'default_summary';
$handler->display->display_options['arguments']['type']['summary_options']['items_per_page'] = '25';
$handler->display->display_options['arguments']['type']['limit'] = '0';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
 
/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block');
1
-2

-
clear: both;

twixzor képe

Köszönöm a válaszokat, javaslatokat!

Ezt a hibakódot adta minden oldalra amikor beinportáltalm a blockot:
Notice: Trying to get property of non-object eval() függvényben (C:\path\to\drupal\sites\all\modules\views\plugins\views_plugin_argument_default_php.inc(53) : eval()'d code 2 sor).

Végülis arra az elhatározásra jutottam, hogy kézzel fogom megírni az oldalt, így Nekem egyszerűbb meg gyorsabb is. Drupalt még annyira mélyen nem ismerem és így több korlátot látok mint a saját kódomban.

De amint lesz időm, ezeket kifogom próbálgatni és amint sikerűl írom is ide.

0
0
balazsgabi képe

elsőre úgy tűnt ez egyszerű, de rá kellet jönnöm, hogy nem annyira. Amit javasoltam fentebb az nem jó (nekem aboros nézete sem működik, de lehet én bénázok valamit. Unknown content type nodes az eredménye)

Egy botos és nem túl elegáns megoldásnak azt tudom elképzelni, hogy minden egyes tartalomtípusnak készítesz egy blokkot melyben csak az adott típust szűröd és ezt a blokkot csak adott CT alatt teszed láthatóvá. Ezzel csak az a gáz, hogy a listában az a node is szerepel amelyik alatt listázza a társait.

Szóval most már én is izgatottan várom egy nálam okosabb tanácsait :)

0
0
L.Tiny képe

Ha csak ez a gond, akkor egy plusz szűrési feltételt kell létrehozni a Node ID-ra (The revision NID of the content revision), és meg kell határozni, hogy mivel ne legyen egyenlő... Ettől persze nem lesz elegánsabb az egész... :)

Nekem nagyon bejött hasonló helyzetre a Node Hierarchy modul. Talán azzal kellene megnézni. Nem kell megijedni, hogy 7-eshez még dev, mert működik szépen.

0
0
balazsgabi képe

ezzel csak az a gondom, hogy nem tudom itt a szűrési feltételeknél hogyan kell hivatkozni az aktuális node-ra (pl útvonal esetében:node/%)

0
0
L.Tiny képe

Jó a kérdés! Az előbb félreértettem valamit, bocs. Most azon agyalok, hogyan lehetne szűrni a tartalom típusára is és arra is, hogy ne jelenítse meg saját magát a listában.

Abba az irányba mentem el, hogy felvettem a "Típus", a "Tartalom azonosító" és a "Cím" mezőket. Az első kettőt elrejtettem, a Cím mező kimenetét pedig átírtam erre:
<span class="page-node-[nid] node-type-[type]">[title]</span>. Innentől kezdve kellene egy olyan php kódot írni, hogy ha az oldal típusa megegyezik a Cím page-node-[nid] osztályával, ill. az oldal node/[nid] megegyezik a cím page-node-[nid] osztályával, akkor ne jelenjen meg.

Nos itt akadtam el, de talán valaki be tud segíteni...

0
0
Geva képe

az aktuális node azonosítóját az url-ből tudod szűrőként(contextual filter - pl.:aboros) használni, akár olyan módon is, hogy kizárd az eredményből azt, az elkészített blokkhoz

2
0
balazsgabi képe

ezt egy picit kifejtenéd?

akár olyan módon is, hogy kizárd az eredményből

hol keressem az erre vonatkozó opciót? Ma ráértem egy picit és próbálgattam, de nekem nem sikerült ezt elérnem.

0
0
aboros képe

hogy 'exclude', ez egy csekkboksz az argumentum beállításainál a 'more' részben, nézd: https://www.evernote.com/shard/s15/sh/90beb53b-aefe-4925-a3ad-cfaba13d2d...

ha van egy node id argumentum a nézetben, amit provide default -ra állítasz és node id from url, és exclude, akkor 'kivonódik' az adott idjű node a listából.

2
0

-
clear: both;

balazsgabi képe

és igen :)

ezzel megszületett twixzor kérdésére a válasz. Valamint én is megtanultam hogyan kell hasonló tartalmakat kilistázni. Az viszont hozzátartozik, hogy ebben a hozzászólásomban (is) hülyeséget állítottam.

A node/% útvonalú page nézetekkel van egy kis bibi. Ezek addig működnek, míg csak egy tartalomtípus (és ennek nézetei) vannak az oldalon. Ha egy ilyen nézetben van még egyedi szűrési feltétel, pl. tartalomtípus, akkor egy attól eltérő tartalomtípus minden node-ja 404-et fog vissza adni.

Ezért megkérném, hogy aki erre jár nyomjon egy -1-et a fenti hozzászólásomra.

0
0
Geva képe

:-( lemaradt a kép, de akkor most már legyen itt magyarul is
http://gevanet.hu/kizaro-url-views.jpg

1
0