Modalne okno – problem so session

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
duskohu
Člen | 778
+
0
-

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.

  1. zavolam si handle handleShowDialog() ktory do komponenty vlozi (v mojom pripade formular)
  2. komponenta si ulozi vstup do session a vykresli
  3. takze ked sa formular odosle komponenta si zo session vytiahne co ma vykreslit takze uz nie je problem ze sa nevola handle
  4. 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)

akadlec
Člen | 1326
+
0
-

Podařilo se ti to dořešit? Mě tak napadá že se ti to neotvírá protože nikde tam nemáš action co by si tu session načetla a otevřela případně okno při tom refreshi.

mildhouse
Člen | 27
+
0
-

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}
mildhouse
Člen | 27
+
0
-

Problém je, že se ti nechce uložit komponenta do session, když místo

$dialog->show($this['userAddressAdd'], 'Pridať adresu');

dáš

$dialog->show('Nějaký text', 'Pridať adresu');

Tak by ti to mělo fungovat.