Jak dostat promenne z Presenteru do nejakyho Modelu

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

Mam nasledujici model :

<?php

namespace App\Model;

use Nette;


class ArticlesManager extends Nette\Object{

    /**
     * @var Nette\Database\Context
     */
    private $database;



    public function __construct(Nette\Database\Context $database){
        $this->database = $database;
    }

    public function getPublicArticles(){
        return $this->database->table('posts')
            ->where('created_at < ',new \DateTime())
            ->where('lang','cz')
            ->order('created_at DESC');
    }
}

a nasledujici Presenter (BasePresenter)

namespace App\Presenters;

use Nette;
use App\Model;


/**
 * Base presenter for all application presenters.
 */
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    /** @persistent */
    public $lang;



    protected function beforeRender()
    {
        parent::beforeRender();
        echo $this->lang;
    }

}

Potreboval bych dostat do Modelu promennu

$lang

Zkusil jsem si v Modelu vytvorit promennu

$presenter

do ktere pres __contructor jsem chtel ulozit BasePresenter, ale nepodarilo se ( Error: Service ‚28_App_Model_ArticlesManager‘: Service of type App\Presenters\BasePresenter needed by App\Model\ArticlesManager::__construct() not found. Did you register it in configuration file?

Jak se teda mohu dostat k

$lang
CZechBoY
Člen | 3608
+
0
-

Nešlo by udělat třídu, která by poskytovala právě nastavený jazyk? Šla by potom injectnout v jakékoliv třídě a nemusel bych řešit nějaký hacky přes presenter.
Pokud máš v aplikaci aktivní vždy pouze 1 jazyk tak můžeš jazyk nastavit v presenteru staticky do té třídy uchovávající jazyk.

Šaman
Člen | 2666
+
0
-

Předej si to setterem. Až si v presenteru vytvoříš/injectneš třídu modelu, tak mu to normálně nastavíš pomocí public setLang($lang).

Piticu
Člen | 93
+
0
-

CZechBoY napsal(a):

Nešlo by udělat třídu, která by poskytovala právě nastavený jazyk? Šla by potom injectnout v jakékoliv třídě a nemusel bych řešit nějaký hacky přes presenter.
Pokud máš v aplikaci aktivní vždy pouze 1 jazyk tak můžeš jazyk nastavit v presenteru staticky do té třídy uchovávající jazyk.

Budu mit vzdycky aktivni jen jeden. Cestina, Rumunstina nebo Anglictina. (meni se to prave v odkazu localhost/www/cz nebo lolcaohst/www/en atd.

Editoval Piticu (18. 6. 2016 18:40)

Piticu
Člen | 93
+
0
-

Šaman napsal(a):

Předej si to setterem. Až si v presenteru vytvoříš/injectneš třídu modelu, tak mu to normálně nastavíš pomocí public setLang($lang).

namespace App\Presenters;

use Nette;
use App\Model;


class HomepagePresenter extends BasePresenter
{
	/** @var Nette\Database\Context */
	private $articleManager;

	public function __construct(Model\ArticlesManager $articleManager){
		$this->articleManager = $articleManager;
	}

	public function renderDefault(){
		$this->template->posts = $this->articleManager->getPublicArticles();
	}


}

Treba v HomePresenteru mam tridu modelu ArticleManager. Akorad potrebuji v ArticleManager udelat select podle $lang

return $this->database->table('posts')
    ->where('created_at < ',new \DateTime())
    ->where('lang',**$lang**)
    ->order('created_at DESC');

Neco takoveho.

CZechBoY
Člen | 3608
+
0
-

Tak jako vždycky můžeš předat parametr podle kterýho to vybereš žejo.

public function getPublicArticles($lang)
{
return $this->database->table('posts')
    ->where('created_at < ',new \DateTime())
    ->where('lang',$lang)
    ->order('created_at DESC');
}
Piticu
Člen | 93
+
0
-

CZechBoY napsal(a):

Tak jako vždycky můžeš předat parametr podle kterýho to vybereš žejo.

public function getPublicArticles($lang)
{
return $this->database->table('posts')
    ->where('created_at < ',new \DateTime())
    ->where('lang',$lang)
    ->order('created_at DESC');
}

Udelal jsem to pres setLang, ale uprimne jsem blbej no :D porad jsem hledal v tom nejakou metodu, neco a vubec mi nenapadlo predat to jako parametr metody

getPublicArticles()

Editoval Piticu (19. 6. 2016 13:11)

erikbalog
Člen | 27
+
+1
-

Dá sa použiť Kdyby Translation a v modeli si len zistíš aktuálny jazyk:

<?php
/** @var \Kdyby\Translation\Translator */
private $translator;
/** @var string */
private $lang;

public function __construct(\Kdyby\Translation\Translator $translator) {
	$this->translator = $translator;
	$this->lang = $this->translator->getLocale();
}

public function cokolvek() {
	//v $this->lang je uložený aktuálny jazyk napr. 'cs'
}
?>

Opravte ma ak sa mýlim.

Editoval erikbalog (19. 6. 2016 13:27)