plink – po kliknutí na odkaz se dostanu na stejnou stránku, i když je URL jiná
- jiri.korejtko
- Člen | 8
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
$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:
- Noví uživatelé dle „mladí“
list
v actionUser je nevhodny nazev- $this->redirect(‚Error:404‘) neni spravne – pouzij radeji
$this->error()
, coz vyvola BadRequestException (defaultne se 404 kodem), kterou zachyti Error presenter $this->presenter
je v presenteru zbytecne- 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
pár věcí:
- 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“. - 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.
- 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}
- 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
matej21 napsal(a):
$this->getUser()
vraci aktualne prihlaseneho uzivatelev actionUser to vybiras spravne, takze staci do toho renderUser misto
$this->getUser()
dat$this->list
a par poznamek:
- Noví uživatelé dle „mladí“
list
v actionUser je nevhodny nazev- $this->redirect(‚Error:404‘) neni spravne – pouzij radeji
$this->error()
, coz vyvola BadRequestException (defaultne se 404 kodem), kterou zachyti Error presenter$this->presenter
je v presenteru zbytecne- 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
- Příště dám pozor
- Přejmenoval jsem
- Věděl jsem, že to mám špatně, ale dokud mi nefungovaly odkazy, tak jsem se k tomu nedostal
- Odebráno
- 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
Oli napsal(a):
- 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
- To by taky šlo, zkusil jsem to předělat podle tebe
- 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
- Díky, ještě musím podle toho přizpůsobit šablonu
- Oli
- Člen | 1215
jiri.korejtko napsal(a):
- 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
Oli napsal(a):
jiri.korejtko napsal(a):
- 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
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
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)
- jiri.korejtko
- Člen | 8
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)