Replicator createOne() error

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

Ahoj,
snažím se rozchodit replicator v aplikaci, což se mě podařilo do stádia vykreslení. Po kliknutí na přidání nového inputu mě vyskočí laděnka s chybou

Call to undefined method Nette\Forms\Container::createOne()

Co bych mohl mít špatně?
díky

David Matějka
Moderator | 6445
+
0
-

ukaz kod

xciza
Člen | 194
+
0
-
protected function createDynamicForm() {
	$form->addDynamic('users', function (Container $user) {
                    $user->addText('name', 'Name');
                    $user->addSubmit('add', 'Add next person')
                                    ->setValidationScope(FALSE)
                            ->onClick[] = callback($this, 'MyFormAddElementClicked');
                }, 1);

}

 public function MyFormAddElementClicked(SubmitButton $button) {
        $button->parent->createOne();
    }

//sablona
      {foreach $form['users']->containers as $user}

    {$user['name']->control} {$user['name']->label}
    {$user['add']->control}

{/foreach}
David Matějka
Moderator | 6445
+
0
-

ten button musis pridat na dynamic container, ne na vnitrni container a nemusis navesovat callback, staci:

$form['users']->addSubmit('add', 'Add next person')->addCreateOnClick();

Editoval matej21 (23. 5. 2014 13:20)

xciza
Člen | 194
+
0
-

tak jsem to upravil takto:

$form->addDynamic('users', function (Container $user) {
                   $user->addText('name', 'Name');
               }, 1);

       $form['users']->addSubmit('add', 'Add next person')->addCreateOnClick();

Ale šablonu mám upravit jak? V současném stavu mě to píše že komponenta „add“ neexistuje

iguana007
Člen | 970
+
0
-

Zkus:

{form dynamicForm}
    {foreach $form['users']->containers as $user}
        {$user['name']->control} {$user['name']->label}
    {/foreach}
    {$form['users']['add']->control}
{/form}

Editoval iguana007 (23. 5. 2014 14:24)

xciza
Člen | 194
+
0
-

Jo díky, už to přidává další pole. Ale po kliknutí se celá stránka jakoby reloaduje (problikne) a zůstane umístěná na hlavičce (nepřesune se k novému poli). Je nějaká možnost jak to dělat bez toto probliknutí? Tak nějak jsem doufal že to v sobě má ajax a pole se přidají a překreslí bez jakýchkoli změn. Snad mě chápete :)

David Matějka
Moderator | 6445
+
0
-

Replicator resi pouze server side, client side si musis vyresit sam – treba pomoci nette.ajax.js a snippetu.
Dokonce neni nutno provadet ajaxovy pozadavek, ale pouze v klientu upravit DOM a ty prvky pridat, viz treba https://forum.nette.org/…cet-poloziek#…

xciza
Člen | 194
+
0
-

Tak všechno fungovalo tak jak má, než jsem na form nasadil AJAX. Momentálně to mám takto:

    protected function createComponentStep2() {
	$form->addDynamic('step2', function (Container $step2) {
                    $step2->addText();
                    $step2->addText();
                }, 1);

        $form['step2']->addSubmit('add', '+ add new')->addCreateOnClick();


        $form->addSubmit('submit', "continue")->setAttribute('class', 'button');

        $form->onSuccess[] = callback($this, 'step2Submitted');
}
public function MyFormAddElementClicked(SubmitButton $button) {
        $button->parent->createOne();
    }
  public function step2Submitted(Form $form) {
    //obsluha formu
        if ($this->isAjax()) {
            $this->invalidateControl('multistep');
            $this->invalidateControl('progressbar');
            $this->invalidateControl('javascripts');
        }
    }


//sablona
 {form step2 class => [multistep, ajax]}
        <fieldset>
            {foreach $form['step2']->containers as $step}
            <div class="input">
                <p>{$step['']->label}</p>
                <p>{$step['']->control}</p>
            </div>
            <div class="input">
                <p>{$step['']->label}</p>
                <p>{$step['']->control}</p>
            </div>


            {/foreach}
            <div class="clear"></div>

            <p class="add">{$form['step2']['add']->control}</p>
            {input submit}
        </fieldset>
        {/form}

Odeslání a překreslení formuláře AJAXem proběhne v pořádku, ale nemohu přidat pomocí replikatoru další pole. Co je potřeba doupravit?