Jak stworzyć moduł usługi?

Poradnik został napisany bardzo powierzchownie. Aby w pełni nauczyć się tworzenia modułów usług, musisz zaznajomić się z kodem już stworzonych modułów.
Moduł usługi to zestaw metod umożliwiających stworzenie nowej usługi, a następnie obsługiwanie jej. Zadaniem modułu usługi jest między innymi: Co MUSISZ umieć, aby stworzyć moduł usługi: Podstawowa nomenklatura:
Podstawowe informacje o funkcjonowaniu modułów usług w sklepie SMS
Zaczynamy kodzić!
  1. Tworzymy plik id_modulu.php i wrzucamy go do lokalizacji: includes/services/. Jego szkielet powinien wyglądać następująco: 01| <?php
    02|
    03| $heart
    ->register_service_module("example""Przykład""ServiceExample""ServiceExampleSimple");
    04|
    05| class 
    ServiceExampleSimple extends Service
    06|
    {
    07|     const 
    MODULE_ID "example";
    08| }
    09|
    10| class 
    ServiceExample extends ServiceExampleSimple
    11|
    {
    12| }
    1. W linii 3-ciej informujemy silnik, że nasz moduł istnieje.
      • 1 argument - id modułu (każdy moduł musi mieć unikalny identyfikator)
      • 2 argument - nazwa modułu przyjazna oczom
      • 3 argument - nazwa klasy modułu
      • 4 argument - nazwa klasy simple modułu
    2. W linii 7-mej podajemy takie samo ID jak w 1 argumencie metody register_service_module.
    3. W tym momencie możemy już utworzyć nową usługę, którą będzie obsługiwał nasz moduł (PA -> Usługi -> Dodaj usługę)
  2. Moduł możemy teraz rozszerzać o dodatkowe funkcjonalności (które będziemy musieli zakodzić). Lista interfejsów, które moduł może implementować znajduje się w lokalizacji: includes/services/interfaces/.
  3. Przykładowy moduł implementujący interfejsy IService_Purchase oraz IService_PurchaseOutside 01| <?php
    02|
    03| $heart
    ->register_service_module("example""Inne""ServiceExample""ServiceExampleSimple");
    04|
    05| class 
    ServiceExampleSimple extends Service implements IService_CreateIService_AdminManage
    06|
    {
    07|     const 
    MODULE_ID "example";
    08| }
    09|
    10| class 
    ServiceExample extends ServiceExampleSimple implements IService_PurchaseIService_PurchaseOutside
    11|
    {
    12|
    13|     
    /**
    14|      * Metoda która sprawdza poprawność wprowadzonych danych zakupu,
    15|      * wywoływana gdy zakup został przeprowadzony z zewnątrz, nie przez formularz na stronie WWW.
    16|      *
    17|      * @param Entity_Purchase $purchase_data
    18|      *
    19|      * @return array
    20|      *  status => string id wiadomości,
    21|      *  text => string treść wiadomości
    22|      *  positive => bool czy udało się przeprowadzić zakup czy nie
    23|      *  [data => array('warnings' => array())]
    24|      *  [purchase_data => Entity_Purchase dane zakupu]
    25|      */
    26|     
    public function purchase_data_validate($purchase_data)
    27|     {
    28|         global 
    $heart$db$lang;
    29|
    30|         
    $warnings = array();
    31|
    32|         
    // Serwer
    33|         
    $server = array();
    34|         if (!
    strlen($purchase_data->getOrder('server'))) {
    35|             
    $warnings['server'][] = $lang->must_choose_server;
    36|         }
    37|         else {
    38|             
    // Sprawdzanie czy serwer o danym id istnieje w bazie
    39|             
    $server $heart->get_server($purchase_data->getOrder('server'));
    40|
    41|             
    // Danej usługi nie można zakupić na danym serwerze
    42|             
    if (!$heart->server_service_linked($server['id'], $this->service['id']))
    43|                 
    $warnings['server'][] = $lang->chosen_incorrect_server;
    44|         }
    45|
    46|         
    // E-mail
    47|         
    if (strlen($purchase_data->getEmail()) && $warning check_for_warnings("email"$purchase_data->getEmail())) {
    48|             
    $warnings['email'] = array_merge((array)$warnings['email'], $warning);
    49|         }
    50|
    51|         
    // Jeżeli są jakieś błedy, to je zwróć
    52|         
    if (!empty($warnings)) {
    53|             return array(
    54|                 
    'status' => "warnings",
    55|                 
    'text' => $lang->form_wrong_filled,
    56|                 
    'positive' => false,
    57|                 
    'data' => array('warnings' => $warnings)
    58|             );
    59|         }
    60|
    61|         
    $purchase_data->setOrder(array(
    62|             
    'amount' => $price['amount']
    63|         ));
    64|
    65|         
    $purchase_data->setPayment(array(
    66|             
    'cost' => $heart->get_tariff_provision($purchase_data->getTariff())
    67|         ));
    68|
    69|         return array(
    70|             
    'status' => "ok",
    71|             
    'text' => $lang->purchase_form_validated,
    72|             
    'positive' => true,
    73|             
    'purchase_data' => $purchase_data
    74|         
    );
    75|     }
    76|
    77|     
    /**
    78|      * Metoda wywoływana, gdy usługa została prawidłowo zakupiona
    79|      *
    80|      * @param Entity_Purchase $purchase_data
    81|      * @return integer        value returned by function add_bought_service_info
    82|      */
    83|     
    public function purchase($purchase_data)
    84|     {
    85|         return 
    add_bought_service_info(
    86|             
    $purchase_data->user->getUid(), $purchase_data->user->getUsername(), $purchase_data->user->getLastip(), $purchase_data->getPayment('method'),
    87|             
    $purchase_data->getPayment('payment_id'), $this->service['id'], $purchase_data->getOrder('server'), $purchase_data->getOrder('amount'),
    88|             
    $purchase_data->getOrder('auth_data'), $purchase_data->getEmail()
    89|         );
    90|     }
    91|
    92| }
    93|
  4. Każdy moduł może przechowywać dodatkowe pliki (js, html, css) w odpowiednich folderach:
    • includes/languages/id_jezyka/id_modulu.php - biblioteka językowa ładowana zawsze
    • jscripts[/admin]/pages/id_modulu.js - plik *.js ładowany tylko na konkertnej stronie
    • jscripts/services/id_modulu.js - plik *.js ładowany zawsze
    • styles[/admin]/pages/id_modulu.css - plik *.css ładowany tylko na konkertnej stronie
    • styles/services/id_modulu.css - plik *.css ładowany zawsze
    • themes/id_motywu/services/id_modulu/* - tutaj powinny się znajdować wszystkie szablony *.html z których korzysta moduł