Vytahovanie z databazy fetchAll a zobrazenie v template pomocou foreach
- Metrix
- Člen | 8
Mojim problemom je, ze mi vyhadzuje ako rows neznamu premennu… uz som skusal asi vsetko, teda urcite vsetko nie, inac by to slo… viete mi poradit?
namespace App\Presenters;
use Nette;
use App\Model;
use Nette\Application\UI;
use Nette\Application\UI\Form as Form;
use Nette\Diagnostics\Debugger as Ndebug;
use Nette\Security\Passwords;
use Nette\Security\User;
use Nette\Database\Table\Selection;
use Nette\Database\Context;
class ProductPresenter extends BasePresenter{
public function obuv($druh){
$dsn='mysql:host=127.0.0.1;dbname=papuce-eshop';
$user='root';
$password='';
$database = new Nette\Database\Connection($dsn, $user, $password);
$result=[];
$database = $result->fetchAll('SELECT * FROM `products-child` WHERE druh = ?', $druh);
$rows=$database;
return $rows;
}
}
template
{block content}
{php
echo '<table><thead><tr><td>Nazov</td><td>Cena</td><td>Detail</td><td>Mnozstvo na sklade</td><td>Velkost</td></tr></thead><tbody>';
$druh ='Panska';
foreach ($rows as $row) {
echo '<tr><td>' . $row->title;
echo '</td><td>' . $row->price;
echo '</td><td>' . $row->detail;
echo '</td><td>' . $row->mnozstvo;
echo '</td><td>' . $row->size;
echo '</td><tr>';
}
echo '</tbody></table>'; }
{/block content}
- CZechBoY
- Člen | 3608
uf, nevim kde bych zacal.
Pouzivej DI.
Data si vytahuj v action metode.
Data predavej do sablony v render metode.
Pokud opravdu pouzivas Nette\Database tak ve fetchAll nemuzes predavat sql
prikaz, ale v query metode.
Cela tvoje trida by sla prepsat na
private $database;
public function __construct Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderDefault($druh)
{
$rows = $this->database->query('SELECT * FROM `products-child` WHERE druh = ?', $druh)->fetchAll();
$this->template->rows = $rows;
}
jen nezapomen registrovat databazi v konfiguraci (`config.neon`) aby ses k ni mohl takto pripojit.
priklad konfigurace
database:
dsn: 'mysql:host=127.0.0.1;dbname=papuce-eshop
user: root
password: xyz
- Metrix
- Člen | 8
Neslo to uplne bez chyb. Nakolko mam pod produktami tri latte sablony, tak som musel prepisat funkciu
namespace App\Presenters;
use Nette;
use App\Model;
use Nette\Application\UI;
use Nette\Application\UI\Form as Form;
use Nette\Diagnostics\Debugger as Ndebug;
use Nette\Security\Passwords;
use Nette\Security\User;
use Nette\Database\Table\Selection;
use Nette\Database\Context;
class ProductPresenter extends BasePresenter{
public $rows;
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderPanska($druh)
{$druh='Panska';
$rows = $this->database->query('SELECT * FROM `products-child` WHERE druh = ?', $druh)->fetchAll();
$this->template->rows = $rows;
}
public function renderDamska($druh)
{$druh='Damska';
$rows = $this->database->query('SELECT * FROM `products-child` WHERE druh = ?', $druh)->fetchAll();
$this->template->rows = $rows;
}
public function renderDetska($druh)
{$druh='Detska';
$rows = $this->database->query('SELECT * FROM `products-child` WHERE druh = ?', $druh)->fetchAll();
$this->template->rows = $rows;
}
}
{block content}
{php
echo '<table><thead><tr><td>Nazov</td><td>Cena</td><td>Detail</td><td>Mnozstvo na sklade</td><td>Velkost</td></tr></thead><tbody>';
foreach ($this->getParameter('rows') as $row) {
echo '<tr><td>' . $row->title;
echo '</td><td>' . $row->price;
echo '</td><td>' . $row->detail;
echo '</td><td>' . $row->mnozstvo;
echo '</td><td>' . $row->size;
echo '</td><tr>';
}
echo '</tbody></table>'; }
{/block content}
Teraz to uz funguje ako ma… teda zatial sa ziadna chyba nevyhodila.
Dakujem, zatial som len zaciatocnik z nette frameworkom, robil som predtym
ciste php, takze vzkreslovanie sablon mi trva dlhsie.
Editoval Metrix (17. 8. 2017 22:01)
- TheNEoo
- Člen | 75
Ahoj urcitě to použi jako píše CZechBoY.
V config.neon zaregistruj database
query bych asi do presenteru nedaval a presunul do repository
HomepageRepository zaregistrovat v config.neon
services:
- App\Repository\HomepageRepository
HomepageRepository.php
namespace App\Repository;
class HomepageRepository extends MainRepository {
public function findAll($druh){
return $this->database->table('products-child')->where('druh =?', $druh);
}
}
MainRepository.php
namespace App\Repository;
use Nette;
class MainRepository extends Nette\Object{
/**
* @var Nette\Database\Context
*/
protected $database;
public function __construct(Nette\Database\Context $database) {
$this->database = $database;
}
HomepagePresenter.php
namespace App\Presenters;
use Nette;
use App\Repository\HomepageRepository;
class HomepagePresenter extends BasePresenter {
//predat si DB buď @injectem nebo pres contructor
/** @var HomepageRepository @inject */
public $homepageRepository;
public function renderDefault($druh) {
$this->template->items = $this->HomepageRepository->findAll($druh);
}
default.latte
{block content}
{foreach $items as $item}
{first}<table>{/first}
<tr>
<td>{$item->title}</td>
<td>{$item->price}</td>
etc....
</tr>
{last}</table>{/last}
{/foreach}
Je to spíše takový návrh k zamyšlení :) :)
Editoval TheNEoo (17. 8. 2017 23:50)
- CZechBoY
- Člen | 3608
Ale proc rovnou zatezovat zacatecnika dalsi vrstvou, kdyz teprv pronika do Nette jako takoveho? Vsak on na to treba prijde sam :-)
Nicmene jo – vyresil si za nej duplicitni kod, ktery ma ve vsech render metodach. Dokonce ses zbavil i vsech stejnych render metod a pouzil jen jednu metodu.
Jen je potreba dodat, ze si odebral urceni druhu rucne a pocitas ze si ho
opravdu posle parametrem.
Odkaz na jednotlive druhy je potreba vytvorit tomto smyslu:
<a n:href="Homepage:default, druh => panske">Pánské</a>
@Metrix pamatuj si jednu vec – pokud potrebujes v sablone pouzit {php} tak je mozna neco spatne a obchazis sablonovaci system. Doporucuju prostudovat sablony v Nette v domumentaci – sablony jsou urcite jednim z nejvetsich pomocniku :-).
- Metrix
- Člen | 8
Ok, dakujem, tak som si to pomenil, v sablone nemam {php…} ale uz to mam zakreslene „spravne“
{block content}
<table><thead><tr><td>Nazov</td><td>Cena</td><td>Detail</td><td>Mnozstvo na sklade</td><td>Velkost</td></tr></thead><tbody>
{foreach $this->getParameter('rows') as $row}
<tr><td> {$row->title}
</td><td>{$row->price}
</td><td> {$row->detail}
</td><td> {$row->mnozstvo}
</td><td> {$row->size}
</td><tr>
{/foreach}
</tbody></table>
{/block content}
a ten $druh som si poslal tiez cez n:href, co je celkom pekny sposob ako si preposielat premenne.
TheNEoo dakujem za rady, urcite to vyuzijem pri zlozitejsom projekte, ale toto bude len nejaky maly eshop pre znameho.
- Metrix
- Člen | 8
matopeto napsal(a):
Metrix napsal(a):
ale toto bude len nejaky maly eshop pre znameho.vytesat do kamena :) – prepac ze sa na tom smejem, ale nic ako maly eshop neexistuje :) Na eshop pouzi radsej nejake hotove free riesenie ako prestashop alebo podobne.
len to sa chcem na tom naucit aj framework nette
- Rob Bob
- Člen | 60
Metrix napsal(a):
matopeto napsal(a):
Metrix napsal(a):
ale toto bude len nejaky maly eshop pre znameho.vytesat do kamena :) – prepac ze sa na tom smejem, ale nic ako maly eshop neexistuje :) Na eshop pouzi radsej nejake hotove free riesenie ako prestashop alebo podobne.
len to sa chcem na tom naucit aj framework nette
Tak začni tady: https://doc.nette.org/cs/quickstart
Editoval Rob Bob (18. 8. 2017 14:14)