wtorek, 15 lutego 2011

Automatyczne wyświetlanie submenu bez użycia taxonomii w CMSie Drupal

Głównym wymaganiem co do jednego z projektów nad którymi aktualnie pracuję jest maksymalne uproszczenie procesów zarządzania zawartością. W związku z tym postanowiłem za wszelką cenę ograniczyć do minimum ilość pól i list wyboru formularza dodawania zawartości. Jednak strona docelowo posiadała będzie dość rozbudowaną strukturę podstron co naturalnie sugeruje użycie systemu podmenu.


Intuicyjny interfejs = Logiczny interfejs


Już sobie wyobrażam jak przebiegała by rozmowa z klientem, któremu muszę wytłumaczyć, że aby na nowo tworzonej podstronie wyświetliło się odpowiednie podmenu w formularzu dodawania zawartości musi najpierw wybrać odpowiednią kategorię wpisu z listy kategorii, a później odpowiednie podmenu z listy menu. Nawet pomijając jego niezadowolenie mi byłoby głupio uznać takie rozwiązanie tego problemu za finalne.


Automatyzacja jedynym sposobem uniknięcia błędów


Jeśli zrezygnujemy z kategorii standardowe rozwiązania Drupala też nas nie rozpieszczają. Naturalnie nie jest bardzo skomplikowane utworzenie dodatkowych menu i wyświetlanie ich w jakimś bloku. Nie jest też niczym trudnym ustalenie wyświetlania bloku tylko na konkretnych podstronach. Nie jest to trudne, ale jest bardzo niewygodne, gdyż po dodaniu nowej podstrony trzeba wrócić do konfiguracji bloku. Inną sprawą jest fakt, że wpuszczanie niedoświadczonego użytkownika na stronę konfiguracji bloku jest mocno nieroztropne. Prawdopodobieństwo kłopotów przy takim podejściu jest podobne do tego gdy zwróci się uwagę dresiarzowi, że jego białe skarpety nie komponują się za dobrze z czarnym dresiwem.


11 linijek do szczęścia


Rozwiązanie tego problemu przynosi opcja wyświetlania bloku w zależności od strony z wykorzystaniem skryptu PHP. I znowu, nie mam pojęcia dlaczego, programiści Drupala postanowili nie ułatwiać nam za bardzo życia. Wystarczyłoby gdyby $node przetrzymywał nazwę menu, do których należy. Byłoby też minimalnie łatwiej gdyby zmienna $node była dostępna w polu PHP konfiguracji bloku. Niestety ani jedno, ani drugie nie jest dla nas dostępne. Na początku musimy przygotować więc funkcję, która sprawdzi do jakiego podmenu należy dany node. Umieszczamy ją w pliku template.php i wygląda ona tak:


<?php
function getSubmenu($nid){
  if($nid){
    $result = db_query("SELECT menu_name FROM {menu_links} WHERE link_path = '%s' LIMIT 1", 'node/'.$nid);
    $data = db_fetch_object($result);
    return $data->menu_name;
  }
  else return FALSE;
}
?>


Następnie wchodzimy w konfigurację bloku podmenu i zakładce 'Wyświetlanie zależne od strony' wybieramy ostatnie zaznaczenie: 'Wyświetlaj, jeśli poniższy kod PHP zwraca prawdę - TRUE (tryb PHP, tylko dla ekspertów).'. W polu tekstowym umieszczamy poniższy kod:


<?php
  if(arg(0) == 'node' && is_numeric(arg(1)) && (getSubmenu(arg(1)) == '[nazwa systemowa podmenu]'))
    return TRUE;
  else return FALSE;
?>

I gotowe. Rozwiązanie jak widać banalne, ale jego przydatność jest moim zdaniem nie do przecenienia.

Brak komentarzy:

Prześlij komentarz