Ako odovzdat komponente id?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
steelbull
Člen | 241
+
-1
-

Ako odovzdat komponente ID?

Priklad:

protected function createComponentLrassignwuform($id) {
    $form = (new LrAssignWuFormFactory($this, 'LrAssignWuForm', $this->context, $this->translator))->create($id);
    return $form;
}

Dakujem za odpovede.

Editoval steelbull (6. 11. 2014 15:47)

Michal Vyšinský
Člen | 608
+
+3
-

To je celé špatně:

  1. Vytvoř si továrničku, kterou zaregistruješ jako službu a injectneš si ji kde potřebuješ
  2. Komponentu vytvoř přes tu továrničku
  3. Nepoužívej $this->context – injektuj přímo služby, které potřebuješ
  4. To pojmenování… no comment

Dokumentace:

  1. továrničky https://doc.nette.org/…dependencies#…
  2. DI https://doc.nette.org/…dependencies

Editoval Michal Vyšinský (6. 11. 2014 15:55)

steelbull
Člen | 241
+
0
-

Mozes mi to prosim ukazat na nejakom priklade?

Velmi pekne dakujem.

Michal Vyšinský
Člen | 608
+
+2
-

Dokumentaci si četl?

Továrnička:

interface LrAssignWuFormFactory
{
    /**
     * @return LrAssignWuForm
     */
    function create($id);
}

Komponenta

class LrAssignWuForm extends Form
{
    public function __construct($id, Translator $translator)
    {
       ...
    }
}

Registrace v configu:

services:
	- implement: LrAssignWuFormFactory
      parameters: [id]
	  arguments: [%id%]

V presenteru:

class SomePresenter {

    /** @var LrAssignWuFormFactory @inject */
    public $lrAssignWuFormFactory;

	private $id;

	public function actionKdeSeVytvariForm($id)
    {
        $this->id = $id;
    }

	protected function createComponentLrassignwuform()
	{
       return $this->lrAssignWuFormFactory->create($this->id);
    }

}

Předpokládám, že ID máš v url.

Továrnička se ti vygeneruje pomocí DI kontejneru, takže závislosti definuješ pouze v KONSTRUKTORU komponenty. V interface továrničky budeš mít pouze ten jeden parametr ID, který ji musíš vždy předat.

Editoval Michal Vyšinský (6. 11. 2014 16:02)

steelbull
Člen | 241
+
-3
-

Vyriešené, zabudol som zmazat namespace, ale teraz to hlási chybu:

Nette\InvalidArgumentException
Missing parameter ‚id‘

@MichalVyšinský

Urobil som to takto:

<?php

use Nette\Application\UI,
    Nette\Forms\Form,
    App\Model;



class LrAssignWuFormFactory extends UI\Control {

    /** @inject @var \Nette\Database\Context */
    public $context;
    private $translator;
    private $id;



    /**
     * Constructor
     *
     * @param int $id
     * @param \App\Presenters\Translator $translator
     */
    function __construct(int $id, Translator $translator) {
        $this->translator = $translator;
        $this->id = $id;
    }



    /**
     * Create form
     *
     * @param int $id
     * @return \Nette\Application\UI\Form
     */
    function create(int $id) {
        // Create new instance
        $form = new UI\Form;

        // Load LabRequest model
        $wuModel = new Model\WuModel($this->context);

        // Washing units list
        $wus = $wuModel->getAssignWuList($id)->fetchPairs('id', 'serial');

        $form->method = 'post';
        $form->getElementPrototype()->addAttributes(array('id' => 'wuForm'));

        // Load LabRequests list
        $form->addSelect('wu_id', $this->translator->translate('wu.default.number'), $wus)
                ->setAttribute('class', 'chosen-select')
                ->setPrompt('');

        // Add form protection
        $form->addProtection();

        $form->onSuccess[] = array($this->instance, $this->callback);

        return $form;
    }

}



/**
 * Form interface
 */
interface ILrAssignWuFormFactory {



    /**
     * @return LrAssignWuForm
     */
    function create($id);
}

A do configu vyzerá takto:

services:
    - App\RouterFactory
    router: @App\RouterFactory::createRouter
    authenticator: UserAuthenticator

    - implement: ILrAssignWuFormFactory
    parameters: [id]
    arguments: [%id%]

Editoval steelbull (6. 11. 2014 17:16)