[gelöst] arguments (Views) mit php steuern und Kritik am O'Reilly- Buch wegen der fehlerhaften Wiedergabe von PHP- Codes
am 03.01.2010 - 23:05 Uhr in
Ich möchte Argumente in den Views mit php steuern.
In einem View als Block sollen die Bands des gleichen Genres ausgegeben werden, wie die Band im Node Content in der Mitte.
Code zum Argument Genre:
$nid = arg(1);
if ($this -> view -> current_display == 'block'
&& arg(0) == 'node' && is_numeric($nid))
{ $context = node_load($nid);
if ($context -> type == 'bandprofil')
{
return $context -> field_genre[0]['nid'];
}
}
return 'all';
Der Views tut zeigt nach wie vor alle Bands an, egal welchen Genres, es tut sich also nichts, ob mit oder ohne Code.
Dieses Beispiel stammt aus dem recht guten Buch von O'Reilly; "Praxiswissen Drupal6".
Ich gehe davon aus, dass ich die Einträge laut Buch alle richtig gemacht habe, auch für diesen View: "Bands gleichen Genres"
Ich habe natürlich das PHP Modul aktiviert.
Wer kann mir helfen?
Hartmut
- Anmelden oder Registrieren um Kommentare zu schreiben
Mit der Funktion var_export
am 04.01.2010 - 01:11 Uhr
Mit der Funktion
var_export
kannst anzeigen lassen, welchen Wert eine Variable hat und mitdrupal_set_message
kannst du eine Statusmeldung in Drupal anzeigen.Das kannst du dazu verwenden, um deinen Code mit Debugging-Informationen anzureichen:
<?php
$nid = arg(1);
drupal_set_message('DBG $nid: ' . var_export($nid, true));
drupal_set_message('DBG current_display: ' . var_export($this->view->current_display, true));
drupal_set_message('DBG arg(0): ' . var_export(arg(0), true));
drupal_set_message('DBG is_numeric($nid): ' . var_export(is_numeric($nid), true));
if ($this -> view -> current_display == 'block'
&& arg(0) == 'node' && is_numeric($nid))
{
$context = node_load($nid);
drupal_set_message('DBG $context->type: ' . var_export($context->type, true));
if ($context -> type == 'bandprofil')
{
drupal_set_message('DBG $context->field_genre[0]["nid"]: ' . var_export($context->field_genre[0]['nid'], true));
return $context -> field_genre[0]['nid'];
}
}
drupal_set_message('DBG: return "all" wird ausgeführt.');
return 'all';
?>
Wenn du nun ein Bandprofil besuchst, dann solltest du recht schnell erkennen ab wann dein Code und deine Vorstellungen getrennte Wege gehen.
BTW: ich glaube,
$this->view->current_display == 'block_1'
.--
Danke und: Wohin damit?
am 04.01.2010 - 16:27 Uhr
Wird dein Code in eine neue Seite als PHP-Code eingefügt?
Gruß Hartmut
Der Code ersetzt deinen
am 04.01.2010 - 18:48 Uhr
Der Code ersetzt deinen bestehenden Code.
--
Die Debug- Anzeige klappt
am 05.01.2010 - 00:39 Uhr
Ein interessante Möglichkeit zu debuggen. Danke für die Arbeit. Und ich weis jetzt wie es geht.
Woher kann man diese Info bekommen? Gibt es ein Buch?
Z.B. Drupal für Entwickler?
Ich werde jetzt anhand der Ausgaben prüfen, welche Fehler auftreten. Zumindest geht aber der PHP- Code überhaupt.
In dem Views/ Arguments habe ich jedoch die php-Codezeichen
<?php
....
?>
Gruß Hartmut
Deine Vermutung war richtig!
am 05.01.2010 - 00:37 Uhr
Du hast richtig gelegen mit der Benennung "Block_1" statt lediglich "Block".
Die erste if- Bedingung war dadurch immer false und wurde nie durchlaufen, damit auch nicht die darunterstehende Debug- Ausgabe.
Nach der Veränderung lief es richtig.
Damit hast du einen wichtigen Bug in dem O'Reilly - Buch aufgedeckt.
Und ich hab den Einstieg in das PHP - Debugging geschafft.
Nochmals Danke für die schnelle Hilfe.
ähnliches Problem
am 10.02.2011 - 09:59 Uhr
Hi,
ich habe ein ähnliches Problem.
in Drupal 7 habe ich ein Inhaltstyp Partner erstellt
mit den Feldern Title und body (standartfelder) und dem feld partner_kategorie, das ein Taxonomy Kategorie zugeordnet ist.
Meine Seite hat verschieden Menuepunkte die über die Taxonomy erstellt wurden.
in Views will ich nun steuern das der Inhaltstyp Partner nur sichbar wird auf den Seiten mit der gleichen Taxonomy Kategorie.
Beispie
Mein Menue mit Taxonomie
Blubb-> Blah -> blubber
Der Inhaltstyp Partner mit den Inhalten
Title: TEST
Body: ajlöskfjöa
Kategoire: blubber
So nun soll im Menuepunkt blubber, und nur das das TEST teil erscheinen.
Ich haben einen neuen View erstellt (Typ Nodes)
Die Felder Title und body reingeschrieben und bei Arguments den Taxonomy:Begriff hinzugefügt.
Wenn das Argument nicht vorhanden ist soll es Ausgeblendet werden.
Nun muss es Validiert werden.
Da scheint nun wieder php gefragt.
Wie kann ich dem mitteilen das er als Argument das nehmen soll was im der url drin ist also der ausgewählte link.
sowas wie
return arg(1); ging nicht.
Wenn ich die entsprechenden Argumente in der Vorschau von Hand eingebe klappts.
Ich hoffe ich drücke mich verstänlich aus. Es ist nicht ganz so einfach.
EDIT:
Soweit wie ich das verstanden habe, gibt es bei mir folgende abweichungen.
Da ich Drupal 7 habe steht in der URL nix von node sondern der echte lesbare name. Ich weiß nicht wie das intern gehandelt wird, aber im prinzip müsste er nur als standartargument sowas wie arg(1) zurück liefern.
zb. URL = cge.tkuebler.de/Frauenchor
arg(1) = Frauenchor
oder nicht???
Ich habe 2 Taxonomy Vokabulare
Kategorie und Tags.
das was ich verwenden will ist Kategorie. In meinem Inhaltstyp benutze ich auch ein Begriff aus dem Vokabular Kategorie.
Nun soll eben nur was angezeigt werden wenn der Inhaltstyp mit der Taxonomy Kategorie Begriff Frauenchor, mit dem arg(1) der URL Angezeigt wird.
Dreck es klappt einfach nicht. Bitte kann mir einer Helfen.
Im Zweifel sollte man immer das Richtige tun.
vielleich ein grund
am 10.02.2011 - 10:42 Uhr
Da ich das ganze als Block darstellen will muss ich wohl das hier Berücksichtigen.
Block display
Block displays will show up on your blocks administration page. Once a block display is created and saved, it can be enabled and positioned in your theme by visiting administer >> site building >> blocks and selecting it from the list.
Blocks do not accept arguments from any source; the only way to get arguments to a block is to provide defaults to it, possibly via the PHP Code default setting.
* Edit the argument in question; you may want to override this argument if you have multiple displays using it.
* Change the "Action to take if argument is not present" to "Provide default argument". This will bring up a new box called "Provide default argument options".
* The most common default argument type used for blocks is Node from URL, where it attempts to determine if the URL refers to a node, for example if visiting 'node/1' or 'node/1/edit'. User ID from URL is also very common.
* If you change the default argument type to 'PHP Code' (note: You must have permission to use PHP code on your site) you can enter PHP to define the argument needed. Simply return the argument.
Ich bleib dran...
Im Zweifel sollte man immer das Richtige tun.
Kueblert schrieb Da ich das
am 10.02.2011 - 10:44 Uhr
Da ich das ganze als Block darstellen will muss ich wohl das hier Berücksichtigen.
Block display
Block displays will show up on your blocks administration page. Once a block display is created and saved, it can be enabled and positioned in your theme by visiting administer >> site building >> blocks and selecting it from the list.
Blocks do not accept arguments from any source; the only way to get arguments to a block is to provide defaults to it, possibly via the PHP Code default setting.
* Edit the argument in question; you may want to override this argument if you have multiple displays using it.
* Change the "Action to take if argument is not present" to "Provide default argument". This will bring up a new box called "Provide default argument options".
* The most common default argument type used for blocks is Node from URL, where it attempts to determine if the URL refers to a node, for example if visiting 'node/1' or 'node/1/edit'. User ID from URL is also very common.
* If you change the default argument type to 'PHP Code' (note: You must have permission to use PHP code on your site) you can enter PHP to define the argument needed. Simply return the argument.
Ich bleib dran...
mh andererseites bestätigt das nur das ich mit php arbeiten muss ARGL...dreck...
Im Zweifel sollte man immer das Richtige tun.
vorerst zufriedenstellend
am 10.02.2011 - 10:59 Uhr
HA es geht auch ohne php.
In views habe ich das Standart Taxonomy teil kopiert und
dort habe ich einen Block eingfügt mit folgenden Einstellungen
Im Argument Taxonomy Begriffs ID
Title = %1
Flag = Standardargument zu Verfügung stellen
Flag = Taxonomy Term ID from URL
Flag = Load default argument from term page
Dadruch wird im Block der Inhaltstyp angezeigt der mit der URL und der eingabe übereinstimmen.
Oh mann das war ne schwere Geburt.
Jetzt muss ich mal schauen ob ich das noch vom Layout her anpassen kann.
Ach ja für alle die es interessiert hier ein Link wie das Endergebnis ausschaut.
cge.tkuebler.de
in der Rubrik Männerchor und Frauenchor erscheint nun auf der Rechten Seite ein Block mit dem Ansprechpartner (Spezieller Inhaltstyp)
Im Zweifel sollte man immer das Richtige tun.
Finale Lösung
am 10.02.2011 - 17:11 Uhr
Jetzt erst habe ich die wirkliche Lösung gefunden.
http://das-drupal-magazin.de/taxonomy-view-einem-block
hat mir dabei geholfen.
Der Knackpunkt ist einfach das sowohl intern, bei der Taxonomy nur nummern gespeichert werden z.b. taxonomy/term/12 und nicht die namen die in der URL zu sehen sind.
Und zweitens das ein Block keine Argumente aus der URL lesen kann.
Jetzt hat es jedenfalls geklappt :-D
ENDE
Im Zweifel sollte man immer das Richtige tun.