PrestaShop ObjectModel讲解
查看全部词条命名空间:Main
ObjectModel 是PrestaShop系统中的一个非常重要的抽象类(相信了解JAVA,C++等高级语言的朋友,对抽象类不陌生),准确的说它是一个包含了数据表CURD基本操作的工具类。
我愿意称这个类是一个比较别扭的base model,它包含了数据表的描述基本描述、CURD操作、常规的数据验证服务等。
相信有些朋友跟我一样,已经对Presta学习有些日子了,大家都会发现只要界面表单中的元素的名称与表中的字段名称一致,系统就会自动识别出入库数据。其实并不是这样的。这主要是依赖两个重要的方法来完成的,getFields、copyFromPost.
getFields 是 ObjectModel 并无实现的方法体,继承ObjectModel的对象类必须针对其自身的需求,建立字段数组,以便系统使用,同时需要对字段数组中的字段作显式声明。
class Category extends ObjectModel {
public $id_parent = 0;
public $name;
public $level_depth = 0;
public $position;
public $active;
public $date_add;
public $date_upd;
..........................
public function getFields() {
parent::validateFields ();
if (isset ( $this->id ))
$fields ['id_category'] = intval ( $this->id );
$fields ['id_parent'] = intval ( $this->id_parent );
$fields ['name'] = pSQL ( $this->name );
$fields ['level_depth'] = intval ( $this->level_depth );
$fields ['date_add'] = pSQL ( $this->date_add );
$fields ['date_upd'] = pSQL ( $this->date_upd );
return $fields;
}
}
另一个重要的函数处于classes/Tools.class.php中,copyFromPost。
copyFromPost负责把提交过来的表单数据,填充至ObjectModel的子类。它的工作原理是非常简单,遍历POST中的变量,并判断 ObjectModel子类中是否存在该变量,存在则赋值。这样就完成了对象的数据填充,系统再通过getFields方法是提取需要操作的数据。
static function copyFromPost(&$object) {
/* Classical fields */
foreach ( $_POST as $key => $value )
if (key_exists ( $key, $object )) {
/* Do not take care of password field if empty */
if ($key == 'passwd' and Tools::getValue ( $this->identifier ) and empty ( $value ))
continue;
/* Automatically encrypt password in MD5 */
if ($key == 'passwd' and ! empty ( $value ))
$value = Tools::encrypt ( $value );
$object->{$key} = $value;
}
}
注:# key_exists(PHP内置函数),用于是判断对象是否存在是目前属性。