nefunkčnost plinku v komponentě

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

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

Jan Endel
Člen | 1016
+
0
-

To vypadá, jako by komponenta nebyla připojena k presenteru. Jak ji připojuješ?

tttpapi
Člen | 100
+
0
-

Vytvořím ji normálně přes createComponent v presenteru a v latte pomocí control vložím.

studna
Člen | 181
+
0
-

Podle kousku kódu ji nepřipojuješ v konstruktoru.

<?php
parent::__construct($parent, $name);
?>

Editoval studna (19. 10. 2012 15:00)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

studna Není potřeba, může ji připojovat pomocí return. Ale musí ji pak tak připojovat :)

tttpapi
Člen | 100
+
0
-

No, mám to úplně stejně vytvořený jako v jiných latte a tam to funguje bez problémů.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

tttpapi Na co se pilec ptal je vpodstatě jak vypadá tvoje továrnička. Tam se ta komponenta připojuje.

tttpapi
Člen | 100
+
0
-
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
+
0
-

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
+
0
-
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
+
0
-

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)

tttpapi
Člen | 100
+
0
-

Super, díky moc. Už to funguje.