Redraw po kliku na tlačítko ve formu

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

Zdravím,
mám takový problém. Mám formulář se 3mi tlačítky. Jedno slouží na odeslání formuláře, jedno na mazání vybraných obrázků a poslední bude na přesun do jiného alba. Problém je, že v případě, kdy označím X obrázků a následně kliknu na tlačítko pro smazání, provede se smazání, ale neprovede se mi redraw snippetu s obrázky. Nevím jak ho ve FormFactory zavolat po dokončení mazání obrázků.

FormFactory:

class FormFactory extends Nette\Object
{
	//.....

 public function create($id_images, $id_album)
    {

        $this->id_album = $id_album;

        $form = new Form;

        $form->setTranslator($this->translator->domain('forms'));

        $images = $form->addDynamic('images', function (Container $image) {

            $image->addHidden('id_image');

            $image->addHidden('name');

            $image->addCheckbox('select');

            $image->addText('description');
        });

        $form->addOptionList('default','default', $id_images);

        $form->addSubmit('delete', 'button.delete_selected')
            ->setValidationScope(FALSE)
            ->onClick[] = array($this, 'deleteSelected');

        $form->addSubmit('move', 'button.move_selected')
            ->setValidationScope(FALSE)
            ->onClick[] = array($this, 'moveSelected');

        $form->addSubmit('send', 'button.save');
        $form->onSuccess[] = array($this, 'formSucceeded');

          return $form;
    }

Metoda pro mazání obrázků (tam bych potřeboval zavolat redraw):

public function deleteSelected($button) {

       $form = $button->getForm();
       $values = $form->getValues();

       $album_data = $this->imageRepository->getAlbumSource($this->id_album)->fetch();

       if($album_data->id_user != $this->user->identity->getId()){
           throw new Nette\Application\BadRequestException;
       }

       foreach ($form['images']->values as $id_image => $image) {

           if($image['select']){

               $this->imageStorage->delete($this->user->identity->ident_user . '/' . $this->id_album . '/' . $image['name']);
               $this->imageRepository->deleteImage($image['id_image']);

               if($album_data->default_image == $image['name']) {
                   $image = $this->imageRepository->getImages($this->id_album)->limit(1)->fetch();

                   if($image){
                       $values['default_image'] = $image['name'];
                   }
                   else{
                       $values['default_image'] = NULL;
                   }

                   $this->imageRepository->updateAlbum($this->id_album, $values);
               }
           }
       }

		// zde bych potřeboval zavolat redraw na snippet
       //$this->redrawControl('imagesSnippet');
   }

Nevíte prosím někdo jak na to? Díky moc.

F.Vesely
Člen | 369
+
0
-

Prilinkuj si nette.ajax.js a dej formulari tridu ajax.

Croc
Člen | 270
+
0
-

nette.ajax.js mám, ale nevím jak myslíš dát formuláři třídu ajax…

iNviNho
Člen | 352
+
0
-

Tlačítku submit dáš triedu ajax, napr.

<button n:name="submit" class="ajax">Odošli ma!</button>

BTW: https://componette.org/…tte.ajax.js/

Croc napsal(a):

nette.ajax.js mám, ale nevím jak myslíš dát formuláři třídu ajax…

Editoval iNviNho (2. 2. 2016 9:48)

CZechBoY
Člen | 3608
+
0
-

Nebo

$form->addSubmit(...)
    ->getControlPrototype()
    ->addClass('ajax');
Croc
Člen | 270
+
0
-

Jo takhle. No ale stejně se mi snippet nerefreshne…

CZechBoY
Člen | 3608
+
0
-

Mas v tom formSucceeded prekresleni redrawControl(nazevSnippetu)?

Croc
Člen | 270
+
0
-

Ve formSucceeded to nemám. Potřebuji to mít v deleteSelected, kterým se ale neodeodesílá ten form – viz výše uvedený kód.

Nicméně v metodě deleteSelected mám $this->redrawControl('imagesSnippet');, ale nerefreshne se…

CZechBoY
Člen | 3608
+
0
-

A co se pošle po síti? (Záložka network ve vývojářských nástrojích → filtr XHR)

iNviNho
Člen | 352
+
0
-

Skús iba pichnúť do renderSABLONA()

<?php
if ($this->isAjax()) {
	$this->redrawControl("imagesSnippet");
}
?>

A otestuješ či nie je problém v redrawControle metode

Editoval iNviNho (2. 2. 2016 10:26)

Croc
Člen | 270
+
0
-

Aha, chyba 500:
Nette\MemberAccessException: Call to undefined method App\Forms\FormFactory::redrawControl()

CZechBoY
Člen | 3608
+
0
-
$this->getPresenter()->redrawControl('snippet');
Croc
Člen | 270
+
0
-

To jsem zkoušel už předtím, ale hodí mi to taky 500:
Call to undefined method App\Forms\FormFactory::getPresenter()

Nebude problém v tom, že tu třídu mám extends Nette\Object? Pokud dám extends Form, hlásí mi to:
Nette\InvalidStateException: Component '' is not attached to 'Nette\Application\UI\Presenter'

Editoval Croc (2. 2. 2016 10:36)

CZechBoY
Člen | 3608
+
+1
-

Jo takhle, ty vracíš přímo Form. Tak ten redraw udělej v presenteru.

protected function createComponentMujFormular ()
{
	$form = $this-formFactory->create();

	$form->getComponent('delete')->onClick[] = function () {
		$this->redrawControl('imagesSnippet');
	};

	return $form;
}

Případně si udělej svoji událost.

class FormFactory extends \Nette\Object
{
	public $onDelete = array ();

	public function deleteSelected ($button)
	{
		...

		$this->onDelete($button->getForm());
	}
}

class MujPresenter extends BasePresenter
{
	protected function createComponentMujForm ()
	{
		$form = $this->formFactory->create();

		$form->onDelete[] = function ($form) {
			$this->redrawControl('imagesSnippet');
		};

		return $form;
	}
}

Editoval CZechBoY (2. 2. 2016 10:59)

Croc
Člen | 270
+
0
-

Díky za tip, ale teď se to chová stejně jako na začátku.

Označím obrázek, kliknu na smazání, to se provede. Označený obrázek se již nezobrazí, ale je tam místo něj ikona chybějícího obrázku + další věci, které k obrázku zobrazuji. Obrázek je vymazán, jak z DB tak ze složky, ale jelikož se provere refresh nad daty před výmazem, pokusí se ho to zobrazit.

Nebude tedy lepší prvést redirect na stejnou stránku?

Editoval Croc (2. 2. 2016 13:22)

CZechBoY
Člen | 3608
+
0
-

Ten redraw se provede až po smazání obrázku.
Neobrátil si pořadí volání $this->onDelete($button->getForm()) a samotného smazání?

Editoval CZechBoY (2. 2. 2016 13:47)

Croc
Člen | 270
+
0
-

Neobrátil. Zatím jsem tam dal redirect. Asi to tak zatím nechám být, ať nad tím nemrhám čas.

Díky moc všem za rady :-)