Zend Framework 2 建立自己的 Module (5)

本篇文章是要來介紹有關於文字翻譯,還有頁面的樣式

Styling and Translations

有關於頁面上的文字內容都可以進行對應的翻譯,可以到:/path/to/project-name/module/Application/language 查看 en_US.po 檔案

po 副檔名檔案是一種翻譯類型的檔案,因此需要特殊的 editor 才能夠打開,我們這邊要先去下載一個 poedit 這個編輯氣是屬於跨平台的,進入官網之後是很容易找到下載點的。

下載回來之後,安裝並打開,會看到介面如下面的截圖:

poedit

我們按下開啟打開 en_US.po 檔,就可以進行編輯的動作,按照下面的圖把 skeleton application “翻譯” 成 “tutorial”

poedit

接著存檔之後,檔案選單中有一個編譯成 MO 檔,改完之後都需要編譯成新的 MO 檔

接下來是 styling 的部分,就是樣式的地方,每次在頁面出來的時候,都會有:© 2005 – 2016 by Zend Technologies Ltd. All rights reserved. 這個 copyright 的文字。

為了要把它移掉,我們需要去編輯:/path/to/project-name/module/Application/view/layout/layout.phtml

並移除:<p>&copy; 2005 – <?php echo date(‘Y’) ?> by Zend Technologies Ltd. <?php echo $this->translate(‘All rights reserved.’) ?></p> 這一行。
接著再打開頁面之後,那一行 copyright 文字就會不見了。

album

Zend Framework 2 建立自己的 Module (4)

Database and models

在這裡,我們使用了:Zend\Db\TableGateway\TableGateway 做為對資料庫中的資料表進行新增,查詢,修改以及刪除。

我們使用 MySQL 並透過 PHP 的 PDO 層作為存取資料庫,我們先建立一個名為:zf2tutorial 的資料庫作為資料庫的名稱,接著執行下面的 SQL 檔的指令

The model files

Zend Framework 並沒有提供 Model 之類的 component 原因是因為這部分是我們自己的商業邏輯,我們需要自己寫的

我們建立一個名為 Album.php 並放在 /path/to/project-name/module/Album/src/Album/Model 目錄下

Album.php

在 Album.php 中,就只有一個簡單的 Album class 我們為了要與 Zend\Db 中的 TableGateway 運作正常,因此我們需要實做 exchangeArray() 方法,這個方法可以簡易的從另一個項目設定中去複製一個陣列中的資料,並把資料可以印出在 view 上 (或表單)

我們建立了一個 AlbumTable.php 檔在: /path/to/project-name/module/Album/src/Album/Model 目錄下

AlbumTable.php

其中裡面的方法功能介紹如下:fetchAll 就是得到一個查詢所有 Album 的集合,getAlbum 則是得到某一行的且傳回物件,saveAlbum 則是儲存一行 Album 相關的資料,最後的 deleteAlbum 則是刪除某一行指定的 Album 記錄。

Using ServiceManager to configure the table gateway and inject into the AlbumTable

修改前面的 Module.php,位置在:/path/to/project-name/module/Album/Module.php

接下來要加入有關資料庫登入的驗證資訊,所以我們要分別編輯:/path/to/project-name/config/autoload/global.php 與 /path/to/project-name/config/autoload/local.php

global.php

就是加入 db 資料庫相關的,像這裡就是定義 PDO 的,下面則是加入 servive_manager 與 Zend\Db\Adapter\Adapter 內建操作資料庫有關的。

local.php

則是填入登入 MySQL 的驗證資訊,如帳號與密碼。

 

Back to the controller

Listing albums

 

AlbumController.php 前面已經有使用過了,在這裡可以看到一些註解,可以知道加了哪幾行。

index.phtml

下面是有關於視圖 (view) index.phtml 的 code

由 index.phtml 得知:

We always use the escapeHtml() view helper to help protect ourselves from Cross Site Scripting (XSS) vulnerabilities (see http://en.wikipedia.org/wiki/Cross-site_scripting).

我們常會使用 escapeHtml() 來防止跨站腳本的漏洞。

 

最後,輸入網址:http://localhost/project-name/public/album 就會看到如下的畫面

user-guide.database-and-models.album-list

 

到這裡就完成了一個簡單的表格列出專輯清單,下一篇我們會介紹:Styling and Translations 樣式與翻譯。

Zend Framework 2 建立自己的 Module (3)

繼 前一篇文章  我們初步建立了 Module 與設定,接下來要介紹 Routing 與 Controllers

Routing and controllers

依照官方的文件,我們列出下列的表格,分別去描述 Page 名稱與敘述頁面 (Page) 所要做什麼事情

[table “” not found /]

從上面得知,我們有四個頁面,那每個頁面有相對應的動作,我們把每個動作寫在同一個 Controller (控制器)中,在 Controller 類別中,建立四個方法分別去對應上面表格中的四個動作。

[table “” not found /]

編輯 /path/to/project-name/module/Album/config/module.config.php

從 code 得知,我們加入了一個 Controller 名字叫做:AlbumController 與一段 code 做為:router 路由網址,而下列的表格為路由網址:

[table “” not found /]

Create the controller

一般來說 Controller 的命名為:{Controller name}Controller

/path/to/project-name/module/Album/src/Album/Controller

網址對應的動作為:

[table “” not found /]

Initialise the view scripts 初始化視圖(樣版)腳本

  • /path/to/project-name/module/Album/view/album/album/index.phtml
  • /path/to/project-name/module/Album/view/album/album/add.phtml
  • /path/to/project-name/module/Album/view/album/album/edit.phtml
  • /path/to/project-name/module/Album/view/album/album/delete.phtml

修改 /path/to/project-name/module/Album/config/module.config.php

下一篇則會介紹:建置資料庫與模型 (Model) 的關係

Zend Framework 2 建立自己的 Module (2)

前置作業

先參考前一篇,把 skeleton (骨架) application 的建立

我們遵照線上文件,把 Module 建立起來,我們建立一個 Module 名稱為 Album 其目錄架構如下:

 

project-name/

—–/module

 ———-/Album

—————/config

—————/src

——————–/Album

————————-/Controller

————————/Form

————————/Model

—————/view

——————–/album

————————/album

由上面的目錄架構得知,最上層的專案根目錄為:project-name 而 module 是下一層目錄,接下來是 Album 我們取的目錄名稱,再下一層有 config, src 以及 view 這三個目錄。

而 src 目錄下又有 Album 目錄,Album 目錄下又有 Controller, From 以及 Model,而 view 目錄下面有一層 album 再下一層有 album。

 

Module.php

建立一個 PHP 檔名為 Module.php  把它放在:/path/to/project-name/module/Album/Module.php 程式碼如下:

 

Autoloading files

自動載入用,因為我們在開發的階段,因此只要建立一個 PHP  檔,其路徑:/path/to/project-name/module/Album/autoload_classmap.php 程式碼如下:


<?php return array(); ?>

 

Module Configuration

建立一個 module.config.php 並放在:/path/to/project-name/module/Album/config 程式碼如下:

 

Informing the application about our new module

修改 application.config.php 其位置在:/path/to/project-name/config/application.config.php 加入一行 ‘Album’ 做為啟用 Album 模組
下一篇介紹:Routing and controllers

Zend Framework 2 建立 skeleton application (1)

Zend Framework 2 wiki 介紹

簡單說,這個框架是一個以 MVC 為基礎的框架,MVC 在這篇已經超出範圍,所以不在這裡去贅述,有興趣可以去找找資料

線上文件連結:http://zf2.readthedocs.io/en/latest/index.html

使用 Composer 下載 Zend Framework


#下載 Composer

curl -sS https://getcomposer.org/installer | /path/to/executable/php

#執行 composer.phar 產生一個 Zend Framework 的 skeleton application 專案

#參考文章: http://zf2.readthedocs.io/en/latest/user-guide/skeleton-application.html

php composer.phar create-project --stability="dev" zendframework/skeleton-application path/to/install

從上面可以得知,下載完之後的專案為一個正在開發的 skeleton 骨架 application

在這篇的文章中,會請你去設定 Apache 的 VirtualHost 去更改網址,如不要的話,或是有一些共享主機 (shared hosting) 並不允許你去更改 httpd.conf 的設定,所以這在部署上顯得較為困難,因此,如不改的話,其實可以連上 http://your-domain.com/project-name/public 就會看到下面有著與文件上一模一樣的截圖,有出現一模一樣的截圖就代表設定成功了。

user-guide.skeleton-application.hello-world

 

可以試著測試預設的 route 有沒有正常的運作試著輸入網址:http://your-domain.com/project-name/public/123 就會出現下面的 404 Not found

404

 

Error reporting

可以編輯 public 目錄下的 index.php 裡面的第四行插入下面這段 code:

其目的是在開發的階段可以立即的在網頁上顯示錯誤,不過記得網站上線之後要將錯誤關閉


<?php
/**
* Display all errors when APPLICATION_ENV is development. (這段是插入的)
*/
if ($_SERVER['APPLICATION_ENV'] == 'development') {
error_reporting(E_ALL);
ini_set("display_errors", 1);
}
/**
* This makes our life easier when dealing with paths. Everything is relative
* to the application root now.
*/

chdir(dirname(__DIR__));

// Decline static file requests back to the PHP built-in webserver
if (php_sapi_name() === 'cli-server' && is_file(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) {
return false;
}

// Setup autoloading
require 'init_autoloader.php';

// Run the application!
Zend\Mvc\Application::init(require 'config/application.config.php')->run();

下一篇介紹如何建立一個自己的 Module