Volání proměnných uvnitř fce v Presenteru

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

Mám menší problém, nevím v čem je chyba :) Asi to Nette nebude, ale tak..

Mám rekurzivní fci v Presenteru a uvnitř volám např:

$presenter->link
$promenna

Zkoušel jsem nastavit: global $promenna; uvnitř té fce, bohužel mi to nějak nebere :(

Ani ten link mi to nechce vyhodit… nevíte co s tím?

vlki
Člen | 218
+
0
-

Moc nerozumim, co se snazis rict. Nechces postnout ty kousky kodu?

Mas3r
Člen | 116
+
0
-
<?php
$GLOBALS['adminTpl'] = $adminTpl;

function RecurseTable( $array = array(), $parent = 0, $depth ) {
global $component, $changer;


	if( !array_key_exists($parent, $array) ) return '';

	foreach($array[$parent] as $key => $r) {

	if($r->active == 1) $icoActive = 'active'; else $icoActive = 'inactive';

		?>
		<tr class="<? //= $changer->Change()?>">
			<td>
            <?php if($depth==0) { ?><img src="<?=$GLOBALS['adminTpl']?>/images/icons/menu.gif" width="20" height="26" alt="Menu" title="Menu" align="absbottom" /><? } else { ?><img src="<?=$GLOBALS['adminTpl']?>/images/icons/<?= $icoActive ?>.gif" width="20" height="19" alt="activity" title="activity" align="absbottom" /><? } ?>
            <input type="text" size="3" name="order" value="<?= $r->order ?>" />
            <span style="margin-left:<?= $depth*30 ?>px"><?= $r->title ?></span></td>
		<td align="center">
    		<a href="<?= $presenter->link('edit', $row->id) ?>"><img src="<?= $adminTpl;?>/images/icons/edit.gif" /></a>
    		<a href="<?= $presenter->link('delete!', $row->id) ?>"><img src="<?= $adminTpl;?>/images/icons/delete.gif" /></a>
   	 	</td>

		</tr>
		<?

		if($key == $r->id && is_array( $array[$parent] )) RecurseTable( $array, $r->id, $depth+1 );

	}

}



<h3>Strom stránek</h3>
<hr />
<br />

<table class="table">

<tr>
	<th>Název</th>
    <th>Nastavení</th>
</tr>

<?= RecurseTable( $recurse_menu, 0, 0); ?>

</table>

?>
  • musím udělat před fcí $GLOBALS[‚adminTpl‘] = $adminTpl; abych dostal tu proměnnou dovnitř
  • nefunguje $presenter->link

Editoval Mas3r (30. 6. 2008 20:51)

David Grudl
Nette Core | 8218
+
0
-

$presenter->link nemůže fungovat, když uvnitř funkce žádná proměnná $presenter neexistuje. Celé bych to postavil jako metodu třídy a zrušil používání $GLOBALS.

vlki
Člen | 218
+
0
-

No, zkousel jsem si to sam. Udelal funkci a registroval $component jako global. Ale ve funkci se s ni pracovat nedalo. Pres referenci nebyl problem, ale tohle me zarazilo. Skoro se zdalo, ze objekt nejde „zglobalizovat“. Je to mozne?

Jinak jsem chtel napsat, ze bych to resil prepsanim na malou komponentu. To je ale nema daleko od toho, co navrhuje David.

Mas3r
Člen | 116
+
0
-

Takže jsem to hodil do komponenty:

<?php

	/**
	 */

// =============================================================================

	class Recursive {


// =============================================================================

		/**
		 * Vytvor RecursiveTable
		 */
		public function RecursiveTable( $array = array(), $parent = 0, $depth ) {

			   		$adminTpl = 'templates/'.Environment::getVariable('adminTemplate');

					$changer = new ChangerTR();

					echo parent::getPresenter();


					if( !array_key_exists($parent, $array) ) return '';

					foreach($array[$parent] as $key => $r) {

					if($r->active == 1) $icoActive = 'active'; else $icoActive = 'inactive';

						?>
						<tr class="<?= $changer->Change()?> <?php if($depth==0) echo 'menu';?>">
							<td>
							<?php if($depth==0) { ?>
                            <img src="<?= $adminTpl?>/images/icons/menu.gif" width="20" height="26" alt="Menu" title="Menu" align="absbottom" />
							<? } else { ?>
                            <img src="<?= $adminTpl?>/images/icons/<?= $icoActive ?>.gif" width="20" height="19" alt="activity" title="activity" align="absbottom" />
							<? } ?>
							<input type="text" size="3" name="order" value="<?= $r->order ?>" />
							<span style="margin-left:<?= $depth*30 ?>px"><?= $r->title ?></span></td>
							<td align="center">
							</td>
						</tr>
						<?

						if($key == $r->id && is_array( $array[$parent] )) $this->RecursiveTable( $array, $r->id, $depth+1 );

				}

}



	}

?>

A pak jsem zkoušel:

<?php
parent::getPresenter();
$this->getPresenter();
?>

Ale ani jedno nešlo. Jak získám tedy presenter?

vlki
Člen | 218
+
0
-

Komponentu si nactes v presenteru (require a nactes do promenne v presenteru) a uvnitr komponenty se pak dostanes k presenteru pres atribut parent. Takze metodu link pak z komponenty volas $this->parent->link().

Viz priklad z Nette Fifteen. Tam je ukazkove komponenta vyuzita.

Mas3r
Člen | 116
+
0
-

Takže to nakonec funguje, ale musí se to udělat takto:

<?php
class Recursive extends Presenter (

parent::link(':Admin:Pages:menuDelete', $r->id)
?>