Zaregistrovaný model a presenter

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

Mám vytvořený model, který je zaregistrovaný v config.neon jako služba a neumím to správně zpracovat v presenteru…

Model :

<?php

namespace App\Model;

use Nette;

class MujModel {
    /** @var \Nette\Database\Context */
    public $database;

    public function __construct(\Nette\Database\Context $database) {
        $this->database = $database;
    }

 	public function getDataAll() {
		return $this->database->query('SELECT * FROM posts');
	}

}

Presenter :

class HomepagePresenter extends BasePresenter
{
    /**
     * @inject
     * @var MujModel */
    public $model;

    public function renderDefault() {
        $this->template->data = $this->model->getDataAll();
    }
}

Class or interface ‚App\Presenters\MujModel‘ used in @var annotation at Property [ <default> public $model ] not found. Check annotation and ‚use‘ statements

Oli
Člen | 1215
+
+2
-

@brontosaurus 1. formátuj kod, kdo má tohle číst?
2. Problém je v namespace. Tvůj model je „celým názvem“ App\Model\MujModel, ale v presenteru jsi žádný namespace nepoužil, proto se vezme ten, který je v té třídě a to je App\Presenters. A jistě chápeš, že
App\Model\MujModel != App\Presenters\MujModel.

Možná by ti mohlo pomoct tohle nebo přímo manuál.

brontosaurus
Člen | 49
+
0
-

Nedal jsem tam kód presenteru celej. Takhle to mám. V netbeans mám kód naformátovanej, asi se to špatně uloží když to sem vložím..
<?php

namespace App\Presenters;

use Nette,
App\Model;

/**
* Homepage presenter.
*/
class HomepagePresenter extends BasePresenter
{
/**
* @inject
* @var MujModel */
public $model;

public function renderDefault() {
$this->template->data = $this->model->getDataAll();
 }
}

David Matějka
Moderator | 6445
+
0
-

@brontosaurus precti si, jak formatovat kod

Oli
Člen | 1215
+
0
-

@brontosaurus podle mě v tomhle případě v tom var musíš mít Model\MujModel nebo v use App\Model\MujModel.

Taková rychlá kontrola je, že když zmáčkneš ctrl a klikneš na tu třídu tak se ti musí otevřít v novým tabu. Pokud se ti neotevře, tak ta třída není dobře napojená (nenašla se).

Mysteria
Člen | 797
+
0
-
use App\Model\MujModel;

/** @var MujModel @inject */
public $model;
brontosaurus
Člen | 49
+
0
-
<?php

namespace App\Presenters;

use Nette,
	App\Model;


/**
 * Homepage presenter.
 */
class HomepagePresenter extends BasePresenter
{
    /**
     * @inject
     * @var MujModel */
    public $model;

    public function renderDefault() {
        $this->template->data = $this->model->getDataAll();
    }
}
?>
David Matějka
Moderator | 6445
+
0
-

Vidis, ze to jde :) ted si precti o tech namespacech, jak radi @Oli a mas to vyreseny ;)

brontosaurus
Člen | 49
+
0
-

Tak namespace už je dobře, jestli ještě se mnou máte trpělivost tak bych potřeboval vysvětlit co mám špatně ve fci renderDefault() tu mi to nebere ..Moc nerozumim hlavně tý části $this->template->data

<?php

namespace App\Presenters;

use Nette,
	App\Model\MujModel;


/**
 * Homepage presenter.
 */
class HomepagePresenter extends BasePresenter
{
    /** @var MujModel @inject */
    public $model;

    public function renderDefault() {
        $this->template->data = $this->model->getDataAll();
    }
}
?>
iguana007
Člen | 970
+
0
-

Co znamená, že „ti to nebere“? Co to dělá/nedělá? Vypíše to nějakou chybu? Proměnná data není v template dostupná, či co?

Amgis
Člen | 8
+
0
-

No to
<?php
$this->template->data = …
?> předává proměnnou $data do šablony latte. Její výpis v šabloně můžeš udělat buď přímo:

{$data}
A nebo pokud jde o výpis s DB, tak pomocí funkce foreach:
<ul>
  {foreach $data as $item}
  {$item->nazev_radku_v_tabulce}
  {/foreach}
</ul>
brontosaurus
Člen | 49
+
0
-

Zkouším vytvořit MVC tak jak jsem se dočetl, že se to má správně dělat. Tedy vytvořit model, v kterým budou dotazy na data a bude zaregistrovaný jako služba a nebude v něm inject(ten bude až v presenteru). Presenter tedy předá data do šablony a ta to zobrazí. V modelu mám zatím jen jednu metodu(getDataAll, která vypíše všechno z tabulky posts a v presenteru chci data předat do šablony prostřednictvím tý metody z modelu. Předá se to tedy proměnnou „data“,jak jsem se teď dozvěděl ale vyhodí mi to chybu na to, že to nezná tu metodu z modelu.
„Call to undefined method App\Model\MujModel::getDataAll()“

Freema
Člen | 18
+
0
-

brontosaurus napsal(a):

Zkouším vytvořit MVC tak jak jsem se dočetl, že se to má správně dělat. Tedy vytvořit model, v kterým budou dotazy na data a bude zaregistrovaný jako služba a nebude v něm inject(ten bude až v presenteru). Presenter tedy předá data do šablony a ta to zobrazí. V modelu mám zatím jen jednu metodu(getDataAll, která vypíše všechno z tabulky posts a v presenteru chci data předat do šablony prostřednictvím tý metody z modelu. Předá se to tedy proměnnou „data“,jak jsem se teď dozvěděl ale vyhodí mi to chybu na to, že to nezná tu metodu z modelu.
„Call to undefined method App\Model\MujModel::getDataAll()“

Nemáš jen tak náhodou tu metodu:

<?php
private function getDataAll()
?>

nebo

<?php
protected function getDataAll()
?>

:)

Editoval Freema (13. 5. 2015 16:58)

brontosaurus
Člen | 49
+
0
-

Ne, mám public function getDataAll()

Džůny
Člen | 19
+
0
-

@brontosaurus Jak vypadá řádek s inject modelu teď? Ve tvé poslední ukázce kódu u něj totiž nemáš uvedený celý namespace. Podle dokumentace by uveden být měl, třeba bude problém tady.

brontosaurus
Člen | 49
+
0
-

Tak už mi to jede. Díky všem za pomoc..