Jak dostat promenne z Presenteru do nejakyho Modelu
- Piticu
- Člen | 93
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
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.
- Piticu
- Člen | 93
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
Š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.
- Piticu
- Člen | 93
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
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)