Jak mazat a editovat záznamy podle nového quickstartu?
- xciza
- Člen | 194
Ahoj, zkouším svoji aplikaci podle nového quickstartu ale narazil jsem
u mazání a editace dat v db.
Do teď jsem to dělal následně:
public function renderDeleteUzivatel($id = 0) {
$this->template->uzivatel = $this->uzivatel->get($id);
if (!$this->template->uzivatel) {
$this->error('Položka nenalezena.');
}
}
protected function createComponentDeleteFormUzivatel() {
$form = new Form;
$form->addSubmit('delete', 'Smazat')->setAttribute('class', 'default');
$form->addSubmit('cancel', 'Cancel');
$form->onSuccess[] = callback($this, 'deleteFormUzivatelSubmitted');
$form->addProtection('Vypršel časový limit, odešlete formulář znovu.'); //Obrana před Cross-Site Request Forgery (CSRF)
return $form;
}
public function deleteFormUzivatelSubmitted(Form $form) {
if ($form['delete']->isSubmittedBy()) {
$this->uzivatel->find($this->getParameter('id'))->delete();
$this->flashMessage('Položka smazána.');
}
$this->redirect('default');
}
či editace:
public function renderEditUzivatel($id = 0) {
$form = $this['uzivatelForm'];
if (!$form->isSubmitted()) {
$row = $this->uzivatel->get($id);
if (!$row) {
$this->error('Záznam nebyl nalezen');
}
$form->setDefaults($row);
}
}
public function uzivatelFormSubmitted(Form $form) {
$id = (int) $this->getParameter('id');
if ($id > 0) {
$this->uzivatel->find($id)->update(array(
'username' => $form->values->username,
'password' => md5($form->values->password),
'ucet' => $form->values->ucet
));
$this->flashMessage('Uživatel upraven.', 'success');
} else {
$this->context->createUzivatel()->insert(array(
'username' => $form->values->username,
'password' => md5($form->values->password),
'ucet' => $form->values->ucet
));
$this->flashMessage('Uživatel přidán.', 'success');
}
$this->redirect('Uzivatele:default');
}
Ale v novém quicstartu se k tomu nemohu dokousat. Zatím mám toto:
UserPresenter:
protected function createComponentDeleteForm() {
$form = new Form;
$form->addSubmit('delete', 'Smazat')->setAttribute('class', 'default');
$form->addSubmit('cancel', 'Cancel');
$form->onSuccess[] = callback($this, 'deleteFormSubmitted');
$form->addProtection('Vypršel časový limit, odešlete formulář znovu.'); //Obrana před Cross-Site Request Forgery (CSRF)
return $form;
}
public function deleteFormSubmitted(Form $form) {
$this->usersRepository->deleteUser;
$this->flashMessage('Položka smazána.');
$this->redirect('Users:default');
}
a userTable:
public function deleteUser($id) {
return $this->getTable()->delete($id);
}
Díky za rady
- xciza
- Člen | 194
Tak mazání jsem vyřešil, ale s editací mám problém. V presenteru mám toto:
public function renderEdit($id = 0) {
$form = $this['userForm'];
$row = $this->usersRepository->findBy(array('id' => $id));
if (!$row) {
$this->error('Záznam nebyl nalezen');
}
$form->setDefaults(array(
'username' => $row->username
));
}
Problém mě dělá naplnění formuláře daty z db. hlásí chybu:
Cannot read an undeclared property Nette\Database\Table\Selection::$username.
na řádku
'username' => $row->username
- Andrasin
- Člen | 29
Pokud jede podle quickstartu tak ne get, ale find, což je metoda z BaseModelu obalující právě get…
Ve tvém aktuálním zápisu ti chybí ->fetch(), přepiš to takto:
$row = $this->usersRepository->findBy(array('id' => $id))->fetch();
Nebo lépe, takto:
$row = $this->usersRepository->find($id);
Editoval Andrasin (12. 10. 2012 23:24)
- ViPEr*CZ*
- Člen | 817
Hmmm teď když koukám do githubu, tak tam taková metoda není. Ale nic nebrání si ji dopsat. ;-) Do třídy Repozitory https://github.com/…pository.php si přidejte public metodu:
public function get($id) {
return $this->getTable()->get($id);
}
a pak samozřejmě to co jsem psal… namísto findBy použij get.
- xciza
- Člen | 194
Andrasin napsal(a):
Pokud jede podle quickstartu tak ne get, ale find, což je metoda z BaseModelu obalující právě get…
Ve tvém aktuálním zápisu ti chybí ->fetch(), přepiš to takto:
$row = $this->usersRepository->findBy(array('id' => $id))->fetch();
Díky, takhle to funguje.
Ještě mám problém s potvrzením editace.
V presenteru mám toto:
public function userFormSubmitted(Form $form) {
$id = (int) $this->getParameter('id');
if ($id > 0) {
$this->usersRepository->updateUser($form->values->username, $form->values->password, $form->values->ucet);
$this->flashMessage('Uživatel upraven.', 'success');
} else {
$this->usersRepository->createUser($form->values->username, $form->values->password, $form->values->ucet);
$this->flashMessage('Uživatel přidán.', 'success');
}
$this->redirect('Users:default');
}
A v userRepository:
public function updateUser($username, $password, $ucet) {
$id = (int) $this->getTable()->find('id')->fetch();
return $this->getTable()->find($id)->update(array(
'username' => $username,
'password' => md5($password),
'ucet' => $ucet
));
}
Ale po odeslání formuláře do daného uživatele nezaktualizuje…
- xciza
- Člen | 194
Ještě mám problém s potvrzením editace.
V presenteru mám toto:
public function userFormSubmitted(Form $form) { $id = (int) $this->getParameter('id'); if ($id > 0) { $this->usersRepository->updateUser($form->values->username, $form->values->password, $form->values->ucet); $this->flashMessage('Uživatel upraven.', 'success'); } else { $this->usersRepository->createUser($form->values->username, $form->values->password, $form->values->ucet); $this->flashMessage('Uživatel přidán.', 'success'); } $this->redirect('Users:default'); }
A v userRepository:
public function updateUser($username, $password, $ucet) { $id = (int) $this->getTable()->find('id')->fetch(); return $this->getTable()->find($id)->update(array( 'username' => $username, 'password' => md5($password), 'ucet' => $ucet )); }
Ale po odeslání formuláře do daného uživatele nezaktualizuje…
nikdo neporadi s editaci?
- ViPEr*CZ*
- Člen | 817
A to co napsal enumag je obecně aplikovatelné (s drobnými změnami) na
jakýkoliv takovýto problém… prostě je obecně dobré se naučit procházet
(analyzovat) si vlastní kód krok po kroku (debugování). Tak se člověk
naučí … ;-)
Jinak jestli chcete něco vidět (např. jaký SQL dotaz se generuje), tak si
ještě odstraňte přesměrování $this->redirect(‚Users:default‘);
- xciza
- Člen | 194
enumag napsal(a):
@xciza: Jestli to chápu dobře tak se ti nezaktualizuje záznam v databázi? V tom případě si zjisti:
- Jaký SQL dotaz se vygeneruje (debug bar)?
- Nemáš někde rollback transakce?
- Zavolá se vůbec metoda updateUser?
- Pokud zavolá, zavolá se se správnými parametry?
Tak zpět k mému problému.
Debug bar vypíše dotaz se správnými hodnotami:
UPDATE users
SET username
=‚Pokus‘, password
=‚XY‘,
ucet
=‚admin‘
WHERE (id
= 0)
Až na to že to neupdatuje u id 16 ale 0. Čili se nezupdatuje u toho správnýho usera.
- xciza
- Člen | 194
To byl spíš takový pokus.
Vrtám se v tom dál a udělal jsem následující úpravy:
presenter
<?php
public function userFormSubmitted(Form $form) {
$id = $form['id']->getValue();
if ($id > 0) {
$this->usersRepository->updateUser($id, $form->values->username, $form->values->password, $form->values->ucet);
$this->flashMessage('Uživatel upraven.', 'success');
} else {
$this->usersRepository->createUser($form->values->username, $form->values->password, $form->values->ucet);
$this->flashMessage('Uživatel přidán.', 'success');
}
//$this->redirect('Users:default');
}
?>
a userRepository:
<?php
public function updateUser($id, $username, $password, $ucet) {
return $this->getTable()->where($id)->update(array(
'username' => $username,
'password' => $password,
'ucet' => $ucet
));
}
?>
Ale takto se změní všechny uživatele na username toho upravovaného… Co vylepšit?
EDIT: Tak stačilo změnit
<?php
return $this->getTable()->where($id)->update(array(
na
return $this->getTable()->find($id)->update(array(
?>
A snad to bude i nadále dělat to co ma
Editoval xciza (16. 10. 2012 19:20)
- mildabre
- Člen | 62
xciza napsal(a):
Tak mazání jsem vyřešil, ale s editací mám problém. V presenteru mám toto:
public function renderEdit($id = 0) { $form = $this['userForm']; $row = $this->usersRepository->findBy(array('id' => $id)); if (!$row) { $this->error('Záznam nebyl nalezen'); } $form->setDefaults(array( 'username' => $row->username )); }
Problém mě dělá naplnění formuláře daty z db. hlásí chybu:
Cannot read an undeclared property Nette\Database\Table\Selection::$username. na řádku 'username' => $row->username
Nedeklarovaná property username v objektu typu Selection – což je ten $row to znamená, že tam nemáš klíč username, ale třeba name – bude to asi ve struktuře databáze, mrkni do Admina do tabulky user zda tam někde je username.