Handle v komponentě nezíská id
- Tomáš Jablonický
- Člen | 115
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)
- jiri.medved
- Člen | 33
Zkus to bez carky za delete!
<a n:href="delete! $item->idmenuitem" class="ajax">Smazat</a>
- nanuqcz
- Člen | 822
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
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
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)
- Paradiso
- Člen | 101
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
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í