kiwiberry 迷你奇異果or奇異果梅

內容物是奇異果,外皮是棗子的新奇水果團購9顆116元,真不便宜

kiwiberry 迷你奇異果or奇異果梅

內容物是奇異果,外皮是棗子的新奇水果團購9顆116元,真不便宜

zf動態Layout

bootstrap.php 新增pluginClass處理動態Layout

<?php
    Zend_Layout::startMvc(
    array(
        'layoutPath' => '/application/views/layouts/scripts',
        'layout' => 'layout',
        'pluginClass' => 'GPMS_Util_Layout'
    )
);

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
}

自訂動態Layout Class,預設導到portal.phtml,其他by module切割

<?php
class GPMS_Util_Layout extends Zend_Layout_Controller_Plugin_Layout
{
  public function preDispatch(Zend_Controller_Request_Abstract $request)
  {
    switch ($request->getModuleName()) {
        case 'default':
            $this->_moduleChange('portal');
        break;
        default:
        break;
    }
  }
  protected function _moduleChange($moduleName) {
    $this->getLayout()->setLayout($moduleName);
  }
}

ZF套用library規則

Naming Rule決定位置

class Zend_Db_Table_Abstract 置放於:library\Zend\Db\Table\Abstract.php

Application.ini要適當調整來自動載入library

[production]

phpSettings.display_startup_errors = 0

phpSettings.display_errors = 0

includePaths.library = APPLICATION_PATH "/../library"

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"

bootstrap.class = "Bootstrap"

appnamespace = "Application"

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

resources.frontController.params.displayExceptions = 0

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

autoloadernamespaces.util = "Util_" // 新增自動載入的Library Util

[staging : production]

自訂Class測試,置放於Library/Util/SessionHelper.php:

<?php

class Util_SessionHelper // 在Library的Util目錄下建立SessionHelper.php {

    public function getLongonId(){

        return "sheauren";

    }

}

?>

使用方式:

<?php

$SessionHelper=new Util_SessionHelper();

echo $SessionHelper->getLongonId();

?>

ZF目錄說明

  1. quickstart (專案名稱產生的目錄)
  2. |-- application (App位置)
  3. |   |-- Bootstrap.php
  4. |   |-- configs (設定檔)
  5. |   |   `-- application.ini
  6. |   |-- controllers
  7. |   |   |-- ErrorController.php
  8. |   |   `-- IndexController.php
  9. |   |-- models (模組化分類,底下會有自己的Controllers/Modules/Views)
  10. |   `-- views
  11. |       |-- helpers
  12. |       `-- scripts
  13. |           |-- error
  14. |           |   `-- error.phtml
  15. |           `-- index
  16. |               `-- index.phtml
  17. |-- library (第三方函式庫、自製函式庫,預設zend library也是放這)
  18. |-- public (公開資料位置,網站Root)
  19. |   |-- .htaccess
  20. |   `-- index.php
  21. `-- tests (測試資料,PHPUnit)
  22.     |-- application
  23.     |   `-- bootstrap.php
  24.     |-- library
  25.     |   `-- bootstrap.php
  26.     `-- phpunit.xml

zf 常用command整理

建立專案:

zf create project projectName

執行後會產生整個專案所需的目錄

啟用Layout功能(套用樣板):

zf enable layout

產生Application/Layouts目錄,並且產生基本樣板檔案layouts/scripts/layout.phtml

新增Module:

zf module moduleName

執行後會於Application下產生該Module的目錄

新增Module's Controller:

zf create controller controlName moduleName

執行後會於該Module下產生該Controller檔案

新增Control's View:

zf create view viewName controlName moduleName

執行後會於該Controller下對映之View目錄產生該View檔案

新增Control's Action:

zf create action actionName controlName moduleName

執行後會於該Controller下產生該Action

新增Model:

zf create model modelName moduleName

執行後於該Module目錄下產生該Model檔案

資料庫設定:

zf configure db-adapter "adapter=PDO_MYSQL&host=localhost&username=root&password=pwd&dbname=projectName&charset=utf8" development;

於系統設定檔設定此資料庫連線

新增DbTable:

zf create db-table modelName tableName

於Model中新增此tableName的class

zf create db-table modelName tableName force-overwrite

強制覆蓋方式建立

產生整個DB的DbTable語法如下:

zf create db-table.from-database

如果發生錯誤:

Fatal error: Cannot redeclare class Zend_Loader in C:\Program Files\Zend\Apache2

\htdocs\AMIS\library\Zend\Loader.php on line 31

請將application.ini的includePaths.library = APPLICATION_PATH "/../library"用分號註解掉就會正常

將zf project放於Directory下,不另外設定VirtualHost

  • Project置放於Apache htdocs下
  • 於Project下新增檔案:.htaccess

該檔案結構如下:

RewriteEngine on

RewriteRule (.*) ./public/$1

  • http.conf的Directory改成下面設定:

<Directory "C:\Program Files\Zend\Apache2/htdocs">

Options Indexes FollowSymLinks

AllowOverride All

Order allow,deny

Allow from all

</Directory>

  • 重新啟動Apache

設定VirtualHost給zf project

  • 於httpd.conf定義新的VirtualHost - 直接當Root時
  • <VirtualHost *:81>

        ServerName localhost

        DocumentRoot "C:\Program Files\Zend\Apache2\htdocs\ProjectName\public"

        SetEnv APPLICATION_ENV "development"

        <Directory "C:\Program Files\Zend\Apache2\htdocs\ProjectName\public">

            DirectoryIndex index.php

            AllowOverride All

            Order allow,deny

            Allow from all

        </Directory>

    </VirtualHost>

     

  • 定義新的Port記得需要額外Listen該Port
  • Listen 81

     

  • 設定好記得重新啟動apache

XP安裝ZendServer-CE

    最簡單安裝方式,抓CE Server(社群版),如:ZendServer-CE-php-5.3.14-5.6.0-SP2-Windows_x86.exe,下載該執行執行執行就好,不過個人推薦它可以選擇裝在IIS上面或Apahce上面,建議用Apache,畢竟通通用Opensource的東西比較好整合,M$的還是自家整合比較單純。

  1. XP現在都有的安裝警告

    clip_image001

  2. Installation讀取畫面

    clip_image002

  3. 這次安裝版本是Zend Server Community Edition 5.6

    clip_image003

  4. License Agreement

    clip_image004

  5. 安裝類型,我習慣用Custom看一下大致裝了什麼

    clip_image005

  6. 第一次可以不調整安裝內容,如果需要加裝phpMyAdmin/MySQL Server也可以勾起來,不過我個人建議沒友直接聯繫的情況,分開裝比較單純

    clip_image006

  7. Zend Server安裝之Web Server挑選,這邊我選擇Install an Apache 2.2.22 Web Server,它同時幫我們裝Apache Httpd Server

    clip_image007

  8. 預設80 Port已經被IIS搶走了,所以我把Web Server Port改成8080,不過後面的Occupied還是持續顯示沒有立即更新

    clip_image008

  9. 列入此次要安裝的清單

    clip_image009

  10. 持續安裝

    clip_image010

  11. 安裝完成,預設直接啟動Zend Server

    clip_image011

  12. 此時右下角常駐圖示會多兩個圖示,分別代表:  Zend Server、  Apache Server

    clip_image012

  13. 很不幸的預設執行的Zend Server是掛點的

    clip_image013

  14. 查看Apache Error.log

    clip_image014

  15. Error.log顯示 Zend Enabler沒辦法讀取,XML Parse錯誤

    clip_image015

  16. 於Zend Server/Etc目錄下檢查ZendEnablerConf.xml檔

    clip_image016

  17. 用Notepad++開啟後,編碼有錯誤的問題

    clip_image017

  18. 直接將第一行砍掉,另存成UTF-8編碼

    clip_image018

  19. 重新執行Apache

    clip_image019

  20. 重新執行Zend Server

    clip_image020

  21. 終於看到正常的Zend Server第一次執行畫面

    clip_image021

  22. 設定Server password

    clip_image022

  23. 初次設定完畢

    clip_image023

  24. 平常Zend Server畫面

    clip_image024

  25. 測試command功能,執行cmd

    clip_image025

  26. 於Command模式下,執行zf

    clip_image026

  27. 出現zf指令提示,大功告成!

    clip_image027

短短的年多竹北高鐵人潮的變化

因為老婆工作在台北的關係,去年二月就搬到竹北高鐵旁租房子,每天在接送老婆去搭車。剛開始下班時間過去機車停車區有1/3個空位任我跳選擇,經過一年多的時間而已,現在不臨停紅線拼運氣已經沒位置可以暫停了。

不過人多排隊的禮儀就越來越糟糕了,我老婆每天早上可以看到一排包包卡自由座位車箱的排隊,高鐵自己的站務人員不處理的情況下,這風氣慢慢應該會形成竹北高鐵的文化吧。

怎麼檢查廁所有沒有掃乾淨?

看看馬桶的坐墊背面有沒掃乾淨就知道了!
因為那邊是最容易髒,而且又看不到的地方。
如果那邊有注意到掃乾淨,那表示掃的有細心!

ASP.NET MVC Action Result

  1. ContentResult - 回傳自訂內容
  2. EmptyResult - 不回傳
  3. FileResult - 回傳File
  4. HttpStatusCodeResult - 回傳HttpStatus
  5. JavaScriptResult - 回傳Javascript
  6. JsonResult - 回傳JSON字串
  7. RedirectResult - 轉址
  8. RedirectToRouteResult - 重新Route
  9. ViewResultBase - 回傳View
  10. PartialViewResult - 回傳頁面部分資料
  11. View() - 回傳預設View
  12. View(data) - 回傳預設View並帶入資料

ASP.NET MVC 快速入門

ASP.NET Model-View-Control的作業方式:

  • View – 負責顯示畫面設計,並且顯示Control所提供的資訊,如果不需要畫面的資訊(如:XML,JSON String),Controller可以直接回傳,不需另外設計View。
  • Controller – 負責畫面與商業邏輯之間的串接,依據User Request URL,ASP.NET會依據Route Rule分配給對應的Controller的指定Method處理,該Method可以依據輸入的參數與HttpGet/HttpPost行為,來決定是否呼叫Model進行Business運作,以及決定套用哪個View來進行顯示。
  • Model – 負責商業邏輯處理的資料集(Model)與服務(Services),UI上資料填入Model後會由Controller呼叫相對應的Services並回傳資料提供給Controller進行View的串接。

MVC作業方式的優劣:

優點:
  • 適合單元測試,Model/View/Controller的功能切割明確,彼此的相依性低,容易分工作業與單獨測試
  • 網頁設計回歸傳統Html Design,與ASP.NET相依性較低,移植系統較傳統ASP.NET Web Form複雜度降低
  • 無法採與傳統ASP.NET Web Form 以Postback方式處理UI互動,減少畫面閃爍與ViewState資料保存的現象,降低網頁Size。
缺點:
  • 小功能強迫切割會造成過於繁瑣,且當View/Controller/Model彼此相依資料複雜時,彼此傳遞的資料格式會十分複雜與繁瑣。
  • UI互動依賴傳統Javascript設計,Javascript撰寫會較為複雜,無法如ASP.NET Web Form可以拉到後端處理。
  • 無法使用ASP.NET Web Form的元件(DataGrid、GridView),類似功能的開發效率會降低,須以傳統網頁設計的方式實作。

ASP.NET MVC目錄規則:


以登入畫面為例:


範例中需實作項目共有:

  1. View – LogOn.aspx
  2. Control – AccountController.cs
  3. Model – LogonModel.cs
  4. Services – AccountServices.cs

以VS2010實做上述功能順序如下(我的習慣順序):

  1. 新增AccountController.cs (View的新增依賴Controller,所以先新增Controller)
  2. AcounntController內新增Logon Method
  3. 由Logon Method產生View (LogOn.aspx)
  4. 自行於Model目錄下新增Model相關cs:LogonModel.cs/AccountServices.cs (Model在View Design前新增比較方便)
  5. 將View的Model從預設Dynamic改為LogonModel
  6. 設計View UI讓HTML元件與Model資料的綁定
  7. LogonMethod於HttpGet時的輸入參數改為LogonModel.cs
  8. 實作AccountServices.ValidateUser邏輯 
  9. 實作AccountController.Logon邏輯
  10. 完成

上述順序實作順序之畫面:

1. 新增AccountController.cs (View的新增依賴Controller,所以先新增Controller)

於Controller目錄下Add->Controller 
Controller Name取名為Account,後面Controller為必需名稱,是否直接新增Create/Update/Delete/Details Method這次先不需要)
2. AcounntController內新增Logon Method 

AccountController.cs內預設只有Index Method,分別設計兩個同名LogOn Method Method提供HttpGet/HttpPost兩種狀態分開處理,此時UserModel尚未定義。
3. 由Logon Method產生View (LogOn.aspx) 

在Method上按右鍵會有[Add View …]選項,點選後會自動產生對應的View於Controller目錄下。

此次未採用MasterPage,因此Select master page必須取消勾選。

[Add]後,於Views/Account下,產生LogOn.aspx的View。
4. 自行於Model目錄下新增Model相關cs:LogOnModel.cs/AccountServices.cs (Model在View Design前新增比較方便)

LogonModel.cs,自訂欄位UserName/Password

AccountServices.cs,提供ValidateUser Method
5. 將View的Model從預設Dynamic改為LogonModel

原本View的資料參數為dynamic

調整為自訂的Model物件
6. 設計View UI讓HTML元件與Model資料的綁定

依照ASP.NET MVC Binding語法設計UI,MVC 3.0有Razor語法,上面為原本的基本語法
7. LogonMethod於HttpGet時的輸入參數改為LogonModel.cs

此為LogOn Submit後訊息處理窗口。
8. 實作AccountServices.ValidateUser邏輯 

可延伸與後端資料庫做整合。
9. 實作AccountController.Logon邏輯

依據輸入內容呼叫登入檢查並依據結果只配對應View
10. 完成

預設畫面

登入完成

登入失敗

ASP.NET MVC結合三層式架構(USL/BLL/DAL)


展示層由原本View+Control實現,Model由TO取代,Services由BLL取代,並直接呼叫DAL處理。

專案Sample,Web內無Model目錄,Controller直接呼叫BLL

橫式廣告