Zmazanie zaznamu v databaze

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

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

Někde v životním cyklu plníš hodnotu $this->tasks a ta není při zpracování signálu k dispozici (udělej si dump). Neplníš náhodou $this->tasks někde v render...() nebo beforeRender()? Zpracování signálu se provádí před jakýmkoli výstupem z render.

cujan
Člen | 410
+
0
-

jasne plnim to

<?php
public function renderDelete($id = 0)
	{
        $this->template->tasks = $this->ciselnikfarbaRepository->findBy(array('id' => $id));

	}
?>
Ot@s
Backer | 476
+
0
-

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

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

Ot@s
Backer | 476
+
0
-

Call to a member function findBy() on a non-object

Stále málo indícií k věcné pomoci. Od začátku – chybová hláška vyskočí přesně kde? Po kliknutí na tlačítko smaznání (uvnitř deleteFormSubmitted()) nebo v průběhu vykreslování delette.latte?

Editoval Ot@s (10. 10. 2012 11:44)

cujan
Člen | 410
+
0
-

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

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

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.

Ot@s
Backer | 476
+
0
-

Caine napsal(a):
Tohle fungovat nemuze, protoze ty parametry (id) se predavaj az render metode dany komponenty, ne ty tovarnicce, ty se predava nazev volany komponenty.

Jasný, sekl jsem se. Míchám do toho signály a vznikl z toho nesmysl.

cujan
Člen | 410
+
0
-

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

Uf, kruh se uzavírá. Kde plníš $this->tasks? Podle všeho je v době zpracování signálu deleteFormSubmitted(Form $form) $this->tasks prázdné.

cujan
Člen | 410
+
0
-

plnim to v

<?php
public function renderDelete($id = 0)
  {
        $this->template->tasks = $this->ciselnikfarbaRepository->findBy(array('id' => $id));
  }
?>
Ot@s
Backer | 476
+
0
-

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:

  1. $this->template->tasks a $this->tasks není totéž
  2. 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
+
0
-

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.

cujan
Člen | 410
+
0
-

No tak cumel som do toho a zrazu to prislo, cize staci upravit v deleteFormSubmitted

toto

<?php
$this->ciselnikfarbaRepository->findBy(array('id'=> $id))->delete();
?>

este raz vdaka.....