problém s modelem a jeho zobrazením
- fidLi
- Člen | 41
dobrý den, jel jsem podle quick start, ale server mi házi chybu 500
v configu mám nastavenou databázi
bootstrap na konci mám taky
dibi::connect(Environment::getConfig('database'));
model PersonModel
<?php
class PersonModel {
public $result = NULL;
public $all = NULL;
public function __construct (){
}
private function rosterPersons()
{
$this->result = dibi::query('SELECT * FROM `table`');
$this->all = $result->fetchAll();
return $this->all;
}
public function createPerson()
{
}
}
person presenter
<?php
final class PersonPresenter extends RegularPresenter
{
private $personRoster = NULL;
public function showDefault()
{
$this->template->persons = $this->model->rosterPersons();
}
public function renderDefault()
{
}
public function getModel() {
if(!isset($this->personRoster))
$this->personRoster = new PersonModel;
return $this->personRoster;
}
}
a teplate
{block content}
{foreach $persons as $person}{$person->jmeno}{$person->text}{/foreach}
a nefunguje mi to, prosím vás pomoc
zkoušel jsem různé kombinace, třeba přesunout získání dat do
konstruktoru, ale to nepomohlo…
dibi jsem nahrál pouze do bootstrapu, a dal do složky libs, jako to je v quck
startu…
- Jakub Šulák
- Člen | 222
Máš tam hned několik chyb, kterých jsem si všiml:
- private function rosterPersons(): voláš ji pak v presenteru, musí být tedy public; navíc voláš fetchAll() nad neexistující proměnnou
- ze showDefault() dej přiřazení template do renderDefault()
- v šabloně nemáš uzavřený {/block} (to teď nevím zda je povinné)
- v presenteru voláš metodu nad objektem $this->model, ale členskou proměnnou model nemáš nikde nadefinovanou; pak je tam nějaká metoda getModel() což mě přijde jako pokus o magické gettery, pak to ale musí vypadat $this->template->persons = $this->personRoster->rosterPersons();
PS: vycházím z toho, co jsi zveřejnil, quickstart jsem neviděl.
- fidLi
- Člen | 41
Děkuji za odpovědi, v šablonách to není
a od Jakuba jsem udělal všechno, jen ten poslední bod nechápu, a když přesunu obsah funkce show do render, tak se načte prázdná stránka, jinak to píše 500 error…
Stále nefunguje :(
Edit: přijde mi, jako by spojení na databázi nefungovalo
Editoval fidLi (2. 4. 2010 13:02)
- fidLi
- Člen | 41
Trošku jsem to pozměnil, a zjistil jsem kde je chyba… Nedaří se mi ji však vyřešit…
Presenter
public function renderDefault()
{
$this->template->messages = $this->getModel();
}
public function getModel(){
return $this->model = array("first", "second", "third");
}
tak se mi v klidu vše zobrazí,
jakmile ale zavolám instanci modelu, tak to nefunguje – 500 internal
error
TEDY:
Presenter
public function renderDefault()
{
$this->template->messages = $this->getModel();
}
public function getModel(){
return $this->model = new DiscussModel;
}
a model
class DiscussModel
{
public function __construct(){
return array("first", "second", "third");
}
}
Nepomůže ani když použiji proměné po returnech…
- Mikulas Dite
- Člen | 756
Jak tak na to koukám, možná se Nette nelíbí to, že v getModel() přistupuješ na $this->model, protože se to pak zacyklí.
A proč nemáš zaplou Laděnku?
- Ondřej Mirtes
- Člen | 1536
Já BaseModel dědím od Component a modely mám v továrničkách stejně jako komponenty.
A podle mě je tohle error, který se ti musí projevit i na localhostu, tak proč nevyvíjíš tam?
Editoval Ondřej Mirtes (2. 4. 2010 21:52)
- fidLi
- Člen | 41
Ondřej Mirtes napsal(a):
Já BaseModel dědím od Component a modely mám v továrničkách stejně jako komponenty.
A podle mě je tohle error, který se ti musí projevit i na localhostu, tak proč nevyvíjíš tam?
tomu nerozumím
nevyvíjím tam, protože se mi nepodařilo nainstalovat mysql a háže mi to tam stránku nelze zobrazit..
Editoval fidLi (2. 4. 2010 22:01)
- Ondřej Mirtes
- Člen | 1536
Tak s tímhle problémem bych začal, že. Pokud máš PHP 5.3.2, může být problém s tím, že v hosts souboru nemáš uvedený řádek:
127.0.0.1 localhost
K mému popisu – modely jsou pak stejně „lazy“ jako komponenty a vznikne maximálně jedna instance takového modelu.
abstract class BaseModel extends Component {
}
class MujModel extends BaseModel {
}
A v Presenteru:
protected function createComponentMujModel() {
return new MujModel;
}
A přistupuješ k němu pomocí $this['mujModel'];
.
- Mikulas Dite
- Člen | 756
Laděnku na produkčním serveru zapneš taky:
Debug::enable(Debug::DEVELOPMENT);
Jak řešíme modely? Já je mám přes
$this->m->nejakyNazev->modelovaFunkce();
kde getM() je
v BasePresenteru a vrací instanci modelCreator
, který upravuje
__get a podle toho vrací model. Plus to samé v BaseModelu.
Editoval Mikulas Dite (2. 4. 2010 22:22)
- fidLi
- Člen | 41
stále mi to nefunguje… ani přes tu komponentu, a laděnka píše toto
Notice: Use of undefined constant layout2 - assumed 'layout2' in /var/www/web5/younglaboratories.com/younglaboratories.com/app/presenters/RegularPresenter.php on line 21
a stránka normálně naběhne pod tímto řádkem
EDIT: to jsem spravil, a laděnka nic nepíše…
EDIT2: jako kdyby se nenačítala složka models, a neexistovala třída DiscussModel…
EDIT3: nejde zavolat instance třídy DiscussModel…
Editoval fidLi (3. 4. 2010 11:32)
- LuKo
- Člen | 116
Nevím, nakolik je to ještě aktuální, ale třeba pro ostatní, kteří na toto téma přijdou. V tomto kousku kódu je chyba:
fidLi napsal(a):
<?php class DiscussModel { public function __construct(){ return array("first", "second", "third"); } } ?>
- konstruktor vrací instanci své třídy,
return
v konstruktoru je tedy z principu nesmysl.