Ajaxové odeslání formuláře při použití továrničky
- Alsatian
- Člen | 175
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)
- Alsatian
- Člen | 175
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
a kterou používáš knihovnu na ajax?
podle té třídy tipuji nette.ajax.js, máš tam
volaný init()
- Alsatian
- Člen | 175
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!