plink – po kliknutí na odkaz se dostanu na stejnou stránku, i když je URL jiná

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

Zdravím, nette se učím od léta, zatím všechny problémy jsem za pomoci fóra nebo pokusu a omylu vyřešil :-) ale ted jsem opravdu bezradnej, vůbec netuším co dělám špatně.

Na mém projektu se uživatel musí registrovat, aby se dostal dovnitř, a každý nový uživatel dostane „id_user“. V patičce si generuju 4 nejnovější uživatele takto:

<h4>Nový uživatelé</h4>
                        {foreach $footerUsers as $users}
                            {if $iterator->getCounter() < 5}
                                <ul>
                                    <li><a href="{plink Profile:user $users->id_user}">{$users->login}</a></li>
                                </ul>
                            {/if}
                        {/foreach}

Po kliknutí na odkaz uživatele se potřebuju dostat na jeho profil. URL mi to vyhodí správnou, např:
http://localhost/profile/user/37

a tady je ten problém, když kliknu na jakýhokoliv uživatele, tak URL se mi sice změní, ale stále se dostávám na svůj vlastní profil a to nechci :) zkoušel jsem obdobu i s „n:href=“ a obyčejným „{link …}“, ale pořád to samé

když jsem si to samé dělal u výpisu článků, abych je mohl editovat, tak to funguje bez problémů.

Tady je ještě kod render a action

public function renderUser() {
        if ($this->getUser()->isLoggedIn()) {
            $user = $this->getUser();
            $id = $user->getId();

            $path = $this->usersRepository->searchUserPhoto($id);
            $this->template->source = $this->presenter->template->basePath . $path;

            $this->template->userInfo = $this->usersRepository->findById($id);
            $this->template->userAddress = $this->addressRepository->findById($id);
        }
    }

    /** @var \Nette\Database\Table\ActiveRow */
    private $list;

    public function actionUser($id) {
        $this->list = $this->usersRepository->findBy(array('id_user' => $id))->fetch();
        if ($this->list === FALSE) {
            $this->redirect('Error:404');
        }
    }

Netušíte, jak to opravit?

Předem díky za pomoc

David Matějka
Moderator | 6445
+
0
-

$this->getUser() vraci aktualne prihlaseneho uzivatele

v actionUser to vybiras spravne, takze staci do toho renderUser misto $this->getUser() dat $this->list

a par poznamek:

  1. Noví uživatelé dle „mladí“
  2. list v actionUser je nevhodny nazev
  3. $this->redirect(‚Error:404‘) neni spravne – pouzij radeji $this->error(), coz vyvola BadRequestException (defaultne se 404 kodem), kterou zachyti Error presenter
  4. $this->presenter je v presenteru zbytecne
  5. jak plnis $footerUsers? to omezeni pomoci counteru by tam nemelo co delat, to by jsi mel omezit limitem pri plneni te promenne daty

Editoval matej21 (3. 12. 2013 21:38)

Oli
Člen | 1215
+
0
-

pár věcí:

  1. Kde bereš $footerUsers? Z databáze? Pokud ano, bylo by lepší si z databáze vytáhnout jen poslední 4 uživatele a ne tahat celou databázi a předat ji šabloně s tím, že šablona to „ořízne“.
  2. isLoggedIn() by jsi měl podle mě volat už v actionUser. A pokud uživatel není přihlášen tak mu vypsat nějakou flash správu, přesměrovat, nebo něco s ním provést.
  3. Tohle nechápu k čemu je dobrý:
$this->template->source = $this->presenter->template->basePath . $path;

Lepší je podle mě v šabloně zavolat něco jako {$basePath}/{$path}

  1. Tohle už řeší tvůj dotaz:)
	/** @var \Nette\Database\Table\ActiveRow */
    	private $list;

public function renderUser() {

            //$user = $this->getUser(); ----> zbytečné
            //$id = $user->getId();  ----> zbytečné

            $this->template->source = $this->usersRepository->searchUserPhoto($this->list->id_user); // ----> změna
            //$this->template->source = $this->presenter->template->basePath . $path; ----> podle mě k ničemu


            $this->template->user = $this->list // -----> změna
            //$this->template->userAddress = $this->addressRepository->findById($id); -----> duplicitní
        }
    }

    public function actionUser($id) {
        if ($this->getUser()->isLoggedIn()) {
        $this->list = $this->usersRepository->findBy(array('id_user' => $id))->fetch();
        	if ($this->list === FALSE) {
        	    $this->redirect('Error:404');
        	}
	} else
	{
		$this->flashMessage('Nejsi přihlášen', 'error');
		$this->redirect('Sign:in');
	}
    }

Nefungovalo ti to proto, protože jsi sice v action dostal $id, ale v renderu jsi s ním nepracoval a pracoval jsi jen se svou instancí getUser.

jiri.korejtko
Člen | 8
+
0
-

matej21 napsal(a):

$this->getUser() vraci aktualne prihlaseneho uzivatele

v actionUser to vybiras spravne, takze staci do toho renderUser misto $this->getUser() dat $this->list

a par poznamek:

  1. Noví uživatelé dle „mladí“
  2. list v actionUser je nevhodny nazev
  3. $this->redirect(‚Error:404‘) neni spravne – pouzij radeji $this->error(), coz vyvola BadRequestException (defaultne se 404 kodem), kterou zachyti Error presenter
  4. $this->presenter je v presenteru zbytecne
  5. jak plnis $footerUsers? to omezeni pomoci counteru by tam nemelo co delat, to by jsi mel omezit limitem pri plneni te promenne daty

Díky za renderUser, pořešil jsem, zatím to funguje :-D

  1. Příště dám pozor
  2. Přejmenoval jsem
  3. Věděl jsem, že to mám špatně, ale dokud mi nefungovaly odkazy, tak jsem se k tomu nedostal
  4. Odebráno
  5. To dělám přes metodu v konkrétním repositáři. Tu proměnou „footerUsers“ tahám přes BasePresenter
$this->template->footerUsers = $this->usersRepository->findCompleteDesc();

protože tu patičku mám v základním layoutu. Metoda vypadá takto:

public function findCompleteDesc() {
        return $this->findBy(array('done' => true))->order('created_user DESC');
    }
jiri.korejtko
Člen | 8
+
0
-

Oli napsal(a):

  1. Ok, až budu mít čas, předělám to tak, abych tahal rovnou 4 uživatelé z databáze, aby šablona měla co nejmín práce
  2. To by taky šlo, zkusil jsem to předělat podle tebe
  3. To bylo k vytáhnutí cesty, kde leží na FTPku daný obrázek konkrétního uživatele, protože když jsem to měl obyčejně přes šablonu {$basePath}/{$path} , tak mi to nevytáhlo obrázek
  4. Díky, ještě musím podle toho přizpůsobit šablonu
jiri.korejtko
Člen | 8
+
0
-

Díky moc chlapi, pomohli jste mi :)

Oli
Člen | 1215
+
0
-

jiri.korejtko napsal(a):

  1. To bylo k vytáhnutí cesty, kde leží na FTPku daný obrázek konkrétního uživatele, protože když jsem to měl obyčejně přes šablonu {$basePath}/{$path} , tak mi to nevytáhlo obrázek

Ukaž jak to máš. Já to takhle používám a funguje to dobře. Předám si název adresáře a jméno fotky a vypadá to pak takhle nějak:

<img src="{$basePath}/gallery/{$folder}/{$imgName}" />
jiri.korejtko
Člen | 8
+
0
-

Oli napsal(a):

jiri.korejtko napsal(a):

  1. To bylo k vytáhnutí cesty, kde leží na FTPku daný obrázek konkrétního uživatele, protože když jsem to měl obyčejně přes šablonu {$basePath}/{$path} , tak mi to nevytáhlo obrázek

Ukaž jak to máš. Já to takhle používám a funguje to dobře. Předám si název adresáře a jméno fotky a vypadá to pak takhle nějak:

<img src="{$basePath}/gallery/{$folder}/{$imgName}" />

v renderu si předávám proměnou $source

$this->template->source = $this->usersRepository->searchUserPhoto($this->userList->id_user);

protože ji potřebuju v šabloně. Zjistí to, jestli má daný uživatel uložený obrázek a vykreslí jej, pokud nemá, tak vykreslí defaultní noImage

Todle mám v šabloně:

{if $source != null}
                    <img width="400" src="{$source}" alt="Photo by BodyMe.com" title="My photo" />
                {else}
                    <img width="323" src="{$basePath}/images/noImage.png" alt="BodyMe.com" title="Kulturistika, výživa a plány" />
                {/if}
Oli
Člen | 1215
+
0
-

Pokud to máš takhle, tak ti to nenajde, protože nemáš nikde tu basePath. Ještě jedna drobnost. Připojuješ se IMHO zbytečně 2× k db. Stačil by ti v šabloně jen ten např.: $this->template->someUser ($user nepoužívej, je to defaultní aktuální uživatel v Nette, aby sis ho nepřepsal) takže by to potom mohlo vypadat třeba takhle:

{if $someUser->source != null}
	<img width="400" src="{$basePath}/images/{$someUser->source}" alt="Photo by BodyMe.com" title="My photo" />
{else}
	<img width="323" src="{$basePath}/images/noImage.png" alt="BodyMe.com" title="Kulturistika, výživa a plány" />
{/if}

Kdyžtak si dumpni, jakej řetězec máš v src. Ten obrázek by ti to takhle mělo každopádně vrátit…

jiri.korejtko
Člen | 8
+
0
-

Oli napsal(a):

Tvoje poznámka o $user, to myslíš tento kus kodu?
$user = $this->getUser();

prolítnu projekt a předělám to :)

tak, jak jsem poslal posledně, tak mi to obrázek vrátí v pořádku, i když tam nemám {$basePath}.

Po dumpu mi to hází: string(26) „/images/jirka/IMG-1882.JPG“

Editoval jiri.korejtko (4. 12. 2013 13:48)

Oli
Člen | 1215
+
0
-

ne, $user = $this->getUser(); je v pohodě. Problém je v šabloně. v šabloně je {$user} ekvivalent $this->getUser();.

Pokud tam nemáš basePath, tak by ti to mělo vrátit správně obrázek jen, pokud máš projekt v rootu. Myslím ;-)

jiri.korejtko
Člen | 8
+
0
-

Oli napsal(a):

jo takle, rozumím, projdu si šablony a kouknu na to … s tím basepath, to uvidím až hodím na produkční server :-D jestli to bude vracet správný obrázek nebo nebude vracet nic :-D

jinak ještě jednou díky

Editoval jiri.korejtko (4. 12. 2013 17:54)