PrestaShop ObjectModel讲解
来自站长百科
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内置函数),用于是判断对象是否存在是目前属性。