Formulare: filtr pro vypis dat z DB → postup zpracovani dat z formulare?
- ras
- Člen | 135
Ahoj vsem,
jako zacatecnik s Nette citim, ze mi neco utika a tak bych se chtel zeptat
na radu.
Mam jednoduchy prehled udaju nacitanych s databaze. Model poresi dotaz a
presenter preda data sablone a ta je zobrazi → klasika.
V sablone je krom vypsanych dat i formular, skrze ktery by melo byt mozne
zobrazovana data nejak filtrovat.
Co me trapi je, ze fakt jsem neprisel na zpusob, jak si zkontrolovany formular,
resp. jeho data nejak zpracovat a z modelu vzit data dle podminky z filtru a
ta pak pres presenter poslat opet do sablony + furmular mit nastaveny na nove
(zvolene) hodnote. Ve vysledku mi vzdy vse skoci do defaultu → vypsat vse. je
mi jasny, ze nekde mam totalni blbost, ale po nekolika hodinach zkouseni,
hledani, cteni a opetovneho hledani prosim o radu. DIKY.
Struktura (mimo jine):
- web_app\AdminModule\presenters
--> BasePresenter.php
--> SpravcePresenter.php
- web_app\AdminModule\templates\Spravce
--> prehledUzivatelu.latte
- web_app\control
-->AdminFilterUzivateleForm.php
- web_app\Model
--> Model.php
--> AdminModel.php
AdminModel.php
class AdminModel extends Model
{
function getDBcmsUzivateleAll()
{
return Model::$db->table('cms_uzivatele');
}
}
SpravcePresenter.php
public function renderPrehledUzivatelu()
{
$this->template->uziv2 = $allUsers->getDBcmsUzivateleAll();
// mam zde zatim toto, aby se mi neco vypisovalo --> problem je c. 1, ze nevim, jak sem dostat data z formulare, abych pak mohl pouzit neco jako
}
function createComponentFilterUzivateleForm()
{
$form = new \AdminFilterUzivateleForm();
$presenter = $this;
$form->onSuccess[] = function() use ($presenter) {
$presenter->redirect('this');
};
return $form;
}
AdminFilterUzivateleForm.php
class AdminFilterUzivateleForm extends Nette\Application\AppForm
{
public $onSuccess;
function __construct()
{
parent::__construct();
$this->addSelect('is_active', 'Aktivní:', array(2 => "vše", 1 => "ano", 0 => "ne",));
$this->addSubmit('filterDo', 'Filtruj');
$this->addProtection('Prosím odešlete formulář znovu (bezpečnostní prvek již není platný).');
$this->onSubmit[] = callback($this, "filterUzivateleSubmitted");
}
function filterUzivateleSubmitted()
{
$values = $this->getValues();
try {
$filtrovani = new \AdminModel();
if (isset($values["is_active"]) == true AND $values["is_active"] < 2)
{
// beru pouze data, ktera jsem si vyfiltroval
$filtrovani->getDBcmsUzivateleAll()->where("aktivni = ?", $values["is_active"]);
}
else
{
// beru vsechna data
$filtrovani->getDBcmsUzivateleAll();
}
// problem c. 2 je tady neb nevim jak dal pokracovat
$this->onSuccess($this);
} catch (Nette\Security\AuthenticationException $e) {
$this->addError($e->getMessage());
}
}
}
prehledUzivatele.latte
{block obsah_stranky}
<h2>Přehled uživatelů</h2>
{control filterUzivateleForm}
<table border="1" width="100%" summary="Prehled uzivatelu">
<thead>
<th>Editovat</th>
<th>ID</th>
<th>Jméno</th>
<th>Uživatel</th>
<th>Heslo</th>
<th>Email</th>
<th>Aktivní</th>
<th>Poslední příhlášení</th>
<th>Smazat</th>
</thead>
<tbody>
<tr n:foreach="$uziv2 as $uziv">
<td>EDIT</td>
<td>{$uziv->id}</td>
<td>{$uziv->prijmeni} {$uziv->krestni_jmeno}</td>
<td>{$uziv->uzivatelske_jmeno}</td>
<td>{$uziv->uzivatelske_heslo}</td>
<td>{$uziv->email}</td>
<td>{$uziv->aktivni}</td>
<td>{$uziv->posledni_prihlaseni|date:'d.m.Y H:m:s'}</td>
<td>SMAZAT</td>
</tr>
</tbody>
</table>
{/block}
Snad jsem Vam dodal veskere podklady.
- Filip Procházka
- Moderator | 4668
Je vcelku logické, že ti „nefungují“ filtry, protože vždy, když odešleš formulář, tak se výsledek sice vyfiltruje, ale opět přesměruješ stránku a podmínky tak ztratíš.
Ty musíš udělat to, že po odeslání formuláře filtry předáš do URL nebo do session, třeba takto:
$form->onSubmit[] = function ($form) {
$form->getPresenter()->redirect('this', array('filter' => $form->getValues()));
}
A pak při dalším renderování si filtry z url přečteš a logiku co máš teď po odeslání formuláře, by jsi měl mít v render.
- ras
- Člen | 135
HosipLan: Tak jsem se pokusil zapracovat to co jsi uvedl (snad na dobre misto) → vysledek
SpravcePresenter.php po aktualizaci
function createComponentFilterUzivateleForm()
{
$form = new \AdminFilterUzivateleForm();
$presenter = $this;
$form->onSubmit[] = function ($form)
{
$form->getPresenter()->redirect('this', array('filter' => $form->getValues())); // chybovy radek -> hlaska uvedena pod vypisem kodu
};
/*
$form->onSuccess[] = function() use ($presenter)
{
$presenter->redirect('this');
};
*/
return $form;
}
Ovsem vysledkem je hlaseni Recoverable Error, Object of class Nette\ArrayHash could not be converted to string
Mohu poprosit jeste o jedno popostrceni, DIKY.
- bojovyletoun
- Člen | 667
$form->getPresenter()->redirect('this', array('filter' => (array)$form->getValues()));
Po přetypování to chodí.
Editoval bojovyletoun (20. 4. 2011 17:18)