Prestashop 的back office tab 筆記 - Part 1

最近因為一些原因接觸了一下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'));
下一part 筆記將會是另一重要部分back-office tab 的掛上和設定了...

0 回應:

Post a Comment