UWAGA: Strona zawiera materiały archiwalne. Większość artykułów dotyczy Joomla! 1.0
Start arrow Programowanie arrow Poradniki arrow Tworzenie komponentu w Mambo CMS
Tworzenie komponentu w Mambo CMS - Wstęp Drukuj Email
Spis treści
Wstęp
dailymessage.php
admin.dailymessage.php
admin.dailymessage.html.php
toolbar.dailymessage.php
toolbar.dailymessage.html.php
install.dailymessage.php i uninstall.dailymessage.php
dailymessage.xml
Dodatek 1. Komponenty versus Moduły
Dodatek 2: Zakładki na stronach administracyjnych

Ten plik zawiera logikę administracyjnej strony komponentu, czyli reakcję na Twoje klikanie w panelu administracyjnym. Plik zawiera tylko kod PHP, natomiast aktualny kod HTML generowany na stronach jest generowany poprzez klasę HTML_joeDailyMessage zdefiniowaną w pliku admin.dailymessage.html.php.

Uwaga!Krótko mówiąc tutaj definiujemy, co zrobić, kiedy klikniemy na administratorskim pasku narzędzi na ikonie ’Zapisz’, ’Nowy’ itp.

<?php 
     defined('_VALID_MOS') or die('Direct Access to this location is not allowed.');
 
// ensure user has access to this function
     if (!($acl->acl_check( 'administration', 'edit', 'users', 
          $my->usertype, 'components', 'all' )
          | $acl->acl_check( 'administration', 'edit', 'users', 
 
      $my->usertype, 'components', 'com_newsfeeds' ))) {
         mosRedirect( 'index2.php', _NOT_AUTH );
}

Pierwsza linia jest nam już znana z opisu poprzedniego pliku. Kolejne linie sprawdzają, czy użytkownik otwierający ten plik, ma uprawnienia administratora.

     require_once( $mainframe->getPath( 'admin_html' ) );
     require_once( $mainframe->getPath( 'class' ) );

Teraz wczytujemy pliki admin.dailymessage.html.php and dailymessage.class.php. Funkcja getPath() zwraca odpowiednie ścieżki i nazwy plików.

 
     $id = mosGetParam( $_REQUEST, 'cid', array(0) );
          if (!is_array( $id )) {
          $id = array(0);
     }

Lista wiadomości dnia (jak i większość głównych stron administracyjnych komponentów) posiada po lewej stronie zestaw checkboxów pod nazwą zaczynającą się na 'cid'. Funkcja mosGetParm() zwraca nam wszystkie te checkboxy w tablicy $id. Jeśli taka tablica jest niedostępna (np. gdy strona ładuje się pierwszy raz), $id ustawia się na pustą tablicę, co pozwala na unikniecie ewentualnych błędów w przetwarzaniu.

     switch($act) {
 
         case "configure":
               switch($task) {
                    case "save":
                         saveConfiguration($option);
                         break;
                default:
                         listConfiguration($option);
                         break;
               }
          break;
          default:
 
     switch ($task) {
               case "save" :
                    save($option);
               break;
               case "edit" :
                    edit( $option, $id );
               break;
               case "new" :
                    $id = '';
                    edit( $option, $id);
               break;
 
               case "delete" :
                    del($option, $id);
               break;
 
               case "publish" :
                    publishMessage($option, '1', $id);
               break;
 
               case "unpublish" :
                    publishMessage($option, '0', $id);
               break;
 
               case "listMessages" :
               default:
                    listMessages($option);
               break;
 
               }
          break;
      }

Teraz jest dobry moment do omówienia różnic pomiędzy zmiennymi $task i $act. Kiedy administrator klika na przycisk ’Zapisz’ lub ’Publikuj’, wybór ten musi zostać przekazany do komponentu, dokonuje się to poprzez zmienną $task . Dodatkowo ikony te mogą być użyte w różnych podmenu komponentu. Komponent musi dokładnie wiedzieć, o którą funkcjonalność nam chodzi. Wtedy właśnie używamy zmiennej $act. W naszym przypadku komponent Daily Message (Wiadomość Dnia) ma dwa podmenu : Edit Messages (Edytuj Wiadomośći) oraz Config (Konfiguruj). Podmenu te są identyfikowane, przez $act jako odpowiednio ’all’ oraz ’configure’.

Komponent Daily Message (Wiadomość Dnia) używa zagnieżdżonych poleceń switch, aby stwierdzić, jaką akcję powinien podjąć. Zewnętrzny switch bazuje na zawartości zmiennej $act, ponieważ oba podmenu ’all’ i ’configure’ używają takich samych zadań ($task). Tak więc najpierw sprawdzamy zmienną $act a potem zmienną $task.

Uwaga!Użycie poleceń switch dokładnie odzwierciedla menu komponentu w panelu administratora oraz pasek narzędzi (toolbar) w każdym z podmenu. W przypadku znalezienia odpowiedniego $task jesteśmy odsyłani do funkcji obsługującej dane zdarzenie. Funkcje zdefiniowane są w tym samym pliku.

function saveConfiguration($option) {
     global $database;
     $row = new joeDailyMessageConf($database);

Teraz zdefiniujemy funkcje obsługujące różne zadania. Pierwsza z nich zapisze w bazie danych ustawienia, kiedy klikniesz na przycisku ’Zapisz’ na stronie konfiguracji komponentu. Parametrem funkcji jest zmienna $option ustawiona przez Mambo na nazwę komponentu, którego dotyczy akcja, w naszym przypadku to ’com_dailymessage’. Pozwoli nam to zakodować później przekierowanie powrotne do panelu administracyjnego komponentu. Następna linia jest nam znana. Powoduje, że obiekt bazy danych jest dostępny w funkcji. Deklarujemy nowy obiekt $row typu joeDailyMessageConf (klasa zdefiniowana w pliku dailymessage.class.php), który jest rozszerzeniem standardowej klasy w Mambo - mosDBTable. Obiekty bazujące na mosDBTable mają wiele funkcji ułatwiających proces zapisywania informacji w bazie danych.

// bind it to the table
     if (!$row -> bind($_POST)) {
          echo "<script> alert('"
          .$row -> getError()
          ."'); window.history.go(-1); </script>\n";
          exit();
     }

Ten fragment używając odziedziczonej z klasy mosDBTable funkcji bind(), próbuje uzyskać wartości z tablicy _POST i przypisać je do odpowiednich zmiennych obiektu $row. Jeśli próba jest nieudana (np., nazwy zmiennych nie pasują lub ich typ jest się nie zgadza), przy użyciu Javascript wyświetlany jest błąd i wykonanie dalszego kodu jest zatrzymane. Bład pojawia się jako okienko popup wraz z przyciskiem przekierowującym nas do poprzedniej strony.

Uwaga!To przypisanie to próba spasowania wszystkich zmiennych przekazanych jako parametry HTML-owego formularza do kolumn tablicy bazie danych. Czyli wyobraźcie sobie, że zmieniacie ustawienia konfiguracyjne wpisując/zmieniając dane w odpowiednim formularzu HTML a potem chcąc zapisać te dane są one przekazane tutaj w tablicy _POST pod odpowiednimi nazwami odpowiadającymi nazwom kolumn tabeli konfiguracyjnej komponentu w bazie danych.

// store it in the db
     if (!$row -> store()) {
          echo "<script> alert('"
          .$row -> getError()
          ."'); window.history.go(-1); </script>\n";
     exit();
     }

Kiedy już spasowaliśmy wszystkie informacje i przechowujemy je w obiekcie $row, to możemy zapisać je do bazy danych, używając funkcji store(). Obsługa ewentualnych błędów jest analogiczna do powyższego fragmentu.

     mosRedirect("index2.php?option=$option&act=configure", "Configuration Saved");
 }

Na zakończeniu, jeśli powiodły się wszystkie poprzednie kroki, użytkownik jest przekierowywany z powrotem do strony konfiguracyjnej komponentu oraz na górze strony wyświetlany jest komunikat 'Configuration Saved' (Ustawienia Zapisane). Zmienna $option, zawiera informacje przekazaną jako parametr (com_dailymessage) i powiadamia, Mambo, aby otworzyło teraz panel administracyjny komponentu Daily Message (Wiadomość Dnia). Zauważcie, że odnośnik zawiera zmienną $act ustawioną na 'configure'. Jeśli by tego tam nie było, użytkownik zostałby przekierowany do domyślnej strony administracyjnej komponentu, czyli w naszym przypadku: edycja wiadomości.

function listConfiguration($option) {
     global $database;
 
     $database->setQuery("SELECT * FROM #__joe_dailymessage_conf"  );
     $rows = $database -> loadObjectList();

Kolejna funkcja obsługuje wyświetlanie ustawień. Odczytuje aktualną konfigurację komponentu z bazy danych i wyświetla ją na formularzu, gdzie ustawienia mogą być edytowane według potrzeb administratora. Odpowiednie zapytanie jest skierowane do bazy danych, a jego wynik zapisujemy w obiekcie $rows. Szczegóły opisałem w powyższej funkcji.

     if ($database -> getErrorNum()) {
          echo $database -> stderr();
          return false;
     }

Jeżeli wystąpił błąd podczas przetwarzania zapytania do bazy danych, ten fragment kodu wyświetli przyczynę błędu oraz zatrzyma funkcję, aczkolwiek pozwoli Mambo na zakończenie ładowania strony bez danych konfiguracyjnych pobranych z bazy danych.

 
     HTML_joeDailyMessage::listConfiguration($option, $rows);
     }

Tutaj następuje wywołanie funkcji listConfiguration z obiektu HTML_joeDailyMessage, który zdefiniowaliśmy w pliku admin.dailymessage.html.php. Parametrami są nazwa komponentu ($option) oraz dane konfiguracyjne pobrane z bazy danych ($rows).

Uwaga!Wywoływana tutaj funkcja ma za zadanie wygenerować kod HTML budujący formularz oraz wypełnić go danymi.

function publishMessage( $option, $publish=1 ,$cid ) {
   global $database, $my;
    if (!is_array( $cid ) || count( $cid ) < 1) {
       $action = $publish ? 'publish' : 'unpublish';
       echo "<script>alert('Select an item to $action'); window.history.go(-1);</script>\n";
       exit;
    }

Kiedy administrator chce opublikować wiadomość, ta funkcja ustawia znacznik 'publikacja' tej wiadomości. Musimy najpierw sprawdzić, czy administrator wybrał jakąś wiadomość do publikacji

Uwaga!(w opisie poprzedniego pliku objaśniłem, co to jest tablica $cid, jest to zbiór zaznaczonych checkboxsów po lewej stronie panelu administracyjnegokomponentu).
Jeżeli administrator nie zaznaczył żadnej wiadomości do opublikowania, wyświetlamy odpowiedni komunikat w Javascript i wysyłamy go do poprzedniej strony. Wiersz gdzie przypisujemy wartość zmiennej $action jest skróconą wersją polecenia 'if'. Zmiennej $action przypisujemy napis ’publish’ jeśli zmienna $publish równa się 1, w przeciwnym przypadku zmiennej $action przypisujemy napis ’unpublish’.

     $cids = implode( ',', $cid );

Jeśli administrator wybrał kilka wiadomości do publikacji, tworzymy zmienną $cids, która zawiera listę wartości z tablicy $cid rozdzielonych przecinkiem. Zabieg ten ułatwi nam aktualizację bazy danych.

     $database->setQuery( "UPDATE #__joe_dailymessage SET published='$publish'"
     . "\nWHERE id IN ($cids)"
);
     if (!$database->query()) {
          echo "<script> alert('".$database->getErrorMsg()."'); 
             window.history.go(-1); </script>n";
          exit();
     }

Zapytanie aktualizuje bazę danych informacją o publikacji/niepublikowaniu. Jakiekolwiek błędy towarzyszące zapytaniu są wyświetlane poprzez Javascript.

     mosRedirect( "index2.php?option=$option" );
 }

W ostatnim kroku administrator jest przekierowywany do domyślnej strony administracyjnej komponentu przekazanego w zmiennej $option, czyli ’com_dailymessage’.

function save($option) {
     global $database;
 
     $row = new joeDailyMessage($database);
 
// bind it to the table
     if (!$row -> bind($_POST)) {
          echo "<script> alert('"
          .$row -> getError()
          ."'); window.history.go(-1); </script>\n";
          exit();
     }
 
// store it in the db
    if (!$row -> store()) {
        echo "<script> alert('"
        .$row -> getError()
        ."'); window.history.go(-1); </script>\n";
        exit();
    }
    mosRedirect("index2.php?option=$option", "Saved");
    }

Funkcja jest prawie identyczna do funkcji saveConfiguration, różnica polega na użyciu innego typu obiektu - joeDailyMessage oraz przekierowaniu do domyślnej strony administracyjnej komponentu (edytowanie wiadomości) wraz z wiadomością ’Saved’ (Zapisane).

Uwaga!Po prostu zapisujemy inne informacje i dlatego musimy użyć obiektu odzwierciedlającego dane z tablicy z wiadomościami. Pozostała funkcjonalność jest taka sama, polecam więc analizę funkcji saveConfiguration.

function del($option, $cid) {
    global $database;
 
    if (!is_array($cid) || count($cid) < 1) {
        echo "<script> alert('Select an item to delete'); window.history.go(-1);</script>\n";
        exit();
    }

Lista wiadomości do skasowania jest przekazana jako parametr tej funkcji. Jeśli parametr nie jest tablicą lub nie zawiera elementów, odpowiedni komunikat jest wyświetlany i administrator jest przekierowany do poprzedniej strony.

    if (count($cid)) {
        $ids = implode(',', $cid);
        $database->setQuery("DELETE FROM #__joe_dailymessage WHERE id IN ($ids)");
    }

Sprawdzając po raz kolejny, że wybrane zostały wiadomości do skasowania, tworzymy zapytanie do bazy danych powodujące ich skasowanie.

    if (!$database->query()) {
        echo "<script> alert('"
        .$database -> getErrorMsg()
        ."'); window.history.go(-1); </script>\n";
    }
    mosRedirect("index2.php?option=$option");
   }

Zapytanie kasujące jest wykonywane wraz ze standardową obsługą ewentualnych błędów. Następuje przekierowanie do domyślnej strony administracyjnej komponentu.

function edit($option, $uid) {
    global $database;
 
    if($uid){
        $row = new joeDailyMessage($database);
        $row -> load($uid[0]);
    }

Jeśli administrator wybierze wiadomość do edycji, ta funkcja tworzy odpowiedni obiekt odpowiadający kolumnom tabeli z wiadomościami oraz wypełnia go informacjami przekazanymi w parametrze $uid. Ponieważ edytujemy jedną wiadomość na raz, szukane informacje są w pierwszym wierszu tablicy $uid ($uid[0]). Przekazujemy je do obiektu $row.

    HTML_joeDailyMessage::edit($option, $row);
    }

Wywołujemy funkcję edit z klasy HTML_joeDailyMessage, która generuje odpowiedni formularz HTML i wypełnia go danymi z obiektu $row.

function listMessages($option) {
    global $database;
 
    $database->setQuery("SELECT * FROM #__joe_dailymessage ORDER BY id"  );

Ostatnia funkcja wyświetla domyślną strone administracyjną komponentu. Jeśli nie wybierzesz żadnego zadania ($task), ta funkcja wyświetli wszystkie Wiadomości Dnia pozwalając administratorowi na ich edycje, kasowanie, publikacje/nie publikacje. Zapytanie pozwala odczytać całą zawartość tablicy z wiadomościami dnia. Są one posortowane według identyfikatora, który w bazie danych jest ustawiony na autozwiększanie. W ten sposób możemy stworzyć unikatowy klucz w bazie danych oraz wyświetlić wiadomości według ich kolejności powstania.

    $rows = $database -> loadObjectList();
        if ($database -> getErrorNum()) {
        echo $database -> stderr();
    return false;
    }
    HTML_joeDailyMessage::listMessages($option, $rows);
 }
?>

Wykonujemy zapytania, wyświetlamy na stronie wynikowej wszystkie ewentualne błedy. Funkcja listMessages() w klasie HTML_joeDailyMessage wygeneruje kod HTML pokazujący wszystkie wiadomości na stronie.



Zmieniony ( 14.12.2007. )
 
« poprzedni artykuł