Formulare: filtr pro vypis dat z DB → postup zpracovani dat z formulare?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ras
Člen | 135
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

$form->getPresenter()->redirect('this', array('filter' => (array)$form->getValues())); Po přetypování to chodí.

Editoval bojovyletoun (20. 4. 2011 17:18)

ras
Člen | 135
+
0
-

Diky za nakopnuti … je uzasne si uvedomit, jak po precteni jedne vety se zmeni pohled na tu stale stejnou hlasku ;o) → stacilo pretypovat na array

opraveny kod

$form->getPresenter()->redirect('this', array("filter" => (array) $form->getValues()));