problém s modelem a jeho zobrazením

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

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…

despiq
Člen | 320
+
0
-
<?php
public function showDefault()
?>

to by melo byt spis

<?php
public function renderDefault()
?>
fidLi
Člen | 41
+
0
-

despiq napsal(a):

<?php
public function showDefault()
?>

to by melo byt spis

<?php
public function renderDefault()
?>

to je pak ve výsledku prázdná bílá stránka

despiq
Člen | 320
+
0
-

jakej je nazev sablony?
jakou volas akci?
co mas v layoutu?

Jakub Šulák
Člen | 222
+
0
-

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

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

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

Nemáš zavedenou proměnnou třídy (resp.presenteru) model.

fidLi
Člen | 41
+
0
-

to právě že mám

Mikulas Dite
Člen | 756
+
0
-

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?

fidLi
Člen | 41
+
0
-

jedu na ostrým serveru, takže mi laděnka nějak nejede…

ale jinak než přes $this->model novou instanci modelu nezískám… zajímalo by mě, jak to třeba řeší ostatní…

Ondřej Mirtes
Člen | 1536
+
0
-

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

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

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

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

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)

fidLi
Člen | 41
+
0
-

tak sem to vyřešil po svém, postupném var_dumpováním a s laděnkou

LuKo
Člen | 113
+
0
-

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.