Redraw po kliku na tlačítko ve formu
- Croc
- Člen | 270
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.
- iNviNho
- Člen | 352
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)
- Croc
- Člen | 270
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
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
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)