Problém s Multiplierem v komponentě

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

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
+
0
-

@genetic: Máš nějakou zprasenou verzi Nette, protože Nette\ComponentModel\Container::createComponent($name, array $parameters = NULL) neexistuje.

genetic
Člen | 4
+
0
-

Pravda pravdoucí,
vážně tam byla chyba, po opravení metody je to oukej.

Díky moc :)

Jan Tvrdík napsal(a):

@genetic: Máš nějakou zprasenou verzi Nette, protože Nette\ComponentModel\Container::createComponent($name, array $parameters = NULL) neexistuje.