Volání modelu v renderu a pak komponente !?
- MW
- Člen | 615
Zdravim,
narazil jsem na zvlastni chovani a rad bych se poradil. Podotykam, ze vse valilo s timto kodem, jak ma, nez jsem ted aktualizoval na nove Nette. Pokud dam pryc radku z renderEdit, form se dokresli v poradku.
Asi to bude nejaka moje nepozornost. Moc diky za radu !
volam v renderEdit, vse zatim OK, vrati, co ma:
...
public function renderEdit() {
...
$this->template->name = $this->context->contractsModel->getDataById($this->getParam('id'))->fetch()->client_name;
...
}
poté načítám v šabloně formulář, kde jiz model nevrati, co ma:
function createComponentContractsForm() {
$form = new Form;
...
$form->addSelect('type', 'Typ:', $this->getTypes());
$form->addText('mrp_cislo', 'MRP Čislo:');
$form->addText('gps', 'GPS:');
...
if ($this->action === 'edit') {
$contracts = $this->context->contractsModel->getDataById($this->getParam('id'))->fetch();
// a prave zde, me to nic nevrati !!!
if (!$contracts) {
throw new Nette\Application\BadRequestException;
}
$form->setDefaults($contracts);
}
return $form;
}
- MW
- Člen | 615
Spravne Id dostava, jakmile dam pryc to v tom renderEdit, formular me to
naplni.
Nechapu to…
Cca 3/4 roku stare Nette to schrouplo… nove ne.
Kdyz to krokuju, tak ta metoda proste vrati nulovy pocet radku. Coz je nesmysl…
Do toho renderu taham jen jednu radku (nazev Klienta) a pak do formu dotahuju data pro toho klienta.. takze to tam mam jen kvuli nazvu.. ale proste me zarazi, kde muze byt problem…
Ze by metoda nesla pouzit znovu?
Jeste me napada, ze mam contractsModel zavedeny jako sluzbu v configu:
services:
contractsModel:
class: \IkonisModule\ContractsModel
arguments: ["@database"]
To jedine mam jinak oproti stare verzi. Ze to taham z contextu a ne z basePresenteru.
Editoval MW (7. 9. 2012 20:16)
- MW
- Člen | 615
nj :-) dedim.. jestli myslime, to same…
Mohu pozadat nejak o vysvetleni? Proc to vadi? Jinde to mam stejne, jediny
rozdil je, ze tam nemam JOIN..
class ContractsModel extends BaseModel {
protected $data;
public $total;
public $ptotal;
function __construct(\Nette\Database\Connection $database) {
parent::__construct($database);
$this->data = $this->database->table('contracts')->select('contracts.*, clients.name AS client_name, branches.name AS branch_name');
}
.......
function getDataById($id = null) {
if ($id) {
return $this->data->where('contracts.id', $id);
} else {
return $this->data;
}
}
........
}
Editoval MW (8. 9. 2012 18:26)
- Jan Endel
- Člen | 1016
Přišel mi dotaz, proč je špatné dědit ze Selection, zkusím to shrnout do pár bodů:
- Selection je v podstatě reprezentace několika řádků z tabulky, model by měl být ten, kdo s těmito řádky pracuje – viz problém dřeva a nakladače, kde dřevo se samo nenaloží
- Selection si pamatuje svůj vnitřní stav, tedy že jeho funkce nejsou deterministické (při několika voláních nemá na stejné vstupní data stejné výstupy
- Doporučuju svou modelovou vrstvu předělat na základě nového QS aby už ze selection nedědila a tedy abych v modelu měl deterministické funkce v modelu.
- MW
- Člen | 615
Aha,
takze kdyz to shrnu pro blbe(pro me), tak je chyba ve tride udrzovat data
protected $data;
inicializovat je
$this->data = $this->database->table('contracts');
a tu pak pouzivat v dalsich metodach napr. pro filtr ?
if($pozminka) {
$this->data->where('branches_id', $branch);
}