最近因為一些原因接觸了一下prestashop 這一個free open-source 的shopping cart platform, 其實睇番原來年多前也有接觸過它,不過當時就沒有什麼深入研判過它的code同寫法, 今次終於睇完它的developer guide 同試左寫下d modules同admin tab, 基本上其實真係唔難去用同寫的....
基本上佢official site上面個developer guide 的前半部是寫得不錯的,一步一步來, 倒是它的後面部份講如何去寫一個back-office tab時就好似簡單了一點, 得個example 完全冇解釋呢, 好在自己摸下摸下總算摸得明白了,有了個太約知道可以點去寫,所以就係度寫低一d筆記以免將來會忘記了...
好,首先是database的部份吧,由於個系統是support多個語言的,所以當然就試下寫可以作出多個語言的設定吧,官方的sample 唔知點解個db part 不是一個多個語言的,但係到左寫個admin page 時就係多個語言,導致個page 行來行去都係行唔到,真係吹脹了, 搞左我好耐先發現問題的原因@@
以下就是我的db:
CREATE TABLE `ps_test` ( `id_test` int(11) NOT NULL AUTO_INCREMENT, `description` varchar(255) DEFAULT NULL, PRIMARY KEY (`id_test`) ) ENGINE=InnoDB AUTO_INCREMENT=1; --ps_test_lang 是用來放多個語言的字串 CREATE TABLE `ps_test_lang` ( `id_test` int(11) DEFAULT NULL, -- 這個是ps_test的primary key `id_lang` int(11) DEFAULT NULL, -- 這個是不同語言的key `name` varchar(32) DEFAULT NULL -- 不同語言的field ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
和官網的不同,其中多了一個ps_test_lang 是用來放多個語這的字串, 這裏`_lang` 是指定了的surfix, 而它的prefix就是另一個table(ps_test).由於只是得一個variable (name) 設定成可以支援多個語言,所以這table就只得`name`,這一個field
沒有了這個_lang 的table, 但在後期(admin page)設置multi-lang 的setting時是會出現db error 的呢
接著就可以睇下個class了
<?php class Test extends ObjectModel { /** @var string Name */ public $id; public $name; public $description; protected $fieldsRequired = array('description'); protected $fieldsSize = array('description' => 510); protected $fieldsValidate = array( 'description' => 'isGenericName'); protected $fieldsRequiredLang = array('name'); protected $fieldsSizeLang = array('name' => 64); protected $fieldsValidateLang = array('name' => 'isGenericName'); protected $table = 'test'; protected $identifier = 'id_test'; public function getFields() { parent::validateFields(); $fields['description'] = pSQL($this->description); return $fields; } public function getTranslationsFieldsChild() { if (!parent::validateFieldsLang()) return false; return parent::getTranslationsFields(array('name')); } } ?>
首先這一個db object class 是要extends ObjectModel 的,接著就是object 的field 了, 這裏我地有3個variable - id, name 同description, 而其中的name 是support 多個語言的
<?php class Test extends ObjectModel { /** @var string Name */ public $id; public $name; public $description;
之後就可以設定那些field 的必須的, 這裡我分別設定description及name 都是必須的, 而其中 name 是一個多個語言的field.
protected $fieldsRequired = array('description'); protected $fieldsSize = array('description' => 510); protected $fieldsValidate = array( 'description' => 'isGenericName'); protected $fieldsRequiredLang = array('name'); protected $fieldsSizeLang = array('name' => 64); protected $fieldsValidateLang = array('name' => 'isGenericName');
設定好這個class是會連去db 那一個table同它的key
protected $table = 'test'; protected $identifier = 'id_test';
注意在這裏的table name 是 `test` 而不是 `ps_test`, 因為`ps_`這個prefix 會在系統運行sql時加上的,所以這裏就可以免了
加入getFields的function, 這裏是不用把name 這個多個語言的field 放入去的, 只要把所有非多個語言field放上去就可以了, 多個語這的field是透過getTranslationsFieldsChild來處理的...
function getFields() { parent::validateFields(); $fields['description'] = pSQL($this->description); return $fields; }
加上getTranslationsFieldsChild來support 多個語言
public function getTranslationsFieldsChild() { if (!parent::validateFieldsLang()) return false; return parent::getTranslationsFields(array('name')); }
如果是多於一個field是support 多語這的, 只要把它加進array入面就可以了 - parent::getTranslationsFields(array('name', 'field2'));
0 回應:
Post a Comment