Práce se sessins, přístup k nim

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

Zdravím,

řeším přidání položky do košíku pomocí sessions …

Přidání a uložení v sessions mě funguje, ale už nevím, jak k nim přistupovat v šablone při výpisu.

Presenter pridaní do sessions

// Nacteme info o fotce
        $foto = $this->eshop->findAll()->where("id", $id)->fetch();

        foreach ($foto->related("soubory.eshop_id") as $img) {
            $imgc = $img->cesta;
        }
        // Nastavime hodnoty sessions
        $session = $this->getSession('fotkyKosik');
        $session->polozkyKosikFotky[] = array(
            "fotka" => $id,
            "cesta" => $imgc,
            "nazev" => $foto->nazev,
            "rozmer" => $values->size,
            "ks" => $values->ks,
            "cena" => $foto->cena
        );

Base render:

// Nastaveni kosiku
        $section = $this->session->getSection('fotkyKosik');
        $this->template->kosik = $section;

A v šabloně je projdu foreach

{foreach $kosik as $k => $polozky}{dump $polozky}{/foreach}

Ale nějak mě už nejde vypsání podrobnosti o fotkach v sessions, respektivě když provedu

{foreach $kosik as $k => $polozky}{dump $polozky->nazev}{/foreach}

Tak dostanu
Trying to get property of non-object

Co přehlížím? Samozdřejmně jsem dokumentaci četl, ale už prostě nevím …

Děkuji za ranní nakopnutí

David Kudera
Člen | 455
+
0
-

Ukládáš si to tam jako pole, ale přistupuješ k tomu jako k objektu. Zkus to upravit takhle:

{dump $polozky[nazev]}

OT: Název proměnné polozky je trochu divný ne? Jde přece jen o jednu položku ;-)

wicked
Člen | 290
+
0
-

David Kudera napsal(a):

Ukládáš si to tam jako pole, ale přistupuješ k tomu jako k objektu. Zkus to upravit takhle:

{dump $polozky[nazev]}

OT: Název proměnné polozky je trochu divný ne? Jde přece jen o jednu položku ;-)

Děkuji za radu, ale když to upravím, dostanu zase
Undefined index: nazev

OT: jj mám to zatím pojmenované, protoze potrebuji vyresit tu funkčnost …

wicked
Člen | 290
+
0
-

Už jsem na to přišel …

Jelikož v presenteru mam

$session = $this->getSession('fotkyKosik');
$session->polozkyKosikFotky[] = array(
    "fotka" => $id,
    "cesta" => $imgc,
    "nazev" => $foto->nazev,
    "rozmer" => $values->size,
    "ks" => $values->ks,
    "cena" => $foto->cena
);

V renderu jsem přidal

$section = $this->session->getSection('fotkyKosik')->polozkyKosikFotky;
$this->template->kosik = $section;

a potom už funguje ten $polozky[nazev]

wicked
Člen | 290
+
0
-

Chci se zeptat, jak je možné provést update daného záznamu v sessions?

Sessions pracuji viz výše, ale funguje něco jako

$this->sessions->update()->where()

Jde mi o to, ze mam v sessions ulozeny pocet polozek, ale pomoci handleUp a handleDown chci s kusama hejbat …

Děkuji za radu

Mysteria
Člen | 797
+
0
-

Session není nic víc než normální pole, do kterýho si uložíš co chceš. Takže normálně to updatuješ jako $session->polozkyKosikFotky[‚ks‘] += $pocetKusu;

wicked
Člen | 290
+
0
-

Mohl bych poprosit ještě o nějaké bližší nakopnutí? Pracuji se sessions fakt prvně … a jsem rád, že se mi zatím položky ukládají do sessions a vypisuji je v kosiku …

wicked
Člen | 290
+
0
-

Když provedu

// Zvyseni poctu ks
   public function handleUp($id) {
       $session = $this->getSession('fotkyKosik');
       $pocet = $session->polozkyKosikFotky;
       dump($pocet);

   }

Výsledek je

array (1)
0 => array (6)
fotka => "2"
cesta => "/upload/2014-09-12-09-38-54.png" (31)
nazev => "Pokus prvního nahrání :-)" (28)
rozmer => "10x10" (5)
ks => "1"
cena => "125" (3)

Ale kdyz udělám jak
$pocet = $session->polozkyKosikFotky->ks; tak nemám žádný objekt a když¨
$pocet = $session->polozkyKosikFotky[ks]; tak nemzna index ks …

Edit: takze to musim prochazet foreach?

Editoval wicked (16. 9. 2014 18:05)

David Matějka
Moderator | 6445
+
0
-

to pole s konkretni polozkou tam mas pod indexem 0…

wicked
Člen | 290
+
0
-

Jasně, to mě napadlo, ale když to chci řešit dynamicky, přeci tam nemůžu do presenteru napsat 0 když se to mění …

Jak zjistím tedy konkretní index? k danému záznamu který chci měnit?

David Matějka
Moderator | 6445
+
0
-

@wicked tak pri vkladani do session pouzij jako klic ID

wicked
Člen | 290
+
0
-
// Zvyseni poctu ks
public function handleUp($id) {
    $session = $this->getSession('fotkyKosik');
    $pocet = $session->polozkyKosikFotky['0']['ks'];
    dump($pocet);

}

ted už dostanu to číslo které je spravně, ale jde mi o to, že kdyz budu mít více položek, jak tedy zjistím, zda je to 0, 1 nebo 99?

David Matějka
Moderator | 6445
+
0
-

mozna, ze se opakuju, ale

tak pri vkladani do session pouzij jako klic ID

wicked
Člen | 290
+
0
-

matej21 napsal(a):

@wicked tak pri vkladani do session pouzij jako klic ID

Asi mě budeš muset víc nakopnout :-( Z dokumentace vůbec nejsem moudřejší …

myslíš upravit toto?

$session = $this->getSession('fotkyKosik');
$session->polozkyKosikFotky[] = array(
    "fotka" => $id,
    "cesta" => $imgc,
    "nazev" => $foto->nazev,
    "rozmer" => $values->size,
    "ks" => $values->ks,
    "cena" => $foto->cena
);

takto?

$session = $this->getSession('fotkyKosik');
$session->polozkyKosikFotky[$id] = array(
    "fotka" => $id,
    "cesta" => $imgc,
    "nazev" => $foto->nazev,
    "rozmer" => $values->size,
    "ks" => $values->ks,
    "cena" => $foto->cena
);

A potom

// Zvyseni poctu ks
   public function handleUp($id) {
       $session = $this->getSession('fotkyKosik');
       $pocet = $session->polozkyKosikFotky[$id]['ks'];
       dump($pocet);

   }

Děkuji za trpělivost

Psal dřív než zkusil, ok funguje :-)

Editoval wicked (16. 9. 2014 18:20)

David Matějka
Moderator | 6445
+
0
-

ano

wicked
Člen | 290
+
0
-

matej21 napsal(a):

ano

Takto tedy můžu řešit i mazani atd… velice dekuji za kopanec a trpělivost :-)

wicked
Člen | 290
+
0
-

Ještě prosím poslední dotaz … na smazaní položky dle dokumentace slouží unset

ale když mám

// smazani polozky
    public function handleDelete($id) {
        $session = $this->getSession('fotkyKosik');
        $zaznam = $session->polozkyKosikFotky;
        unset($zaznam[$id]);
        $this->redirect('this');
    }

Nic to neprovede …

pro smazani komplet sekce pouzivam remove() to je ok, ale pro takto jeden zaznam?

David Matějka
Moderator | 6445
+
0
-

zkus primo

unset($session->polozkyKosikFotky[$id]);

tim $zaznam = ... si to pole nakopiroval, tudiz to neovlivnilo pole v session

wicked
Člen | 290
+
0
-

matej21 napsal(a):

zkus primo

unset($session->polozkyKosikFotky[$id]);

tim $zaznam = ... si to pole nakopiroval, tudiz to neovlivnilo pole v session

jasně, rozumim a funkcni :-)

děkuji

wicked
Člen | 290
+
0
-

Ještě blbá otázka …

Data vypisuji takto

<tbody>
                    <tr n:foreach="$kosik->polozkyKosikFotky as $k => $polozky">
                        <td>{$iterator->counter}.</td>
                        <td><a n:href="Stranka:foto, $polozky[fotka]">{$polozky[nazev]}</a></td>
                        <td align="center">{$polozky[ks]}</td>
                        <td align="center">{$polozky[cena]},-Kč</td>
                        <td align="center">{$cena_celkem = $polozky[cena]*$polozky[ks]},-Kč</td>
                        <td align="center" title="Zvýšit počet KS"><a n:href="up!, $polozky[fotka]" title="Zvýšit počet KS"><i class="fa fa-plus"></i></a></td>
                        <td align="center" title="Snížiz počet KS"><a n:href="down!, $polozky[fotka]" title="Snížiz počet KS"><i class="fa fa-minus"></i></a></td>
                        <td align="center" title="Odebrat fotku"><a n:href="delete!, $polozky[fotka]" title="Odebrat fotku"><i class="fa fa-close"></i></a></td>
                    </tr>
                </tbody>

Ale jak udělám celkovou cenu? Přímo v šabloně? Potřebuji sečíst všechny ceny v sessions a vypsat je …

Děkuji

EDIT: Předpokladám že pomocí foreach … ale nějak mě uniká celková implementace …

Editoval wicked (17. 9. 2014 21:31)

Lkopo
Člen | 65
+
+1
-

Neviem, či latte podporuje si vytváranie premenných, ale ak nie tak asi cez filter. V šablóne by si mal:

{$kosik->polozkyKosikFotky|total_price}

a filter by mohol vyzerať nejak takto:

$latte->addFilter('total_price', function (array $a) {
    foreach($a as $v) { $t += $v['cena']*$v['ks']; } return $t;
});

Čerpal som odtiaľ: https://latte.nette.org/en/#…

UPDATE

Tak sa dajú aj v Latte deklarovať, len neviem, či je možné pripisovať predchádzajúce hodnoty. Skús ešte v foreach cykle

{var $spolu += $polozky[cena]*$polozky[ks]}

A niekde inde potom

{$spolu}

Nemám to teraz ako otestovať, takže ti bohužiaľ neporadím, či toto je možné.

Zasa s filterom to môžeš využiť kdekoľvek inde a nemusíš si stále vypisovať premenné.

Note: je to rada od začiatočníka s Nette, možno je lepší spôsob, tak si kľudne počkaj aj na iných :)

Editoval Lkopo (17. 9. 2014 22:50)

abc
Člen | 92
+
+2
-

Já jsem tedy taky začátečník, ale toto se přeci dá vyřešit jednoduše v rámci toho cyklu..

{var celkem = 0}
<tr n:foreach="$kosik->polozkyKosikFotky as $k => $polozky">
{var celkem += ($polozky[cena]*$polozky[ks])}
</tr>
{celkem} //tady mas celkovou sumu
Mysteria
Člen | 797
+
0
-

Dá se to jak píše @abc případně je ještě možnost si držet celkovou dobu rovnou v session. Prostě při updatu položky nebo počtu kusů rovnou přepočítávej i celkovou cenu a pak nemusíš nic takovýhle v šabloně řešit.

wicked
Člen | 290
+
0
-

abc napsal(a):

Já jsem tedy taky začátečník, ale toto se přeci dá vyřešit jednoduše v rámci toho cyklu..

{var celkem = 0}
<tr n:foreach="$kosik->polozkyKosikFotky as $k => $polozky">
{var celkem += ($polozky[cena]*$polozky[ks])}
</tr>
{celkem} //tady mas celkovou sumu

Děkuji :-)