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
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
To je celé špatně:
- Vytvoř si továrničku, kterou zaregistruješ jako službu a injectneš si ji kde potřebuješ
- Komponentu vytvoř přes tu továrničku
- Nepoužívej
$this->context
– injektuj přímo služby, které potřebuješ - To pojmenování… no comment
Dokumentace:
Editoval Michal Vyšinský (6. 11. 2014 15:55)
- Michal Vyšinský
- Člen | 608
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
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)