Modalne okno – problem so session
- duskohu
- Člen | 778
Caute nechal som sa inspirovat modal komponentov: https://forum.nette.org/…okna-v-nette. Ale stav ona udrzujem tak ze to co chcem zobrazovat ci uz komponentu alebo html ukladam do session.
- zavolam si handle handleShowDialog() ktory do komponenty vlozi (v mojom pripade formular)
- komponenta si ulozi vstup do session a vykresli
- takze ked sa formular odosle komponenta si zo session vytiahne co ma vykreslit takze uz nie je problem ze sa nevola handle
- modalne okno zavriem tak ze vymazem session
Problem je v tom ze 1 krat sa okno zobrazi, session sa ulozi, ale ked refresnem stranku bez volania handle, tak v session nic neni, a tu nastane problem, neviem preco? Nevie niekto poradit?
//Definicia Dialog
public function createComponentDialog($name)
{
$control = new DialogControl($this, $name);
return $control;
}
// Handle na otvorenie modal
// Predam mu komponentu $this[‚userAddressAdd‘]
public function handleShowDialog(){
/** @var DialogControl $dialog */
$dialog = $this->getComponent('dialog');
$dialog->show($this['userAddressAdd'], 'Pridať adresu');
}
// dialog control
class DialogControl extends BaseControl
{
/** @var \Nette\Http\Session */
private $storage;
public function __construct($parent = NULL, $name = NULL)
{
parent::__construct($parent, $name);
$this->storage = $this->presenter->getSession(__CLASS__);
}
public function show($config, $title = null)
{
$values = array(
'data' => $config,
'title' => $title,
);
$this->storage[$this->name] = $values;
if ($this->presenter->isAjax()) {
$this->invalidateControl();
}
}
public function handleCloseDialog()
{
unset($this->storage[$this->name]);
if ($this->presenter->isAjax()) {
$this->invalidateControl();
}
}
public function flashMessage($message, $type = 'info')
{
parent::flashMessage($message, $type);
$this->invalidateControl("flashes");
}
public function render()
{
if (isset($this->storage[$this->name])) {
$this->template->data = $this->storage[$this->name]['data'];
$this->template->title = $this->storage[$this->name]['title'];
}
$this->template->render();
}
}
// sablona
{snippet}
{ifset $data}
<div id="modal-dialog" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="dialogConfirmationLabel" aria-hidden="true">
<div n:ifset="$title" class="modal-header">
<a type="button" class="close ajaxd" n:href="closeDialog!" aria-hidden="true">×</a>
<h3 id="dialogConfirmationLabel">{$title}</h3>
</div>
{snippet flashes}
{foreach $flashes as $flash}
<div class="flash {$flash->type}">{$flash->message}
<div class="closeFlashes"></div>
</div>{/foreach}
{/snippet}
<div class="modal-body">
{if is_array($data)}
{foreach $data as $c}
{if $c instanceof \Nette\Application\UI\Control}
{$c->render()}
{else}
{!$c}
{/if}
{/foreach}
{else}
{if $data instanceof \Nette\Application\UI\Control}
{$data->render()}
{else}
{!$data}
{/if}
{/if}
</div>
</div>
{/ifset}
{/snippet}
Editoval duskohu (3. 6. 2013 13:24)
- mildhouse
- Člen | 27
duskohu napsal(a):
3. takze ked sa formular odosle komponenta si zo session vytiahne co ma vykreslit takze uz nie je problem ze sa nevola handle
Problem je v tom ze 1 krat sa okno zobrazi, session sa ulozi, ale ked refresnem stranku bez volania
handle, tak v session nic neni, a tu nastane problem, neviem preco? Nevie niekto poradit?
Pokud odešleš bez handleShowDialog(), tak v session nic není. Takže když odešleš formulář, tak tam taky nic není, protože to jde mimo handleShowDialog(). On se sice odešle i zpracuje, protože data jsou odeslána, továrna komponenty formuláře existuje a nic nebrání tomu, aby se formulář zpracoval. Ale nezobrazí se. Schválně zkus formuláři předat addError() před zpracováním.
Ale je zvláštní, že se ti ta session po refreshi ztratí. Zkusil jsem to a dělalo mi to také. Tak jsem to trochu okleštil a upravil a fungovalo bez problémů :
public function createComponentDialog(){
$sess = $this->getSession('pokus');
$control = new DialogControl($sess);
return $control;
}
public function handleShowDialog(){
$this->getComponent('dialog')->show('Nějaká konfigurace', 'Nadpis');
}
dialog control
class DialogControl extends BaseControl
{
/** @var \Nette\Http\Session */
private $storage;
public function __construct($storage)
{
parent::__construct();
$this->storage = $storage;
}
public function show($config, $title)
{
$this->storage->config = $config;
$this->storage->title = $title;
}
public function handleCloseDialog()
{
$this->storage->remove();
}
public function render()
{
$template = $this->template;
$template->setFile(__DIR__ . '/DialogControl.latte');
if (isset($this->storage)) {
$this->template->config = $this->storage->config;
$this->template->title = $this->storage->title;
}
$this->template->render();
}
}
šablona
{snippet}
{if isset($config) AND isset($title)}
<h1>{$title}</h1>
<b>Config je : {$config}</b><br>
{/ifset}
{/snippet}