Trošku zvláštní helper – je to správně?

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

V mém komentářovém systému je možno kliknout na reagovat se přenese číslo ve formátu [číslo] to se uloží do DB a při výpisu zobrazuji odkaz na ten komentář a jméno uživatele. Napsal jsem si na to helper a nejsem si tedy jistý, jestli je to OK. Funguje, ale to použití vypadá hrozně.

Připravím si helper v renderBefore
Proměnná $commentsArr se do helperu dostává až v šabloně, protože nevím jak ji tam dostat jinak.

		$that = $this; // na hostingu je PHP 5.3 arghh!
		$this->template->registerHelper('reactions', function($string, $commentsArr) use ($that){

				$string  = preg_replace_callback("~\[(\d*?)\]~si", function($out) use($commentsArr) {

if (array_key_exists($out[1], $commentsArr))
    return   "<a href='#komentar".$out[1]."'>[" .$commentsArr[$out[1]][0]."] ".$commentsArr[$out[1]][1]."</a>";
else
    return $out[1];

				}, $string);

				return $string;

			});

renderDetail
.
.
.

		$comments = $this->template->comments = $this->model->findComments($this->template->post->id);
		$commentsArr = array();
		$i = 0;
		foreach ($comments as $arr)
		{
	        $i++;
	        $commentsArr[$arr->id] = array($i, $arr->jmeno);
		}

		$this->template->commentsArr = $commentsArr;

Použití <div class=„text“>{$cmtRow->vzkaz|striptags|reactions:$commentsArr|makeLink|nl2br|smileys}</div>

Moje otázka zní tedy, lze to napsat trošku lépe? Zápis reactions:$commentsArr vypadá fakt ugly.


A ještě drobnost. Potřebuji vykonávat určité záměny jako nahrazení značek za smajlíky, nahrazení textových odkazů za klikací atd takže potřebuji povolit HTML tagy. Nejdříve odstranění přes striptags a pak provedu záměny, je to bezpečné? Četl jsem cosi o tom, že striptags není uplně ono, ale nevím jak to napsat jinak.

Myiyk
Člen | 321
+
+1
-

Místo předání přes šablonu si to pole můžeš předat v presenteru.

Přidáš si proměnnou do presenteru

class AnyPresenter extends .... {
public $commentsArr;

a místo

$this->template->commentsArr = $commentsArr;

použiješ

$this->commentsArr = $commentsArr;

Výsledný helper

$that = $this; // na hostingu je PHP 5.3 arghh!
$this->template->registerHelper('reactions', function($string) use ($that){
		$commentsArr = $that->commentsArr;
        $string  = preg_replace_callback("~\[(\d*?)\]~si", function($out) use($commentsArr) {

                if (array_key_exists($out[1], $commentsArr))
                    return   "<a href='#komentar".$out[1]."'>[" .$commentsArr[$out[1]][0]."] ".$commentsArr[$out[1]][1]."</a>";
                else
                    return $out[1];

        }, $string);

        return $string;

    });

použití
<div class=„text“>{$cmtRow->vzkaz|striptags|reactions|makeLink|nl2br|smileys}</div>

Kcko
Člen | 468
+
0
-

super :-) díky