nefunkčnost plinku v komponentě
- tttpapi
- Člen | 100
Ahoj,
mám tenhle kus kódu, který používám asi v 5 kontrolkách a všude mi funguje.
<a href="{plink User:profile 1}">test</a>
Vytvořil jsem si další kontrolku a přidal do ní opět tento odkaz a vůbec nefungoval. Tak jsem postupně začal odebírat obsah latte, až tam nakonec zbyl jen tento link a stále to nefunguje.
Error:
Call to a member function link() on a non-object
\libs\Nette\Utils\LimitedScope.php(49) : eval()'d code Line: 20
Kontrolka
use Nette\Application\UI;
class UsersFollowBoxs extends UI\Control {
public function __construct($usersModel) {
parent::__construct();
... práce s db
}
public function render() {
$this->template->setFile(__DIR__ . '/UsersFollowBoxs.latte');
$this->template->setTranslator($this->parent->context->translator);
$this->template->render();
}
}
verze Nette 2.0.1
- Vojtěch Dobeš
- Gold Partner | 1316
studna Není potřeba, může ji připojovat pomocí
return
. Ale musí ji pak tak připojovat :)
- Vojtěch Dobeš
- Gold Partner | 1316
tttpapi Na co se pilec ptal je vpodstatě jak vypadá tvoje továrnička. Tam se ta komponenta připojuje.
- tttpapi
- Člen | 100
protected function createComponentUsersFavouriteItemsBox() {
if ($this->profilesId) {
$profilesUserId = $this->profilesId;
}
else {
$pom = explode("-", ($this->getParam('id')));
$profilesUserId = $pom[2];
}
$row = $this->users->getItems()->
where('users.id', $profilesUserId)->
select('profiles.id AS profileId')->fetch();
$profilesProfileId = $row->profileId;
return new UserFavouriteItemsBox($this->users, $this->profilesId);
}
Takže tam mám přidat i presenter jako parametr?
Editoval tttpapi (19. 10. 2012 15:16)
- Vojtěch Dobeš
- Gold Partner | 1316
That's fucking strange. Ať se dívám jak se dívám, žádná část toho tvého kódu by neměla způsobovat popsanou chybu. Pořád ti tenhle kód zlobí? Kdyžtak pošli celý kód té komponenty.
- tttpapi
- Člen | 100
use Nette\Application\UI;
class UsersFollowBoxs extends UI\Control {
private $currentProfileId;
private $presenter;
public function __construct($users, $currentProfileId, $presenter) {
parent::__construct();
$this->presenter = $presenter;
$this->currentProfileId = $currentProfileId;
$this->template->currentProfileId = $currentProfileId;
# following
$following = $users->getUsersFollowers()
->where('following_users_id', $currentProfileId)
->order('RAND()')
->limit(8);
$followedIds = array();
foreach ($following as $f) {
$followedIds [] = $f->following_users_id;
}
$this->template->following = $users->getItems()
->select('profiles.profile_picture_url, users.id')
->where('users.id', $followedIds);
# followed
$followed = $users->getUsersFollowers()
->where('followed_users_id', $currentProfileId)
->order('RAND()')
->limit(8);
$followedIds = array();
foreach ($followed as $f) {
$followedIds [] = $f->followed_users_id;
}
$this->template->followed = $users->getItems()
->select('profiles.profile_picture_url, users.id')
->where('users.id', $followedIds);
# counts
$this->template->followingCount = $users->getFollowers()
->where('following_users_id', $currentProfileId)
->count();
$this->template->followedCount = $users->getFollowers()
->where('followed_users_id', $currentProfileId)
->count();
}
public function render() {
if (isset($_SESSION['userProfileMenu']['menuFollowing'])) {
$this->template->menuFollowing = TRUE;
}
else if (isset($_SESSION['userProfileMenu']['menuFollowers'])) {
$this->template->menuFollowers = TRUE;
}
unset($_SESSION['userProfileMenu']);
$this->template->setFile(__DIR__ . '/UsersFollowBoxs.latte');
$this->template->setTranslator($this->parent->context->translator);
$this->template->render();
}
public function handleShowFollowing() {
$_SESSION['profileMenuItem'] = UserProfileMenuItems::USER_PROFILE_MENU_FOLLOWING;
unset($_SESSION['userProfileMenu']);
$_SESSION['userProfileMenu']['menuFollowing'] = TRUE;
$_SESSION['userProfileMenu']['showFollowing'] = TRUE;
//$this->presenter->template->showContactsBox = FALSE;
$this->invalidateControl('userFollowBoxs');
$this->presenter->invalidateControl('middleColumnSnippet');
$this->presenter->invalidateControl('leftColumnSnippet');
}
public function handleShowFollowers() {
$_SESSION['profileMenuItem'] = UserProfileMenuItems::USER_PROFILE_MENU_FOLLOWERS;
unset($_SESSION['userProfileMenu']);
$_SESSION['userProfileMenu']['showFollowers'] = TRUE;
$_SESSION['userProfileMenu']['menuFollowers'] = TRUE;
//$this->presenter->template->showContactsBox = FALSE;
$this->invalidateControl('userFollowBoxs');
$this->presenter->invalidateControl('middleColumnSnippet');
$this->presenter->invalidateControl('leftColumnSnippet');
}
}
latte jsem zredukoval pouze na toto
<a href="{plink User:profile 1}">test</a>
Editoval tttpapi (19. 10. 2012 15:33)
- Vojtěch Dobeš
- Gold Partner | 1316
Hm, smaž ten parametr $presenter
v konstruktoru stejně jako
s tím související kód.
Dále hlavní důvod chyby:
A přesuň všechno přiřazování do šablony z konstruktoru buď do
render()
, nebo aspoň do attached
(viz dokumentace
komponent). Pokud si vytáhneš šablonu už v konstruktoru, tak se vytvoří
bez presenteru, protože presenter se do komponenty dostane až při zavolání
attached()
. Takhle se v tvém případě sice
attached()
zavolá taky a presenter se dostane do komponenty, ale
už se nijak do již existující šablony nepřiřadí.
Editoval vojtech.dobes (19. 10. 2012 15:51)