Jak vypsta filtrovaná data

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

Potřeboval bych poradit jak vykreslit filtrovany data:
Presenter:

<?php
use Nette\Application\AppForm;

class HomepagePresenter extends BasePresenter
{

       protected function startup() {
        if(!$this->getUser()->isLoggedIn()){
          if($this->getUser()->getLogoutReason() === Nette\Web\User::INACTIVITY) {
          }
            $this->redirect('Login:');
        }

        parent::startup();
    }
        public function renderDefault(){
            $this->template->koment = KomentarModel::fetchAll();
        }
        protected function createComponentFiltr($name)
        {
            $prom = KomentarModel::filtruj();
            $form = new AppForm;
            $form->addSelect('uzivatel', 'Podle uzivatele', $prom);
            $form->addSubmit('send','Filtruj');
            $form->onSubmit[] = callback($this,'renderFiltr');
            return $form;
        }

        public function filtrSubmitted(AppForm $form)
        {
            $data = $form->getValues();
            $id = (int)$data['uzivatel'];


        }
?>

Šablona:

<?php
{block content}
{widget filtr}
{foreach $koment as $post}
<div>
    <p>Uzivatel: {$post['username']} | datum: {$post['datum']|date}</p>
    <p>{$post['text']}</p>
</div>
{/foreach}
?>

Potřebuju docílit toho, že po vybrání autora v selectboxu se mi vyfiltrujou komentáře pouze tohoto autora.Poradtě prosím co bych asi tak měl dopsat do této metody?

<?php
        public function filtrSubmitted(AppForm $form)
        {
            $data = $form->getValues();
            $id = (int)$data['uzivatel'];


        }
?>

Editoval Milhaus87 (23. 2. 2011 22:21)

bojovyletoun
Člen | 667
+
0
-

nemáš na mysli něco podobného – dole jsem napsal můj nápad

` $id = (int)$data[‚uzivatel‘];` je vadné. Ta proměnná se ztratí- nemyslsel jsi $this->id?

Editoval bojovyletoun (23. 2. 2011 22:14)

Milhaus87
Člen | 22
+
0
-

Jsem to upravil aby tam nebylo zbytečnýho kódu navic. Jde mi jenom o to aby když si vyberu uživatele „Milan“ a dám odeslat tak aby jsem mi i klidne do jine sablony vypsali příspevky od „Milana“. Ajax na to snad potřebovat ani nebudu snad.

Editoval Milhaus87 (23. 2. 2011 22:25)

Milhaus87
Člen | 22
+
0
-

Vážně nikdo nevíte jak nato?

srigi
Nette Blogger | 558
+
0
-

@Milhaus87 V prvom rade by si mal spojit vykreslovanie tych komentov s formularom do komponenty. Zahod celu Render metodu, zo sablony vyhod foreach a nechaj tam iba widget (premenuj si to na control, widget je deprecated!)

Do tovarnicky komponenty daj iba:

protected function createComponentFiltr($name)
{
  $filtr = new \Components\Filtr($this, $name);
}

Zaloz si novy subor app/components/Filtr.php a jeho sablonu app/components/filtr.latte.

Do app/components/Filtr.php daj cca takyto kod:

<?php
namespace Components;

class Filtr extends \Nette\Application\Control
{
    private $filters = null;

    public function render() {
        $this->template->setFile(__DIR__ . '/filtr.latte');
        $this->template->koment = $this->getKoment();
        $this->template->render();
    }

    private function getKoment() {
        return \KomentarModel::fetchByFilter($this->filters);
    }
}

Nejko do toho Filtr komponentu nalep ten tvoj formular, tak aby jeho onSubmit metoda menila tu private property $filters. Bohuzial teraz uz nemam cas ti to tu napisat.

Editoval srigi (25. 2. 2011 17:26)

Milhaus87
Člen | 22
+
0
-

Díky za radu. Asi to ale nechápu mam to teda takhle udělany. Ale když dám filtrovat tak mi to hodí error Call to undefined method HomepagePresenter::filtrSubmitted().

app/components/Filtr.php

<?php
namespace Components;

class Period extends \Nette\Application\Control
{
    private $filters = null;

    public function render() {
        $this->template->setFile(__DIR__ . '/filtr.latte');
        $this->template->koment = $this->getKoment();
        $this->template->render();
    }

    private function getKoment() {
        return \KomentarModel::filtrace($this->filters);
    }
    public function setFilters($data)
    {
        $this->filters = $data;
    }
}
?>

šablona filtr.latte

<?php
{block content}
{foreach $koment as $kom}
{$kom['text']}
{/foreach}
?>

Model

<?php

use Nette\Object;

class KomentarModel extends Object {

    public static function filtruj()
    {
        return dibi::fetchPairs('Select distinct komentare.id_uzivatele,username from users join komentare on
                users.id_uzivatele = komentare.id_uzivatele');
    }
    public static function filtrace($id)
    {
        return dibi::fetchAll('select username,datum,text from users join komentare on
            users.id_uzivatele = komentare.id_uzivatele where komentare.id_uzivatele = %i order by id_komentare DESC'
            ,$id);
    }
}
?>

HomepagePresenter

<?php
use Nette\Application\AppForm;
use Components\Period;

class HomepagePresenter extends BasePresenter
{

       protected function startup() {
        if(!$this->getUser()->isLoggedIn()){
          if($this->getUser()->getLogoutReason() === Nette\Web\User::INACTIVITY) {
          }
            $this->redirect('Login:');
        }

        parent::startup();
    }
        public function renderDefault(){

        }

        protected function createComponentFiltr($name)
        {

            $prom = KomentarModel::filtruj();
            $form = new AppForm;
            $form->addSelect('uzivatel', 'Podle uzivatele', $prom);
            $form->addSubmit('send','Filtruj');
            $form->onSubmit[] = callback($this,'filtrSubmitted');
            return $form;
        }

        private function filtrSubmitted(AppForm $form)
        {
            $filtr = new Period;
            $data = $form->getValues();
            $id = (int) $data['uzivatel'];
            $filtr->setFilters($id);
            $this->redirect('default');
        }
}
?>

šablona

<?php
{block content}
{control filtr}
?>

Editoval Milhaus87 (24. 2. 2011 14:25)

Michalek
Člen | 211
+
0
-

Neměla by filtrSubmitted() být public, místo private?

Milhaus87
Člen | 22
+
0
-

Jo to by měla to jsem přehlédl. Nic méně to teď celé projde ale do šablony se mi nic nevypíše.

Editoval Milhaus87 (24. 2. 2011 14:26)

bojovyletoun
Člen | 667
+
0
-

To asi neřeším problém, ale podle mě redirect v FiltrSubmitted nemá být,

Milhaus87
Člen | 22
+
0
-

Tak jsem to vyřešil takhle a chci se zeptat je to tak dobře? Nebo by jste to řešili úplně jinak?

app\components

<?php
namespace Komponenta;
/**
 * Description of MojeKomponenta
 *
 * @author Milan
 */
class MojeKomponenta extends \Nette\Application\Control{

    private $filter = null;

    public function render()
    {
        $this->template->setFile(__DIR__ .'/sablona.phtml');
        $this->template->koment = $this->getKoment();
        $this->template->render();
    }

    private function getKoment() {

        if($this->filter == null){
         return \KomentareModel::fetchAll();
        }else{
        return \KomentareModel::fetchByFilter($this->filter);
        }
    }

    public function setKoment($data) {
        $this->filter = $data;
    }
}?>
šablona komponenty
<?php
{block content}
{foreach $koment as $kom}
<p>{$kom['text']}</p>
{/foreach}
?>

model

<?php

use Nette\Object;

class KomentareModel extends Object {

    public static function fetchByFilter($id) {
        return dibi::fetchAll('SELECT * FROM komentare where id_uzivatele = %i',$id);
    }

    public static function filtruj() {
        return dibi::fetchPairs('Select distinct komentare.id_uzivatele,username from users join komentare on
                users.id_uzivatele = komentare.id_uzivatele');
    }

    public static function fetchAll() {
        return dibi::fetchAll('Select * from komentare');
    }
}
?>

HomepagePresenter

<?php
use Nette\Application\AppForm;

class HomepagePresenter extends BasePresenter
{
private $id_filter = null;

	public function renderDefault()
	{

	}

        protected function createComponentFiltr($name) {
            $fil = new Komponenta\MojeKomponenta($this, $name);
            $fil->setKoment($this->vrat());

        }

        protected function createComponentForm($name) {
            $prom = KomentareModel::filtruj();
            $form = new AppForm($this, 'form');
            $form->addSelect('uzivatel', 'Podle uzivatele', $prom);
            $form->addSubmit('send');
            $form->onSubmit[] = callback($this,'formSubmitted');
            return $form;
        }

        public function formSubmitted(AppForm $form)
        {
            $data = $form->getValues();
            $this->id_filter = (int)$data['uzivatel'];

        }
        public function vrat()
        {
            return $this->id_filter;
        }
}
?>

Teď mi ale jde o tohle po odeslani formuláře adresa vypadá takhle

http://localhost/NetteFiltr/www/?do=form-submit

Já bych ale chtěl aby byla takováto.

http://localhost/NetteFiltr/www/

Půjde toho nějak docílit?

bojovyletoun
Člen | 667
+
0
-

Mě by třeba zajímalo, když budu psát nějakou složitou aplikaci, která bude mít dost modelů různě provázaných, co považujete za nejlepší řešení (vůbec rozhodnutí, zda použít ORM):

  • dibi
  • notorm
  • Nette\Database
  • ActiveRecord
  • Ormion (prý je starý, ale mě se docela líbí. )
  • EntityRepositoryMapper z kuchařky
  • Doctrine2

Já jsem si tedy vyzkoušel z první skupiny vyzkoušel všechny a pak Ormion, nicméně tak podvědomě tuším, že u složitějších věcí se bez ORM neobejdu(je to tak?). Ormion mě nadchnul, ale Doctrine se štítím kvůli složitosti. Asi je nejvyšší čas to vyzkoušet a nakonec zjistím možná, že to tak složité není.

Editoval bojovyletoun (25. 2. 2011 13:01)

srigi
Nette Blogger | 558
+
0
-

@Milhaus87 je to fajn (zobral si si moje doporucenia), ale uplne tip-top by bolo, keby si aj ten form nejako integroval do komponenty (normalne mozes dat tovarnicku do komponenty samotnej).

Co sa tyka tych URL, na to sa vykasli, userovi je uplne jedno co je v adresnom riadku pri odoslani formulara. Je to taka Nette konvencia, ze signaly maju takuto formu, obcas sa niekto najde, ze mu to vadi, ale fakt je zbytocne mrhat energiu na riesenie tejto malickosti.

Milhaus87
Člen | 22
+
0
-

Tak to vyzkouším dát form do komponenty
Stejnak dík bez tvé ukázky bych to asi dohromady nedal.

Editoval Milhaus87 (25. 2. 2011 14:22)