Latte 3: Lze ovlivnit pořadí registrace extension v config.neon?

Kajda23
Člen | 42
+
0
-

Ahoj,
vytvořil jsem si extension, které přepisuje jeden z formulářových tagů. Problém je, že pokud mojí extensionu registruji v configu (latte: extensions: – MojeExtenšna), je zaregistrována před formulářovou extensionou a tudíž jí nepřepíše. Lze pořadí registrace nějak ovlivnit nebo nějak jinak dostat mojí verzi tagu místo standardní?

Editoval Kajda23 (24. 10. 2022 10:34)

Marek Bartoš
Nette Blogger | 1263
+
0
-

Tak jak píšeš to teď opravdu nejde. Latte DI extension registruje Latte extensions při vytváření Engine přes LatteFactory, zatímco FormsExtension se registruje až následně v TemplateFactory https://github.com/…eFactory.php#…

Můžeš řešit tak, že svoji extension zaregistruješ pomocí události TemplateFactory::$onCreate(), aby registrace tvé proběhla až po registraci původní.

David Grudl
Nette Core | 8218
+
+2
-

Asi by se to dalo řešit přidáním volby after, kde by se uvedlo, za jakou extension se má přidávaná zařadit…

Editoval David Grudl (24. 10. 2022 14:03)

petr.pavel
Člen | 535
+
0
-

Nebo v addExtension() nepřidávat tu samou extension podruhé. Pak by šlo v configu Nette\Bridges\FormsLatte\FormsExtension uvést před mou extension a tím ovlivnit pořadí načítání.

Editoval petr.pavel (4. 4. 17:26)

petr.pavel
Člen | 535
+
0
-

Ještě přidám hotový příklad pro ten postup s onCreate:

common.neon

services:
	latte.templateFactory:
		setup:
			- '$onCreate[]' = [App\Bridges\Latte\LatteExtension, onTemplateCreate]	# a workaround to override FormsExtension::label
declare(strict_types=1);

namespace App\Bridges\Latte;

use Nette\Bridges\ApplicationLatte\DefaultTemplate;

class LatteExtension extends \Latte\Extension
{

  public function getTags(): array
  {
    return [
      'label' => [Nodes\LabelNode::class, 'create'],
    ];
  }


  public static function onTemplateCreate(DefaultTemplate $template): void
  {
    $template->getLatte()->addExtension(new static);
  }

}
David Grudl
Nette Core | 8218
+
0
-

Upravím kód tak, aby se nejdříve přidaly CacheExtension a FormsExtension, a teprve poté uživatelské extensions.

UIExtension je vázané na $control, ale to by se dalo řešit úpravou LatteFactory, aby $control přijímala jako parametr.

Můžete to otestovat v 3.2-dev