Vytahovanie z databazy fetchAll a zobrazenie v template pomocou foreach

Metrix
Člen | 8
+
0
-

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

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

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

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

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

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.

matopeto
Člen | 395
+
+1
-

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.

David Matějka
Moderator | 6445
+
+2
-

@Metrix

misto $this->getParameter('rows') ` pouzij jen `$rows

Metrix
Člen | 8
+
0
-

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

TheNEoo
Člen | 75
+
0
-

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>

Jj máš pravdu na to jsem úplně zapomněl

Rob Bob
Člen | 60
+
+2
-

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)

matopeto
Člen | 395
+
0
-

Tak tak, zacni radsej niecim jednoduchsim ako eshopom :) je velka pravdepodobost ze ho neurobis uplne najlepsie/najbezpecnejsie a tam uz ide o peniaze a povest znameno :)