初始化新记录的视图变量

时间:2013-01-06 21:50:18

标签: php model-view-controller pdo

在我的MVC中,我使用数组使用模型中的数据填充表单。我正在使用PDO和获取关联数组,这给出了一个可用于填充视图的字段数组。

当用户请求新记录时,该数组为空,除非我在使用前明确测试每个变量的值,否则脚本会因不存在的索引而失效。

对于新记录,我之前的方法是设置一个空数组并将其传递给视图。这对于简单的表单很好,但是当视图需要使用10-15个变量时,这有点单调乏味。

这样做的首选方法是什么? 我的视图应该在使用前测试每个字段,还是应该创建空数组。如果是这样,是否应在控制器或模型中创建空数组?


例如,如果用户想要编辑现有记录,控制器会将ID号传递给模型,并要求其提供记录的当前值数组。

控制器将此数组传递给视图,然后将值合并到表单中进行编辑。

相反,当控制器收到 new 记录的请求时,它知道向模型询问记录是没有意义的,因为它是新记录。它不能只调用视图,因为传递的数组不包含表单所需的键。

我目前的做法是初始化一个空键数组,但这似乎很乏味,浪费时间并容易出错,因为如果模型发生变化需要维护它。

例如:

$this->view->class['Code']=NULL;
$this->view->class['Description']=NULL;
$this->view->class['Image']=NULL;
$this->view->class['Judge']=NULL;
$this->view->class['Entries']=NULL;
$this->view->class['Absentees']=NULL;

必须有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

在我看来,设置propper默认值是一个模型问题。

想象一下这样的课程:

class Car {

    protected $color;

    protected $vendor;


    public function __construct($color, $vendor) {
        $this->color = $color;
        $this->vendor = $vendor;
    }


    public static function getDefault() {
        return new Car('unknown', 'unknown');       
    } 

}

然而。你告诉过你使用数组。你会发现类似的数组方式。我建议编写一个像getDefaultWhatever()这样的函数,并将其放在 model 部分代码中。

答案 1 :(得分:0)

对于糟糕的MVC设计,这是一种创可贴,但你可以使用这样的功能,

function idx(&$array, $index = 0, $default = null) {
  return isset($array[$index]) ? $array[$index] : $default
}

在视图中,如果您正常,$class['Description']

您现在可以使用idx($class, 'Description')


您不必单独传递模型的每个属性。相反,只需传递整个模型对象并从视图中访问它。例如:

$this->view->entry = $myModelInstance;其中$myModelInstanceEntry的实例或任何类具有代码,描述,图像,裁判等属性。

然后在视图中使用类似$entry->Description

的内容