Yii gridview verwendet eine externe Variable im Wert - php, gridview, yii

Ich habe eine Funktion in meinem Lehrermodell, die Kategorien Array zurückgibt.

getCaterogies() {
return array("1" => "short tempered", "2" => "funny", "3" => "visionary", ...);
}

Ich speichere Indizes in der Datenbank und zeige überall Werte an, die den Wert des entsprechenden Arrays verwenden.

$categories = $teacher->categories;
$category = $categories[$teacher->category];

Ich mache das, weil jemand vorgeschlagen hatfür mich, keine Strings in einer Datenbank zu speichern, die Status sind, sondern ganzzahlige Werte speichern und entweder die Konvertierung in der Datenbank speichern oder im HT-Modell definieren. Das Problem mit Zeichenketten besteht darin, dass sie bei Vergleichen eher für menschliche Fehler anfällig sind. Vielleicht wegen der Groß- / Kleinschreibung.

Jetzt ist das Problem, das ich gegenüberstelle, dass, während ich Werte in Gridview zeige, ich die 2 Linien in einem Wertfeld schreiben muss, aber es ist ein Ausdruck, und äußere Variablen auch nicht.

Wie kann ich das für Gridview arbeiten?

Antworten:

45 für die Antwort № 1

Sie können die anonyme Funktion als Wert verwenden, der ausgeführt werden kann $row, $data params wo $row hält die Zeilennummer (nullbasiert) und $data enthält das Datenmodell für die Zeile.

Auf diese Weise können Sie es nur im Inneren definieren.

$this->widget("zii.widgets.grid.CGridView", array(
"dataProvider"=>$dataProvider,
"columns"=>array(
array(
"name"=>"..",
"value"=>function($data,$row){
$categories = $teacher->categories;
return $categories[$data->category];
},
),
),
));

Und wenn Sie es von außen verwenden möchten, können Sie sich auf PHPs verlassen use:

$categories = $teacher->categories;
$this->widget("zii.widgets.grid.CGridView", array(
"dataProvider"=>$dataProvider,
"columns"=>array(
array(
"name"=>"..",
"value"=>function($data,$row) use ($categories){
return $categories[$data->category];
},
),
),
));

Ich würde persönlich den zweiten empfehlen, weil auf diese Weise die Berechnung des Arrays nur einmal erfolgt und in allen Fällen verwendet wird.


2 für die Antwort № 2

Du kannst schreiben

$categories = $teacher->categories;
$category = $categories[$teacher->category];

in einer Zeile:

$category = $teacher->categories[$teacher->category];

Außerdem schlage ich vor, dass Sie eine andere Lösung verwenden:

class ModelClass
{
const STATUS_SHORT_TEMPERED = 1;
const STATUS_FUNNY = 2;
const STATUS_VISIONARY = 3;
}

Dies ermöglicht Ihnen eine semantische Verwendung

ModelClass::STATUS_FUNNY;

statt weniger semantisch

2;

Außerdem können Sie Ihr Array auf diese Weise zusammenstellen:

getCaterogies() {
return array(
ModelClass::STATUS_FUNNY => "status funny",
...
);
}