Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/friendsofredaxo/navigation_array

Helper Class to build navigations for REDAXO cms
https://github.com/friendsofredaxo/navigation_array

navigation redaxo redaxo-addon

Last synced: about 1 month ago
JSON representation

Helper Class to build navigations for REDAXO cms

Awesome Lists containing this project

README

        

# REDAXO FOR NavigationArray
Navigation Array ist ein PHP Klasse für die einfache Erstellung einer Navigationsstruktur als Array.
## Features
- Offline Artikel und Ycom Rechte werden berücksichtigt
- Startkategorie kann frei gewählt werden
- Tiefe kann festgelegt werden
- Kategorien filtern und manipulieren (z.B. mit Meta Infos) über Callbacks
- Mitgelieferte Fragmente für die HTML Ausgabe der Navigation

## Array-Struktur
So sieht das generierte Array aus. Es enthält alle Kategorien und Unterkategorien bis zur angegebenen Tiefe. Offline Kategorien und Rechte aus Ycom werden vorher aus dem Array entfernt.
```php
array:7 [▼
0 => array:11 [▶]
1 => array:11 [▶]
2 => array:11 [▶]
3 => array:11 [▶]
4 => array:11 [▼
"catId" => 43
"parentId" => 0
"level" => 0
"catName" => "Kontakt"
"url" => "/kontakt/"
"hasChildren" => true
"children" => array:2 [▼
0 => array:11 [▼
"catId" => 178
"parentId" => 43
"level" => 1
"catName" => "Kontaktformular"
"url" => "/kontakt/kontaktformular/"
"hasChildren" => false
"children" => []
"path" => array:1 [▶]
"active" => false
"current" => false
]
1 => array:11 [▶]
]
"path" => []
"active" => true
"current" => true
]
5 => array:11 [▶]
6 => array:11 [▶]
]
```

## Array generieren

### Aufruf mit Konstruktor
```php
// define namespace
use FriendsOfRedaxo\NavigationArray\BuildArray;
// create object
$navigationObject = new BuildArray(-1, 3);
// generate navigation array
$navigationArray = $navigationObject->generate();
```

### Aufruf mit Methoden

```php
// define namespace
use FriendsOfRedaxo\NavigationArray\BuildArray;
// create navigation array
$navigationArray = BuildArray::create()
->setStart(-1)
->setDepth(4)
->setIgnore(true)
->setCategoryFilterCallback(CategoryFilter())
->setCustomDataCallback(CustomData())
->generate();
```

## HTML Ausgabe
In erster Linie generiert Navigation Array ein Array. Die Ausgabe als HTML ist Aufgabe des Entwicklers. Hier sind einige Beispiele, wie das Array in HTML integriert werden kann.

### Fragmente
Mit Fragmenten wird die Logic sauber vom Code getrennt. Das Fragment 'navigation.php' kann kopiert, angepasst und in `project` oder `theme` Ordner abgelegt werden.

```php
// Festlegen des Namespace
use FriendsOfRedaxo\NavigationArray\BuildArray;

// Navigation Array erstellen
$navigationObject = new BuildArray(-1, 3);
$navigationArray = $navigationObject->generate();

//Fragmente laden Navigation Array und Klasse für aktive Elemente übergeben
$fragment = new rex_fragment();
$fragment->setVar('navigationArray', $navigationArray);
$fragment->setVar('activeClass', 'active');

// Navigation ausgeben


    echo $fragment->parse('navigation_array/navigation.php');

```

### PHP Funktion
Alternativ kann man das Array auch direkt in PHP Verarbeiten hier einige Beispiele
#### Beispiel einfache Navigation

```php
// Function to generate the navigation list
function generateNavigationList($items) {
if (empty($items)) {
return '';
}

$output = '

    ';
    foreach ($items as $item) {
    $output .= '
  • ';
    $output .= '' . $item['catName'] . '';

    // Check if this item has children
    if ($item['hasChildren']) {
    $output .= generateNavigationList($item['children']);
    }

    $output .= '

  • ';
    }
    $output .= '
';

return $output;
}

use FriendsOfRedaxo\NavigationArray\BuildArray;
$NavigationArray = BuildArray::create()->setDepth(3)->generate();

// Generate the navigation list
$navigationList = generateNavigationList($NavigationArray);

// Output the navigation list
echo $navigationList;
```

#### Beispiel erweiterte Navigation mit Callback

```php
use FriendsOfRedaxo\NavigationArray\BuildArray;

$mainnavi_array = (new BuildArray())
->setCustomDataCallback(function($cat) {
return ['navtype' => $cat->getValue('cat_navigationstyp')];
})
->generate();

$mainnavigation_items = [];

function createNavigationItems($navi) {
$items = [];
$class_active = $navi['active'] ? 'active' : '';
$class_current = $navi['current'] ? ' current' : '';
$class_has_child = $navi['children'] ? ' has-child' : '';

$items[] = "


  • {$navi['catName']}";

    if ($navi['children']) {
    $items[] = 'X';
    $items[] = '

      ';

      foreach ($navi['children'] as $nav_child) {
      $items[] = createNavigationItems($nav_child);
      }

      $items[] = '

    ';
    }

    $items[] = '

  • ';

    return implode($items);
    }

    foreach ($mainnavi_array as $navi) {
    $navtype_arr = explode('|', $navi['navtype']);

    if (in_array('main', $navtype_arr)) {
    $mainnavigation_items[] = createNavigationItems($navi);
    }
    }

    $mainnavigation = '

      ' . implode($mainnavigation_items) . '
    ';
    ```

    ##### Erklärung

    Zu Beginn wird die Klasse `BuildArray` aus dem `FriendsOfRedaxo\NavigationArray`-Namespace verwendet, um ein Array für die Hauptnavigation zu generieren. Dabei wird eine benutzerdefinierte Callback-Funktion verwendet, um zusätzliche Daten für jeden Eintrag in der Navigation festzulegen. In diesem Fall wird das Feld `navtype` mit dem Wert des Feldes `cat_navigationstyp` aus der Kategorie des Eintrags befüllt.

    Anschließend wird eine leere Array-Variable `$mainnavigation_items` definiert. Diese wird später mit den generierten Navigationselementen befüllt.

    Die Funktion `createNavigationItems` wird definiert, um rekursiv die HTML-Struktur für jedes Navigationselement zu erstellen. Dabei werden verschiedene CSS-Klassen basierend auf den Eigenschaften des Navigationselements gesetzt, wie z.B. `active`, `current` und `has-child`. Die Funktion gibt den HTML-Code für das Navigationselement als String zurück.

    In der Schleife `foreach ($mainnavi_array as $navi)` wird über jedes Element in der generierten Hauptnavigation iteriert. Das Feld `navtype` wird in ein Array `$navtype_arr` aufgeteilt, indem der Wert anhand des Trennzeichens `|` gesplittet wird. Wenn der Wert `main` in `$navtype_arr` enthalten ist, wird die Funktion `createNavigationItems` aufgerufen und das generierte Navigationselement wird dem Array `$mainnavigation_items` hinzugefügt.

    Schließlich wird die Hauptnavigation als HTML-Code in der Variable `$mainnavigation` gespeichert, indem die einzelnen Navigationselemente mit `implode` zu einem String zusammengefügt werden.

    Das Feld `cat_navigationstyp` hat derzeit die Werte "meta, main, footer". Es wird verwendet, um zu bestimmen, welche Navigationselemente in der Hauptnavigation angezeigt werden sollen. In diesem Fall werden nur die Elemente angezeigt, deren `navtype` den Wert 'main' enthält.

    #### Beispiel: Bootstrap 5 Navigation

    ```php
    ';
    $sub[] = bsnavi5($cat['children']);
    $sub[] = '';
    $subnavi = join("\n", $sub);
    }

    $catname = $cat['catName'];
    if ($cat['active'] == true) {
    $active = ' active';
    }

    $catname = '' . $catname . '';
    $output[] = '

  • ' . $catname . $subnavi . '
  • ';
    }
    return implode("\n", $output);
    }

    use FriendsOfRedaxo\NavigationArray\BuildArray;
    $NavigationArray = BuildArray::create()->setDepth(4)->generate();
    ?>