Persistent parameter ISSUE

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

Ahojte. Mám nasledovný problém:
Vytváram control s persistentným parametrom $selected (typu array). V jej šablone potom prevádzam link ktorý zavolá handle na nejaký signál. To však nie je podstatné. Podstatné je to, že keď vo Factory, kde vytváram tento control pridám do toho poľa niečo, v linku v šablone sa to nepredá. Potom keď kliknem na ten link, do/z poľa sa pridá/odoberie niečo ďalšie a to už sa zrazu na linku prejaví a persistentný parameter sa predá pomocou GET requestu.

V krátkosti: pri prvom vykreslení kontrolky sa mi do linku nezahrnú prednastavené persistentné parametre, kdežto po invalidácii snippetu/redirecte už všetko fičí ako by malo.

Stretli ste sa už s niečim podobným?

Azathoth
Člen | 495
+
0
-

možná by se hodilo ukázat zdrojáky té komponenty

Durisvk
Člen | 31
+
0
-

Tá komponenta je zdlhavá, ale podstata spočíva v týchto funkciách

<?php

class Filter extends Item implements IProcessableFilter
{
    /**
     * @persistent
     * @var array
     */
    public $selected = array();



	    public function select($value)
    {
        if (isset($_GET['do']) && Strings::contains($_GET['do'], 'toggle')) {
            return $this;
        } else {
            $this->_select($value);
            return $this;
        }
    }

    /**
     * @param string|IElement $value
     * @return self
     */
    protected function _select($value)
    {
        if ($value instanceof IElement) {
            $value = $value->getValue();
        }

        if(!isset($this->elements[$this->serializeValue($value)])) {
            throw new InvalidArgumentException("Element '{$value}' was not found and is unable to become selected.");
        }

        if (!$this->isMultiple()) {
            $this->selected = array();
        }

        $this->selected[] = $this->serializeValue($value);

        return $this;
    }



    public function handleToggle($e) {
        if ($this->isSelected($e)) {
            $this->deselect($e);
        } else {
            $this->_select($e);
        }

        $this->redrawFilters();
    }

    protected function redrawFilters() {
        if($this->getPresenter()->isAjax()) {
            $filterControl = $this->lookup('Datagrid\Filtering\Control');
            if($filterControl instanceof Control) {
                $filterControl->redrawControl('filters');
            }
        } else {
            $this->redirect('this');
        }
    }
?>

Problém:
Funkciu select($value) volám z factory a všetko prebehne bez problémov, $value sa mi uloží do $selected, problém však nastáva keď sa renderuje template kde vytváram takýto link:

<?php
<a n:href="toggle! $element->value" n:class="ajax, $control->isSelected($element->value) ? selected, btn, btn-default, btn-sm" data-ajax-off="history">{_}{$element->label}{/_}</a>
?>

Keď hneď po načítaní stránky prídem myšou nad odkaz, malo by mi ukázať perzistentný parameter v URL odkazu, to sa však nedeje. Keď potom kliknem na odkaz a spracuje sa signál handleToggle, až potom sa mi do URL odkazu pridá tento očakávaný persistentný parameter.

Otázka
Ako prinútiť Control aby do odkazu predával persistentný parameter hneď na začiatku, kým sa ešte nespracuváva žiaden signál? V podstate, mal by ho tam dávať vždy, bez ohľadu na to či je to signál alebo prvotný render, lenže v mojom prípade to takto nefunguje.

Azathoth
Člen | 495
+
0
-

no, není to náhodou tím, že před zavoláním toho handle je v proměnné selescted akorát prázdné pole? a protože prázdné pole je defaultní hodnota, tak se v url neukládá. persistentní proměnná se předává jen, když nemá defaultní hodnotu.

Durisvk
Člen | 31
+
0
-

Azathoth napsal(a):

no, není to náhodou tím, že před zavoláním toho handle je v proměnné selescted akorát prázdné pole? a protože prázdné pole je defaultní hodnota, tak se v url neukládá. persistentní proměnná se předává jen, když nemá defaultní hodnotu.

Nie, práve že problém nastáva, keď sa selected nastavuje ešte vo factory, keď filter nie je ani attachnutý. Už vtedy sa do poľa pridáva jeden prvok, a myslel som si že by mi ho tam malo zobraziť (Debugger ukázal dokonca v beforeRender() že selected má jeden prvok a predsa nebol do linku zahrnutý)

Durisvk
Člen | 31
+
0
-

tak sa mi to podarilo vyriešiť,
ak si chcete byť istý s prenosom persistentných parametrov skrz linky použite ich v href atribúte ako napr. ja:

<?php

<a href="{link toggle! $element->value, 'selected' => $control->selected}" n:class="ajax, $control->isSelected($element->value) ? selected, btn, btn-default, btn-sm" data-ajax-off="history">{_}{$element->label}{/_}</a>

?>

podstatná je táto časť:

href=„{link toggle! $element->value, ‚selected‘ ⇒ $control->selected}