Jak správně a bezpečně podstrčit komponentě htmlData z presenteru a zobrazit htmlData v šabloně komponenty

vosy
Člen | 525
+
0
-

v presenteru mám

    protected function createComponentConfirmFormDialog()
    {
        $latte = new Engine();
        $latte->setTempDirectory(__DIR__.'/../../../temp/');
        $params = ['email'=>'zkouska@seznam.cz'];
        $htmlConfirmDialog = $latte->renderToString(__DIR__.'/templates/Emaily/sections/confirmDialog_smazatEmail.latte', $params);

        $onConfirmFce = function():void{
            //nějaká FCE
        };

        return $this->confirmFormDialogControl->create($onConfirmFce, $htmlConfirmDialog);
    }

a v komponentě mám

class ConfirmFormDialogControl extends Control
{
...
...
    public function render()
    {
        $this->template->setFile(self::TEMPLATE);
        $this->template->customHtml = $this->htmlConfirmDialog;
        $this->template->render();
    }
...

}

interface IConfirmFormDialogControl
{
    public function create( $onConfirmFce, $htmlConfirmDialog):ConfirmFormDialogControl;
}

a v šabloně komponenty mám

<div class="{App\Constants::PREFIX}-modal">
    <div class="dialog">
        <div class="header"><a href="">X</a></div>
        <div class="content">NĚJAKÝ OBSAH</div>

        {$customHtml|noescape}

        <div class="controlPanel">{control confirmForm}</div>
    </div>
</div>

Chci ze septat, je

{$customHtml|noescape}

dosti bezpečné nebo bych tuto situaci měl řešit jinak?

Marek Bartoš
Nette Blogger | 1162
+
+1
-

Vyrenderované Latte je už escapované, takže pokud jej používáš ve stejném kontextu (nemáš např. Latte vyrenderované v kontextu HTML a vypisuješ jej v kontextu javascriptu), tak je to bezpečné.

Jen bych string s html hned po renderu obalil do instance Nette\Utils\Html a předával komponentě ten. Ať při vykreslení do šablony nemusíš myslet na noescape.

Marek Bartoš
Nette Blogger | 1162
+
+1
-

__DIR__.'/../../../temp/'

Místo tohoto si do služby předávavej parametr %tempDir%. Aplikace se ti nerozbije, když se ti změní struktura složek.

I presenter můžeš registrovat manuálně do služeb

services:
	- App\ExamplePresenter(%tempDir%)
final class ExamplePresenter extends ...
{

	public function __construct(string $tempDir)
	{
		// ...
	}

}

Editoval Marek Bartoš (17. 10. 2022 23:06)

Marek Bartoš
Nette Blogger | 1162
+
+1
-

A než renderovat do stringu, tak si raději udělej komponentu s handle metodou pro smazání a volej v ní callback předaný přes konstruktor. V callbacku záznam smažeš. Může tak být komponenta pro mazání schovaná uvnitř komponenty namísto toho, abys to řešil v presenteru

Editoval Marek Bartoš (17. 10. 2022 23:09)

vosy
Člen | 525
+
0
-

Marek Bartoš napsal(a):

A než renderovat do stringu, tak si raději udělej komponentu s handle metodou pro smazání a volej v ní callback předaný přes konstruktor. V callbacku záznam smažeš. Může tak být komponenta pro mazání schovaná uvnitř komponenty namísto toho, abys to řešil v presenteru

@MarekBartoš

Ahoj,
díky, to zní zajímavě.

Jak by ten handle a callback měl vypadat?

Děkuju

Editoval vosy (18. 10. 2022 14:17)