Ochrana emailu {helper} – prebrana funkce ze Smarty

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

Zdravim!

Jestli nekdo pouzivate krom latte i Smarty, tak Smarty disponuje funkci pro ochranu emailu .

Pouziti:

{mailto address="me@example.com" encode="javascript"}
<script type="text/javascript" language="javascript">
   eval(unescape('%64%6f% ... snipped ...%61%3e%27%29%3b'))
</script>

Trochu jsem upravil tuto funkci a implementoval ji jako helper pro latte. Treba se to nekomu bude hodit.

Pouziti:

Presenter:

public function beforeRender(){
	$this->template->registerHelper('email', 'SmartyMailto::helper');
}

Latte:

{var $mail = "my@email.net"}

{!$mail|email:"javascript"}
{!$mail|email:"javascript_charcode"}
{!$mail|email:"hex"}
{!$mail|email:"javascript":"link to my email here"}

Git: Smarty:Mailto

Editoval Felix (18. 1. 2012 15:12)

Patrik Votoček
Člen | 2221
+
0
-

Nelíbí se mě závislost na JavaScriptu.

Raději bych šel Texy! cestou.

$template->registerHelper('email', function($s) {
	return str_replace('@', '<!-- ANTISPAM -->&#64;<!-- ANTISPAM -->', $s);
});
{var $mail = "test@example.com"}
{!$mail|email}
Felix
Nette Core | 1186
+
0
-

Mam v planu implementovat tam fci z Texy!, drupalu a vlastni callback.

Lawondyss
Člen | 106
+
0
-

Patrik Votoček napsal(a):

Nelíbí se mě závislost na JavaScriptu.

Raději bych šel Texy! cestou.

$template->registerHelper('email', function($s) {
	return str_replace('@', '<!-- ANTISPAM -->@<!-- ANTISPAM -->', $s);
});
{var $mail = "test@example.com"}
{!$mail|email}

Dobrý nápad, ale neřeší to výpis do odkazu za mailto:.

Felix
Nette Core | 1186
+
0
-

Lawondyss napsal(a):

Patrik Votoček napsal(a):

Nelíbí se mě závislost na JavaScriptu.

Raději bych šel Texy! cestou.

$template->registerHelper('email', function($s) {
	return str_replace('@', '<!-- ANTISPAM -->@<!-- ANTISPAM -->', $s);
});
{var $mail = "test@example.com"}
{!$mail|email}

Dobrý nápad, ale neřeší to výpis do odkazu za mailto:.

Uz jsem to implementoval. Staci mrknout na muj git.

motorcb
Člen | 551
+
0
-

Jak zprovozním ten příklad z Gittu?
Stáhnu soubor SmartyMailto.php – kam ho uložím?

Felix
Nette Core | 1186
+
0
-

motorcb napsal(a):

Jak zprovozním ten příklad z Gittu?
Stáhnu soubor SmartyMailto.php – kam ho uložím?

Vlozit to staci treba do slozky libs/ a pote zaregistrovat jako helper v presenteru.

public function beforeRender(){
    $this->template->registerHelper('email', 'SmartyMailto::helper');
}
motorcb
Člen | 551
+
0
-

To mi právě vrací chybu:

Nette\MemberAccessException
Call to undefined method Nette\Templating\FileTemplate::email().

Soubor jsem nahrál do /libs vedle složky Nette

Editoval motorcb (4. 6. 2012 17:18)

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

motorcb V jaké šabloně ten helper používáš, když ti to chybu vyhazuje?

Felix
Nette Core | 1186
+
0
-

A pouzivas to spravne jako helper?

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

Felix to asi používá, ta chyba, co píše, tomu celkem odpovídá.

motorcb
Člen | 551
+
0
-

vojtech.dobes : Používám to v komponentě
Felix:

{!$article->email|email:"javascript"}
motorcb
Člen | 551
+
0
-

I když dám do HomepagePresenter.php:

public function beforeRender(){
    $this->template->registerHelper('email', 'SmartyMailto::helper');
}

a v templates/default.latte nechám vypsat:

{var $mail = "my@email.net"}

{!$mail|email:"javascript"}
{!$mail|email:"javascript_charcode"}
{!$mail|email:"hex"}
{!$mail|email:"javascript":"link to my email here"}

Skončí to chybou:
Nette\InvalidStateException
Callback ‚SmartyMailto::helper‘ is not callable.

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

To jsem si myslel. Používáš to v komponentě, ta si tvoří jinou instanci šablony, která beforeRender vůbec neprojde (tato metoda ji nemůže ovlivnit). Tzn. si tu registraci zkopíruj do svojí komponenty, a to konkrétně do:

protected function createTemplate($class = NULL)
{
	$template = parent::createTemplate($class);
	// zde
	return $template;
}

To s tím smarty not callable je taky zajímavý, ale asi neposloužím.

motorcb
Člen | 551
+
0
-

vojtech.dobes:
Používám Nette 2 a v komponentě mám toto:

use Nette\Application\UI,
    Nette\Database\Table\Selection;

class TaskList extends UI\Control
{
    /** @var \Nette\Database\Table\Selection */
    private $tasks;

    public function __construct(Selection $tasks)
    {
        parent::__construct(); // vždy je potřeba volat rodičovský konstruktor
        $this->tasks = $tasks;
    }

    public function render()
    {
        $this->template->setFile(__DIR__ . '/TaskList.latte');
        $this->template->tasks = $this->tasks;
        $this->template->render();
    }
}

Kam to tam umístím?

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

Kdekoliv jako další metodu. Anebo se nemusíš patlat (ale je to takové hezčí) s createTemplate, a můžeš tu registraci helperu hodit rovnou do render metody.

motorcb
Člen | 551
+
0
-

vojtech.dobes:

public function render()
{
    $this->template->setFile(__DIR__ . '/TaskList.latte');
    $this->template->tasks = $this->tasks;
	$this->template->registerHelper('email', 'SmartyMailto::helper');
    $this->template->render();
}

Hlásí chybu:

Nette\InvalidStateException
Callback 'SmartyMailto::helper' is not callable.
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

To s tím smarty not callable je taky zajímavý, ale asi neposloužím.

motorcb
Člen | 551
+
0
-

Tak už to šlape. Problém byl ve špatně staženém souboru s knihovnou.
Díky za pomoc