Cesta k hodnotám dle stringu

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

Zdravím,

potřeboval bych nakopnout s jedním problémem.
Mám nadefinovány „cesty“ k hodnotám vytaženým z DB, např.

$value = '->name';
$value = '->item_category->name';

Dále mám funkci, která si dle určitého pravidla vybere co všechno potřebuje za hodnoty a ty pak vypíše do excelovského souboru.

	$rowCounter = $templateData->startRow;
foreach ($items as $itemId => $item) {
   foreach ($templateData->dataList as $column => $data) {

      $list->setCellValue($column . $rowCounter, ${'$item' .$data->value});

   }

   $rowCounter++;
}

Bohužel, stále mi to vyhazuje jen error s tím, že nezná např. $item->item_category->name, ale pokud místo „${‚$item‘ .$data->value}“ vypíšu přímo „$item->item_category->name“, tak s tím nemá problém.

Dokázal by mě někdo nakopnout?
Díky!

MW
Člen | 626
+
0
-

Zkus to nadefinovat bez „->“ a přistupuj k tomu jako k poli:

$item['data']

Editoval MW (9. 2. 2017 14:32)

altyn
Člen | 6
+
0
-

MW napsal(a):

Zkus to nadefinovat bez „->“ a přistupuj k tomu jako k poli:

$item['data']

Jo, tohle mě taky napadlo, ale chtěl bych právě díky cizím klíčům vybírat data i z dalších tabulek, ale pokud to nepůjde budu si tedy muset udělat speciální select, kde si veškeré data vytahám v jednom dotazu a poté k tomu budu přistupovat jako k normálnímu poli jak říkáš.

matopeto
Člen | 395
+
0
-

dal by sa na to urobit nejaky helper, splitnes si to podla „->“ a potom prejdes cez for cez tie values a davas $obj = $obj->{$value}

takze nieco take (pisem bez skusania a len tak bez editora ale snad bude napad jasny)

/* $string je daco ako "$item->name->value->othervalue" */
function getValue($string) {
	$values = explode("->", $string);
	$obj = $$values[0];
    foreach($values as $value) {
      $obj = $obj->{$value};
	}

    return $obj
}

Editoval matopeto (10. 2. 2017 12:46)

altyn
Člen | 6
+
0
-

matopeto napsal(a):

dal by sa na to urobit nejaky helper, splitnes si to podla „->“ a potom prejdes cez for cez tie values a davas $obj = $obj->{$value}

takze nieco take (pisem bez skusania a len tak bez editora ale snad bude napad jasny)

/* $string je daco ako "$item->name->value->othervalue" */
function getValue($string) {
	$values = explode("->", $string);
	$obj = $values[0];
    foreach($values as $value) {
      $obj = $obj->{$value};
	}

    return $obj
}

Jo, skvely diky jen doplnim:

	// Nastaveni
	...
	'value' => 'name->...->name',
	...

	// Volani
	$this->getValue($item, $data->value)

	// Funkce
	public function getValue($item, $string)
{
    $values = explode("->", $string);

    foreach($values as $value) {
        $item = $item->{$value};
    }

    return $item;
}