Service of type Latte\Engine required by $latte in SMSModel::__construct() not found

mimacala
Člen | 113
+
0
-

Ahojte,
nahoře mám

use Latte\Engine;

 public function __construct(
        private Explorer $db,
        private Engine $latte,  //tady mi to háže chybu
    ){
    }


 public function OdeslatEmail($od,$komu,$predmet,$cesta,$par,$par2)
    {

        $params = [
            'par' => $par,
            'par2' => $par2,
        ];
        $mail = new Nette\Mail\Message;
        $mail->setFrom($od)
            ->addTo($komu)
            ->setSubject($predmet)
            ->setHtmlBody($this->latte->renderToString($cesta, $params));
        $mailer = new Nette\Mail\SendmailMailer;
        $mailer->send($mail);
    }

Tady je celá chyba
[2022–08–14 21–42–56] Nette\DI\ServiceCreationException: Service of type App\model\SMSModel: Service of type Latte\Engine required by $latte in SMSModel::__construct() not found. Did you add it to configuration file? in /data/web/virtuals/304203/virtual/www/vendor/nette/di/src/DI/Resolver.php:650 @ @@ exception–2022–08–14–21–42–f98557db7e.html

na produkčním serveru vypíše Error 500

Takto vypadá soubor services

services:
	- App\Router\RouterFactory::createRouter
	- App\Components\Formulare\FormularPrihlaseni
	- App\model\Kontrola
	- App\model\BaseModelUzivatele
	- App\model\UzivatelModel
	- App\model\ProvozovnaModel
	- App\model\ReklamaceModel
	- App\model\ZpravyModel
	- App\model\SMSModel

SMS model tam mám chybu mi to hodilo až po přidání LatteEngine :/
Jinak ve vendor samozřejmě je latte.
Bude to nějaká blbost, ale jsem na tom ted zaseklý :D .. prosím nesetkal se s tím někdo ?
Děkuji

Marek Bartoš
Nette Blogger | 1161
+
+1
-

Engine není služba, vytváří se skrze službu Nette\Bridges\ApplicationLatte\LatteFactory

Ale možná budeš chtít spíš Nette\Bridges\ApplicationLatte\TemplateFactory. Přidává věci jako jsou odkazy, cachovací a překladové makro

mimacala
Člen | 113
+
0
-

Potřebuji právě, aby mi fungovala funkce $this->latte->renderToString($cesta, $params).

Marek Bartoš
Nette Blogger | 1161
+
+1
-

S TemplateFactory takto
$this->templateFactory->createTemplate()->renderToString()

mimacala
Člen | 113
+
0
-

Ahoj prosím ještě teď mám chybu
[2022–08–15 17–40–02] Latte\RuntimeException: Missing template file ‚templates/email.latte‘. in

email.latte mám ve složce templates, ale nevím jak udělat cestu protože {$basePath} mě nasměruje do www.
Zde je kód s cestou

    public function OdeslatEmail($od,$komu,$predmet,$cesta,$par,$par2)
    {

        $params = [
            'par' => $par,
            'par2' => $par2,
        ];
        $mail = new Nette\Mail\Message;
        $mail->setFrom($od)
            ->addTo($komu)
            ->setSubject($predmet)
            ->setHtmlBody($this->latte->createTemplate()->renderToString($cesta, $params));
        $mailer = new Nette\Mail\SendmailMailer;
        $mailer->send($mail);
    }

 $this->sms->OdeslatEmail('Aktivace účtu - <>',$data->email,'Aktivační link','templates/email.latte',$klic,$data->email);

=========================================================================================
Jinak ještě mimo to,
v dokumentaci je tento příklad

$latte = new Latte\Engine;
$params = [
	'orderId' => 123,
];

$mail = new Nette\Mail\Message;
$mail->setFrom('Franta <franta@example.com>')
	->addTo('petr@example.com')
	->setHtmlBody(
		$latte->renderToString('/path/to/email.latte', $params),
		'/path/to/images'
	);

Ale latte/engine mi právě dělalo problémy a tvoje řešení funguje v pořádku.
Dokumentace je tedy zastaralá ?
Děkuji

nightfish
Člen | 471
+
+2
-

@mimacala
ad cesta: Do renderToString() posílej absolutní cestu – v nejjednodušším případě jako __DIR__.'/templates/email.latte – což ovšem bude vyžadovat, aby složka templates se souborem email.latte byla ve stejném adresáři, jako soubor, v němž použiješ konstantu __DIR__. Pokud je jinde, bude potřeba cestu nějak upravit.

ad Latte\Engine: je zásadní rozdíl, když si vytvoříš Latte engine pomocí new Latte\Engine a když si jej vyžádáš jako závislost přes konstruktor. Ve druhém případě to vyžaduje, aby byl Latte\Engine zaregistrován jako služba v DI kontejneru, což v Nette standardně není.

mimacala
Člen | 113
+
0
-

@nightfish Aha jasné DIR funguje.
Snažím se teda odkaz vytvořit přes link a předat si ho rovnou do emailu, ale nejak mi nejdou sestavit „. '“.
Neví někdo jak tohle vyřešit ? :D

$url = '<a href="' . $this->link("Prihlaseni:aktivace", $klic, $data->email) . '"></a>'; // tady mi to dělá problémy :D
        $this->sms->OdeslatEmail("Aktivace účtu - <info@reklab.cz>",$data->email,"Aktivační link [RekLab]",$url);

na email mi přijde toto ne odkaz ale jako text

<a href="/prihlaseni/aktivace?klic=183&email=mujemail.cz"></a>

Editoval mimacala (15. 8. 2022 20:12)

mystik
Člen | 288
+
+2
-

To bude tím, že zafunguje automatické escapování, kterým Latte brání tomu, aby tam uživatel podstrčil nějaký škodlivý kód.

Za mě si nesestavuj celé HTML, ale jen URL odkazu a udělej ji absolutní.

$url = $this->link("//Prihlaseni:aktivace", $klic, $data->email)

A nebo jde rozchodit klasická makra link a plink takhle:

$latte->addExtension(new UIExtension(null));
$latte->addProvider('uiControl', $linkGenerator);
$latte->addProvider('uiPresenter', $linkGenerator);

Jako $linkGenerator předáváš buď službu typu LinkGenerator, nebo cokoliv co má metodu link. Makra link a plink ji pak volají.

mimacala
Člen | 113
+
0
-

No jistě, teď to funguje .....
přitom tak snadné…
Moc děkuji za pomoc :)

@mystik Prosím bylo by možné odkaz nějak schovat za název ? <a href=„link“>Název linku</a>

Editoval mimacala (15. 8. 2022 21:34)

nightfish
Člen | 471
+
+2
-

mimacala napsal(a):
Prosím bylo by možné odkaz nějak schovat za název ? <a href=„link“>Název linku</a>

Jakože <a href="{$url}">Název linku</a> v šabloně?

mystik
Člen | 288
+
+2
-

Pokud genwrujes html mail tak ano presne tak jak pises. Akorat ten html kod musis mit az v sablone a promennou s url vkladat jen do href. Neposilat si kusy html v promenne.

mimacala
Člen | 113
+
0
-

Aha chápu, já měl právě problém s předáním linkgeneratoru do šablony, tak jsem to chtěl vyřešit takhle :/
EDIT: kdyby někdo řešil stejně jako já .. zde je řešení

  $mail = new Nette\Mail\Message;
        $mail->setFrom($od)
            ->addTo($komu)
            ->setSubject($predmet)
            ->setHtmlBody('<a href="' . $par . '">Aktivační link</a>');
        $mailer = new Nette\Mail\SendmailMailer;
        $mailer->send($mail);

Editoval mimacala (16. 8. 2022 20:23)