php – Joomla! 前後台元件 (Component) 共用 Model 的方法

Joomla! 的元件 (Component) 在前後台算是各自獨立,而 MVC 架構更是前後台分離。也就是如果前台的 Controller 要使用後台的 Model 該怎麼辦呢?會有這個需求,主要是解決避免重複造輪子。例如

  • 前台:會員發佈文章,需要寫入資料表 Article 欄位 title, content, user_id
  • 後台:管理員可以手動發佈文章,需要寫入資料表 Article 欄位 title, content, user_id

我們發現同一件事情,寫入資料表欄位 這個動作,通常我們會在前台、後台的 Model 都要各做一次一模一樣的方法。

class MyModelArticle extends JModelLegacy
{
    public function insert()
    {
        // 寫入動作......
    }
}

我們要如何統一寫一次就好,讓這個 insert() 可以被前後台都使用呢?

用範例解決方式

我建議將元件 Component 的 Model 部分,集中在後台 MVC 架構裡。前台的 MVC 架構,不要放任何的 Model。這樣可以更方便維護,日後前台、後台只要動到跟資料庫有關的行為,一律到後台的 Model 尋找

  • Component 名稱 com_my
  • Controller 名稱 MyControllerArticle
  • Model 名稱 MyModelArticle

後台控制器

取得 Model 的方法不用做任何改寫。

class MyControllerArticle extends JControllerLegacy
{
    function __construct($config = array())
    {
        parent::__construct($config);
        $this->article_model = $this->getModel('Article');
    }

    // 寫入
    public function query_insert()
    {
        $this->article_model->insert();
    }
}

 

前台控制器

因為前台沒有 Model 了,我們要用 JModelLegacy::addIncludePath() 取得後台的 Model,然後仍然可以維持使用 getModel() 的方法。

class MyControllerArticle extends JControllerLegacy
{
    function __construct($config = array())
    {
        parent::__construct($config);
        
        JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_my/models');
        $this->store_model = $this->getModel('Article') or die("Invalid Load Model");
    }

    // 寫入
    public function query_insert()
    {
        $this->article_model->insert();
    }
}

 

當前後台都改用這種方式運作,我們維護與資料表 Article 的行為,就可以統一集中在後台的 Model 囉。

 

發表迴響