Nastavenie atribútu v handle (Ajax)
- Aris
- Člen | 48
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:
- Formuláre sú vykreslené, prebehne Ajax požiadavka na upload img handleUploadImg()
- Img premiestnim v úložisku do požadovaného priečinka a nastavím $this->img_url
- 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
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
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
- redrawControl tam nepotrebujes
- nemuzes posilat separatni ajax request, musis zpracovat response toho ajax uploadu
- Aris
- Člen | 48
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
jak resis to
prebehne Ajax požiadavka na upload img handleUploadImg()
?
- David Matějka
- Moderator | 6445
tak to se budes muset nejak napojit na vysledek toho requestu – asi pres success event, na google urcite najdes spoustu navodu, jak na to