Ajaxové odeslání formuláře při použití továrničky

Alsatian
Člen | 164
+
0
-

Ahoj. Návodů kroupy, ale ne a ne se dopracovat zdárného konce..
Tvořím formulář s výběrem obrázků (addMultiUpload) kde odeslání bych rád AJAXově. Form je v továrničce, abych nezahlcoval presenter.

Presenter HomepagePresenter.php

<?php
namespace App\Presenters;

class HomepagePresenter extends BasePresenter
{
    /** @var \App\Forms\FormImagesFactory @inject */
    public $formImagesFactory;

    public function renderDefault()
    {
        $images = glob('uploads/*.jpg');
        $this->template->images = $images;
    }

    protected function createComponentFormImages()
    {
        $form = $this->formImagesFactory->create();
        return $form;
    }
}

default.latte – stránka s formulářem

{block content}
    {="now"|date:'j. n. Y / H:i:s'}

    <h1>Formulář pro vložení obrázků</h1>
    {control formImages}

    <hr>

    <div n:snippet="imagesWrapper">
        <img n:tag-foreach="$images as $image" src="{$basePath}/{$image}" border="0">
    </div>
{/block}

FormFactory.php – v neočesaném projektu zde inicializuji třeba translator.

<?php
namespace App\Forms;

use Nette;
use Nette\Application\UI\Form;

class FormFactory
{
	use Nette\SmartObject;

	/**
	 * @return Form
	 */
	public function create()
	{
		$form = new Form;

		return $form;
	}
}

A FormImagesFactory.php – kde prostě končím s Ajaxem.. Formulář se odešle „normálně“, tedy POSTem.

<?php
namespace App\Forms;

use Nette;
use Nette\Application\UI\Form;
use Nette\Utils\Image;
use Nette\Utils\Strings;
use Nette\Application\UI;

class FormImagesFactory extends UI\Control
{
	use Nette\SmartObject;

	/** @var FormFactory */
	private $factory;

	public function __construct(FormFactory $factory)
	{
		$this->factory = $factory;
	}

	/**
	 * @return Form
	 */
    public function create()
	{
        $form = $this->factory->create();
        $form->getElementPrototype()->class("ajax");

        $form->addMultiUpload('uploadFile', 'Obrázky')
                ->setRequired(true, 'Vyberte obrázky')
                ->addRule(Form::IMAGE, 'Chybný formát obrázku.');

        $form->addSubmit('send', 'Uložit');

        $form->onSuccess[] = [$this, 'formSucceeded'];
		return $form;
	}

    public function formSucceeded($form, $values)
    {
        if(is_array($values->uploadFile)) {
            foreach($values->uploadFile as $key => $val) { // projdeme obrazky z formulare
                $uploadFile = $values->uploadFile[$key]; // ulozime si pripadny obrazek do promenne

                $fotoName = mt_rand().'.jpg';
                $imgOut = Image::fromFile($uploadFile);
                $imgOut->resize(120, 90, Image::EXACT | Image::SHRINK_ONLY);
                $imgOut->save('uploads/'.$fotoName);
            }
        }

        $p = $form->getPresenter();
        if($p->isAjax()) {
            $this->redrawControl('imagesWrapper');
            $this->redrawControl();
        }
    }
}

Móooc díky za každé nakopnutí :)

Editoval Alsatian (22. 6. 2018 16:51)

CZechBoY
Člen | 3608
+
0
-

No ty máš snippet imagesWrapper v šabloně presenteru, ale invaliduješ snippet v komponentě. Je tedy potřeba invalidovat snippet v presenteru. To můžeš udělat i z komponenty

$p = $form->getPresenter();
if ($p->isAjax()) {
	$p->redrawControl('imagesWrapper');
}
Alsatian
Člen | 164
+
0
-

CZechBoY – jo, koukám na to. To jsem tam dostal nechtěně mými marnými pokusy.
Tohle mi nejede. isAjax není true.

if($p->isAjax()) {

Dost možná na to jdu celkově špatně. Nemáš pls řešení?

Editoval Alsatian (22. 6. 2018 18:22)

CZechBoY
Člen | 3608
+
0
-

No a odesilas ten formular vubec ajaxove?

Kcko
Člen | 465
+
0
-

CZechBoY napsal(a):

No a odesilas ten formular vubec ajaxove?

Ajaxem projdou nahrávané soubory jo?

Alsatian
Člen | 164
+
0
-

CZechBoY napsal(a):

No a odesilas ten formular vubec ajaxove?

Odesílám. V HTML vidím u FORM class=„ajax“.

Jinak vyhodil jsem upload souborů a nahradil jej pro text textovým polem, které dále nijak nezpracovávám.
$form->addText(‚jmeno‘, ‚Jméno‘)->setRequired(‚Zadejte své jméno.‘);

Formulář se stále AJAXově neposílá.

Ondřej Kubíček
Člen | 494
+
0
-

a kterou používáš knihovnu na ajax?
podle té třídy tipuji nette.ajax.js, máš tam volaný init()

Alsatian
Člen | 164
+
0
-

Ondřej Kubíček napsal(a):

a kterou používáš knihovnu na ajax?
podle té třídy tipuji nette.ajax.js, máš tam volaný init()

Ano, nette.ajax.js, init mám a ajaxy na tagu „a“ fungují.

Nakonec jsem zjistil, že jsem ve vykuchaném příkladu měl prohozenou inicializaci init() před načtením nette.ajax.js
Chybu mám tedy někde i hlavním projektu, protože obrázky se nyní normálně uploadují AJAXově!

Díky všem za vaše reakce!