Zobrazení stránky z databáze
- plasmo
- Člen | 66
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.