【问题标题】:Yii gridview use outside variable in valueYii gridview 在值中使用外部变量
【发布时间】:2012-07-20 14:30:44
【问题描述】:

我的教师模型中有一个返回类别数组的函数。

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

我将索引存储在数据库中,并使用与该索引对应的数组的值在各处显示值..

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

我这样做是因为曾经有人建议我不要在数据库中存储作为状态的字符串,而是存储整数值,并将转换存储在数据库中或在 ht 模型中定义它。字符串的问题在于它们在比较中更容易出现人为错误。可能是因为区分大小写。

现在我面临的问题是,在gridview中显示值时,我需要在值字段中写入2行,但它是一个表达式,也不需要外部变量。

我怎样才能让它为 gridview 工作?

【问题讨论】:

    标签: php gridview yii


    【解决方案1】:

    您可以使用匿名函数作为值,它可以采用$row$data 参数,其中$row 保存行号(从零开始),$data 包含行的数据模型。

    这样你就可以只在内部定义它。

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

    如果你想从外部使用它,你可以依赖PHP的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];
                },
            ),
        ),
    ));
    

    我个人会推荐第二个,因为这样数组的计算将只有一次,并且将在所有情况下使用。

    【讨论】:

    • 提示:如果需要 - 您可能想要调用模型函数(对于每条记录),以返回多个值,您希望在不同的 gridview 列中为所述记录打印这些值。您可以通过第一列调用它并使用结果更新 $categories ,而不是在每一列中调用该函数。因此,其他列只能从 $categories 中读取。为此,请通过引用“使用”参数(只需在包含参数时在参数前面添加一个与号 (&) - 也不在函数内部)。 'value'=>function($data,$row) 使用 (&$categories){ $categories = ... },
    【解决方案2】:

    你可以写

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

    一行:

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

    另外,我建议您使用其他解决方案:

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

    这允许您使用更多语义

    ModelClass::STATUS_FUNNY;
    

    而不是更少的语义

    2;
    

    另外,你可以用这种方式组合你的数组:

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

    【讨论】:

    • 你确定$category = $teacher->categories[$teacher->category]; 会起作用吗,因为它是模型中的一个动态getter,而getter 是返回给我的数组..
    • 感谢您的时间和建议,但我正在寻找的正是其他人的回答,在许多其他情况下我可能需要该解决方案..在这种情况下,您的解决方案非常完美,但是我可能需要这样的use stuff..stackoverflow 不允许我投票..:(
    【解决方案3】:

    'urlCreator' => 函数 ($action, $model, $key, $index) 使用($under_category) {

    【讨论】:

      猜你喜欢
      • 2020-03-13
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多