Replicator – přidání nové sady ve snippetu

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

Zdravím a žádám o radu.

Požadovaná funkcionalita: Mám Niftygrid, v něm odkazy na objednání jednotlivých položek. Po kliknutí na tlačítko se otevře fancybox v němž se vykreslí formulář pro zadání více položek. Po kliknutí na „plus“ chci přidat další řádek (funkcionalitou Replicator), tzn. nechť zůstanou vyplněné údaje, nechť se přidá nový řádek a nechť se překreslí obsah formuláře (ve Fancyboxu).

Problém: Když přidání nového řádku dělám bez Ajaxu, nový řádek se přidá a zůstanou i hodnoty zadané v jiných polích. Při odeslání Ajaxem přidání nového řádku nedocílím a nevrátí se mi do formuláře ani zadaná data.

šablona

  {snippet orderForm}
    <div id="order-box">
      {form orderBoxForm}
      <table class="inform">
        {foreach $form['vyrobky']->containers as $id => $vyrobek}
            {first}<tr><td>{label vyrobky-$id-sarze/}</td><td>{label vyrobky-$id-pocet/}</td><td></td></tr>{/first}
            <tr><td>{input vyrobky-$id-sarze}</td><td>{input vyrobky-$id-pocet}</td><td>•{input vyrobky-$id-remove}</td></tr>
        {/foreach}
      </table>
      {input id}
      {input vyrobky-add}{input save}
      {/form}
    </div>
  {/snippet}

presenter


  public function createComponentOrderBoxForm()
  {
    $form = new Form();

    $form->addHidden('id')->setDefaultValue($this->id);

    $group = $form->addGroup('Výrobky');
    $vyrobky = $form->addDynamic('vyrobky', function (\Nette\Forms\Container $vyrobek) use ($form, $group) {

      $form->setCurrentGroup($group);

      $vyrobek->addText('sarze', 'Šarže:', 15);

      $vyrobek->addText('pocet', 'Nabízený počet:', 5);

      $form->setCurrentGroup(NULL);

      $vyrobek->addSubmit('remove', '')
              ->setValidationScope(false)
              ->addRemoveOnClick();
    }, 1);

    $form->setCurrentGroup(NULL);

    $vyrobky->addSubmit('add', '')
            ->setAttribute('class', 'tlacitko-plus')
            ->setValidationScope(false)
            ->addCreateOnClick(true);

    $form->addSubmit('save', 'Uložit')
         ->setAttribute('class', 'button-save');

    $form->onSuccess[] = $this->uloz;

    return $form;
  }


  public function uloz(Form $form)
  {
    if(!$form['save']->isSubmittedBy()) {
	$this->payload->action = 'Replicator';
        $this->invalidateControl('orderBoxForm');
        return;
    }

    $this->payload->action = 'Save';
    $this->invalidateControl('orderBoxForm');
  }

javascript


    $("a.sAjax").bind("click", function (event) {
        event.preventDefault();
        if ($.active) return;

        $.get($(this).attr('href'), function (payload) {
            $.Nette.success(payload);
            $('#order-box').hide();
            $.fancybox($('#order-box').html()/*, ... */);
        });
    });


    $(document.body).on("click", ".tlacitko-plus", function (event) {
        event.preventDefault();
        if ($.active) return;

        $.post($(this).closest('form').attr('action'), $(this).closest('form').serialize()+'&vyrobky%5Badd%5D', function (payload) {
            $('#order-box').hide();
            $.fancybox($('#order-box').html()/*, ... */);
        });
    });


    $(document.body).on("click", ".button-save", function (event) {
        event.preventDefault();
        if ($.active) return;

        $.post($(this).closest('form').attr('action'), $(this).closest('form').serialize()+'&save=Ulo%C5%BEit', function (payload) {
            $('#order-box').hide();
            $.fancybox($('#order-box').html()/*, ... */);
        });
    });

Zkoušel jsem mnohé, aktuálně posílám poslední verzi, už si ale nevím rady (možná hraje roli pátek 13.). Děkuji za nakopnutí.

revoke
Člen | 36
+
0
-

Tak jsem na to přišel a pokud byste někdo potřeboval, zde je řešení:

  1. opravit šablonu
<div id="order-box">
  {snippet orderForm}
  1. opravit javascript
    $(document.body).on("click", ".tlacitko-plus, .tlacitko-krizek, .button-save", function (event) {
        event.preventDefault();
        if ($.active) return;

        $.post($(this).closest('form').attr('action'), serialize_form(event), function (payload) {
            $.Nette.success(payload);
            // otevrit fancybox
            $.Nette.spinner.hide();
        });
    });

function serialize_form(event)
{
  var button = $(event.target);
  return button.parents('form').serialize()
        + '&'
        + encodeURI(button.attr('name'))
        + '='
        + encodeURI(button.attr('value'));
}