Jak vypsta filtrovaná data
- Milhaus87
- Člen | 22
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
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
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)
- srigi
- Nette Blogger | 558
@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
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)
- Milhaus87
- Člen | 22
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
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
@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.