Zobrazení stránky z databáze

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

Ahoj, statické stránky v systémumám uloženy v databázi pro jejich snadnou tvorbu, klasický model CMS, do menu se mi jednotlivé položky hezky vypíšou, včetně správných URL, operuji se stránkami Test 1, Test 2 a Test 3 a jejich seo url test-1,test-2 a test-3. V případě že v menu z položek vyberu stránku Test 1, načte se správně stránka Test 1, ale u jakékoli další stránky se načítá stále Test 1 i přesto že by se měl načíst Test 2, Test 3 a dokonce sem zkusil vytvořit Test 4, ale dopadl jsem stejně. Logika vypadá následovně:

Boostrap

$router = $application->getRouter();

$router[] = new Route('index.php', array(
	'presenter' => 'Homepage',
	'action' => 'default',
), Route::ONE_WAY);

$router[] = new Route('stranky/<seo>', array(
	'presenter' => 'Stranky',
	'action' => 'view',
	'seo' => NULL,
));

$router[] = new Route('<presenter>/<action>/<id>', array(
	'presenter' => 'Homepage',
	'action' => 'default',
	'id' => NULL,
));

Pro modely využívám vzoru Active Record, takže třída Stranky

<?php
class Stranka extends DibiRow{
    public function __construct($arr = array())
    {
        parent::__construct($arr);
    }
}

Třída StrankyManager

<?php
class StrankyManager{
        public function findAllStranky($order = NULL, $where = NULL, $offset = NULL, $limit = NULL)
    {
        return dibi::query(
            'SELECT * FROM [stranky]',
            '%if', isset($where), 'WHERE %and', isset($where) ? $where : array(), '%end',
            '%if', isset($order), 'ORDER BY %by', $order, '%end',
            '%if', isset($limit), 'LIMIT %i %end', $limit,
            '%if', isset($offset), 'OFFSET %i %end', $offset
        )->setRowClass('Stranka');
    }

    public function findStranka($seo)
    {
        return dibi::query('SELECT * FROM [stranky] WHERE [seo]=%i LIMIT 1', $seo)
                ->setRowClass('Stranka')
                ->fetch();
    }
}

Menu s výpisem stránek obstarávám v BasePresenteru, jelikož je to věc pro všechny části webu společná (z toho samého důvodu tam je i loginForm):

<?php
abstract class BasePresenter extends Presenter
{
    private $strankyManager = NULL;

    protected function beforeRender()
    {
        $user = $this->getUser();
        $this->template->user = ($user->isLoggedIn()) ? $user->getIdentity() : NULL;
        $this->template->loggedin = $user->isLoggedIn();
        $this->template->today = new DateTime;

        $this->template->stranky = $this->model->findAllStranky($order = array(
            'nazev' => 'ASC',
        ));
    }

    public function getModel() {
        if(!isset($this->strankyManager))
            $this->strankyManager = new StrankyManager;

        return $this->strankyManager;
    }

    protected function createComponentLoginForm()
	{
		$form = new AppForm;
		$form->addText('username', 'Nick')
			->addRule(AppForm::FILLED, 'Prosím zadejte uživatelské jméno.');

		$form->addPassword('password', 'Heslo')
			->addRule(AppForm::FILLED, 'Prosím zadejte heslo.');

		$form->addCheckbox('remember', 'Zapamatovat');

		$form->addSubmit('login', 'Přihlásit');

		$form->onSubmit[] = callback($this, 'loginFormSubmitted');

		return $form;
	}

	public function loginFormSubmitted($form)
	{
		try {
			$values = $form->values;
			if ($values['remember']) {
				$this->getUser()->setExpiration('+ 14 days', FALSE);
			} else {
				$this->getUser()->setExpiration('+ 20 minutes', TRUE);
			}
			$this->getUser()->login($values['username'], $values['password']);
			$this->redirect('Homepage:');

		} catch (AuthenticationException $e) {
			$form->addError($e->getMessage());
		}
	}
}

Samotný výpis menu je v @layout.phtml

<ul>
    <li><a href="{plink Homepage:Default}">Úvod</a></li>
    <li n:foreach="$stranky as $stranka" class="{$style}"><a href="{plink :Stranky:View seo=>$stranka->seo}">{$stranka->nazev}</a></li>
</ul>

No a nakonec se dostávám k samotnému zobrazení stránky, pokud uživatel vybere že chce zobrazit stránku, takže StrankyPresenter vypadá následovně:

<?php
final class StrankyPresenter extends SecuredPresenter{
    private $strankyManager = null;
    public function actionView(){}

    public function renderView($seo){
        $this->template->stranka = $this->model->findStranka($seo);
    }

    public function getModel() {
        if(!isset($this->strankyManager))
            $this->strankyManager = new StrankyManager;
        return $this->strankyManager;
    }
}

A zobrazení stránky provedu v šabloně:

{block title}{$stranka->nazev}{/block}
{block #content}
<h2>{$stranka->nazev}</h2>
{$stranka->obsah}

Mohl by mě prosím někdo poradit co je kde za problém, už se s tím trápím druhým dnem a stále s tím nemohu pohnout :( děkuji.

westrem
Člen | 398
+
0
-

Chyba je podla mna na 99% tu:

SELECT * FROM [stranky] WHERE [seo]=%i LIMIT 1

Seo sa ti transformuje na int, nema tam byt nahodou %s?

plasmo
Člen | 66
+
0
-

westrem napsal(a):

Chyba je podla mna na 99% tu:

SELECT * FROM [stranky] WHERE [seo]=%i LIMIT 1

Seo sa ti transformuje na int, nema tam byt nahodou %s?

Ach jo, já tušil že to bude prkotina. Moc děkuju :-)