Volání modelu v renderu a pak komponente !?

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

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;
    }
Jan Endel
Člen | 1016
+
0
-

Jak je naimplementovana getDataById? Posílá se správný dotaz? Dostává správné ID?

MW
Člen | 615
+
0
-

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)

Jan Endel
Člen | 1016
+
0
-

mno jooo, že ty dědíš ze selection v tom modelu?

MW
Člen | 615
+
0
-

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)

MW
Člen | 615
+
0
-

Tuší prosím někdo, proč mě toto starší Nette vzalo a nové ne?
Co dělám špatně?

Jan Endel
Člen | 1016
+
0
-

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

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);
}