Problém s Multiplierem v komponentě
- genetic
- Člen | 4
Ahoj, snažím se zprovoznit Multiplier v komponentě, ale Nette mě neustále nadává výjimkou:
Strict
Declaration of Nette\Application\UI\Multiplier::createComponent() should be compatible with
Nette\ComponentModel\Container::createComponent($name, array $parameters = NULL)
Peru se s tím asi půl dne, ale nepodařil se mi žádný posun, ani změna chybové hlášky. Stejně mám Multiplier definovaný v jiné komponentě, ale tam je vše v pořádku.
Jde o stránku s výběrovými řízeními, kde ke každému řízení může být přiřazena jedna nebo více kontaktních osob. Seznam těch kontaktních osob vytvářím pomocí Multiplieru. Přikládám kódy:
Komponenta pro výběrová řízení:
<?php
abstract class AbstractTendersComponent extends AbstractComponentAncestor{
/** @var \Nette\Database\Table\Selection */
protected $tenders;
/** @var TendersModel **/
protected $table;
public function render(){
parent::render();
$this->template->tenders = $this->tenders;
$this->template->tendersCount = $this->tenders->count();
$this->template->render();
}
protected function createComponentContacts(){
$context = $this->presenter->context;
return new Multiplier(function($tenderId) use ($context){
$table = $context->{'create'.preg_replace("/^(\w)?(\w*)/e", "strtoupper('\\1').'\\2'", 'contacts')}();
$control = null;
if($table->where(array('tender_id'=>$tenderId))->count('id') > 0){
$contacts = $table->where(array('tender_id'=>$name));
$tender = $context->createTenders()->where(array('id'=>$contacts->fetch()->tender_id));
$control = new ContactsComponent($contacts, $table);
}
return $control;
});
}
}
?>
Šablona pro vykreslení
<?php
{snippet tenders}
{if $tendersCount == 0}
{include #noTenders}
{else}
{if $tendersCount > 0}
<div class="tenders" n:inner-foreach="$tenders as $t">
<div class="tender">
<h3>{$t->title}</h3>
<div class="title_delim"></div>
<div class="description">
{! $t->description}
</div>
<h4>Požadavky navrhovatele</h4>
<div>
{! $t->proposer_requirements}
</div>
<h4>Kontaktní osoby</h4>
<div>
{snippet tender-$t->id-contacts}
{control "contacts-$t->id"}
{/snippet}
</div>
</div>
</div>
{else}
{include #noTenders}
{/if}
</div>
{/if}
{/snippet}
?>
Presenter
<?php
class TendersPresenter extends BasePresenter
{
/** @persistent */
public $sectionId;
protected function startup(){
parent::startup();
}
public function actionDefault($sectionId){
$this->sectionId = $sectionId;
$this->template->section = SectionsModel::getInstance($this)->findById($this->sectionId)->fetch();
}
protected function createComponentTenders(){
$selection = TendersModel::getInstance($this)->findAll();
$tenders = new TendersComponent($selection, TendersModel::getInstance($this));
return $tenders;
}
}
?>
AbstractComponentAncestor
je potomkem
UI\Control
Za jakoukoli pomoc, která mě alespoň nastměruje k cíli budu moc vděčný.
- Jan Tvrdík
- Nette guru | 2595
@genetic: Máš nějakou zprasenou verzi Nette,
protože
Nette\ComponentModel\Container::createComponent($name, array $parameters = NULL)
neexistuje.