ajaxove plneni editacniho formulare
- TheNEoo
- Člen | 75
Zdravim,
uz chvili se patlam, jak naplnit daty editacni formular ajaxove.
Pri kliku na odkaz upravit se zda, ze vse probehne v poradku. Jen se nenaplni
data, tlacitko se zmeni na Odeslat z puvodniho takze ajax probehne, ale data se
nenaplni do formu,
Zacinam bejt zoufalej :). Az sem se mi to podarilo po delsi dobe dat dohromady pridat i oderat:)
v latte
<script>
$(function() {
// odesílání odkazů
$('a.ajax').live('click', function (event) {
event.preventDefault();
$.get(this.href);
});
// odesílání formulářů
$('form.ajax').live('submit', function (event) {
event.preventDefault();
$.post(this.action, $(this).serialize());
return false;
});
});
</script>
...
<a n:href="updatePhm!, 'id' => $phmItem->id" class="ajax" >Upravit</a>
...
v presenteru
// handler volam z linku...
public function handleUpdatePhm(){
$this['phmForm']['save']->caption = 'Odeslat'; //Pri kliku na upravit se formu upravi tlacitko na ODESLAT, takze to probehne v poradku
$form = $this['phmForm'];
$row = $this->context->createCestySetting()->findPhmEdit($id);
$form->setValues(array('nazev' => $row['nazev'] 'cena' => $row['cena']), TRUE);
if (!$this->presenter->isAjax()) {
$this->presenter->redirect('this');
} else {
$this->template->currentPhm = 'current';
$this->template->page = 'include/phm.latte';
$this->invalidateControl('page');
}
}
//V modelu pak dotaz
public function findPhmEdit($id) {
return $this->connection->query('SELECT * FROM is_setting_phm WHERE id=?', $id)->fetch();
}
Editoval TheNEoo (3. 5. 2012 20:57)
- Ot@s
- Backer | 476
Dvě věci, které asi chybí z důvodu přepisu:
- v latté
{snippet page}....{/snippet}
- místo
public function handleUpdatePhm(){
má býtpublic function handleUpdatePhm($id){
Pokud máš dobře definovnou/připojenou komponentu
createComponentPhmForm
a nette.js s podporou
ajaxu (asi jo, když proběhne změna caption buttonu), tak nevidím důvod,
proč by to nemělo fungovat.
- TheNEoo
- Člen | 75
Ot@s napsal(a):
Dvě věci, které asi chybí z důvodu přepisu:
- v latté
{snippet page}....{/snippet}
- místo
public function handleUpdatePhm(){
má býtpublic function handleUpdatePhm($id){
Pokud máš dobře definovnou/připojenou komponentu
createComponentPhmForm
a nette.js s podporou ajaxu (asi jo, když proběhne změna caption buttonu), tak nevidím důvod, proč by to nemělo fungovat.
Tak to $id mi vubec nedoslo.
Pri odeslani formu se, ale stane to ze se misto update provede insert.
Taktez uz nevim zkousel sem to pres perzistentni parametr ci treba pres return
$id a porad se provadi insert misto update jako by $id po odeslani
bylo null
public function phmFormSubmitted(Form $form, $id) {
if ($id > 0) {
$this->context->createCestySetting()->updatePhm($id, $form->values);
} else {
$this->context->createCestySetting()->insertPhm($form->values);
}
if (!$this->isAjax())
$this->redirect('this');
else {
$this->invalidateControl('stranka');
$this->template->curentPhm = 'current';
$this->template->page = 'include/phm.latte';
$form->setValues(array(''), TRUE);
}
}
Editoval TheNEoo (4. 5. 2012 0:01)
- Ot@s
- Backer | 476
- persistentní parametr by měl vždy fungovat (přidá se automaticky do action formu)
- id ještě můžeš dát do hidden pole příslušného formuláře (pokud nemáš důvod nepoužít persistenci)
To $id
z parametrů phmFormSubmitted
vyhoď,
určitě nikdy nebude obsahovat to, co potřebuješ. Tj obsah komponenty:
/** @persistent */
public $id; // plněné přeba přes <a n:href="this, id=>10">upravit radek</a>
public function phmFormSubmitted(Form $form) {
if ($this->id > 0) {
// update
} else {
// insert
}
// ....
}
- TheNEoo
- Člen | 75
Aktualne to vypada takto:
phm.latte
...
<a n:href="updatePhm!, id => $phmItem->id" class="ajax" >Upravit</a>
...
presenter
public $id;
//sem projde vse v poradku form se naplni daty
public function handleUpdatePhm($id){
$this['phmForm']['save']->caption = 'Upravit Phm';
$form = $this['phmForm'];
$row = $this->context->createCestySetting()->findPhmEdit($id);
$form->setValues(array('nazev' => $row['nazev'], 'cena' => $row['cena']), TRUE);
if (!$this->presenter->isAjax()) {
$this->presenter->redirect('this');
} else {
$this->template->curentPhm = 'current';
$this->template->page = 'include/phm.latte';
$this->invalidateControl('stranka');
}
}
// zde se stale provadi insert misto update
public function phmFormSubmitted(Form $form) {
if ($this->id > 0) {
$this->context->createCestySetting()->updatePhm($id = $this->id, $form->values);
} else {
$this->context->createCestySetting()->insertPhm($form->values);
}
if (!$this->isAjax())
$this->redirect('this');
else {
$this->invalidateControl('stranka');
$this->template->curentPhm = 'current';
$this->template->page = 'include/phm.latte';
$form->setValues(array(''), TRUE);
}
}
Editoval TheNEoo (4. 5. 2012 8:49)
- Ot@s
- Backer | 476
Opravdu máš na začátku definici peristence proměnné? Z ukázky presenteru to není vidět…
/** @persistent */
public $id;
Ostatní tipy:
- z odkazů dočasně stáhni
class="ajax"
– koukej se, jestli je id v URL požadavku a dumpuj si obsahy proměnných podle potřeby - vysyp keš
- něměníš ručně action v
$this['phmForm']
? – zkontroluj si HTML formuláře, resp. URL v action u formuláře, jesti obsahuje onu persistentní ID
- TheNEoo
- Člen | 75
Tak do perzistentniho parametru se mi nedostava hodnota id, nevim, z jakeho duvodu.
Pri volani handleUpdatePhm($id) se promena id naplni, takze zde je vse v poradku, ale perzistentni parametr je stale prazdny, takze pri odeslani formu mam id 0. Nevim, proc by to nemelo jit.
Mam treba ajaxovej kalendar a tam se mi perzistentni parametry prenasi v linku uplne v poradku.
Jinak tlacitko na odeslani neobsahuje zadne id, jen nese akci
Edit:
Odkaz mi ale prijde divny v tom co obsahuje /111?do=UpdatePhm prijde mi divne
to ze tam chyby sluvko id pac v kalendari mam v url ?month=5 ...... a
handler
Editoval TheNEoo (4. 5. 2012 13:08)
- Ot@s
- Backer | 476
TheNEoo napsal(a):
Odkaz mi ale prijde divny v tom co obsahuje /111?do=UpdatePhm prijde mi divne to ze tam chyby sluvko id pac v kalendari mam v url ?month=5 ...... a handler
To bude tím, že používáš název id i v definici
rout. To má vyšší prioritu oproti stejné persistentní proměnné
v preseteru (= proto je součástí URL a ne parametrů). Divné je, že
v presenteru $this->id
je prázdné (při URL
/111?do=UpdatePhm
).
- zkontroluj definici rout v bootstrapu
- zkus v presenteru zaměnit
$this->id
za$this->getParam('id')
- TheNEoo
- Člen | 75
Ot@s napsal(a):
TheNEoo napsal(a):
Odkaz mi ale prijde divny v tom co obsahuje /111?do=UpdatePhm prijde mi divne to ze tam chyby sluvko id pac v kalendari mam v url ?month=5 ...... a handlerTo bude tím, že používáš název id i v definici rout. To má vyšší prioritu oproti stejné persistentní proměnné v preseteru (= proto je součástí URL a ne parametrů). Divné je, že v presenteru
$this->id
je prázdné (při URL/111?do=UpdatePhm
).
- zkontroluj definici rout v bootstrapu
- zkus v presenteru zaměnit
$this->id
za$this->getParam('id')
tak po umornem snazeni se mi nepodarilo jinak nez id predat pres hidden pole ve formu. Az bude vice casu tak se k tomu vratim a zkusim zjistit proc a dam vedet zatim dekuji za spolupraci.