• Home

設計我們的第一個元件

我們將以一個部落格元件作為起頭,名稱為 Blog (com_blog),還有一組 MVC 名稱叫做 articles,接下來,會先從後台介面開始。

初始化一個新元件

在 Joomla 中,讓一個元件運作的最小單位是一個 xml 與 php 檔,例如我們的元件叫做 com_blog,則必須有一個 blog.xmlblog.php 才能夠運作。

現在讓我們先建立 administrator\components\com_blog 目錄,把這兩個檔案也建立起來。

<!-- administrator\components\com_blog\blog.xml -->
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.3" method="upgrade">
    <name>com_blog</name>

    <administration>
        <menu>com_blog</menu>
    </administration>
</extension>
 
// administrator\components\com_blog\blog.php
<?php

echo 'Hello World';
 

接著我們必須安裝他,進入後台 > 擴充套件 > 探索 頁面,按下探索按鈕尋找你的元件,沒意外的話會看到這個畫面,勾選起來安裝即可

p-2014-09-02-1.jpg

接著在網址列輸入 {SITE}/administrator/index.php?option=com_blog 就能看到你的Hello World了。同時元件選單也會出現 com-blog

p-2014-09-02-3.jpg

基礎 Controller

元件必須要有 MVC 架構,我們先來建立一個 Controller,之後的功能才能依賴 controller 調用。

建立 Base Controller:

<?php
// administrator\components\com_blog\controller.php

use Joomla\CMS\MVC\Controller\BaseController;

defined('_JEXEC') or die;

class BlogController extends BaseController
{
    public function display($cachable = false, $urlparams = array())
    {
        echo 'Display Task';
    }
}
 

更改 blog.php

<?php
// administrator\components\com_blog\blog.php

use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Controller\BaseController;

defined('_JEXEC') or die;

// Get request input object
$input = Factory::getApplication()->input;

// Execute the task.
$controller = BaseController::getInstance('Blog');
$controller->execute($input->get('task'));
$controller->redirect();
 

為了安全性,要習慣在每個 php 檔開頭加入 defined('_JEXEC') or die; ,避免外人直接開啟你的 php 檔案。

在 blog.php 我們先拿出 input 物件,用來幫助我們取得網址 GET 或 POST 進來的參數。接著創建一個 controller,由於 getInstance() 帶入的參數是 Blog,Joomla 知道我們要找的是 BlogController,就會把剛剛建立的 controller new 出來。

我們接著直接執行 controller 的 execute() 方法,並帶入網址參數中的 task 值,當然現在是沒有 task 值的,因此在 Joomla 中以 display 當做預設的 task。於是controller 就會執行 display() 這個 method。

最後有一個 redirect()我們可以先不用理會,晚點會在說明。

現在按下 F5 刷新頁面試試看,應該會看到 Display Task

p-2014-09-02-4.jpg

另一個 Task

我們在 BlogController 中加入另一個 method flower() 吧:

<?php
// administrator\components\com_blog\controller.php

use Joomla\CMS\MVC\Controller\BaseController;

defined('_JEXEC') or die;

class BlogController extends BaseController
{
    public function display($cachable = false, $urlparams = array())
    {
        echo 'Display Task';
    }

    public function flower()
    {
        echo 'Flower';
    }
}
 

接著更改網址為 {SITE}/administrator/index.php?option=com_blog&task=flower,就會看到 Flower

p-2014-09-02-5.jpg

由此可知,網址中的 task 參數直接對應 controller 中的 method 名稱,這樣子應該就很好理解了吧!


本章節的教學內容可以在 GitHub 上找到: Code / Commits

ukash birim çevirme saç ekimi estetik