Possible problem: you are starting session while already having some data in output buffer*

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

Caute, neviete mi poradit? Mam komponentu ShoppingCartBlock ktora si vola service ShoppingCart pri nacitani stranky, problem je v tom ze ked v render zavolam service ShoppingCart ktora by mala vyrobit session pokial este neexistuje,tak mi vypise error:

Possible problem: you are starting session while already having some data in output buffer. This may not work if the outputted data grows. Try starting the session earlier.

pokial urobim dalsi refresh tak uz to funguje, neviete mi poradit ako toto riesit?

komponenta: ShoppingCartBlock

class ShoppingCartBlockControl extends BaseControl
{
	private $shoppingCart;

	/**
	 * @param ShoppingCart $shoppingCart
	 */
	public function __construct(ShoppingCart $shoppingCart)
	{
		parent::__construct();
		$this->shoppingCart = $shoppingCart;
	}

	public function render()
	{
		$shoppingCart = $this->shoppingCart->getItems();
		$this->template->shoppingCart = $shoppingCart ;
		$this->template->render();
	}

}

a service:

class ShoppingCart extends Nette\Object {

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

    public function __construct(Nette\Http\Session $session) {
        $this->cart = $session->getSection(__CLASS__);
    }

    public function getItems() {
        return $this->cart->getIterator()->getArrayCopy();
    }

}
norbe
Backer | 408
+
0
-

Sessions lze nastartovat pouze předtím, než se něco odešle na výstup. Nejjednodušeji problém vyřešíš automatickým nastartováním sessions v configu následovně:

nette:
	session:
		autoStart: true
duskohu
Člen | 778
+
0
-

@norbe dik toto pomohlo, nastavoval som to podla dokumentacie, ale to bola asi chyba :-)

enumag
Člen | 2118
+
0
-

@duskohu: Problém je v tom že se ta služba vytváří až během renderování, kdy už session nejde nastartovat. Osobně autostart:true nemám rád, protože to vytváří session i nepřihlášeným uživatelům (úplně zbytečně). Lepší mi připadá sáhnout si na tu komponentu v beforeRender:

public function beforeRender() {
	// start session if needed
	$this['shoppingCartBlock'];
}

Editoval enumag (2. 5. 2013 11:01)

duskohu
Člen | 778
+
0
-

@enumag dakujem, toto sa mi zda cistejsie :-), samozrejme musim v komponente shoppingCartBlock pouzit attached a tam nacitat data so service ShoppingCart.

Edit: inak tato komponenta sa vytvara na kazdej stranke takze session potrebujem stale.

Editoval duskohu (2. 5. 2013 11:38)

norbe
Backer | 408
+
0
-

Zrovna u eshopu máš košík stejnak na každý stránce, takže sessions musíš nastartovat tak jako tak (pokud teda nemáš eshop pouze pro VIP :-))…

Edit: Trošku pozdě, ale už to tu nechám :-)

Editoval norbe (2. 5. 2013 11:41)

enumag
Člen | 2118
+
0
-

@norbe: Máš pravdu, nějak mi to v tu chvíli nedošlo. :-) Možná by se session nemusela vytvářet pro prázdný košík ale to je asi zbytečné řešit.

o5
Člen | 416
+
+1
-

Updatoval jsem z 2.1@dev (10.12.2013) na 2.2@dev (17.12.2013). Dostal jsem stejnou chybu jako v tomto vlákně. Problém jsem zjistil, když jsem přepnul laděnku pomocí ESC. Spatřil jsem totiž lépe vypovídající chybovou hlášku:

Class Nette\Config\Configurator has been renamed to Nette\Configurator.

Mohlo by se někomu hodit…