Categories

Guite edited this page Nov 12, 2014 · 6 revisions

Kategorien

Früher gab es das Problem, dass jeder Modulentwickler selbst eine Kategorisierung in sein Modul einbauen musste. Das ist auch erst einmal recht einfach: Eine Liste von Kategorien und alle haben eine ID. Das lädt man als Array und speichert mit den Inhalten die ID der Kategorie. Und dann kommt der erste User an und möchte Unterkategorien: Er betreibt ein lokales Online-Magazin und möchte zum Beispiel der Rubrik "Sport" noch die Unterrubriken "Fußball", "Handball", "Lacrosse", "Faustball" geben. Verständlich. Also macht sich der Entwickler dran und baut Unterkategorien ein. Dann will jemand Bilder zu den Kategorien haben. Auch das baust Du ein. Und so kommt eines zum anderen. Und wenn die Benutzer Deine tolle Kategorien-Verwaltung erst einmal kennen, wollen sie die gleichen Features auch in anderen Modulen. Und dann sitzen alle Modul-Entwickler da und basteln sich eine Kategorienverwaltung.

Zikula hat unter dem Motto "Don't Repeat Yourself" dieses Problem aufgegriffen und bietet eine zentrale Kategorien-Verwaltung an. Alles was die kann, kann auch Dein Modul in Zukunft. Um die Kategorisierung in Deinem Modul zu verwenden, musst Du zwei Dinge tun:

  • Du musst die Kategorisierung bei der Modulinstallation (-Upgrade) aktivieren.
  • Du musst die Hauptkategorie einrichten.

Einrichtung

Schon bei der Installation bzw. beim Upgrade muss die Kategorisierung aktiviert und mit einige Kategorien versehen werden.

Aktivieren

Ein Beispiel für die Art und Weise, wie man die Kategorisierung aktiviert, findest Du in der Beschreibung der pntables.php. Hier die verkürzte Fassung:

<?php
function example_pntables()
{
    // Einrichtung der Tabellen
    // ...

    // Kategorisierung
    $pntable['example_address_db_extra_enable_categorization'] = true;

    // ...

    return $pntable;
}

Ja. Die eine Zeile reicht. Einfach, oder?

Hauptkategorie

In der pninit.php musst Du nun die Hauptkategorie anlegen. Unter dieser werden dann Deine eigentlichen Kategorien gespeichert. Diese Hauptkategorie ist im Code-Beispiel weiter unten "state" (Deutsch: "Bundesland") - Deine Benutzer können dann die Namen der Bundesländer dort verwalten.

Zur Praxis:

  • Du musst eine weitere Funktion in deine pninit.php einfügen.
  • Du musst diese Funktion aus der Funktion init() in derpninit.php aufrufen.

Beispiel:

<?php
function _example_createDefaultCategory($regpath = '/<u>SYSTEM</u>/Modules/Global')
{
    // Zunächst musst Du die nötigen Klassen laden:
    Loader::loadClass('CategoryUtil');
    Loader::loadClassFromModule('Categories', 'Category');
    Loader::loadClassFromModule('Categories', 'CategoryRegistry');

    // Dann gibst Du den Pfad an, unter dem die Hauptkategorie angelegt werden soll:
    $rootcat = CategoryUtil::getCategoryByPath($regpath);
    if ($rootcat) {

        // Nun legst Du die Hauptkategorie an:
        $registry = new PNCategoryRegistry();
        $registry->setDataField('modname', 'example');
        $registry->setDataField('table', 'address');
        $registry->setDataField('property', 'state');
        $registry->setDataField('category_id', $rootcat['id']);
        $registry->insert();

    } else {
        return false;
    }

    // Du kannst auf diese Weise auch mehrere Kategorien anlegen.

    return true;
}

Integration

Um die Kategorien zum Beispiel als Dropdown in einem Formular anzeigen zu lassen, musst Du in der Funktion, die das Formular aufruft, die Kategorien abfragen und dem Template übergeben:

<?php
function example_user_IRGENDWAS($params)
{

// Hier machst Du die anderen Sachen, die die Funktion tun soll...


// Dann kommen die Kategorien: Lade die nötige Klasse:
if (!($class = Loader::loadClass('CategoryRegistryUtil'))) {
    pn_exit (pnML('_UNABLETOLOADCLASS', array('s' => 'CategoryRegistryUtil')));
}

// Hol Dir die Liste der Kategorien
$catregistry  = CategoryRegistryUtil::getRegisteredModuleCategories ('example', 'address');
// Anm.: "example" = Modulname, "address" = Tabellenname (siehe oben)

$pnRender->assign('catregistry', $catregistry);

// Weiterer Code...

Danach kannst Du das Dropdown anzeigen.

Beispiel:

<div class="PN-formrow">
    Category
    <!--[nocache]-->
    <ul>
    <!--[foreach from=$catregistry key=property item=category]-->
        <!--[array_field_isset assign="selectedValue" array=$<u>CATEGORIES</u> field=$property returnValue=1]-->
        <li><!--[selector_category category=$category name="address[<u>CATEGORIES</u>][$property]" field="id" selectedValue=$selectedValue defaultValue="0"]--></li>
    <!--[/foreach]-->
    </ul>
    <!--[/nocache]-->
</div>

Hinweis: "address" = Tabellenname (siehe oben)

Das Dropdown liefert dann die ID der Kategorie als Wert.

pnForm

pnForm verfügt über ein Plugin für ein Dropdown, das eine Menge Arbeit selbst erledigt. Du musst ihm nur den Namen der Tabelle übergeben:

<!--[pnformcategoryselector id='state' category=$id enableDBUtil=1]-->
// 'state' ist der Name einer Hauptkategorie (siehe oben)
//  $id ist die ID der Kategorie, die ausgewählt sein soll

pnForm bekommt die angewählte Kategorie dann in dieser Art zurück:

array(...,
      '<u>CATEGORIES</u>' => array('state' => 14324));

state' ist der Name einer Hauptkategorie (siehe oben), die Zahl die ID der Kategorie.

Abfragen

Kategorien sind wie Schubladen, in denen thematisch ähnliche Inhalte abgelegt werden. Entsprechend ist es natürlich interessant zu sehen, was in so einer Schublade liegt. Die SELECT-Funktionen von DBUtil können deswegen direkt nach Kategorien filtern.

  • Erstelle ein Array mit den Kategorien aus denen Inhalte angezeigt werden sollen:

Beispiel: Eine Kategorie

<?php
$catfilter = array('state' => $id1);
// 'state' ist der Name der Hauptkategorie (siehe oben)
// $id ist die ID der Kategorie

Beispiel: mehrere Kategorien

<?php
$catfilter = array('state'   => $id1,
                   'country' => $id2);
// 'state' ist der Name einer Hauptkategorie (siehe oben)
// 'country' ist der Name einer anderen Hauptkategorie (die aus keinem Beispiel stammt)
// $id ist die ID der Kategorie
Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.