Autor | Zpráva | ||
---|---|---|---|
Beduin Profil * |
#1 · Zasláno: 3. 11. 2014, 16:55:36
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(). |
||
Časová prodleva: 10 dní
|
|||
Tori Profil |
#2 · Zasláno: 13. 11. 2014, 23:33:38
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. ;)
|
||
Časová prodleva: 10 let
|
0