Autor Zpráva
Beduin
Profil *
Tvořím modul na Prestashop, který bude v administraci zobrazovat nový tab (to mám hotové) a v rámci toho tabu bude další funkcionalita (nemám hotové; formulář, po jeho odeslání se zpracuje a zobrazí výsledek).

Potřeboval bych poradit, jak spravovat obsah a odchytávat POST v rámci toho tabu.

Vygooglil jsem, že potřebuju registrovat vlastní hook, ale není mi jasné, kde ho následně zavolám.

Co zatím mám:
/modules/crawler/crawler.php
<?php   
if (!defined('_PS_VERSION_'))
  exit;

class crawler extends Module
{
    public function __construct()
    {
        $this->name = 'crawler';
        $this->tab = 'administration';
        $this->version = '1.0.0';
        $this->author = '';
        $this->need_instance = 1;
        $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_); 
        $this->bootstrap = true;
     
        parent::__construct();
     
        $this->displayName = $this->l('Crawler');
        $this->description = $this->l('Crawler');
     
        $this->confirmUninstall = $this->l('Určitě chcete tento modul odinstalovat?');
     }


      public function install()
    {
        if (!parent::install())
            return false;
        $this->installModuleTab('AdminCrawlerTab', array(1=>'Crawler'), 0);
          return true;
    }

    private function installModuleTab($tabClass, $tabName, $idTabParent)
       {
           if (!$tabid = Tab::getIdFromClassName($tabClass))
           {
          $tab = new Tab();
          $tab->name = $tabName;
          $tab->class_name = $tabClass;
          $tab->module = $this->name;
          $tab->id_parent = $idTabParent;
          $tab->active = 1;
          $tab->save();
          }
          else $tab = new Tab((int)$tabid);
          return $tabid;
      }

    public function uninstall()
    {
        if (!parent::uninstall())
            return false;
        $this->uninstallModuleTab('AdminCrawlerTab');
          return true;
    }

    private function uninstallModuleTab($tabClass)
    {
        if ($id_tab = Tab::getIdFromClassName($tabClass))
        {
            $tab = new Tab((int) $id_tab);
            $tab->delete();
        }
        return true;
    }
}

/modules/crawler/controllers/admin/AdminCrawlerTabController.php
<?php
include_once(dirname(__FILE__).'/../../crawler.php');

class AdminCrawlerTabController extends AdminController
{
    public function __construct()
    {
        parent::__construct();
    }

    public function display()
    {
        parent::display();
    }

    public function renderList()
    {
        return $this->context->smarty->fetch(dirname(__FILE__).'/../../views/templates/admin/template.tpl');
    }  
}
?>

Právě teď se mi zobrazí formulář z toho template.tpl, ale netuším, kam mám uvést action parametr a jaké další úpravy v kódu, aby se správně zpracoval, případně aby se následně zobrazila jiná stránka než ta vyvolaná metodou renderList().
Tori
Profil
Ke čtení dat z formuláře není potřeba hook, pokud vím. Potřebujete opravdu kontroler? IMHO je modul s kontrolerem (a ORM entitou) užitečný v případě, že modul bude mít vlastní tabulku s daty, která chcete zobrazit, editovat, a provádět s nimi nějaké další akce (např. jako výpis produktů, kategorií,...). Pokud v tom formuláři jen editujete nastavení modulu, které ukládáte pomocí třídy Configuration, anebo data z formuláře použijete jen jednorázově na nějakou akci, tak stačí použít samotný modul bez kontroleru.

Controller zobrazuje tři základní typy stránek:
- tabulkový výpis dat z DB tabulky přiřazené tomuto modulu (metoda renderList)
- volitelný formulář s nastaveními modulu, který se zobrazuje pod tímto výpisem (metoda renderOptions)
- editace dat z toho výpisu (metoda renderForm)
Do výpisu dat se dá ke každému záznamu snadno přidat další akce (výchozí jsou editovat + smazat, $controller->addRowAction('názevAkce');), anebo společná akce pro všechny zaškrtnuté položky (např. hromadné mazání, $controller->bulk_actions['názevAkce'] = array('text' => $this->l('popisek tlačítka akce'));). Na zpracování požadavku si přidáte metodu processNázevAkce(), resp. processBulkNázevAkce() (pro jednořádkovou resp. hromadnou akci). Načtení dat z formuláře je taky jednoduché.
A kontroler by měl každopádně dědit od ModuleAdminController, když je spojený s modulem.

Modul bez kontroleru má jedinou metodu pro zobrazení obsahu, getContent, která vrací už vygenerované HTML. Formulář si můžete nechat vygenerovat stejným způsobem, jako v kontroleru, ale kromě metody, co zpracuje přijatá data, si musíte ještě doplnit:
- vytvoření instance HelperForm
- zachycení odeslání formuláře (stačí podmínka if (Tools::isSubmit('submit'.$this->name)) v metodě getContent - teda za předpokladu, že jste formulář vygeneroval tím helperem)
Data z formuláře získáte stat. metodou Tools::getValue. Na rozdíl od kontroleru tady není žádná názvová konvence (jako metody process* nebo render*), ale asi bych se jí ze zvyku držela.

Generování formuláře helperem má výhodu v tom, že se snadno přizpůsobí jakémukoli vzhledu - přesněji, s výchozími šablonami bude vypadat přirozeně v PS 1.6, 1.5 i 1.4. Vlastní šablona může být v některé verzi rozbitá (je dost rozdíl mezi 1.5 a 1.6), ale zase umožňuje libovolnou strukturu formuláře. Klidně napište, co chcete ve formuláři použít, řeknu vám, jestli to HelperForm umí nebo ne. ;)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: