Předání parametrů v config.neon do komponenty

Alsatian
Člen | 164
+
+1
-

Ahoj.

Rád bych předal parametry z config.neon do své komponenty ContactForm která vypadá takto (zjednodušeně):

namespace App\Components;

use...

class ContactForm extends UI\Control
{
	public function render() {...}
	public function createComponentMyForm() {...}
	public function formSucceeded() {...}
}
interface IContactFormFactory
{
    /** @return ContactForm */
    function create($config);
}

Parametry předávám například do presenterů v config.neon například takto:

services:
    - App\Model\UserManager(%global%)

parameters:
	global:
		systemEmail = 'info@alsan.cz'
		...

Například tento „systemEmail“ bych rád v mé komponentě posléze využil. Jak to tam ale předat nevím…

Děkuji moc předem za jakoukoli radu :)

Našel jsem tento příspěvek, konkrétně radu od Davida, ale nefunguje mi to.
https://forum.nette.org/…ne-z-configu
Dostanu chybu „Service ‚arguments‘: Unknown key ‚0‘ in definition of service.“
Nevím jak přesně potom proměnnou ze své komponenty vytáhnout (použít)

Alsatian
Člen | 164
+
0
-

@CZechBoY děkuji za odkaz. Ale chytrý z toho bohužel nejsem. Používám interface a ten mi nedovolí definovat proměnnou pomocí

private $config;

Jdu Googlit a Googlit a tajně doufám, že mě někdo navede na správnou cestu :)

F.Vesely
Člen | 368
+
0
-

Zkus

namespace App\Components;

class ContactForm extends UI\Control
{
    public function __construct($config) {...}
}
interface IContactFormFactory
{
    /** @return ContactForm */
    function create();
}
services:
    - App\Components\IContactFormFactory(%global%)
Alsatian
Člen | 164
+
0
-

@FVesely ahoj, zkouším a chyba:
Service ‚85_App_Components_IContactFormFactory‘: The item ‚factory‘ in array expects to be callable or Nette\DI\Statement or null, array(20) given.

Já si myslím, že to bude muset být nějak takto:

  • implement: IMyFactory

    arguments: [%foo%]

Ale odkaz ve vláknu od Davida Matějky už není bohužel funkční.
https://forum.nette.org/…ne-z-configu

Alsatian
Člen | 164
+
0
-

Tak nevím, co dělám špatně.
Pokud do config.neon zadám

- {implement: App\Components\IContactFormFactory, arguments: [%global%]}

kde global je

parameters:
	global:
		systemEmail = 'info@alsan.cz'
		...

a do své továrničky přidám

class ContactForm extends UI\Control
{
    public function __construct(array $config) {
        parent::__construct();
    }
	...
}

interface IContactFormFactory
{
    /** @return ContactForm */
    function create();
}

dostanu chybu:
Too few arguments to function App\Components\ContactForm::__construct(), 0 passed in D:\wamp64\www\nazevprojektu\app\presenters\BasePresenter.php on line 355 and exactly 1 expected

PS: doplním, že v BasePresenter.php se formulář zobrazuje takto:

public function startup() {
	parent::startup();
	...

	// kontaktni formular
    ob_start();
        $this['contactForm']->render();
    $formTemplate = ob_get_clean();
    $this->template->kontaktniFormular = (string) $formTemplate;
	...
}

Editoval Alsatian (8. 3. 2019 22:33)

Mysteria
Člen | 797
+
-2
-

Parametry továrničky (metoda create) musí odpovídat konstruktoru toho, co vytváří. Takže takhle:

interface IContactFormFactory
{
    /** @return ContactForm */
    function create(array $config);
}
David Matějka
Moderator | 6445
+
0
-

to vypada, ze v BasePresenter.php on line 355 nepouzivas tu tovarnu, ale instasnci ContactForm vytvaris rucne pres new