Nastavenie atribútu v handle (Ajax)

Aris
Člen | 48
+
0
-

Ahoj, snažil som sa nájsť riešenie ako skombinovať dropzone.js s Nette forms do jedného formulára, avšak neúspešne. Vytvoril som teda samostatný dropzone formulár a formulár Nette. Pri inserte do DB chcem spárovať príspevok s obrázkom.
Chcel by som to riešiť nasledovne:

  1. Formuláre sú vykreslené, prebehne Ajax požiadavka na upload img handleUploadImg()
  2. Img premiestnim v úložisku do požadovaného priečinka a nastavím $this->img_url
  3. Do form succeeded metódy kde realizujem volanie insertu do DB chcem vložiť URL img
	public function renderCreate()
	{
		//tu neprepisujem hodnotu $this->img_url
	}
public function handleUploadImg()
    {
        $img = $this->getRequest()->files['file'];
        $this->img_url = "images/potraviny/" . $this->potravinyModel->next_id() . '/' .$img->name;

        if ($img->isOk() && $img->isImage())
        {
            $img->move($this->img_url);
        }
    }
public function formPublishSucceeded(\Nette\Forms\Controls\SubmitButton $button)
{
    $form = $button->getForm();
    $values = $form->getValues();
    bdump('img url je' . $this->img_url);
		//tu nedostanem nikdy požadovanú URL uloženú v handleUploadImg()
		.
		.
		.
	}

Najjednoduchšie mi príde uložiť si pri handleUploadImg() zostavenú URL do atribútu, prípadne persistentného parametra. Obe metódy som skúsil, avšak vždy natrafím na empty hodnotu atribútu/parametra, takže uložím do DB prázdny string.

Z toho mi vychádza, že niekde porušujem životný cyklus presentera. Ale kde?

Ďakujem za rady :) .

Editoval Aris (8. 11. 2018 9:04)

David Matějka
Moderator | 6445
+
0
-

Ahoj,

Z toho mi vychádza, že niekde porušujem životný cyklus presentera.

ani ne tak presenteru, jako samotneho php :) pote, co dobehne script na zpracovani handleUploadImg, tak se samozrejme vse zahodi, vcetne img_url

nejlepsi bude, kdyz v handleUploadImg vratis skrz payload tu url a nekde v success funkci v javascriptu si tu url nekam vlozis – treba do hidden prvku formulare

Aris
Člen | 48
+
0
-

Vieš mi prosím pomôcť ešte s tým ako funguje payload?
Posielam to nasledovne:

if($this->presenter->isAjax())
{
    $this->payload->message=$this->img_url;
    $this->redrawControl('');
}

Podľa toho čo som našiel by malo fungovať nasledové.

$.nette.ajax({
    url: 'create?do=uploadImg',
    success: function(payload) {
        console.log(payload.value);
    }

Ako response však vráti error ukazujúci na čítanie súboru z requestu

$img = $this->getRequest()->files['file'];

Evidentne sa Ajax navzájom ruší na danej URL.

David Matějka
Moderator | 6445
+
0
-
  1. redrawControl tam nepotrebujes
  2. nemuzes posilat separatni ajax request, musis zpracovat response toho ajax uploadu
Aris
Člen | 48
+
0
-

Je to aspoň trochu správne?

if($this->presenter->isAjax())
{
    $this->sendResponse(new Nette\Application\Responses\JsonResponse(['img_url' => $this->img_url]));
}

Odošle mi tento krát požadovanú response. Ako správne čítať response ajax uploadu v jQuery respektíve nette.ajax? Bol som v tom, že js kódom v predchádzajúcom príspevku čítam dáta z danej url… Example, čo som pozeral na internete mali podobné riešenia. Už som z toho zmätený. I keď sem js nepatrí, vieš mi prosím pomôcť aspoň načrtnutím metódy, ktorú použiť?
Ďakujem ti za trpezlivosť :)

Editoval Aris (8. 11. 2018 15:51)

David Matějka
Moderator | 6445
+
0
-

jak resis to

prebehne Ajax požiadavka na upload img handleUploadImg()

?

Aris
Člen | 48
+
0
-

Cez dropzone uploader, ten automaticky odošle ajaxovo obrázok na server.

<form action="{link uploadImg!}" class="dropzone col-md-4" id="uploader"></form>
David Matějka
Moderator | 6445
+
+1
-

tak to se budes muset nejak napojit na vysledek toho requestu – asi pres success event, na google urcite najdes spoustu navodu, jak na to

Aris
Člen | 48
+
0
-

Ďakujem ti veľmi pekne za trpezlivosť :) . Success event ani config nefungoval, možno mám obe ruky ľavé. Pomohlo jedine prepísanie url/akcie a nastavenie callbacku.