Handle v komponentě nezíská id

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

Ahoj,

mám problém při ajaxovém mazání položky. Handle, který toto má obstarávat a je v komponentě, neobdrží id.

//componenta pro mazaní položky menu

<?php
class MenuItemComponent extends \Nette\Application\UI\Control{

//zde je nejaky kod

    public function handleDelete($id){
        if ($this->presenter->isAjax()){
            $where   = Array();
            $where[] = 'idmenuitem='.$id; //zde nedostanu id

            $this->menuItemModel->delete($where);

            $this->invalidateControl('menuItems');
        }
    }

//pokracovani komponenty

}
?>

Všabloně je pak toto:

<ul n:snippet="menuItems">
    {foreach $menuItems as $item}
    <li id="itemid_{$item->idmenuitem}">
        {$item->name_menuitem}
        <a n:href="delete!, $item->idmenuitem" class="ajax">Smazat</a>
        <a n:href="edit!, $item->idmenuitem" class="ajax">Upravit</a>
    </li>
    {/foreach}
</ul>

Po kliknutí na delete by se měl vyvolat signál, před id a smazat položku menu, nakonec by se měl invalidovat seznam ul ale vyhučí to na nepředaném parametru. ID je v šabloně předáno a adresa vypadá následovně:

http://localhost/admin/menu/edit?…

Editoval jablon (23. 2. 2012 14:23)

Nox
Člen | 378
+
0
-

V šabloně máš $item, v handlu máš $id

Fakt, tímto to nebude…

Editoval Nox (23. 2. 2012 19:55)

nanuqcz
Člen | 822
+
0
-

V šabloně máš $item, v handlu máš $id

Nepřehlídl ses místo $item->idmenuitem na item=>$idmenuitem? Mě ten jeho kód připadá v pořádku.

jiri.medved
Člen | 33
+
0
-

Zkus to bez carky za delete!

<a n:href="delete! $item->idmenuitem" class="ajax">Smazat</a>
nanuqcz
Člen | 822
+
0
-

Zkus tu metodu přepsat takhle:

public function handleDelete($id){
    $where   = Array();
    $where[] = 'idmenuitem='.$id; //zde nedostanu id

    $this->menuItemModel->delete($where);

    if ($this->presenter->isAjax()){
        $this->invalidateControl('menuItems');
    } else {
        $this->presenter->redirect('this');
    }
}

a vyzkoušej, jestli ti to funguje bez AJAXu. Ten kód totiž vypadá v pořádku, takže chyba může být v javascriptech.

Editoval nanuqcz (24. 2. 2012 0:43)

Tomáš Jablonický
Člen | 115
+
0
-

jiri.medved napsal(a):

Zkus to bez carky za delete!

<a n:href="delete! $item->idmenuitem" class="ajax">Smazat</a>

Tohle nepomůže, výsledek je stejný.

Tomáš Jablonický
Člen | 115
+
0
-

nanuqcz napsal(a):

Zkus tu metodu přepsat takhle:

public function handleDelete($id){
    $where   = Array();
    $where[] = 'idmenuitem='.$id; //zde nedostanu id

    $this->menuItemModel->delete($where);

    if ($this->presenter->isAjax()){
        $this->invalidateControl('menuItems');
    } else {
        $this->presenter->redirect('this');
    }
}

a vyzkoušej, jestli ti to funguje bez AJAXu. Ten kód totiž vypadá v pořádku, takže chyba může být v javascriptech.

Ajax chodí v pohodě, když vyvolám samotný handle (bez ajaxově) tak výsledek je stejný. Echo $id je null a dump($this->getParam()) je prázdný pole.

Zatím to řeším pomoci $_GET ale to není to správné řešení.

Editoval jablon (24. 2. 2012 8:53)

nanuqcz
Člen | 822
+
0
-

Právě jsem si to zkoušel na Sandboxu, a mě to funguje. Tak si stáhni mojí verzi a hledej, co máš jinak ;-)

Paradiso
Člen | 101
+
0
-

zdravím, dnes jsem na tento problém také narazil. Problém nastává při tomto zápisu:

$.get({link signal!}, { id: $(this).attr('id'), val: $(this).val() });

protože se vytvoří query string: ?do=control-signal&id=1&val=reserved

a aby to brala komponenta, je třeba: ?do=control-signal&control-id=1&control-val=reserved

napadlo mě toto řešení:

$.get({link signal!}, { "{!$control->name}-id": $(this).attr('id'), "{!$control->name}-val": $(this).val() });

Editoval Paradiso (4. 3. 2012 15:46)

boky
Člen | 18
+
+1
-

Paradiso napsal(a):

$.get({link signal!}, { "{!$control->name}-id": $(this).attr('id'), "{!$control->name}-val": $(this).val() });

no lepší je místo

{!$control->name}-id

tohle

{!$control->getParameterId('id')}

protože když budeš mít komponentu v komponentě, tak už to fungovat nebude

btw: nechtělo by to dopsat do dokumentace? Příde mi že to řeší hodně lidí