Views: Argument Handling Code mit if-Schleife...?
am 29.01.2009 - 21:14 Uhr in
Hallo,
heute habe ich es irgendwie mit if-Schleifen.
Ich habe einen "Monthly Archive" View (http://drupal.org/node/52037) mit einer vid von 64. Also einfach eine Monatsübersicht wie man es von Blogs kennt.. Diese wird momentan beim Inhaltstyp "Nachrichten" als Block angezeigt.
Ich möchte nun die Breadcrumbs des Archivs anpassen. Da momentan lediglich folgendes anzeigt wird, wenn man in das Archiv reinklickt: Startseite >> Archiv
Ich möchte allerdings folgenden Breadcrumb: Startseite >> Nachrichten >> Archiv
Also dachte ich mir, passe ich die Breadcrumbs vom View manuell an mit:(IN DAS FELD: ARGUMENT HANDLING CODE)
$arr_bc = array(
l(t('Startseite'), '<front>'),
l(t('Nachrichten'), 'nachrichten'),
l(t('Archiv'), 'nachrichten/archiv')
);
drupal_set_breadcrumb($arr_bc);
Da aber der Block des Views auf allen Seiten des Inhaltstyps "Nachrichten" angezeigt wird, wird die manuelle Anpassung der Breadcrumbs auf allen Seiten wo der Block eingeblendet wird auch ausgeführt. Also habe ich überlegt eine Schleife mit das Argument Handling Code Feld zu schreiben:
if ($view->vid == 64 and $view->title == 'Archiv') {
$arr_bc = array(
l(t('Startseite'), '<front>'),
l(t('Nachrichten'), 'nachrichten'),
l(t('Archiv'), 'nachrichten/archiv')
);
drupal_set_breadcrumb($arr_bc);
}
Das ganze scheint aber nicht so wirklich zu funktionieren. Ich weiß nicht ob eine if-Schleife in den Argument Handling Code Feld überhaupt möglich ist. Ich hoffe ihr versteht meine Situation, wie kann ich die Breadcrumbs Anpassung durchsetzen, so dass sie lediglich IM Archiv angezeigt werden?
Freue mich auf Eure Antworten.
Grüße
Florian
- Anmelden oder Registrieren um Kommentare zu schreiben
$view
am 30.01.2009 - 09:37 Uhr
Moin!
Prinzipiell müsste das so funktionieren. Lass Dir mal die Variable
$view
ausgeben, damit Du siehst, ob die Attribute wirklichvid
undtitle
heissen (und der gewünschte Wert drinsteht):<?php
drupal_set_message('<pre>'. print_r($view, 1) .'</pre>');
?>
Nicht erschrecken, die Ausgabe ist ziemlich lang.
--------------
Edit:
Solltest Du views2 verwenden, muss der PHP-Code
TRUE
zurückgeben! Also:if ($view->vid == 64 and $view->title == 'Archiv') {
$arr_bc = array(
l(t('Startseite'), '<front>'),
l(t('Nachrichten'), 'nachrichten'),
l(t('Archiv'), 'nachrichten/archiv'),
);
drupal_set_breadcrumb($arr_bc);
return TRUE; // <--- !!!
}
--------------
hth,
Stefan
PS: http://www.if-schleife.de/
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Danke für Deine
am 30.01.2009 - 11:11 Uhr
Danke für Deine Antwort.
Habe Views 1, nutze D5.
Habe jetzt mal mit Deinem Code die Attribute ausgegeben. Es war ein Fehler drin. Hätte wie folgt heißen müssen:
if ($view->vid == 64 and $view->page_title == 'Archiv von Nachrichten') {
$arr_bc = array(
l(t('Startseite'), '<front>'),
l(t('Nachrichten'), 'nachrichten'),
l(t('Archiv'), 'nachrichten/archiv'),
);
drupal_set_breadcrumb($arr_bc);
}
Aber weiterhin das gleiche Problem. Wie gesagt die Nachrichten Seite ist selber ein View, der Block des Archivs ist auch ein View, irgendwie funktioniert deswegen die SChleife nicht und die Breadcrumbs werden auch auf der Nachrichten Seite ebenfalls verändert gezeigt.
Irgendeine Idee für eine Schleife die das Problem behebt? Habe auch den Umkehrschluss getestet:
if ($view->vid == 38) { } else {
$arr_bc = array(
l(t('Startseite'), '<front>'),
l(t('Nachrichten'), 'nachrichten'),
l(t('Archiv'), 'nachrichten/archiv'),
);
drupal_set_breadcrumb($arr_bc);
}
vid 38 ist hier der Nachrichten View, also da wo nicht der Breadcrumb geändert werden soll, aber gemacht wird. Auch mit dieser SChleife wird es allerdings geändert. Ich verstehe es nicht.
Hier noch die Ausgabe der Attribute:
stdClass Object
(
[vid] => 64
[name] => nachrichten_archiv
[description] =>
[access] => Array
(
[0] => 4
)
[page] => 1
[page_title] => Archiv von Nachrichten
[page_header] =>
[page_header_format] => 1
[page_empty] =>
[page_empty_format] => 1
[page_footer] =>
[page_footer_format] => 1
[page_type] => teaser
[use_pager] => 1
[nodes_per_page] => 20
[url] => nachrichten/archiv
[menu] => 0
[menu_tab] => 0
[menu_tab_weight] => 0
[menu_title] =>
[menu_tab_default] => 0
[menu_tab_default_parent_type] => tab
[menu_parent_title] =>
[menu_parent_tab_weight] => 0
[block] => 1
[block_title] => Archiv
[block_use_page_header] => 0
[block_header] =>
[block_header_format] => 1
[block_use_page_footer] => 0
[block_footer] =>
[block_footer_format] => 1
[block_use_page_empty] => 0
[block_empty] =>
[block_empty_format] => 1
[block_type] => list
[nodes_per_block] => 12
[block_more] => 1
[breadcrumb_no_home] => 0
[changed] => 1233309202
[view_args_php] => drupal_set_message('
'. print_r($view, 1) .'
');
if ($view->vid == 64 and $view->title == 'Archiv von Nachrichten') {
$arr_bc = array(
l(t('Startseite'), ''),
l(t('Nachrichten'), 'nachrichten'),
l(t('Archiv'), 'nachrichten/archiv')
);
drupal_set_breadcrumb($arr_bc);
}
[is_cacheable] => 0
[sort] => Array
(
[0] => Array
(
[vid] => 64
[position] => 0
[field] => node.created
[sortorder] => DESC
[options] => normal
[tablename] =>
[id] => node.created
)
)
[argument] => Array
(
[0] => Array
(
[vid] => 64
[type] => monthyear
[argdefault] => 5
[title] => %1
[options] =>
[position] => 0
[wildcard] =>
[wildcard_substitution] =>
[id] => monthyear
)
)
[field] => Array
(
[0] => Array
(
[vid] => 64
[tablename] => node
[field] => title
[label] =>
[handler] => views_handler_field_nodelink
[sortable] => 0
[defaultsort] => 0
[options] => link
[position] => 0
[fullname] => node.title
[id] => node.title
[queryname] => node_title
)
)
[filter] => Array
(
[0] => Array
(
[vid] => 64
[tablename] =>
[field] => node.status
[value] => 1
[operator] => =
[options] =>
[position] => 0
[id] => node.status
)
[1] => Array
(
[vid] => 64
[tablename] =>
[field] => node.type
[value] => Array
(
[0] => nachrichten
)
[operator] => OR
[options] =>
[position] => 1
[id] => node.type
)
)
[exposed_filter] => Array
(
)
[build_type] => block
[type] => list
)
view
am 30.01.2009 - 11:31 Uhr
if ($view->vid == 64 and $view->page_title == 'Archiv von Nachrichten') {
$arr_bc = array(
l(t('Startseite'), '<front>'),
l(t('Nachrichten'), 'nachrichten'),
l(t('Archiv'), 'nachrichten/archiv'),
);
drupal_set_breadcrumb($arr_bc);
}
Ok. Mal ne Zwischenfrage: warum fragst Du immer den Titel ab? Da sind Leerzeichen und wer weiss, was was sonst noch, drin. Mach doch einfach
if ($view->name == 'nachrichten_archiv' && $view->vid == 64) { ... }
Zur Not auch kurz mit Debug-Ausgabe:
drupal_set_message('$view->vid: '. $view->vid);
drupal_set_message('$view->name: '. $view->name);
if ($view->name == 'nachrichten_archiv' && $view->vid == 64) {
drupal_set_breadcrumb(array(
l(t('Startseite'), '<front>'),
l(t('Nachrichten'), 'nachrichten'),
l(t('Archiv'), 'nachrichten/archiv'),
));
}
Stefan
PS:
Irgendeine Idee für eine Schleife die das Problem behebt?
Mit "Schleifen" wird das Problem zwar auch lösbar sein, ich würde jedoch eine
if
Anweisung bevorzugen.Tipp: Beachte die Verhaltensregeln des DrupalCenter.
IF-Schleife meinte ich auch.
am 30.01.2009 - 11:56 Uhr
IF-Schleife meinte ich auch. Sorry.
Dein Vorschlag funktioniert leider aber auch nicht. Ich würde allerdings sagen, dass es logisch ist, dass es nicht funktioniert.
Den wie gesagt auf der Nachrichten Hauptseite wird der Block des Archiv-View ja angezeigt, dementsprechend ist die Abfrage der IF-Schleife erfüllt und somit wird auch der Breadcrumb auf der Nachrichten Hauptseite mit geändert.
Kann man die IF-Schleife nicht so formulieren, dass noch abgefragt wird, dass der View "nachrichten_aktuelles" als "page" erscheinen muss.
Aber wie gesagt nicht einfach eine Abfrage view->type == "page", weil die Nachrichten Hauptseite ja ebenfalls ein View ist und als "page" angezeigt wird.
Du verstehst mich? :D
Grüße
Florian
views
am 30.01.2009 - 13:01 Uhr
IF-Schleife meinte ich auch. Sorry.
Es gibt keine
if
Schleifen! Schleifen umfassen Code-Blöcke, die wiederkehrend aufgerufen werden.Dein Vorschlag funktioniert leider aber auch nicht. Ich würde allerdings sagen, dass es logisch ist, dass es nicht funktioniert.
Den wie gesagt auf der Nachrichten Hauptseite wird der Block des Archiv-View ja angezeigt, dementsprechend ist die Abfrage der IF-Schleife erfüllt und somit wird auch der Breadcrumb auf der Nachrichten Hauptseite mit geändert.
Kann man die IF-Schleife nicht so formulieren, dass noch abgefragt wird, dass der View "nachrichten_aktuelles" als "page" erscheinen muss.
Aber wie gesagt nicht einfach eine Abfrage view->type == "page", weil die Nachrichten Hauptseite ja ebenfalls ein View ist und als "page" angezeigt wird.
Du verstehst mich? :D
Hm, weiss ich noch nicht so ganz.
Was ist der Unterschied zwischen Deinem Archiv-View und der "Nachrichten Hauptseite"?
Wann genau soll die Breadcrump-Navigation geändert werden?
$view->type == 'page'
bezieht sich auf das aktuelle View-Objekt, funktioniert also, wenn der Archiv-View als eigenständige Seite angezeigt wird.leicht verwirrt,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Gut. Dann nehme ich alles
am 30.01.2009 - 13:22 Uhr
Gut. Dann nehme ich alles zurück. Ich darf mich selber als PHP Beginner bezeichnen. ;)
Also unter /nachrichten wird ein View angezeigt mir verschiedenen Nodes (Anrisstexte etc.). Dieser "Nachrichten" View hat einen Archiv Block, dieser Block ist der View mit der besagten vid=64. Von dem Archiv Block aus, kann man sich ins Archiv klicken. (Genauer Aufbau, kannst Du durch den Link im ersten Beitrag einsehen).
Die Breadcrumb Struktur soll nur geändert werden, wenn man sich ins Archiv reinklickt! Sprich auf der Hauptseite also dem "Nachrichten" View soll die Breadcrumbs Struktur nicht mitverändert werden.
Versteht Du jetzt besser was ich meine?
if ($view->name == 'aktuelles_archiv' && $view->vid == 64 && $view->type == 'page') scheint auch nicht zu helfen....
grüße
florian
views
am 30.01.2009 - 13:33 Uhr
Gut. Dann nehme ich alles zurück. Ich darf mich selber als PHP Beginner bezeichnen. ;)
:-)
... Versteht Du jetzt besser was ich meine?
Ja.
if ($view->name == 'aktuelles_archiv' && $view->vid == 64 && $view->type == 'page') scheint auch nicht zu helfen....
Vorhin hiess der View noch 'nachrichten_archiv' :-) Das macht dann eigentlich die Abfrage nach der vid überflüssig.
if ($view->name == 'nachrichten_archiv' && $view->build_type == 'page') { ... }
Das müsste es jetzt eigentlich sein. Ich hatte bisher nicht daran gedacht, dass es "$view->type == 'page'" gar nicht gibt, sondern das über "build_type" angefragt werden kann.
Falls das auch nicht funktioniert, fragen wir einfach den Pfad ab:
if (arg(0) == 'nachrichten' && arg(1) == 'archiv' { ... }
Ich geh aber mal davon aus, das die erste Variante mit
$view->build_type
funktionieren wird. Hoffe ich jedenfalls :-).Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Ja sorry. Eigentlich heißt
am 30.01.2009 - 14:49 Uhr
Ja sorry. Eigentlich heißt die Hauptseite Aktuelles, aber ich habe es mal der Verständnishalber wegen in Nachrichten umbenannt.
So jetzt aber zu Deinem Vorschlag: Ich darf Dich rettenden Gott nennen!;)
Merci, build_type hat wunderbar funktioniert. Es geht jetzt alles genauso wie es soll! Vielen, vielen Dank Dir!
Lieben Gruß
Florian