Jak wyświetlić strukturę książki na stronie

Postanowiłem oprzeć czytelnię mojej strony dla gitarzystów basowych na module book (książka). Stworzyłem kilka książek (lekcje, recenzje, biografie, teoria). Wymyśliłem też, że ładnie by wyglądała strona, na której można by zobaczyć ileś tam ostatnich artykułów z każdej książki, tak aby dział „Czytelnia” był bardziej dla użytkowników przyjazny.

Poniżej każdej listy powinny też być wyświetlone 2 linki – jeden prowadzący do spisu treści książki, drugi zachęcający do dodania podstrony. W załączniku zrzut ekranu z efektów mojej pracy, a poniżej wyjaśnienie jak to zrobić.

Po szybkim przeglądnięciu drupal.org, znalazłem podobną poradę, i przerobiłem do swojego pomysłu.

Cała zabawa sprowadza się do wykonania kilku kroków:

  1. Znajdujemy numer segmentu który ma być dla nas ‚nadrzędny’. Może to być dowolna strona książki zawierająca podstrony, na przykład strona główna, lub rozdział. Numer segmentu to ten który widnieje na samym końcu adresu (np. dla mojastrona/node/25 numerem segmentu jest 25).
  2. Tworzymy zawartość (np. stronę/page) z wykorzystaniem formatu danych PHP.
  3. Na początku strony wklejamy funkcję
function book_struct_recurse($nid, $glebokosc, $ile_pokazac, $children, $current_lineage = array(), $emuluj_blok_book = true) {

   $struct = '';
   $licznik_book = 0;

   if ($children[$nid] && ($glebokosc > 0 || ($emuluj_blok_book && in_array($nid, $current_lineage)))) {
     $struct = '<ul>';
     foreach ($children[$nid] as $key => $node) {
       if ($licznik_book<$ile_pokazac) {
             $licznik_book++;
               if ($tree = book_struct_recurse($node->nid, $glebokosc - 1, $children, $current_lineage, $emuluj_blok_book)) {
                 $struct .= '<li class="expanded">';
                 $struct .= l($node->title, 'node/'. $node->nid);
                 $struct .= $tree;
                 $struct .= '</li>';
               }
               else {
                 if ($children[$node->nid]){
                   $struct .= '<li class="collapsed">'. l($node->title, 'node/'. $node->nid) .'</li>';
                 }
                 else {
                   $struct .= '<li class="leaf">'. l($node->title, 'node/'. $node->nid) .'</li>';
                 }
               }
             }
     }
     $struct .= '</ul><a href="http://adres-naszej-strony/node/'.$nid.'">więcej</a> :: <a href="http://adres-naszej-strony/node/add/book/parent/'.$nid.'">dodaj artykuł w tej kategorii</a>';
     return $struct;
   }
}



$current_lineage = array();
$children = null;
$result = db_query(db_rewrite_sql('SELECT n.nid, n.title, b.parent, b.weight FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.status = 1 ORDER BY b.nid DESC'));

while ($node = db_fetch_object($result)) {
if (!$children[$node->parent]) {
   $children[$node->parent] = array();
}
array_push($children[$node->parent], $node);

if (arg(0) == 'node' && is_numeric(arg(1)) && arg(1) == $node->nid) {
   $_temp = book_location($node);
   foreach ($_temp as $key => $val){
     $current_lineage[] = $val->nid;
   }
   $current_lineage[] = arg(1);
}
}

W kodzie funkcji zmieniamy tylko adres-naszej-strony na właściwy adres.

4. Następnie możemy już wielokrotnie wyświetlić jakiś zbiór ostatnich podstron, korzystając z funkcji:

echo book_struct_recurse(25, 1, 5,$children, $current_lineage, TRUE);

Gdzie pierwsze trzy liczby oznaczają:

  • 25 to numer segmentu nadrzędnego (np. spisu treści książki)
  • 1 to poziom ‚zagłębiania się’ skryptu w podstrony (tutaj 1 oznacza że zobaczymy tylko podstrony, 2 wyświetli nam jeszcze podstrony do tych podstron i tak dalej)
  • 5 oznacza ilość ostatnich artykułów jakie zostaną wyświetlone.

Oczywiście list możemy wyświetlić kilka, otaczając je dowolnym kodem HTML, tak aby powstała miła dla oka i czytelna strona.

Pozdrawiam drupalową brać!

Sposób wyświetlania odpowiedzi

Wybierz preferowany sposób wyświetlania odpowiedzi i kliknij "Zachowaj ustawienia", by wprowadzić zmiany.

Bardzo dobry poradnik. Jak

Bardzo dobry poradnik. Jak ja nie lubię php… muszę się kiedyś go w końcu nauczyć :) Fakt faktem poradnik działa, wyśmienicie. Palik – masz u mnie soczek ;) albo piwko.

Bo ludzie dużo mówią. Filozofia i Religia