Archiv der Kategorie: Blocks

Es geht auch ohne Views: Anzahl Rezepte zu einer Kategorie ausgeben

Ich hab ja redlich versucht, mehr über die Parameterübergabe an Views herauszufinden, aber ganz ehrlich: das war mir alles zu esoterisch, und viel zu kompliziert – man muss ja nicht unbedingt mit Kanonen auf Spatzen schiessen. Ich möchte nach wie vor eine Ausgabe so in der Art:

316 Rezepte insgesamt

111 davon Vegetarisch

Jetzt hab ich einfach die Anforderung ein bisschen geändert: ich lasse den Benutzer auswählen, zu welcher Kategorie er die Anzahl der Rezepte ausgegeben haben möchte. Also dann, auf gehts!

Wie man Drupal eigenen PHP-Code unterschiebt

.. hab ich in diesem Artikel beschrieben. Dafür erstellt man sich ein einfaches Modul, in dem man seine eigenen Funktionen unterbringt. Dann kan man sich zum Beispiel auch einen eigenen Block definieren, in dem man schlicht und ergreifend eine eigene PHP-Funktion aufruft, und den kann man dann positionieren wo man ihn gern haben möchte.

Die Gesamtzahl der Rezepte

Das ist easy, wir selektieren alle Rezepte mit Status1 = veröffentlicht und holen uns die Anzahl mit rowCount:

//Datenbankabfrage für die Gesamtzahl der Rezepte
    $query = db_query("SELECT * FROM node WHERE type like 'rezept' AND status = 1");
    $anzahl = $query->rowCount();
    echo "<h2>".$anzahl." Rezepte insgesamt </h2><br>";

Auswahl der Kategorien über Dropdown-Feld

Dafür basteln wir uns ein Formular mit einer Options-Liste und füttern diese mit einer Datenbankabfrage.

//Datenbankabfrage für das Optionsfeld
    $query = db_query("SELECT * FROM taxonomy_term_data WHERE vid = 2");
    $records = $query->fetchAll();

Ich habe hier die Kategorie Rezepte mit der vid = 2 fest verdrahtet. Das Abfrageergebnis schieben wir so in das Formular rein:

//Beginn Formular    
        echo "<h3>Kategorie auswählen</h3>";

        echo "<form action='#' method='post'>";

        //Beginn des Dropdownmenü
        echo '<select name="Name">';
        
        //hier kommen nun die Werte für die Options rein
        foreach ($records as $record){
               echo '<option>'.$record->name.'</option>';
        }
        echo "</select>";

        echo "<input type='submit' name='absenden' value='Anzahl ausgeben'>";
        echo "</form>";
//End Formular

Am Ende kommt noch ein Submit-Button, und das war, wir haben jetzt unsere Dropdown-Liste mit den Kategorienamen gefüllt.

dropdown_kategorien
dropdown_kategorien

Wenn jetzt der Anwender eine Kategorie ausgewählt hat, muss er noch auf den Button „Anzahl ausgeben“ klicken, dann legen wir los.

auswahl
auswahl

Mit einem if(isset)… fragen wir ab, ob der Submit-Button gedrückt wurde. Dann holen wir uns den Wert aus dem Dropdown-Feld mit $_POST[‚Name‘] und machen zwei kleine Datenbankabfragen. In der ersten holen wir uns die tid zum ausgewählten Kategorienamen, in der zweiten zählen wir, wie oft diese tid mit einem Rezept verknüpft wurde:

if (isset($_POST['absenden'])){
// tid zum Namen der Kategorie holen
    $query = db_query("Select tid from taxonomy_term_data where name like '".$_POST['Name']."'");
    $akt_katid = $query->fetchField();
    
    //Zählen, wieviele Rezepte zur tid vorhanden sind
    $query = db_query("SELECT * FROM taxonomy_index where tid = ".$akt_katid."");
    $anzahl = $query->rowCount();
    
    echo $anzahl." Rezepte zur Kategorie ".$_POST['Name']."<br>";
} //End if isset absenden

Und am Ende geben wir unsere Ergebnisse noch aus.

Wenn man es ganz genau machen wollte, müsste man in die Abfrage für die Anzahl noch einen Join über die nid (Node ID) der Rezepte auf die Tabelle nodes machen und nur alle selektieren, die den Status 1=veröffentlicht haben, aber ich lass es mal so stehen. Meine Ausgabe sieht dann so aus:

111vegetarisch
111vegetarisch

Damit das ganze ein bisschen mehr Nährwert kriegt, legen wir auf den Namen der Kategorie jetzt noch einen Link, der uns dann die Seite der gewählten Kategorie aufruft. Die URL unserer Seite holen wir mit global $base_url; daraus bauen wir dann den Link:

global $base_url;
        
$html_string = '<a href=' . $base_url . '/taxonomy/term/'.$akt_katid.'>'.$_POST['Name'].'</a>';
    echo $html_string;

Das wars jetzt aber, das lass ich so stehen. Ich finde es für einen Block sogar recht gut, weil es nicht so viel Platz wegnimmt wie die View mit allen Kategorien untereinander, das Dropdown-Feld ist da deutlich kompakter.

mit_link_zur_kategorie
mit_link_zur_kategorie

 

Geht manches wirklich nur mit Views?

Ich habe ja schon für WordPress ein Widget und für Joomla ein kleines Modul erstellt, die jeweils die Gesamtzahl der veröffentlichten Rezepte und dazu die Anzahl der Rezepte einer frei wählbaren Kategorie anzeigen, so nach dem Muster:

317 Rezepte insgesamt

89 davon vegetarisch

Jetzt hab ich mich mal dahintergeklemmt, ob sowas auch in Drupal zu realisieren ist, und ich sags ganz ehrlich: ich hab mir einen Frust gegooglet. Es ist anscheinend nicht möglich, einem Block benutzerdefinierte Variable mitzugeben, und damit fällt das ganze Konzept auf die Nase.

Mit Views gehts – ja aber…

Es ist relativ einfach, mit Views einen Block zu erstellen, der die Gesamtzahl der veröffentlichten Rezepte ausgibt. Und es ist auch nicht viel schwieriger, einen Block zu erstellen, der die Gesamtzahl der vegetarischen Rezepte ausgibt. Ich kann aber meinem durchschnittlichen Benutzer nicht zumuten, sich in Views einzuarbeiten und da z.B. statt dem Tag „vegetarisch“ das Tag „Joschis Cocktailbar“ einzusetzen, no way José. Zudem müsste man bei jedem anderen Tag die Überschrift des Blocks auch manuell anpassen, also das kanns echt nicht gewesen sein. Da ich aber nichts anderes gefunden habe, schreibe ich hier mal kurz wie man die Views aufsetzt.

Nur Rezepte aus Joschis Cocktailbar

Struktur->Views->add new view, Namen vergeben. Hier kann man gleich mal den Inhalt of type Rezept tagged with Joschis Cocktailbar auswählen:

nur_joschiscocktailbar
nur_joschiscocktailbar

Create a Block, Continue&edit.

Advanced->use aggregation->aggregate->apply

Fields Inhalt(Titel)->Aggregation settings->Anzahl->apply.

Das sollte jetzt so aussehen:

aggregation
aggregation

Die Ausgabe wäre dann:

7_joschi
7 joschi

Die View für die Anzahl der Rezepte insgesamt erstellt man genauso, nur läßt man ganz am Anfang das tagged with leer. Das wars auch schon, aber ich finde es eine sehr unbefriedigende Lösung. Wie gesagt, ich kann es meinen Anwender nicht zumuten, selber mit Views herumzuhantieren, da suche ich immer noch einen einfacheren Weg. Mal sehen, ob ich noch was finde.

Dropdown-Menüs: nur mit dem richtigen Theme

Als Drupal-Neuling stolpert man ganz schnell darüber, dass es erstmal nicht möglich ist, ein Dropdown-Menü einzurichten. Das ist im Standard-Theme Bartik und im ebenfalls mitgelieferten Theme Garland auch gar nicht vorgesehen! Man braucht ein Theme das diese Option von Haus aus mitliefert, eines wäre zum Beispiel Marinelli. Dann aber ist die Sache ganz einfach. Also, installieren sie sich Marinelli und Nice Menus und dann kanns losgehen.

Mega-Menu einschalten

Design->Marinelli->Einstellungen->Primary Menu settings Which kind of primary links do you want to use? auf Mega Drop Down stellen.

Dann ein paar Basic Pages mit Menüeinträgen erstellen, Reihenfolge und Anordnung können über Struktur->Menüs->Main Menu noch eingestellt werden.

untermenues
untermenues

Block positionieren

Den Block Nice Menu 1 auf die Position Utility Menu Top setzen.

nicemenu
nicemenu

Und so sieht das dann aus:

kochbuchmenu
kochbuchmenu

Nachtrag: Kategorienliste mit Anzahl der Rezepte, und das IVZ V.0

Der Weg zur Kategorienliste mit der Anzahl der Rezepte war noch unvollständig. Das machen wir auch mit Views, ich schau mal dass ich es nachvollziehbar aufschreibe:

Struktur->Views->Add new->Namen vergeben, Anzeigen Taxonomie Begriffe of type Tags

Create a Block, Items per Page nehm ich mal 30 (brauch ich später noch), Continue & Edit.

Block Details->Advanced->Relationships->Taxonomie-Begriff Content with term, Use Aggregation

Fields->Inhalt (Titel)->Aggregation Type Count Distinct, im nächsten Fenster das Feld Bezeichnung leer machen.

Speichern. Block auf gewünschte Position setzen.

anzahl_kategorien
anzahl_kategorien

Wichtige Ergänzung: leere Kategorien ausblenden

Damit man Kategorien, die noch keinem Inhalt zugeordnet sind, nicht mit einem Kategoriename 0 angezeigt bekommt, kann man noch einen zweiten Eintrag unter Relationships hinzufügen, und zwar:

(Beitrag) Inhalt: Taxonomy terms on node

Dann muss man noch in Configure Relationship die Option

 

anhaken, und das wars.

Noch etwas Kosmetik

Es wäre jetzt natürlich schöner, wenn die Zahlen hinter dem Kategorienamen stehen würden statt in der nächsten Zeile darunter. Dazu in der View unter Format Anzeigen Fields Einstellungen bei den beiden Inline Fields Häkchen setzen:

inline_fields
inline_fields

So, das wars jetzt aber. Mein Block mit den Rezept-Kategorien sieht jetzt so aus:

distinct_rezeptkategorien
distinct_rezeptkategorien

Das kann so bleiben!

Als nächstes kommt das Inhaltsverzeichnis dran:

Alle Rezepte A-Z

Wir setzen auch da mal mit Views an.

Neue View hinzufügen, Name z.B. IVZ, Anzeigen Inhalt of Type Blogeintrag, Create a page, Seitentitel z.B. Rezepte A-Z, Pfad rezepte-a-z. Items to Display 300 (brauchen wir später noch). Create a Menu Link, Continue&Edit.

Anzeigen->Inhalt->Fields -> Apply, Inline Fields Inhalt:Titel anhaken.

Sort Criteria Post Date entfernen, Sort Criteria hinzufügen Inhalt:Titel,  (asc) ist default, kann man lassen. Apply. Speichern.

Das sollte einen neuen Menüeintrag erzeugen, in dem alle Rezepte alfabetisch aufgelistet werden:

ivz
ivz

Das ist zwar mal ein Anfang, aber so richtig schön ist es noch nicht. Es wäre viel hübscher, wenn die Anfangsbuchstaben und die Anzahl der Rezepte pro Buchstaben in der Liste auftauchen würden, aber das, so fürchte ich, wird nicht so einfach, jedenfalls nicht ohne ein bisschen Programmierung. Da wollen wir Drupal mal auf den Zahn fühlen, wie sowas gehen könnte – in einem neuen Beitrag.