Zmazanie zaznamu v databaze
- cujan
- Člen | 410
Caute riesim zmazanie konkretneho zaznamu v databaze, pouzivam nato
formular
(kod presentera)
<?php
protected function createComponentDeleteForm()
{
$form = new Form;
$form->addSubmit('cancel', 'Cancel');
$form->addSubmit('delete', 'Delete')->setAttribute('class', 'default');
$form->onSuccess[] = $this->deleteFormSubmitted;
$form->addProtection('Please submit this form again (security token has expired).');
return $form;
}
?>
nasledne metodu na mazanie, v ktorej najdem konkretny zaznam a zmazem ho…
<?php
public function deleteFormSubmitted(Form $form)
{
if ($form['delete']->isSubmittedBy()) {
//$this->albums->find($this->getParameter('id'))->delete();
$this->tasks->findBy(array('id' => $id))->delete();
$this->flashMessage('Vlastnosť bola vymazaná.');
}
$this->redirect('default');
}
?>
a metoda findBy
(kod repository)
<?php
public function findBy(array $by)
{
return $this->getTable()->where($by);
}
?>
a delette.latte vyzera takto
{block #content}
<h1 n:block=„title“>Zmaz vlastnost</h1>
{foreach $tasks as $task}
<p>Ste si isty, ze chcete zmazat {$task->vlastnost} ?</p>
{control deleteForm}
{/foreach}
a vyhodi mi to chybu
Call to a member function findBy() on a non-object
nechapem preco, ked pouzijem metodu findBy na najdenie konkretneho zaznamu a nasledne jeho vypisanie tak mi to funguje.
Vdaka
- Ot@s
- Backer | 476
cujan napsal(a):
jasne plnim to<?php public function renderDelete($id = 0) { $this->template->tasks = $this->ciselnikfarbaRepository->findBy(array('id' => $id)); } ?>
$this->template->tasks
a $this->tasks
jsou
dvě různé proměnné (z hlediska presenteru). Ještě jednou si přečti, co
píšu v předchozím příspěvku. Z popisu ani nevím, kdy přesně ti to
hází chybu. Buďto to pomůže, nebo nevím/nechápu o co jde a poradí ti
někdo jiný.
- cujan
- Člen | 410
no ved toto, ze jaj mam kus chaos v tom ako sa posiela parameter napr. id zo sablony do preentera. Tada ja na sablone vidim ze som si vybral spravny prvok, len neviem ako ked kliknem na talcidlo delete poslat id toho prvku co chcem.
Dufam ze som to nenapisal totalne nezrozumitelne :-)))
vdaka za ochotu
- cujan
- Člen | 410
no tak som to po kroku pretrasoval a dostal som sa az ku samotnej metode
<?php
public function deleteFormSubmitted(Form $form)
{
if ($form['delete']->isSubmittedBy()) {
//$this->albums->find($this->getParameter('id'))->delete();
$this->tasks->findBy(array('id' => $id))->delete();
$this->flashMessage('Vlastnosť bola vymazaná.');
}
$this->redirect('default');
}
?>
cize problem bude uz len v nej.....ako naprogramovat aby ona prevzala id toho konkretneho prvku co je v parametry tasks a nasledne zmazala zaznam s tabulky s takym id.
- Ot@s
- Backer | 476
cujan napsal(a):
cize problem bude uz len v nej.....ako naprogramovat aby ona prevzala id toho konkretneho prvku co je v parametry tasks a nasledne zmazala zaznam s tabulky s takym id.
Přidej si ID do hidden pole (předpoklad je, že ID je dostupné v
$this->getParameter('id')
)
<?php
protected function createComponentDeleteForm()
{
$form = new Form;
$form->addHidden('id', $this->getParameter('id'));
$form->addSubmit('cancel', 'Cancel');
$form->addSubmit('delete', 'Delete')->setAttribute('class', 'default');
$form->onSuccess[] = $this->deleteFormSubmitted;
$form->addProtection('Please submit this form again (security token has expired).');
return $form;
}
public function deleteFormSubmitted(Form $form)
{
$id = $form['id']->getValue();
if ($form['delete']->isSubmittedBy() && !empty($id)) {
//$this->albums->find($this->getParameter('id'))->delete();
$this->tasks->findBy(array('id' => $id))->delete();
$this->flashMessage('Vlastnosť bola vymazaná.');
}
$this->redirect('default');
}
?>
Taky máš možnost vykreslovat komponentu přes
{control deleteForm, 100}
– v tom případě stačí
upravit
<?php
protected function createComponentDeleteForm($id)
{
$form = new Form;
$form->addHidden('id', $id);
// ...
}
- Caine
- Člen | 216
Ot@s napsal(a):
Taky máš možnost vykreslovat komponentu přes
{control deleteForm, 100}
– v tom případě stačí upravit<?php protected function createComponentDeleteForm($id) { $form = new Form; $form->addHidden('id', $id); // ... }
Tohle fungovat nemuze, protoze ty parametry (id) se predavaj az render metode dany komponenty, ne ty tovarnicce, ty se predava nazev volany komponenty.
- cujan
- Člen | 410
super, no takz z formu uz dostavam do deleteFormSubmitted id ktore chcem, len este tato metoda
<?php
public function deleteFormSubmitted(Form $form)
{
if ($form['delete']->isSubmittedBy()) {
$id = $form['id']->getValue();
$this->tasks->findBy(array('id'=> $id))->delete();
$this->flashMessage($id);
}
$this->redirect('default');
}
?>
hlasi chybu
Call to a member function findBy() on a non-object
pricom findBy vyzera takto
<?php
public function findBy(array $by)
{
return $this->getTable()->where($by);
}
?>
- Ot@s
- Backer | 476
Ještě jednou si pozorně přečti, co jsem Ti už jednou psal. Zbytečně se tady do toho zamotáváme :-/
Znovu opakuji:
$this->template->tasks
a$this->tasks
není totéž- nechápeš životní cyklus aplikace
Obecné řešení z hlavy (neznám tvůj presenter)
protected function startup() {
parent::startup();
$this->tasks = $this->ciselnikfarbaRepository; // pohlidej si kde plnis $this->ciselnikfarbaRepository
}
public function renderDelete($id = 0)
{
$this->template->tasks = $this->tasks->findBy(array('id' => $id));
}
- cujan
- Člen | 410
Ja viem ze moje odpovede su chaotikce, lebo ja praticky len tyzden robim v nette a OOP php, ucim sa tak ze robim kponkretny priklad a studujem uvodny tutorial na stranke a example priklady. Cize sa ospravedlnujem za nechapavost, casom sa to urcite zlepsi :-))))
cize ak este mozem otravovat tak tu je moj presenter, lebo v tom mam dost hokej uz.....
<?php
use Nette\Application\UI\Form;
//use Nette\Forms\Form;
class CiselnikfarbaPresenter extends BasePresenter
{
private $ciselnikfarbaRepository;
private $tasks;
protected function startup()
{
parent::startup();
$this->ciselnikfarbaRepository = $this->context->ciselnikfarbaRepository;
}
public function renderDefault()
{
$this->template->tasks = $this->ciselnikfarbaRepository->findAllFarba();
}
//vytvori formular
protected function createComponentVlozVlastnostForm()
{
$form = new Form();
$form -> addText('vlastnost','Vlastnosť',40,100)->addRule(Form::FILLED,'Je nutné zadať vlastnosť');
$form->addSubmit('create', 'Vložiť vlastnosť');
$form->onSuccess[] = $this->vlozVlastnostFormSubmitted;
return $form;
}
//spracuje vystup po odoslani formulara (ulozi vlastnosti)
public function vlozVlastnostFormSubmitted(Form $form)
{
$this->ciselnikfarbaRepository->createTask($form->values->vlastnost);
$this->flashMessage('Vlastnosť pridaná.', 'success');
$this->redirect('this');
}
/********************* view delete *********************/
public function renderDelete($id = 0)
{
$this->template->tasks = $this->ciselnikfarbaRepository->findBy(array('id'=>$id));
}
/**
* Album delete form component factory.
* @return mixed
*/
protected function createComponentDeleteForm()
{
$form = new Form;
$form->addHidden('id', $this->getParameter('id'));
$form->addSubmit('cancel', 'Cancel');
$form->addSubmit('delete', 'Delete')->setAttribute('class', 'default');
$form->onSuccess[] = $this->deleteFormSubmitted;
$form->addProtection('Please submit this form again (security token has expired).');
return $form;
}
//funkcia pre mazanie
public function deleteFormSubmitted(Form $form)
{
if ($form['delete']->isSubmittedBy()) {
$id = $form['id']->getValue();
//$this->albums->find($this->getParameter('id'))->delete();
//$this->templates->tasks->findBy($this->getParameter('id'))->delete();
$this->templates->tasks->findBy(array('id'=> $id))->delete();
//$this->ciselnikfarbaRepository->findBy(array($tasks ->$id))->delete();
dump($id);
$this->flashMessage($id);
}
//$this->redirect('default');
}
}
?>
este raz vdaka za pochopenie a trpezlivost.