přístup k Session ve vlastní třídě

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

Ahoj,

mám problém s přístupem a editováním session ve vlastní třídě.

Mohl by mi někdo prosím poradit na jednoduchém příkladu jak a kde to správně nastavit.

Chápu to tak že b Bootstrap nastartuju session a pak k ní přistupuji kde chci?

Děkuji

Filip Procházka
Moderator | 4668
+
0
-

Chápeš to špatně. app/bootstrap.php je soubor, který pouze nastaví configurátor, dá mu cesty ke konfiguračním souborům a eventuelně zapne aplikaci. Vůbec žádná session ho nezajímá.

Session se nastavuje ideálně v configu a pracuješ s ní pak v modelech a presenterech pomocí Session objektu, který si necháš injectnout.

class MyFunnyModel extends Nette\Object
{
	/** @var Nette\Http\SessionSection */
	private $session;

	public function __construct(Nette\Http\Session $session)
	{
		// vytáhnu si sekci a vložím do vlastnosti třídy
		// zde jsem zvolil pojmenování sekce podle názvu třídy
		$this->session = $session->getSection(get_class($this));
	}

	public function work()
	{
		// v jednotlivých metodách pak pracuješ se svou sekcí
		$this->session->counter += 1;
	}

}

S čím konkrétně máš problém?

batko
Člen | 219
+
0
-

mám tuto třídu

<?php

use Nette\Utils\Strings;
use Nette\Http\SessionSection;

class Basket extends Nette\Object {

    /** @var Nette\Http\SessionSection */
    private $session;

    public function __construct(Nette\Http\Session $session) {
        // vytáhnu si sekci a vložím do vlastnosti třídy
        // zde jsem zvolil pojmenování sekce podle názvu třídy
        $this->session = $session->getSection(get_class($this));
    }

    public function setUser($user = NULL) {
        if ($user == NULL) {
            $this->user = Strings::random(40);
        } else {
            $this->user = 1;
        }
    }

    public function addItem($count = 1, $idItem) {
        $this->session->counter += 1;
    }

}

?>

a při vytvoření objektu (ten se vytváří v komponentě) to hodí

Argument 1 passed to Basket::__construct() must be an instance of Nette\Http\Session, none given, called in C:\xampp\htdocs\Shoplando\app\components\Form\FormToBasket.php on line 28 and defined

ViPEr*CZ*
Člen | 817
+
0
-

A čemu na tý hlášce nerozumíte? Prostě vytváříte objekt, kterému místo instance na Nette\Http\Session předáváte hodnotu NULL, což se konstruktoru nelíbí neboť očekává pouze instanci Nette\Http\Session a nic jiného! Jak vytváříte komponentu a jak ten objekt Basket v ní?

batko
Člen | 219
+
0
-

Komponenta je zde, nějak si sedím na vedení

<?php

namespace Todo;

use Nette;
use Nette\Application\UI\Form;

class FormToBasket extends Nette\Application\UI\Control {

    public $selected;
    public $id;
    public $basket;

    public function __construct($selected, $id) {
        parent::__construct();
        $this->selected = $selected;
        $this->id = $id;

    }

    public function render() {
        $this->template->product = $this->selected;
        $this->template->setFile(__DIR__ . '/FormToBasket.latte');
        $this->template->render();
    }

    public function insertToBasket(Form $form) {
        $basket = new \Basket();


        $this->presenter->flashMessage('Zboží bylo vloženo do košíku v počtu ' . $form->values->count . ' ks', 'success');
        $this->presenter->redirect("this");
    }

    protected function createComponentBasketForm() {
        $form = new Form();
        $form->addText("count")
                ->setValue(1)
                ->addRule(Form::INTEGER, "Hodnota musí být celé číslo");
        $form->addHidden('id')
                ->setValue($this->id);
        $form->addSubmit("submit", "ok");
        $form->onSuccess[] = $this->insertToBasket;
        return $form;
    }

}

?>
ViPEr*CZ*
Člen | 817
+
0
-

S prominutím si sedíte a pořádně.
Prvně bych property nedefinoval jako public (viz. public $basket;). Za druhé
$basket = new \Basket();
A vy se divíte proč Vám tento konstruktor vyhodí vyjímku???? Vždyť definice metody vypadá takto:
public function __construct(Nette\Http\Session $session)
A při vytváření objektu nic jako parametr nepošlete, dostanete jasnou exception a stále netušíte???
Co takhle tam předat instanci na Nette\Http\Session ???
A jak ji dostanete do třídy FormToBasket??? No jednoduše si jí opět předáte.

batko
Člen | 219
+
0
-

Dobře pánové, myslel jsem, že to probíhá vše trochu jednodušeji, takže se na to pořádně podívám.

Zatím děkuji

Rob Bob
Člen | 60
+
0
-

Tvoje potize podle me ani tak nesouvisi s nette jako spis nechapani konceptu navrhu/programovani, takze bych zacal spis tam.