| 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: 12 let
|
|||
0