ajaxove plneni editacniho formulare

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

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

Dvě věci, které asi chybí z důvodu přepisu:

  1. v latté {snippet page}....{/snippet}
  2. místo public function handleUpdatePhm(){ má být public 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
+
0
-

Ot@s napsal(a):

Dvě věci, které asi chybí z důvodu přepisu:

  1. v latté {snippet page}....{/snippet}
  2. místo public function handleUpdatePhm(){ má být public 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
+
0
-
  1. persistentní parametr by měl vždy fungovat (přidá se automaticky do action formu)
  2. 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
+
0
-

Ot@s napsal(a):

  1. persistentní parametr by měl vždy fungovat (přidá se automaticky do action formu)

Nechapu proc to pres persistentni parametr nechce projit. dyz by to melo projit.

JuniorJR
Člen | 181
+
0
-

Ty ho máš totiž v public function phmFormSubmitted(Form $form, $id), což je nedobře. To $id se tam jednoduše nemá, jak předat.

Editoval JuniorJR (4. 5. 2012 8:40)

TheNEoo
Člen | 75
+
0
-

JuniorJR napsal(a):

Ty ho máš totiž v public function phmFormSubmitted(Form $form, $id), což je nedobře. To $id se tam jednoduše nemá, jak předat.

phmFormSubmitted(Form $form, $id) odsud jsem ho odstranil

TheNEoo
Člen | 75
+
0
-

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)

JuniorJR
Člen | 181
+
0
-

Vypiš si před uložením hodnotu toho perzistentního parametru:

$this->id;

Editoval JuniorJR (4. 5. 2012 9:32)

Ot@s
Backer | 476
+
0
-

Opravdu máš na začátku definici peristence proměnné? Z ukázky presenteru to není vidět…

/** @persistent */
public $id;

Ostatní tipy:

  1. 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
  2. vysyp keš
  3. 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
+
0
-

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

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).

  1. zkontroluj definici rout v bootstrapu
  2. zkus v presenteru zaměnit $this->id za $this->getParam('id')
TheNEoo
Člen | 75
+
0
-

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 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).

  1. zkontroluj definici rout v bootstrapu
  2. 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.