Parametry z šablony komponenty se při předávání komponentě ztratí

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

Zdravím,
podobné věci se tu sice řešili ale odpověď na tohle jsem nenašel.

Mám aplikaci rozdělenou do modulů:

  • UIModule
  • MenusModule
  • ArticlesModule

V UI modulu mám presentery, layouty atd., v ostatních modulech jsou jednotlivé komponenty.

Problém s kterým se potýkám:
V MenusModule mám komponentu TopMenuComponent a pokud v její šabloně kliknu na odkaz vedoucí na handler handleSelectBtn($sectionId, $sectionType), parametry z šablony se na cestě mezi presenterem a komponentou vytratí.

Do handleru se samozřejmě dostanu, ale bohužel oba parametry jsou NULL, díky redirectu v handleru dostanu z Laděnky informace obsažené tomto odkazu

Je dost možné že něco přehlížím. Nedaří se mi parametry do handleru protlačit, moc prosím alespoň o nasměrování. Budu moc vděčný za jakoukoli radu!

Zdrojáky:

Šablona komponenty:

<?php
<ul n:inner-foreach="$topMenuButtons as $btn" n:if="$topMenuButtons->count() > 0">
	<li class="menu-item"><a n:href="selectBtn!, $btn->id, $btn->section_type->code" bg="item-{$btn->order}"><span>{$btn->title}</span></a></li>
</ul>
?>

Tvar url po kliknutí na tlačítko menu: http://ee.dev:8080/?topMenu-sectionId=1&topMenu-sectionType=Articles&do=topMenu-selectBtn

Php komponenta

<?php
namespace MenusModule\Components;

use Common\AbstractComponentAncestor;
use SectionsModule\Models\SectionsModel;
use Nette\Diagnostics\Debugger;
use Nette\Utils\Paginator;
use Nette\Application\UI\Multiplier;
use \Nette\Application\UI;
use \Nette\Database\Table\Selection;

class TopMenuComponent extends AbstractComponentAncestor{
	/** @var \Nette\Database\Table\Selection */
	protected $btns;
	/** @var SectionsModel **/
	protected $table;

	/**
	 * Default constructor
	 * @param Selection 	$sections - Selected data from database
	 * @param SectionsModel $table - Whole table for manipulation with data
	 **/
	public function __construct(Selection $btns = null, SectionsModel $table){
		$this->btns = $btns == null ? $table : $btns;
		$this->table = $table;
	}

	public function render(){
		$this->template->setFile(__DIR__.'/TopMenuComponent.latte');
		$this->template->topMenuButtons = $this->btns;
		$this->template->render();
	}

	public function handleSelectBtn($sectionId, $sectionType){
		Debugger::barDump("Id: ".$sectionId);
		Debugger::barDump("Type: ".$sectionType);
		$this->presenter->redirect($sectionType);
	}
}
?>

UIModule layout a HomepagePresenter:
vložení komponenty v @layout:

<?php
<div id="menu">
	{control topMenu}
</div>
?>

HomepagePresenter:

<?php
namespace UIModule;
use UIModule\Components\HomepageComponentPlaceholder;

/**
 * Homepage presenter.
 *
 * @author     Pavel Neumann
 */
use MenusModule\Components\HomepageButtonsComponent;
use ArticlesModule\Components\ArticlesComponent;

use SectionsModule\Models\SectionsModel;

use \Nette\Diagnostics\FireLogger;
use \Nette\Diagnostics\Debugger;

class HomepagePresenter extends BasePresenter
{
	protected function startup(){
		Debugger::barDump("HP pres start");
		parent::startup();
	}

	protected function createComponentHomepageMenu(){
		$selection = SectionsModel::getInstance($this)->findHomepageButtonsSections();
		return new HomepageButtonsComponent($selection, SectionsModel::getInstance($this));
	}

	/**
	 * Guards place for a specific component
	 * @return homepage placeholder component
	 */
	protected function createComponentHomepageSection(){
		return new HomepageComponentPlaceholder();
	}

	public function actionSelect($target){
		$this->presenter->redirect($target.":");
	}
}
?>

BasePresenter:

<?php
namespace UIModule;

use Nette\Diagnostics\Debugger;
use MenusModule\Components\TopMenuComponent;
use SectionsModule\Models\SectionsModel;
use \Nette\Application\UI\Form;

abstract class BasePresenter extends \Nette\Application\UI\Presenter
{
	private $loggedUser;

	protected function startup(){
		parent::startup();
		$this->loggedUser = $this->getUser();
	}

	public function beforeRender(){
		if($this->isAjax()){
			$this->invalidateControl('flashMessages');
		}
	}

	protected function createComponentTopMenu(){
		$selection = SectionsModel::getInstance($this)->findTopMenuSections();
		return new TopMenuComponent($selection, SectionsModel::getInstance($this));
	}
}
?>

Editoval genetic (7. 12. 2012 16:57)

genetic
Člen | 4
+
0
-

Když je člověk hloupej, těžko se mu pomáhá. Každopádně, jsem zapomněl v konstruktoru koponenty zavolat konstruktor rodiče, takže se parametry komponentě nepředaly.

DESETKRÁT A ZNOVA: volej parent::__construct() !!!