Generování linku ze stringu

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

Ahojte, potřeboval bych vygenerovat odkaz ze stringu, který mám v databázi.
Vytvořil jsem si na to jednoduchou funkci, která mi ořeže string a nakonec z něj vyleze

$data = ['Article:detail', 'parametr'];

Musím říct, že jsem to do toho linkGeneratoru zkoušel nacpat všemi způsoby, co mě napadly. Ale na ten správný jsem zjevně nenašel.
Tady jsou mé pokusy.

$this->linkGenerator->link($data[0], $data[1]);	// $data[1] must be of the type array
$this->linkGenerator->link($data[0], array($data[1])); // Undefined offset 1
$this->linkGenerator->link($data[0], array('route' => $data[1])); // Undefined offset 1

Mohli byste mi poradit s tím generováním linku prosím?

Editoval Jan Blažek (31. 7. 2017 10:09)

matopeto
Člen | 395
+
0
-

Malo by to ist nejako takto:
(podla dokumentacia: https://github.com/…enerator.php#L45 prvy parameter je destinacia, teda string ako by si ho zapisal v latte, a druhy su nejake ine riadiace parametre)

<?php
$this->linkGenerator->link("{$data[0]} {$data[1]}");
?>

Edit: Ale len tipujem m z toho co vidim v nette zdrojaku.

Editoval matopeto (31. 7. 2017 10:31)

Jan Blažek
Člen | 36
+
0
-

Teď mi to píše.
„Invalid link destination ‚Article:detail sefdsfsef‘.“

v ArticlePresenter.php mám

function renderDetail($route)
 {
     $article = $this->articleFacade->getArticleByRoute($route);
     if(!$article)
         $this->error();
     $this->template->article = $article;
 }

a v routru

$router[] = new Route('[<locale=cs cs|en>/]article/detail/<route>', 'Article:detail');

Editoval Jan Blažek (31. 7. 2017 10:21)

David Matějka
Moderator | 6445
+
0
-

mel by fungovat ten treti zapis:

$this->linkGenerator->link($data[0], array('route' => $data[1])); // Undefined offset 1

ale dle te chyby to spis vypada, ze neexistuje $data[1]. jsi si jisty, ze ten obsah pole je opravdu takovy, jako pises? nebo na kterem radku to ukazuje tu undefined offset chybu? primo v tom volani, nebo v nejake internal metode nette?

matopeto
Člen | 395
+
0
-

Este preco to chces generovat cez linkgenerator? kde to generujes?

Jan Blažek
Člen | 36
+
0
-

Chci v homepage: mít takový seznam novinek.
Takže se mi do databáze ukládá něco jako

"Uživatel ... přidal článek ..."

Tak mě napadlo, že by bylo fajn, kdyby na to uživatel mohl rovnou kliknout, takže jsem to změnil na

Uživatel ... přidal článek <a href="{link Article:detail $article->route}">...</a>

Podle mě na to jdu zbytečně moc složitě, ale v HomepagePresenter mám

public function renderDefault()
{
		$this->template->addFilter('link', function ($vals){
			$pom= mb_strpos($vals, '{') + 6;
			if($pom === false)
				return $vals;
			$pomII = mb_strrpos($vals, '}');
			$str = mb_substr($vals, $pom, $pomII - $pom);
			$data = explode(' ', $str);
			return 'link <a href="' . $this->linkGenerator->link($data[0], array('route' => $data[1])). '">link</a>'; // v returnu to okarát nahradí {link ...} za vygenerovaný odkat
		});
    $this->template->informations = $this->infoFacade->getInfo();
}

s tím že v latte zavolám akorát |link.
Chyba mi vyskakuje na posledním řádku funkce, která se zavolá při |list v latte. Jak je ten linkGenerator.
Vyskočí mi prostě

Notice

Undefined offset: 1

Screen z Xdebugeru
https://ctrlv.cz/v7Lx

matopeto
Člen | 395
+
+4
-

Ja by som siel do toho inak,
do db by som ulozil zaznam typu: kde si zapises typ notifikacie a id odkzau

|user_id|action_type|action_id|
|     12|article_add|      134|

a potom by som v latte:

{foreach $notificaions as $n}
{if $n->action_type === 'article_add'}
   Uzivatel {$n->users->name alebo tak nejako... :) } pridal clanek <a n:href="Articles $n->action_id"> ...
...

Pripadne este jednoduchsie ak chces iba pridavanie clankov

vythiahnes si clanky zoradene podla casu pridania, a vypises si to v latte:

{foreach $recentArticles as $a}
Uzivatel {$a->user_name alebo tak nejako... :) } pridal clanek <a n:href="Articles $a->article_id">

Editoval matopeto (31. 7. 2017 11:10)

Jan Blažek
Člen | 36
+
0
-

Tak nakonec to udělám po tvém.
Všem děkuji za vaše rady!