Nelza mazat záznamy z tabulky podle ID

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

Zdravím, potřeboval bych udělat mazací funkci z databáze každého jednotlivého řádku, ovšem, mám problém s implementací, kde se mi to padá pořád na získání odpovídajícího ID záznamu z tabulky.

Model:

<?php
 public function findBy($id)
    {
        return $this->findAll()->get($id);
    }
?>

Presenter:

<?php
class DataPresenter extends BasePresenter
{
 /** @var Financni_informaceRepository */
   private $finance;


   protected function startup()
    {
        parent::startup();
         $this->finance = $this->context->financni_informaceRepository;

    }

    /**
     * Továrnička na delate.
     * @return AppForm
     */
    protected function createComponentDeleteForm()
    {
        $form = new AppForm;
        $form->addSubmit('cancel', 'Zrušit')
            ->onClick[] = $this->formCancelled;

        $form->addSubmit('delete', 'Smazat')
            ->setAttribute('class', 'default')
            ->onClick[] = $this->deleteFormSubmitted;

        $form->addProtection();
        return $form;
    }



    public function deleteFormSubmitted()
    {
        $this->finance->findBy($this->getParameter('ID'))->delete();
        $this->flashMessage('Záznam byl smazán.');
        $this->redirect('Data:vypis');


    }

  /********************* financni_informace vypis *********************/
   public function renderVypis() {
    $strankovani = new VisualPaginator($this, 'paginator');
    $paginator = $strankovani->getPaginator();
    $paginator->itemsPerPage = 9;
    $paginator->itemCount = $this->finance->countFinance();
    $rows = $this->finance->getAll($strankovani->paginator->offset, $strankovani->paginator->itemsPerPage);
    $this->template->finance = $rows;
}

/********************* financni_informace delete *********************/


        public function renderSmazat($id)
    {
        $this->template->finance =$this->finance->findBy($this->getParameter('ID'));
        if (!$this->template->finance) {
            $this->error('Záznam nebyl nalezen');
        }
    }

    public function formCancelled()
    {
        $this->redirect('Data:vypis');
    }


}
?>

Editoval Nevinho (22. 11. 2012 13:03)

ViPEr*CZ*
Člen | 817
+
0
-

Tohle $this->getParameter(‚ID‘) nejspíš po submit neplatí. Zkuste se mrknout na tzv. persistentní parametry.

vvoody
Člen | 910
+
0
-

Podla mňa platí, problém by som videl v tom, že je to case sensitive.

$this->getParameter('id');
ViPEr*CZ*
Člen | 817
+
0
-

vvoody napsal(a):

Podla mňa platí, problém by som videl v tom, že je to case sensitive.

$this->getParameter('id');

No pokud to má nastavený v routě tak určitě. ;-) Ono taky volat v metodě render, která vypadá takto:
renderSmazat($id) metodu $this->getParameter(‚ID‘) je dost divný :-)

Nevinho
Člen | 77
+
0
-

case sensitive, tím by to být nemělo, protože v databázi mám ID a ne id, takže to by mělo být v pohodě..

ViPEr*CZ*
Člen | 817
+
0
-

Nevinho napsal(a):

case sensitive, tím by to být nemělo, protože v databázi mám ID a ne id, takže to by mělo být v pohodě..

A od kdy se $this->getParameter(‚id‘); dívá do databáze???

Nevinho
Člen | 77
+
0
-

Ne sorry do databáze se nedívá, ale pak teda nechápu, proč to nevrací to odpovídající id záznamu, když zadaám do metody render($id=1) tak to smaže v pohodě, ale vždycky jen záznam s tím idéčkem. Jak teda mám předat ten parametr aktuálního id? metoda findby($id) by přece měla být dobrá nebo ne?

ViPEr*CZ*
Člen | 817
+
0
-

Nevinho napsal(a):

Ne sorry do databáze se nedívá, ale pak teda nechápu, proč to nevrací to odpovídající id záznamu, když zadaám do metody render($id=1) tak to smaže v pohodě, ale vždycky jen záznam s tím idéčkem. Jak teda mám předat ten parametr aktuálního id? metoda findby($id) by přece měla být dobrá nebo ne?

Co si přečíst moji první odpověď??? Koukněte se na persistentní parametry.

Editoval ViPEr*CZ* (22. 11. 2012 21:25)

Nevinho
Člen | 77
+
0
-

na perzistentní parametry jsem se díval, ale nějak nechápu, jak je použít v mém případě.. -(.
Jakože nějak ukládat aktuální id do perzistentního parametru?

Editoval Nevinho (22. 11. 2012 21:36)

ViPEr*CZ*
Člen | 817
+
0
-

Ufff to je s Vámi práce… co jste na tom nepochopil? Tak jinak… co je toto:

public function deleteFormSubmitted()

???

Nevinho
Člen | 77
+
0
-

Tak to je funkce, která obsahuje kód, který se má provést, pokud je formulář vyplněn a je kliknuto na tlačíto zobrazit dejme tomu.. V mém případě kód, který se provede po kliknutí na odkaz smazat ve vypsané databázi.

Editoval Nevinho (22. 11. 2012 21:44)

ViPEr*CZ*
Člen | 817
+
0
-

Nevinho napsal(a):

Tak to je funkce, která obsahuje kód, který se má provést, pokud je formulář vyplněn a je kliknuto na tlačíto zobrazit dejme tomu.. V mém případě kód, který se provede po kliknutí na odkaz smazat ve vypsané databázi.

Skoro… funkce to je… je to callback na úspěšné odeslání formu a také to je signál komponenty formuláře. A co se stane… v url je ID a po submitu, když smažete $this->redirect(‚Data:vypis‘);
tak to ID zmizí… protože se přesměruje na signál a IDéčko se nepřenese. Jako persistent se ovšem přenese. Jak označit property jako persistent je v dokumentaci.

vvoody
Člen | 910
+
0
-

Nevinho napsal(a):

case sensitive, tím by to být nemělo, protože v databázi mám ID a ne id, takže to by mělo být v pohodě..

Skúsil si to vôbec? Pozeral si sa do debugbaru na query akú hodnotu ti to vložilo do podmienky? Stavím sa že tam bude NULL.

Nevinho
Člen | 77
+
0
-

chápu, ale vždy se vyhodí hláška že záznam není nalezen.

<?php
/** @persistent */
    public $id;

public function renderSmazat($id)
    {
        $this->template->finance =$this->finance->findBy($this->id=$this->getParameter('id'));
        if (!$this->template->finance) {
            $this->error('Záznam nebyl nalezen');
        }

?>

Musí být někde v tété funkci chyba, ale nemůžu přijít kde.

ViPEr*CZ*
Člen | 817
+
0
-

Když už, tak takhle:

public function renderSmazat($id)
{
    $this->template->finance =$this->finance->findBy($id);
    if (!$this->template->finance) {
        $this->error('Záznam nebyl nalezen');
}

a pak taky:

public function deleteFormSubmitted()
{
    $this->finance->findBy($this->id)->delete();
    $this->flashMessage('Záznam byl smazán.');
    $this->redirect('Data:vypis');
}
vvoody
Člen | 910
+
0
-

Tak si dumpni to id čo v ňom máš a používaj to ktoré je predávané ako parameter funkcie, s tým getParameter sa len naradmo upíšeš k smrti.

public function renderSmazat($id)
{
	dump($id);
	$this->template->finance = $this->finance->findBy($id);
	if (!$this->template->finance) {
		$this->error('Záznam nebyl nalezen');
	}
}
Nevinho
Člen | 77
+
0
-

když si dumpnu $id, tak je tam vždy null.. Ono je to asi logický :-(. Bohážel mi to pořád háže hlášku na kterýkoliv záznam, že záznam nebyl nalezen, diky tomu null samozřejmě…

ViPEr*CZ*
Člen | 817
+
0
-

Teď z hlavy… zkuste přiřadit tomu $this->id to idéčko v metodě renderSmazat. Respektive v té metodě by mělo být $this->id naplněno ;-)

Editoval ViPEr*CZ* (22. 11. 2012 22:29)

Nevinho
Člen | 77
+
0
-

Omlouvám se, ale teď jsem to z toho co jste psal příliš nepochopil kam co mám přiřadit..?

vvoody
Člen | 910
+
0
-

Nevinho napsal(a):

když si dumpnu $id, tak je tam vždy null.. Ono je to asi logický :-(. Bohážel mi to pořád háže hlášku na kterýkoliv záznam, že záznam nebyl nalezen, diky tomu null samozřejmě…

To id ani není v url? ako vyzerá to url?

Nevinho
Člen | 77
+
0
-

při zmáčknutí tlačítka smazat a dump($this->id) v metode renderSmazat

URL:http://localhost/…/data/smazat

není tam žádné id, vypíše se pouze NULL

vvoody
Člen | 910
+
0
-

A ty hladáš chybu v spracovaní requestu, keď ani v url nemáš id? Ukáž ako generuješ link toho tlačítka.

Nevinho
Člen | 77
+
0
-

obsah smazat.latte:

<?php
{block #content}
<h1 n:block="title">Smazat záznam</h1>

{if $finance}
    <p>Přejete si smazat tento záznam?</p>
    {control deleteForm}

{else}
    <p>Záznam nebyl nalezen.</p>
{/if}
{/block}

?>

Editoval Nevinho (22. 11. 2012 22:59)

vvoody
Člen | 910
+
0
-

Myslel som to tak že ako generuješ link, ktorý odkazuje na tu stránku kde si teraz (http://localhost/…/data/smazat)

Nevinho
Člen | 77
+
0
-

omlouvám se, ale Asi tě úplně nechápu, co bych ti měl poslat..

<a class=„in_form“ n:href=„smazat“>Smazat</a>

myslíš tohle?

vvoody
Člen | 910
+
0
-

jo, presne tam doplň to idčko

Nevinho
Člen | 77
+
0
-

kam přesně? jak by to mělo prosimtě vypadat, tedka nevím kam to mám doplnit a co?

vvoody
Člen | 910
+
0
-
Nevinho
Člen | 77
+
0
-

<a class=„in_form“ n:href=„smazat $id“>Smazat</a> – takto předpokládám?

Ale když to udělám, tak po kliknutí tlačítka smazat je url: http://localhost/…ta/smazat/id

a hláška záznam nebyl nalezen

vvoody
Člen | 910
+
0
-

čo ukazuje ten dump toho idčka? aký je parameter v query v debug bare?

Nevinho
Člen | 77
+
0
-

<a n:href=„Data:smazat $id“>Smazat</a>

když to mám takhle, tak mi to napíše že Undefined variable: id

Caine
Člen | 216
+
0
-

omg…

<a n:href=„Data:smazat $finance->id“>Smazat</a>

ViPEr*CZ*
Člen | 817
+
0
-

Nevinho napsal(a):

<a n:href=„Data:smazat $id“>Smazat</a>

když to mám takhle, tak mi to napíše že Undefined variable: id

Protože v šabloně to ještě neexistuje, stačí to idéčko předat do šablony (Caine využil existenci objektu $finance a z něj si to idéčko vytáhl)