předání proměnné mezi komponentami

ondraLE
Člen | 23
+
0
-

Zdravím, dělám jednoduchý CMS editor, chci mít kompomenty dle typu obsahu, např. CMSImage řeší obrázek, CMSHTML řeší html obsah atd..
Definici obsahu načítám z DB, kde jeden z parametrů je ->type (např. image, html..) Udělal jsem si komponentu CMSBlock a předávám latte šabloně obj. $def (kde je v ->type název hledané kompomenty).

{control cmsBlock $def}

V presenteru mám:

public function createComponentCmsBlock(): Control
    {
        $control = new CMSDefinitionControl();
        $control->templateDir = dirname($this->template->getFile());
        return $control;
    }

CMSDefinitionControl.php

class CMSDefinitionControl extends Control
{
    public ?string $templateDir = null;
    public ?string $fileDir = null;
    public DefinitionModel $definition;

    public function render(DefinitionModel $definition) : void
    {

        $this->template->fileDir = $this->fileDir;
        $this->definition= $definition;
    }

Zde bych mohl ve fci render zjistit typ bloku a podle toho zobrazit příslušnou šablonu, ale jelikož typů je řádově desítky, raději bych pro každý udělal svoji komponentu. Zkoušel jsem tedy v této classe přidat fci

    protected function createComponent($name): Control
    {
        dump($name);
}

s volám {control cmsBlock-HTML $def}
nicméně do createComponent (subkomponenta CMSDefinitionControl) lze předat jen $name. Podle názvu opět mohu rozparsovat a vrátit příslušnou komponentu, ale jak zapsat název do latte šablony, když je uložen v proměnné?
Zkoušel jsem různě závorkovat, spojovat atd.. např:

{control cmsBlock-$def->type}
{control cmsBlock-($def->type)}
{control cmsBlock-'$def->type'}

vrací vždy Unsupported operand types: string – string.
Nějaký nápad jak si předat název subkomponenty z objektu?
Díky.

nightfish
Člen | 517
+
+2
-

@ondraLE

{control cmsBlock $def}

Pozor na to, že předávání parametrů render metodám komponent nefunguje v AJAX požadavcích. Lepší je si $def předat přes konstruktor (argument create() metody v továrně).

Zkoušel jsem různě závorkovat, spojovat atd.. např:

{control cmsBlock-$def->type}
{control cmsBlock-($def->type)}
{control cmsBlock-'$def->type'}
{control 'cmsBlock-' . $def->type}

A možná funguje i

{control cmsBlock-{$def->type}}
ondraLE
Člen | 23
+
0
-

nightfish napsal(a):

@ondraLE

{control cmsBlock $def}

Pozor na to, že předávání parametrů render metodám komponent nefunguje v AJAX požadavcích. Lepší je si $def předat přes konstruktor (argument create() metody v továrně).

Zkoušel jsem různě závorkovat, spojovat atd.. např:

{control cmsBlock-$def->type}
{control cmsBlock-($def->type)}
{control cmsBlock-'$def->type'}
{control 'cmsBlock-' . $def->type}

A možná funguje i

{control cmsBlock-{$def->type}}

Díky {control 'cmsBlock-'. $def->type} funguje!
K předávání, myslíš tedy udělat továrnu na CMS komponenty obecně a z ní generovat jednotlivé prvky?

Editoval ondraLE (4. 10. 13:45)