založení signálu v handleru

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

Lze v handleru vytvořit signál pro jinou komponentu, tak aby se ihned spracoval?
Tj. ne link se signálem, ale rovnou signál.
Nebo toto nějak simulovat jinak?

Konkrétně v handleru operací DataGridu (AJAX) potřebuji vyvolat zobrazení jiné komponenty:

<?php
protected function createComponentGrid()
{
...
    $operations = array('');
    $operations['confirmRole'] = 'Schválit přiřazení role';
    $operations['rejectRole'] = 'Zamítnout přiřazení role';
    if (count($operations)) {
      $grid->allowOperations($operations, array($this, 'gridOperationHandler')); // allows checkboxes to do operations with more rows
    }
...
}

public function gridOperationHandler(\Nette\Forms\SubmitButton $button)
{
    $form = $button->getParent();
    $values = $form->getValues();
    $operation = $values['operations'];
    $grid = $this->getComponent('grid');
    $rows = array();
    foreach ($values['checker'] as $k => $v) {
      if ($v) $rows[] = $k;
    }
    if ($operation == 'confirmRole') {
	//vyvolat componentu XY s parametry $rows
	$xy = $this->getComponent('xy');
	$xy->handleZobrazse($rows); //??????
    }
...
}
?>

Editoval mlha (6. 5. 2011 13:40)

Majkl578
Moderator | 1364
+
0
-

Jde, otázka je, jestli je to správně.

mlha
Člen | 58
+
0
-

Děkuji za návod. Jak bych si ale předal do takto uměle vyvolaného signálu nějaký parametr/y?

Majkl578
Moderator | 1364
+
0
-

V kódu, na který jsem odkázal, je vidět jak se signál volá:

$this->tryCall($this->formatSignalMethod($signal), $this->params)

Z toho vyplývá, že signál bere stejné parametry, které jsou použity při volání action/render.

Toho o co ti jde bys asi nejjednodušeji docílil vlastní metodou (takový klon signalReceived), např.:

public function signalReceivedManually($signal, array $params = array())
{
	if (!$this->tryCall($this->formatSignalMethod($signal), $params)) {
		$class = get_class($this);
		throw new BadSignalException("There is no handler for signal '$signal' in class $class.");
	}
}

//...

$component->signalReceivedManually('foo', array('x' => 1, 'y' => 2));
Filip Procházka
Moderator | 4668
+
0
-

Nebylo by lepší použít forward? Většinou totiž to co je v signálu, je lepší mít v akci. Osobně si myslím, že signály jsou dobré na stránkování, řazení a ajaxové requesty…