站內搜尋:Yahoo搜尋的結果,如果沒有給完整的網址,請在站內再搜尋一次!

顯示具有 PHP 標籤的文章。 顯示所有文章
顯示具有 PHP 標籤的文章。 顯示所有文章

2012-03-11

在php使用tcpdf輸出pdf檔案,並能正確顯示繁體中文內容

TCPDF的官方網站:http://www.tcpdf.org/

tcpdf(5.9.149)提供了65個範例檔案,示範如何從php建立各種不同樣式、內容風格的PDF檔案。

其中example_038.php是一個說明如何建立CJK文字內容的範例(CJK:中日韓),如果把這個範例的頁首內容更為繁體中文內容,會無法正確顯示:

// set default header data
//原作法以define的方式,定義在tcpdf_config.php中,是英文內容
//$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH,
PDF_HEADER_TITLE.' 038', PDF_HEADER_STRING);
//字型更改為繁體中文內容
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, '測試繁體中文頁首標題', '測試繁體中文頁首字串內容');

將tcpdf_config.php的PDF_FONT_NAME_MAIN的值,由helvetica更改為msungstdlight,即可正確顯示繁體中文的頁首標題內容。

/**
 * default main font name
 */
//define ('PDF_FONT_NAME_MAIN', 'helvetica');      //預設值
define ('PDF_FONT_NAME_MAIN', 'msungstdlight');    //可讓頁首標題正確顯示

以下是修改example_038.php,使顯示繁體中文內容的部分程式碼:

// set font
//$pdf->SetFont('cid0jp', '', 20);        //這個應該也可以
//$pdf->SetFont('cid0ct', '', 20);        //這個應該也可以
$pdf->SetFont('msungstdlight', '', 20);
// add a page
$pdf->AddPage();

//$txt = 'Example of CID-0 CJK unembedded font.
//To display extended text you must have CJK fonts for your PDF reader: こんにちは世界';
$txt = '林書豪再現「林來瘋」身手!';
$txt = $txt . '昨拿廿分、十三助攻與四抄截,';
$txt = $txt . '本季第六次獻出兩個「雙位數」成績單;';
$txt = $txt . '可惜紐約尼克隊防守再出紕漏,';
$txt = $txt . '終場一一四比一一九不敵密爾瓦基公鹿,客場四戰全輸。';
$txt = $txt . '明天凌晨十二點重返紐約主場迎戰費城七六人,尼克全力止敗。';
$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);


以下是調整後所顯示的內容:

2011-12-04

使用php PDO的存取方式,選取SQLite3資料庫的資料內容

以下是一個使用PDO取用SQLite資料庫內容的範例:


<?php
//指定SQLite的檔名
$zDsn ="sqlite:e1000.db3";
//使用PDO建立資料庫連線
//pdo(資料來源字串,帳號,密碼);
$oConn = new pdo($zDsn,"","");
//選取資料的SQL statement
$zSQL ="select oid,word,denotation from elementary where oid<=10";
//執行查詢作業
$oRS = $oConn->query($zSQL);
//取得查詢結果,PDO::FETCH_ASSOC 傳回下一筆資料的欄位名及值
$oRows = $oRS->fetchAll(PDO::FETCH_ASSOC);
//依序 列出從SQLite取得的資料
for ($i=0;$i<10;$i++) {
    $zOid = $oRows[$i]['oid'];
    $zWord = $oRows[$i]['word'];
    $zDennotation = $oRows[$i]['denotation'];
    echo "$zOid --  $zWord --  $zDennotation <br>";
}
?>

2011-12-02

使用php PDO的存取方式,清空SQLite3資料庫的資料內容

使用phpMyAdmin操作MySQL資料庫,有一個很好用但要小心用的『清空』功能(Truncate)。

但在SQLite Database Browser上操作SQLite資料庫檔案,要一次清空資料表中的資料,似乎不是這麼方便?

在沒有找到更好的方法前,先用php的PDO存取方式,寫個迴圈,用delete的方式,逐筆清空資料表的紀錄。雖然不是個好方法,但是個可以達到目的的方法,紀錄下來當個範例用。

<?php
//指定SQLite的來源,資料庫檔案empty.db3和程式碼放在同一目錄下
$zDsn = 'sqlite:empty.db3';
//共有1000筆資料
$nEnd = 1001;
//根據elementary資料表的oid欄位,逐筆讀取資料庫
  for ($i=1;$i<$nEnd;$i++) {
    //使用PDO連接資料庫    
    $oConn = new pdo($zDsn,"","");
    $zSQL = "delete from elementary where oid=".$i;
    $oResult = $oConn->exec($zSQL);
    if (!$oResult){
      echo "資料刪除發生錯誤!<br>";
      echo $zSQL;
      exit();
    }
    $oConn = null;
  }
?>

2011-11-30

使用php搜集資料(擷取遠端網頁的HTML資料):file_get_contents / preg_match / get_meta_tags

很多網頁都會用網址超連結來傳遞參數(採用GET方法),藉此來運作程式,很方便,但相對的資訊的隱藏效果,就不會太好!

有很多網站的網址,可能類似:http://www.web-addr.xom/program.aspx?id=101 的格式,假設id=101是搜尋資料的根據,先測試一下id的資料範圍,假設id介於1~50000,接下來要用迴圈來取得遠端主機的這5萬筆對應的資料。

<?php
//id的起始值
$i = 1;
//連接資料庫的設定值,取得的資料將放到資料庫中
$oLink = @mysqli_connect('localhost','user','passwd','dbname');

while  ($i < 50001)  {
    //要擷取的網頁
    $zURL = "http://www.web-addr.xom/program.aspx?id=" . "$i";
 
    //取得網頁的內容
    $zHTML = file_get_contents($zURL);

    //比對要擷取的內容
    //preg_match(規則, 被比對的資料來源, 結果);
    //取得網頁內容($zHTML)中,介於<abc>和</abc>之間的資料,
    // (/斜線之前要加\倒斜線)
    //( )括號代表:Group and capture
    // . 點代表:match any one character (execept \n)
    // * 星號代表:match 0 or more times
    // /s 代表:讓 . 點 也可以match \n
    preg_match("<abc>(.*)<\/abc>/s", $zHTML, $aMatch);
    //取得資料
    $zWord = $aMatch[1];

    //取得 meta的值 (Description 及 Keywords)
    $aMetaTag = get_meta_tags($zURL);
    $zDescription = $aMetaTag["description"];
    $zKeywords = $aMetaTag["keywords"];

    //為防止取得的資料包含'單引號,
    //可以先用addslashes函數,預先處理要存入資料庫的資料
    //如果有將big5轉換為UTF-8的必要,
    //可以用iconv("big5","UTF-8",$zWord);進行轉換
    $zSQL = "insert into ...... ";   
   
    //如果遠端伺服器,有防火牆等機制,不允許密集的連線,
    //可以用sleep(int seconds);先暫停幾秒,再擷取下一筆資料
    $i = $i + 1;
    //php.ini的max_execution_time預設是30秒,
    //如過要截取得資料數量龐大,30秒絕對不夠用
    //執行程式前,先調整一下max_execution_time,重新啟動apache
    //不然擷取執行30秒後,程式就會自動跳掉了...
}      
?>

2011-11-28

Joomla開發的影音教學網站:http://learn.theartofjoomla.com

網址:http://learn.theartofjoomla.com/
至目前為止(2011-11-28),已發佈的主題有:


  1. Introduction to development
  2. Joomla component basics
  3. Working with component data
  4. Working with backend component lists
  5. Working with backend edit forms
  6. Adding category support to backend components
  7. Packaging a backend component for distribution
  8. Strategies for using version control and automating builds with Phing   
接下來將發佈的主題有:
  1. Introduction to frontend components, menus and multi-extension installation packages (End of November)
  2. Working with frontend component list views (End of December)
  3. Working with frontend component item views (End of January 2012)
  4. Working with routers (End of February 2012)
  5. Modules (2012)
  6. Plugins (2012) 
這個網站只提供幾個免費的內容,大部分的課程是需要付費的。

2011-11-15

讓Netbeans 7.0.x 可以提供 CodeIgniter 2.0.x 的 AutoComplete 功能

參考來源:http://codeigniter.com/forums/viewthread/187949/#888704
  1. 在netbeans專案目錄下的nbproject次目錄下,建立一個次目錄,目錄名稱可以自訂,這裡假設命名為CI_Autocomplete
    netbeans專案目錄:C:\xampp\htdocs\ci
    新建的次目錄為:C:\xampp\htdocs\ci\nbproject\CI_Autocomplete
  2. 在C:\xampp\htdocs\ci\nbproject\CI_Autocomplete目錄下,建立一個命名為CI_Autocomplete_2.php的檔案。(檔案名稱可以自訂)
    C:\xampp\htdocs\ci\nbproject\CI_Autocomplete\CI_Autocomplete_2.php
  3. 將以下內容,放到CI_Autocomplete_2.php檔案中
    <?php

    /**
    * @property CI_DB_active_record $db
    * @property CI_DB_forge $dbforge
    * @property CI_Benchmark $benchmark
    * @property CI_Calendar $calendar
    * @property CI_Cart $cart
    * @property CI_Config $config
    * @property CI_Controller $controller
    * @property CI_Email $email
    * @property CI_Encrypt $encrypt
    * @property CI_Exceptions $exceptions
    * @property CI_Form_validation $form_validation
    * @property CI_Ftp $ftp
    * @property CI_Hooks $hooks
    * @property CI_Image_lib $image_lib
    * @property CI_Input $input
    * @property CI_Language $language
    * @property CI_Loader $load
    * @property CI_Log $log
    * @property CI_Model $model
    * @property CI_Output $output
    * @property CI_Pagination $pagination
    * @property CI_Parser $parser
    * @property CI_Profiler $profiler
    * @property CI_Router $router
    * @property CI_Session $session
    * @property CI_Sha1 $sha1
    * @property CI_Table $table
    * @property CI_Trackback $trackback
    * @property CI_Typography $typography
    * @property CI_Unit_test $unit_test
    * @property CI_Upload $upload
    * @property CI_URI $uri
    * @property CI_User_agent $user_agent
    * @property CI_Validation $validation
    * @property CI_Xmlrpc $xmlrpc
    * @property CI_Xmlrpcs $xmlrpcs
    * @property CI_Zip $zip
    */

    class CI_Controller {};

    /**
    * @property CI_DB_active_record $db
    * @property CI_DB_forge $dbforge
    * @property CI_Config $config
    * @property CI_Loader $load
    * @property CI_Session $session
    */

    class CI_Model {};

    ?> 

  4. 進入netbeans,File -> Project Properties (專案名稱) -> 在Categories中點選PHP Include Path
    這個範例的專案目錄是 ci ,所以畫面上看到的是 Project Properties(ci)
    使用『Add Folder ...』按鈕,將C:\xampp\htdocs\ci\nbproject\CI_Autocomplete 加到專案中
  5. 重新啟動NetBeans。可以在netbeans中檢視codeigniter的autocomplete功能了...

2011-11-01

在Xampp 1.7.7環境下,安裝Xoops 2.5.1a,無法順利完成所有的預設安裝步驟?

Xampp 1.7.7 的 php 是 5.3.8版,符合安裝 Xoops 2.5.x 的php版本需求(5.2以上),但安裝的過程陸續會出現類似以下的訊息,接著無法進行下一步驟,以致無法完成預設的安裝步驟...


Strict Standards: Non-static method XoopsLoad::load() should not be called statically in C:\xampp\htdocs\myg\include\common.php on line 49

Strict Standards: Non-static method XoopsLoad::loadCore() should not be called statically in C:\xampp\htdocs\myg\class\xoopsload.php on line 71

Strict Standards: Non-static method XoopsLoad::loadCoreConfig() should not be called statically in C:\xampp\htdocs\myg\class\xoopsload.php on line 91



解決這個問題的方法
問題出在php.ini的預設設定值,error_reporting 的預設值是 E_ALL | E_STRICT,把這個預設值調為:
error_reporting = E_ALL | ~E_STRICT
這樣就可以讓一大推錯誤訊息消失了!試試看吧!

不過這只是讓錯誤訊息消失而已,問題應該還是存在的!錯誤訊息是不見了,但接下來出現的是一個空白頁,一樣無法完成預設的安裝步驟...,問題出在哪裡呢?
(參考資料:http://www.zendchina.net/?action-viewnews-itemid-2296)

Xoops 2.5需要使用Zend Optimizer的功能...
Xampp 1.7以前的版本(不含1.7),預設安裝了Zend Optimizer,但沒有啟用Zend Optimizer,只要修改 php.ini 中的zend_optimizer.enable_loader的設定值,把 0改成1,重新啟動Apache,Zend Optimizer就啟用了。
但Xampp 1.7版以後,使用php 5.3的版本,Zend Optimizer 3.3.3 只支援 php 5.2.x (官網上有寫runtime for php 5.2 and earlier)...
所以目前看來,要在Xampp 1.7.x上run Xoops 2.5.x 應該會有困難!

2011-10-21

symfony Jobeet學習紀錄--Jobeet網站的資料模型(The Data Model)--(03/24)

Symfony 的練習範例Jobeet : http://www.symfony-project.org/jobeet/1_4/Doctrine/en/
第三天的課程: Day 3: The Data Model

在第三天的課程安排中,將可滿足渴望使用文字編輯器編寫PHP程式碼的需求。
接下來的內容有:定義Jobeet的資料模型、使用ORM與資料庫互動、建立應用程式的第一個模組。但這些功能並不需要很多的PHP程式碼。

資料關聯模式(The Relational Model)
在第二天的課程中,有提到Jobeet專案的主要物件有:求才資料(Job)、進階使用(Affiliate)、工作分類(Category),右圖是這些物件的關聯圖。
為了滿足系統在公佈天數等需求,使用了created_at欄位,當資料新增時,會以系統時間紀錄在created_at欄位。同樣的道理,當有資料更新時,會以當時的系統時間紀錄在Updated_at。

資料綱要(The Schema)
很明顯這裡需要使用一個關聯式資料庫來存放求才資料(Job)、進階使用(Affiliate)、工作分類(Category)等資料。
Symfony是一個物件導向的架構,因此盡可能以物件的方式來操作系統。例如:會以物件的方式方來代替寫SQL語法取得資料。
所以關聯式的資料庫必須對應成物件模式,這可以透過ORM(Object-relational Mapping)的工具來達成,Symfony預設提供了Propel和Doctrine兩種ORM的工具,這裡要用的是Doctrine。
ORM需要描述資料表及資料表間的關係,藉此來建立類別的關聯。描述資料綱要(Schema)有兩種方式:檢視已存在的資料庫或以人工的方式來建立。
因Jobeet的資料庫還不存在,在對Jobeet資料庫還不知悉的情況下,就使用以下的內容來建立資料綱要(Schema), config/doctrine/schema.yml

# config/doctrine/schema.yml
JobeetCategory:
  actAs: { Timestampable: ~ }
  columns:
    name: { type: string(255), notnull: true, unique: true }
 
JobeetJob:
  actAs: { Timestampable: ~ }
  columns:
    category_id:  { type: integer, notnull: true }
    type:         { type: string(255) }
    company:      { type: string(255), notnull: true }
    logo:         { type: string(255) }
    url:          { type: string(255) }
    position:     { type: string(255), notnull: true }
    location:     { type: string(255), notnull: true }
    description:  { type: string(4000), notnull: true }
    how_to_apply: { type: string(4000), notnull: true }
    token:        { type: string(255), notnull: true, unique: true }
    is_public:    { type: boolean, notnull: true, default: 1 }
    is_activated: { type: boolean, notnull: true, default: 0 }
    email:        { type: string(255), notnull: true }
    expires_at:   { type: timestamp, notnull: true }
  relations:
    JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: JobeetJobs } 
 
JobeetAffiliate:
  actAs: { Timestampable: ~ }
  columns:
    url:       { type: string(255), notnull: true }
    email:     { type: string(255), notnull: true, unique: true }
    token:     { type: string(255), notnull: true }
    is_active: { type: boolean, notnull: true, default: 0 }
  relations:
    JobeetCategories:
      class: JobeetCategory
      refClass: JobeetCategoryAffiliate
      local: affiliate_id
      foreign: category_id
      foreignAlias: JobeetAffiliates
 
JobeetCategoryAffiliate:
  columns:
    category_id:  { type: integer, primary: true }
    affiliate_id: { type: integer, primary: true }
  relations:
    JobeetCategory:  { onDelete: CASCADE, local: category_id, foreign: id }
    JobeetAffiliate: { onDelete: CASCADE, local: affiliate_id, foreign: id }

在資料庫設定 database.yml 已經OK的情況下(待會才會進行這個步驟),可以使用 symfony doctrine:build-schema來建立資料綱要(schema)。
YAML的參考資料:
  1. http://yaml.org/
  2. http://components.symfony-project.org/yaml/documentation

資料庫的準備
首先準備好一個命名為jobeet的MSQL資料庫。
使用以下指令,讓Jobeet專案,可以使用jobeet資料庫:
symfony configure:database "mysql:host=localhost;dbname=jobeet" root password
在configure:database這個任務中,用了三個參數:PDO DSN、資料庫帳號、密碼
執行configure:database後,資料庫的設定會存放在 config/database.yml,這個設定檔不一定要使用configure:database來產生,也可以自行編輯建立。

使用ORM(Object-relational Mapping)
前面已經建立資料庫的描述 config/doctrine/schema.yml ,接著要使用Doctrine內建的功能來產生建立資料表所需的SQL敘述。
在產生SQL敘述前,要先從綱要檔(Schema)建立模型類別(Model):
c:\dev\sfprojects\jobeet>symfony doctrine:build --model

>> doctrine  generating model classes
>> file+     C:\Users\Hannibal\AppData\Local\Temp/doctrine_schema_52712.yml
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...trine/JobeetAffiliate.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo.../JobeetAffiliateTable.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...ctrine/JobeetCategory.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...beetCategoryAffiliate.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...ategoryAffiliateTable.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...e/JobeetCategoryTable.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/model/doctrine/JobeetJob.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...ctrine/JobeetJobTable.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...e/BaseJobeetAffiliate.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...se/BaseJobeetCategory.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...beetCategoryAffiliate.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...ne/base/BaseJobeetJob.class.php
>> autoload  Resetting application autoloaders


模型類別(Model Classes)建立後,接著就可以來產生SQL敘述了:
c:\dev\sfprojects\jobeet>symfony doctrine:build --sql

>> doctrine  generating model classes
>> file+     C:\Users\Hannibal\AppData\Local\Temp/doctrine_schema_81084.yml
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...e/BaseJobeetAffiliate.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...se/BaseJobeetCategory.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...beetCategoryAffiliate.class.php
>> tokens    C:/dev/sfprojects/jobeet/lib/mo...ne/base/BaseJobeetJob.class.php
>> autoload  Resetting application autoloaders
>> file-     C:/dev/sfprojects/jobeet/cache/.../config/config_autoload.yml.php
>> doctrine  generating sql for models
>> dir+      C:\dev\sfprojects\jobeet\data/sql
>> doctrine  Generated SQL successfully for models
以上所產生的SQL敘述語法,存放在 sql\data 目錄下

上述的作業只是產生要建立資料表的SQL敘述語法,建立資料表:

c:\dev\sfprojects\jobeet>symfony doctrine:insert-sql
>> doctrine  creating tables
>> doctrine  created tables successfully



Symfony內建有Help的功能,可以透過 symfony help <task> 取得相關內容
例如:symfony help doctrine:insert-sql

在上述的symfony doctrine:build --model作業裡,所產生的php檔案(位於 lib/model )是用來跟資料庫互動的。
瀏覽這些php檔,可以發現每個資料表有三個類別(class)檔案,以jobeet_job資料表為例:

  1. JobeetJob.class.php:這個類別(class)的一個物件(object),代表jobeet_job資料表的一筆資料。這個類別預設是空的。
    class JobeetJob extends BaseJobeetJob {  }
  2. BaseJobeetJob.class.php:這是JobeetJob的父類別(parent class),每次執行 doctrine:build --model 時,這個類別會被複寫(overwritten),所有的作業會在JobeetJob類別中完成。
  3. JobeetJobTable.class.php:這個類別用來定義方法(Methods),主要用來傳送JobeetJob的物件值。這個類別預設是空的。
    class JobeetJobTable extends Doctrine_Table {
        /**
         * Returns an instance of this class.
         *
         * @return object JobeetJobTable
         */
        public static function getInstance()     {
            return Doctrine_Core::getTable('JobeetJob');
        }
    }

資料欄位的值可以用模型物件(model object)中的存取子(accessor, get*())及更動子(mutator, set*())來操作。例如:
$job = new JobeetJob();
$job->setPosition('Web developer');
$job->save();
echo $job->getPosition();
$job->delete();


也可以直接定義外來鍵(foreign key),把物件連結在一起。例如:
$category = new JobeetCategory();
$category->setName('Programming');
$job = new JobeetJob();
$job->setCategory($category);

在ORM這個段落中的作業項目:doctrine:build --model / doctrine:build --sql / doctrine:insert-sql,以及後續要進行的其他項目:產生表單(form)、資料驗證(validator)...
,可以用doctrine:build --all來代替。例如:
symfony doctrine:build --all --no-confirmation

起始資料(The Initial Data)
經過以上的作業項目,已經在資料庫建立資料表,但資料表中還沒有任何資料。任何的網頁應用程式都會有以下三種資料:

  1. 起始資料(Initial Data):起始資料是應用程式作業所需要的,例如:Jobeet網站需要一些工作分類(category)的起始資料,也需要讓管理者可以登入後台的管理資料。
  2. 測試資料(Test Data):程式開發人員需要一些測試資料來測試網站應用程式。
  3. 使用者資料(User data):使用者在日常作業所產生的資料。
每一次Symfony在資料庫中重新建立資料表,都會清空資料,為使資料庫中的起始資料可以保留下來,可以用php程式碼、在MySQL中執行SQL 敘述語法,這些需求是很普遍常見的,有一個更好的方法,可以用symfony來做。
在 data/fixtures/ 建立 YAML固定檔案,使用doctrine:data-load來將資料載入資料庫中。例如:
# data/fixtures/categories.yml
JobeetCategory:
  design:
    name: Design
  programming:
    name: Programming
  manager:
    name: Manager
  administrator:
    name: Administrator
# data/fixtures/jobs.yml
JobeetJob:
  job_sensio_labs:
    JobeetCategory: programming
    type:         full-time
    company:      Sensio Labs
    logo:         sensio-labs.gif
    url:          http://www.sensiolabs.com/
    position:     Web Developer
    location:     Paris, France
    description:  |
      You've already developed websites with symfony and you want to work
      with Open-Source technologies. You have a minimum of 3 years
      experience in web development with PHP or Java and you wish to
      participate to development of Web 2.0 sites using the best
      frameworks available.
    how_to_apply: |
      Send your resume to fabien.potencier [at] sensio.com
    is_public:    true
    is_activated: true
    token:        job_sensio_labs
    email:        job@example.com
    expires_at:   '2010-10-10'
  job_extreme_sensio:
    JobeetCategory:  design
    type:         part-time
    company:      Extreme Sensio
    logo:         extreme-sensio.gif
    url:          http://www.extreme-sensio.com/
    position:     Web Designer
    location:     Paris, France
    description:  |
      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
      eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      enim ad minim veniam, quis nostrud exercitation ullamco laboris
      nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
      in reprehenderit in.
      Voluptate velit esse cillum dolore eu fugiat nulla pariatur.
      Excepteur sint occaecat cupidatat non proident, sunt in culpa
      qui officia deserunt mollit anim id est laborum.
    how_to_apply: |
      Send your resume to fabien.potencier [at] sensio.com
    is_public:    true
    is_activated: true
    token:        job_extreme_sensio
    email:        job@example.com
    expires_at:   '2010-10-10'

其中jobs.yml這個固定檔案會參考兩張圖片,分別位於以下網址,下載存到 web/uploads/jobs/目錄下
http://www.symfony-project.org/get/jobeet/sensio-labs.gif 
http://www.symfony-project.org/get/jobeet/extreme-sensio.gif

位於 data/fixtures的固定檔案,使用YAML格式編碼,定義了模型物件(object model),以標籤的方式建立唯一的名稱(在jobs.yml中定義了:job_sensio_labs 及 job_extreme_sensio),標籤的最大用處是建立物件的連結關係,不必定義主鍵(primary key),例如:job_sensio_labs的求才工作分類是programming,這個標籤(label)是設定在Programming工作分類。
在YAML檔案中,如果一個字串是由多行文字所組成,必須使用pine字元(|)來串接多行字串,成為一個字串。

雖然一個固定檔案(fixture file)可以包含一到數個模型(Model),這裡採用的方式是一個固定檔案對應一個模型的作法。
Propel requires that the fixtures files be prefixed with numbers to determine the order in which the files will be loaded.
With Doctrine this is not required as all fixtures will be loaded and saved in the correct order to make sure foreign keys are set properly.

固定檔案(fixture file)中,並不需要定義所有的欄位值,symfony可以帶入database schema中的預設值,且當symfony使用doctrine來載入資料到資料庫時,所有內建的行為(built-in behavior)(例如:自動記載產生時生、更新時間)和自訂的行為(custom behavior)都會啟動。
載入起始資料到資料庫的指令 : symfony doctrine:data-load

c:\dev\sfprojects\jobeet>symfony doctrine:data-load
>> doctrine  Loading data fixtures from "C:\...fprojects\jobeet\data/fixtures"
>> doctrine  Data was successfully loaded

可以使用doctrine:build --all --and-load 來代替 doctrine:build --all 和 doctrine:data-load這兩項作業
使用symfony dotrine:build --all --and-load會產生forms, filters, models,並刪除資料庫、重建資料表。

使用瀏覽器查看實際的狀況(See it in Action in the Browser)
接下來是如何顯示工作列表、如何編輯現存的求才資料、如何刪除一筆求才資料,如第一天的進度,Symfony專案是由應用程式組成,每一應用程式可細分為模組(modules),模組中包含表達程式特性的PHP程式碼(例如API模組),或使用者可以在模型物件中進行的各項操作(例如:求財模型Job Model)。
Symfony可以從指定的模型中,自動產生模組,並提供基本的操作
symfony doctrine:generate-module --with-show --non-verbose-templates frontend job JobeetJob

>> dir+      C:\dev\sfprojects\jobeet\apps\frontend\modules/job\actions
>> file+     C:\dev\sfprojects\jobeet\apps\f...s/job\actions/actions.class.php
>> dir+      C:\dev\sfprojects\jobeet\apps\frontend\modules/job\templates
>> file+     C:\dev\sfprojects\jobeet\apps\f...s/job\templates/editSuccess.php
>> file+     C:\dev\sfprojects\jobeet\apps\f.../job\templates/indexSuccess.php
>> file+     C:\dev\sfprojects\jobeet\apps\f...es/job\templates/newSuccess.php
>> file+     C:\dev\sfprojects\jobeet\apps\f...s/job\templates/showSuccess.php
>> file+     C:\dev\sfprojects\jobeet\apps\f...modules/job\templates/_form.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f...s/job/actions/actions.class.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f...s/job/templates/editSuccess.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f.../job/templates/indexSuccess.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f...es/job/templates/newSuccess.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f...s/job/templates/showSuccess.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f...modules/job/templates/_form.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f...s/job/actions/actions.class.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f...s/job/templates/editSuccess.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f.../job/templates/indexSuccess.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f...es/job/templates/newSuccess.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f...s/job/templates/showSuccess.php
>> tokens    C:/dev/sfprojects/jobeet/apps/f...modules/job/templates/_form.php
>> file+     C:\dev\sfprojects\jobeet\test\f...nal\frontend\jobActionsTest.php
>> tokens    C:\dev\sfprojects\jobeet\test\f...nal\frontend\jobActionsTest.php
>> file-     C:/dev/sfprojects/jobeet/cache/...96f/autoJob/templates/_form.php
>> file-     C:/dev/sfprojects/jobeet/cache/...toJob/templates/showSuccess.php
>> file-     C:/dev/sfprojects/jobeet/cache/...utoJob/templates/newSuccess.php
>> file-     C:/dev/sfprojects/jobeet/cache/...oJob/templates/indexSuccess.php
>> file-     C:/dev/sfprojects/jobeet/cache/...toJob/templates/editSuccess.php
>> dir-      C:/dev/sfprojects/jobeet/cache/...db690e723e96f/autoJob/templates
>> file-     C:/dev/sfprojects/jobeet/cache/...toJob/actions/actions.class.php
>> dir-      C:/dev/sfprojects/jobeet/cache/...d7db690e723e96f/autoJob/actions
>> dir-      C:/dev/sfprojects/jobeet/cache/...e90f98f9d7db690e723e96f/autoJob


以上使用了 doctrine:generate-module 來為JobeetJob模型產生 job的前台模組,同時製造了大部分的symfony任務(tasks)、及一些位於 apps\frontend\modules\job\目錄下的檔案及目錄。
actions\ 目錄:The module actions
templates\ 目錄:The module templates

actions\actions.class.php類別:定義了所有job模組的action名稱 / 功能描述,如下:
index : 顯示資料表的所有資料
show : 顯示指定資料的欄位及欄位值
new : 顯示新增資料的表單
create : 產生一筆資料
edit : 顯示編輯資料的表單
update : 根據使用使所送出的值,更新一筆資料
delete : 從資料表刪除一筆指定的資料

可以使用以下的網址,在瀏覽器測試一下job模組:
http://jobeet.localhost/frontend_dev.php/job

2011-10-20

symfony Jobeet學習紀錄--Jobeet專案需求目標(The Project)--(02/24)

Symfony 的練習範例Jobeet : http://www.symfony-project.org/jobeet/1_4/Doctrine/en/
第二天的課程: Day 2: The Project

Jobeet這個專案的目標:建立一個求職網站
  1. Jobeet網站的使用者,有以下四類:
    • admin: He owns the website and has the magic power(網站管理者)
    • user: He visits the website to look for a job(求職者)
    • poster: He visits the website to post a job(張貼求才訊息者)
    • affiliate: He re-publishes some jobs on his website(進階使用者,可以使用Jobeet API)

  2. Jobeet有前台(frontend)與後台(backend)的應用需求
    • frontend前台的需求有七項(F1~F7):提供給使用者使用網站的介面
    • backend後台的需求有三項(B1~B3):提供給管理者管理網站的功能

  3. F1需求:使用者在首頁可以看到最新的求才資料
    當使用者進入Jobeet網站首頁,可以看到最新的求才列表。
    依照工作分類(category)加上發布日期排序,最新發布的在前面。
    工作列表上只顯是工作地點(location)、職位(position)、求才公司(company)
    每一個工作分類,列表中只顯示前十筆工作,並提供該分類中所有工作的連結(F2)
    使用者可以搜尋建立自己的求職工作列表(F3)
    可以張貼一個求才(F5)

  4. F2需求:使用者可以取得所選定分類的求才資料
    當使用者點選工作分類名稱或"more jobs"連結時,他可以看到該分類以日期排序的所有求才工作。
    工作列表以每頁20筆工作,進行分頁。

  5. F3需求:使用者可以用關鍵字,重新搜尋工作列表
    關鍵字搜尋的欄位範圍:工作地點(location)、職位(position)、工作分類(category)、求才公司(company)

  6. F4需求:使用者點選一個工作連結,可以看到這個工作的詳細內容

  7. F5需求:使用者可以張貼求才訊息,求才訊息包含下列資料:
    • Company
    • Type (full-time, part-time, or freelance)
    • Logo (optional)
    • URL (optional)
    • Position
    • Location
    • Category (the user chooses in a list of possible categories)
    • Job description (URLs and emails are automatically linked)
    • How to apply (URLs and emails are automatically linked)
    • Public (whether the job can also be published on affiliate websites)
    • Email (email of the poster)

      張貼求才訊息,不必再特別新增帳號。
      新增求才訊息的作業流程:張貼者填入求才訊息所需的相關資料,預覽檢視求才訊息的正確性。
      張貼者即使沒有Jobeet網站的帳號,也可以使用張貼求才訊息時所給的特殊連結,進行求才資料的修改。
      每則求才訊息可以保留30天(由管理者設定,詳見B2需求),張貼者可以在求才訊息刊登逾期5天內,再刊登30天。

  8. F6需求:使用者可以申請成為可以使用Jobeet API的進階使用者
    一般使用者可以經由認證成為可以使用Jobeet API的近接使用者,要成為進階使用者,必須提供下列資料:
    • Name : 使用者名稱
    • Email : 電子郵件帳號
    • Website URL : 網站的網址

      進階使用者帳號,必須由管理者啟用(B3需求),啟用後進階使用者會收到由電子郵件寄送,使用API的授權
      申請時,進階使用者可以從工作範圍的子範圍中選取工作

  9. F7需求:進階使用者可以經由API瀏覽現有的工作列表
    進階使用者可以使用經授權的API,瀏覽現有的工作列表,取得的瀏覽資料可以使用XML、JSON、YAML等格式,傳送資料。
    進階使用者可以限制傳回的求才筆數,也可以在指定的分類中過濾查詢資料。

  10. B1需求:Jobeet網站由管理者設定
    管理者可以編輯網站上的工作分類

  11. B2需求:Jobeet網站上的求才工作由管理者管理
    管理者可以編輯或移除任何求才工作

  12. B3需求:進階使用者由管理者管理
    管理者可以建立或編輯進階使用者,負責啟用或停用進階使用者
    當管理者啟用一個進階使用者,系統會產生一組唯一的授權給進階使用者使用。
就像其他的網站開發一樣,不會一開始就進入程式碼的編寫,首先必須收集需求並設計系統的模型,這就是上述的準備內容。

symfony Jobeet學習紀錄--建立專案(Starting up the Project)--(01/24)

Symfony 的練習範例Jobeet : http://www.symfony-project.org/jobeet/1_4/Doctrine/en/
第一天的課程: Day 1: Starting up the Project


  1. 工作環境需求:web server / PDO相容的資料庫(例如:(MySQL, PostgreSQL, SQLite...等) / php 5.2.4以上的版本。
    我使用Xampp 1.7.7版,php是5.3.8版,符合上述的需求。Xampp解壓縮在c:\xampp 。

  2. 建立專案資料夾:資料夾的路徑、名稱中,不要包含空白字元
    c:\> mkdir c:\dev\sfprojects\jobeet
    c:\> cd c:\dev\sfprojects\jobeet

  3. 下載Symfony:下載網址→http://www.symfony-project.org/installation ,我選擇目前最新的版本 1.4.14,這版本會持續維護到2012年11月
  4. 建立Symfony的解壓縮存放位置:c:\dev\sfprojects\jobeet\lib\vendor>
    將下載取得的symfony-1.4.14.zip,解壓縮到這個資料夾下
    並將解壓縮後的目錄名稱:c:\dev\sfprojects\jobeet\lib\vendor\symfony-1.4.14>
    更改為:c:\dev\sfprojects\jobeet\lib\vendor\symfony>
  5. 建立Jobeet專案
    使用以下指令(參數:generate:project)建立Jobeet專案所需的架構目錄、檔案
    c:\dev\sfprojects\jobeet>c:\xampp\php\php.exe lib\vendor\symfony\data\bin\symfony generate:project jobeet
    • >> dir+      C:\dev\sfprojects\jobeet\apps
    • >> dir+      C:\dev\sfprojects\jobeet\cache
    • >> dir+      C:\dev\sfprojects\jobeet\config
    • >> file+     C:\dev\sfprojects\jobeet\config/ProjectConfiguration.class.php
    • >> file+     C:\dev\sfprojects\jobeet\config/properties.ini
    • >> file+     C:\dev\sfprojects\jobeet\config/rsync_exclude.txt
    • >> dir+      C:\dev\sfprojects\jobeet\data
    • >> dir+      C:\dev\sfprojects\jobeet\data/fixtures
    • >> file+     C:\dev\sfprojects\jobeet\data/fixtures/fixtures.yml
    • >> dir+      C:\dev\sfprojects\jobeet\lib/form
    • >> file+     C:\dev\sfprojects\jobeet\lib/form/BaseForm.class.php
    • >> dir+      C:\dev\sfprojects\jobeet\log
    • >> dir+      C:\dev\sfprojects\jobeet\plugins
    • >> file+     C:\dev\sfprojects\jobeet\symfony
    • >> dir+      C:\dev\sfprojects\jobeet\test
    • >> dir+      C:\dev\sfprojects\jobeet\test/bootstrap
    • >> file+     C:\dev\sfprojects\jobeet\test/bootstrap/functional.php
    • >> file+     C:\dev\sfprojects\jobeet\test/bootstrap/unit.php
    • >> dir+      C:\dev\sfprojects\jobeet\test/functional
    • >> dir+      C:\dev\sfprojects\jobeet\test/unit
    • >> dir+      C:\dev\sfprojects\jobeet\web
    • >> file+     C:\dev\sfprojects\jobeet\web/.htaccess
    • >> dir+      C:\dev\sfprojects\jobeet\web/css
    • >> file+     C:\dev\sfprojects\jobeet\web/css/main.css
    • >> dir+      C:\dev\sfprojects\jobeet\web/images
    • >> dir+      C:\dev\sfprojects\jobeet\web/js
    • >> file+     C:\dev\sfprojects\jobeet\web/robots.txt
    • >> dir+      C:\dev\sfprojects\jobeet\web/uploads
    • >> dir+      C:\dev\sfprojects\jobeet\web/uploads/assets
    • >> tokens    C:/dev/sfprojects/jobeet/config/ProjectConfiguration.class.php
    • >> tokens    C:/dev/sfprojects/jobeet/config/properties.ini
    • >> tokens    C:/dev/sfprojects/jobeet/config/rsync_exclude.txt
    • >> tokens    C:/dev/sfprojects/jobeet/config/ProjectConfiguration.class.php
    • >> tokens    C:/dev/sfprojects/jobeet/config/properties.ini
    • >> tokens    C:/dev/sfprojects/jobeet/config/rsync_exclude.txt
    • >> tokens    C:/dev/sfprojects/jobeet/lib/form/BaseForm.class.php
    • >> file+     C:\dev\sfprojects\jobeet\config/databases.yml
    • >> dir+      C:\dev\sfprojects\jobeet\config/doctrine
    • >> file+     C:\dev\sfprojects\jobeet\config/doctrine/schema.yml
    • >> chmod 777 C:\dev\sfprojects\jobeet\web\uploads
    • >> chmod 777 C:\dev\sfprojects\jobeet\cache
    • >> chmod 777 C:\dev\sfprojects\jobeet\log
    • >> chmod 777 C:\dev\sfprojects\jobeet/symfony
    • >> chmod 777 C:/dev/sfprojects/jobeet/web/uploads/assets
    • >> tokens    C:/dev/sfprojects/jobeet/config/databases.yml
    • >> tokens    C:/dev/sfprojects/jobeet/config/doctrine/schema.yml
    • >> tokens    C:/dev/sfprojects/jobeet/config/ProjectConfiguration.class.php
    • >> tokens    C:/dev/sfprojects/jobeet/config/properties.ini
    • >> tokens    C:/dev/sfprojects/jobeet/config/rsync_exclude.txt
    • >> tokens    C:/dev/sfprojects/jobeet/lib/form/BaseForm.class.php
  6. 簡化輸入的指令
    減重複重複輸入『c:\xampp\php\php.exe lib\vendor\symfony\data\bin\symfony』為『symfony』
    在C:\dev\sfprojects\jobeet\lib\vendor\symfony\data\bin下,有一個symfony.bat的批次檔,把這個批次檔複製到C:\dev\sfprojects\jobeet\目錄下,就可以輸入symfony來代替『c:\xampp\php\php.exe lib\vendor\symfony\data\bin\symfony』這串字串
    在symfony.bat這個批次檔中有提到,要建立一個PHP_COMMAND的環境變數,變數的值是php.exe的所在位置,我php.exe的所在位置是:c:\xampp\php\php.exe
  7. 建立前台應用程式:使用generate:app參數
    c:\dev\sfprojects\jobeet>symfony generate:app frontend
    使用symfony批次檔簡化輸入,產生以下目錄、檔案:
    預設啟用了兩個參數 --escaping-strategy 和 --csrf-secret,可以防止XSS和CSRF攻擊
    • >> dir+      C:\dev\sfprojects\jobeet\apps/frontend\config
    • >> file+     C:\dev\sfprojects\jobeet\apps/frontend\config/app.yml
    • >> file+     C:\dev\sfprojects\jobeet\apps/f...licationConfiguration.class.php
    • >> file+     C:\dev\sfprojects\jobeet\apps/frontend\config/cache.yml
    • >> file+     C:\dev\sfprojects\jobeet\apps/frontend\config/factories.yml
    • >> file+     C:\dev\sfprojects\jobeet\apps/frontend\config/filters.yml
    • >> file+     C:\dev\sfprojects\jobeet\apps/frontend\config/routing.yml
    • >> file+     C:\dev\sfprojects\jobeet\apps/frontend\config/security.yml
    • >> file+     C:\dev\sfprojects\jobeet\apps/frontend\config/settings.yml
    • >> file+     C:\dev\sfprojects\jobeet\apps/frontend\config/view.yml
    • >> dir+      C:\dev\sfprojects\jobeet\apps/frontend\i18n
    • >> dir+      C:\dev\sfprojects\jobeet\apps/frontend\lib
    • >> file+     C:\dev\sfprojects\jobeet\apps/frontend\lib/myUser.class.php
    • >> dir+      C:\dev\sfprojects\jobeet\apps/frontend\modules
    • >> dir+      C:\dev\sfprojects\jobeet\apps/frontend\templates
    • >> file+     C:\dev\sfprojects\jobeet\apps/frontend\templates/layout.php
    • >> tokens    C:/dev/sfprojects/jobeet/apps/frontend/config/settings.yml
    • >> file+     C:\dev\sfprojects\jobeet\web/index.php
    • >> file+     C:\dev\sfprojects\jobeet\web/frontend_dev.php
    • >> tokens    C:\dev\sfprojects\jobeet\web/index.php
    • >> tokens    C:\dev\sfprojects\jobeet\web/frontend_dev.php
    • >> rename    C:\dev\sfprojects\jobeet\apps/f...frontendConfiguration.class.php
    • >> tokens    C:\dev\sfprojects\jobeet\apps/f...frontendConfiguration.class.php
    • >> chmod 777 C:\dev\sfprojects\jobeet\web\uploads
    • >> chmod 777 C:\dev\sfprojects\jobeet\cache
    • >> chmod 777 C:\dev\sfprojects\jobeet\log
    • >> chmod 777 C:\dev\sfprojects\jobeet/symfony
    • >> chmod 777 C:/dev/sfprojects/jobeet/web/uploads/assets
    • >> dir+      C:\dev\sfprojects\jobeet\test/functional/frontend
  8. 目錄讀取權限的調整
    C:\dev\sfprojects\jobeet\cache  C:\dev\sfprojects\jobeet\log 必須使用完全控制(777)的讀取權限。
  9. Web Server網頁伺服器的設定
    在C:\Windows\System32\drivers\etc\目錄下的hosts檔案,加入一行:
    127.0.0.1         jobeet.localhost
    並在httpd.conf檔案的最後面,加入以下內容: (c:\xampp\apache\httpd.conf)
    <VirtualHost 127.0.0.1:80>
      ServerName testproject.localhost
      DocumentRoot "c:\dev\sfprojects\jobeet\web"
      DirectoryIndex index.php
      <Directory "c:\dev\sfprojects\jobeet\web">
        AllowOverride All
        Allow from All
      </Directory>
      Alias /sf "c:\dev\sfprojects\jobeet\lib\vendor\symfony\data\web\sf"
      <Directory "c:\dev\sfprojects\jobeet\lib\vendor\symfony\data\web\sf">
        AllowOverride All
        Allow from All
      </Directory>
    </VirtualHost>
  10. 測試專案
    http://jobeet.localhost
    http://jobeet.localhost/frontend_dev.php

symfony 1.4.14 開發環境安裝紀錄

  1. 工作環境需求:web server / PDO相容的資料庫(例如:(MySQL, PostgreSQL, SQLite...等) / php 5.2.4以上的版本。
    我使用Xampp 1.7.7版,php是5.3.8版,符合上述的需求。Xampp解壓縮在c:\xampp 。

  2. 建立專案目錄: c:\dev\sfproject
     (目錄名稱路徑上,應避免使用空白,如:My Documents)

  3. 將symfony framework放在 c:\dev\sfproject\lib\vendor目錄下。
    將下載取得的symfony-1.4.14.zip 解壓縮至:c:\dev\sfproject\lib\vendor\ 目錄下。

  4. 建立symfony專案(命名為TestProject):
    切換到 c:\dev\sfproject\ 目錄下,執行以下的命令:
    c:\dev\sfproject>c:\xampp\php\php lib\vendor\symfony\data\bin\symfony generate:project TestProject
  5. 執行以下的命令,測試剛才建立TestProject專案
    c:\dev\sfproject>c:\xampp\php\php lib\vendor\symfony\data\bin\symfony -V
    (-V這個參數會顯示symfony的安裝位置,安裝位置紀錄在C:\dev\sfproject\config\ProjectConfiguration.class.php,檔案中所紀錄的路徑應該是相對位置,不是絕對路徑,這樣在搬移專案目錄時,才不會出問題)
    出現以下訊息,代表TestProject建立成功:
    symfony version 1.4.14 (C:\dev\sfproject\lib\vendor\symfony\lib)

  6. 測試一下,在命令字元下,symfony可以提供哪些功能提示?
    c:\dev\sfproject>c:\xampp\php\php lib\vendor\symfony\data\bin\symfony

  7. 設定資料庫:(使用參數configure:database)
    假設以建立MySQL資料庫sftestdb,可以使用帳號root,密碼password,登入資料庫,建立資料庫設定檔的指令如下:
    c:\dev\sfproject>c:\xampp\php\php lib\vendor\symfony\data\bin\symfony configure:database "mysql:host=localhost;dbname=sftestdb" root password
    資料庫設定檔的存放位置:c:\dev\sfproject\config\database.yml

  8. 建立前台應用程式:(使用參數generate:app參數)
    c:\dev\sfproject>c:\xampp\php\php lib\vendor\symfony\data\bin\symfony generate:app frontend
    (執行上述指令後,會建立以下目錄、檔案)
    >> dir+      C:\dev\sfproject\apps/frontend\config
    >> file+     C:\dev\sfproject\apps/frontend\config/app.yml
    >> file+     C:\dev\sfproject\apps/frontend\...licationConfiguration.class.php
    >> file+     C:\dev\sfproject\apps/frontend\config/cache.yml
    >> file+     C:\dev\sfproject\apps/frontend\config/factories.yml
    >> file+     C:\dev\sfproject\apps/frontend\config/filters.yml
    >> file+     C:\dev\sfproject\apps/frontend\config/routing.yml
    >> file+     C:\dev\sfproject\apps/frontend\config/security.yml
    >> file+     C:\dev\sfproject\apps/frontend\config/settings.yml
    >> file+     C:\dev\sfproject\apps/frontend\config/view.yml
    >> dir+      C:\dev\sfproject\apps/frontend\i18n
    >> dir+      C:\dev\sfproject\apps/frontend\lib
    >> file+     C:\dev\sfproject\apps/frontend\lib/myUser.class.php
    >> dir+      C:\dev\sfproject\apps/frontend\modules
    >> dir+      C:\dev\sfproject\apps/frontend\templates
    >> file+     C:\dev\sfproject\apps/frontend\templates/layout.php
    >> tokens    C:/dev/sfproject/apps/frontend/config/settings.yml
    >> file+     C:\dev\sfproject\web/index.php
    >> file+     C:\dev\sfproject\web/frontend_dev.php
    >> tokens    C:\dev\sfproject\web/index.php
    >> tokens    C:\dev\sfproject\web/frontend_dev.php
    >> rename    C:\dev\sfproject\apps/frontend/...frontendConfiguration.class.php
    >> tokens    C:\dev\sfproject\apps/frontend/...frontendConfiguration.class.php
    >> chmod 777 C:\dev\sfproject\web\uploads
    >> chmod 777 C:\dev\sfproject\cache
    >> chmod 777 C:\dev\sfproject\log
    >> chmod 777 C:\dev\sfproject/symfony
    >> chmod 777 C:/dev/sfproject/web/uploads/assets
    >> dir+      C:\dev\sfproject\test/functional/frontend

  9. 簡化輸入的指令
    在上述的多個指令中,一直在重複輸入c:\xampp\php\php lib\vendor\symfony\data\bin\symfony
    在C:\dev\sfproject\lib\vendor\symfony\data\bin下,有提供一個symfony.bat的批次檔,把這個批次檔複製到C:\dev\sfproject\目錄下,就可以輸入symfony來代替c:\xampp\php\php lib\vendor\symfony\data\bin\symfony
    在symfony.bat這個批次檔中有提到,要建立一個PHP_COMMAND的環境變數,變數的值是php.exe的所在位置,我php.exe的所在位置是:c:\xampp\php\php.exe

  10. 目錄讀取權限的調整
    C:\dev\sfproject\cache  C:\dev\sfproject\log 必須使用完全控制(777)的讀取權限。

  11. Web Server網頁伺服器的設定:
    xampp的apache設定檔位於: c:\xampp\apache\httpd.conf
    將以下內容加到httpd.conf設定檔的最後面:
    NameVirtualHost 127.0.0.1:8080
    Listen 127.0.0.1:8080
    <VirtualHost 127.0.0.1:8080>
        DocumentRoot "c:\dev\sfproject\web"
        DirectoryIndex index.php
        <Directory "c:\dev\sfproject\web">
            AllowOverride All
            Allow from All
        </Directory>
        Alias /sf "c:\dev\sfproject\lib\vendor\symfony\data\web\sf"
        <Directory "c:\dev\sfproject\lib\vendor\symfony\data\web\sf">
            AllowOverride All
            Allow from All
        </Directory>
    </VirtualHost>

    除了使用8080port以外,也可以使用本機自訂的主機名稱,
    在C:\Windows\System32\drivers\etc\目錄下的hosts檔案,加入一行:
    127.0.0.1         testproject.localhost
    並在httpd.conf檔案的最後面,加入以下內容:
    <VirtualHost 127.0.0.1:80>
      ServerName testproject.localhost
      DocumentRoot "c:\dev\sfproject\web"
      DirectoryIndex index.php
      <Directory "c:\dev\sfproject\web">
        AllowOverride All
        Allow from All
      </Directory>
      Alias /sf "c:\dev\sfproject\lib\vendor\symfony\data\web\sf"
      <Directory "c:\dev\sfproject\lib\vendor\symfony\data\web\sf">
        AllowOverride All
        Allow from All
      </Directory>
    </VirtualHost>

  12. 完成了!(httpd.conf有變更,重新啟動Apache)

2011-09-25

【Netbeans 7.0.1 + Xampp 1.7.7 】設定啟用xdebug的除錯功能

Netbeans 7.0.1 增加了許多功能,讓人很想趕快試試看!
我主要的測試標的是php ide的相關功能,趁著這次的測試,順便把我目前使用的XAMPP由1.7.4版,推到1.7.7版。
在進入新功能的測試前,先把xdebug的除錯功能設定好。
從XAMPP 1.7.2版起,XAMPP已經將XDebug包含進來了,我們所要做的只是調整php.ini中的設定,相關變更說明如下:
  1. 在以下位置找到php.ini:XAMPP_HOME\php\php.ini。如果是使直接解壓縮的方式,XAMPP_HOME就是C:\XAMPP
  2. 搜尋zend_extension,將這一行的註解取消 zend_extension = "XAMPP_HOME\php\ext\php_xdebug.dll".
  3. 搜尋xdebug.remote_host,將這一行的註解取消 xdebug.remote_host=localhost. 並將 localhost 更改為 127.0.0.1
  4. 搜尋xdebug.remote_enable,將這一行的註解取消 xdebug.remote_enable = 0. 並將 0 更改 1.
  5. 搜尋xdebug.remote_handler,將這一行的註解取消 xdebug.remote_handler = "dbgp".
  6. 搜尋xdebug.remote_port,將這一行的註解取消 xdebug.remote_port = 9000.
  7. 儲存 php.ini ,儲存上列的修改內容
  8. 透過 XAMPP Control Panel 重新啟動 Apache server.

參考資料來源:
http://netbeans.org/kb/docs/php/configure-php-environment-windows.html#installAndEnableXDebug

2011-03-21

Xampp中php的 timezone 設定

Xampp中的php.ini,[Date]中的date.timezone沒有給預設值
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =

; http://php.net/date.default-latitude
;date.default_latitude = 31.7667

; http://php.net/date.default-longitude
;date.default_longitude = 35.2333

; http://php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.583333

; http://php.net/date.sunset-zenith
;date.sunset_zenith = 90.583333

所以部分的程式再執行的時候,會出現如下的Warning
Warning: strftime() [function.strftime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for '8.0/no DST' instead in C:\xampp\htdocs\Smarty307\libs\sysplugins\smarty_internal_templatecompilerbase.php on line 59

避免這個Warning警告訊息的作法:

  1. 在php.ini的[Date]中加入:date.timezone="Asia/Taipei"
  2. 或在程式中加入 date_default_timezone_set("Asia/Taipei")

2011-03-16

如何讓php POS的中文資料可以正常顯示?

  1. 將資料庫CREATE為預設使用utf8的資料庫,CREATE DATABASE dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_gerenal_ci;
  2. 修改database/database.sql,將每個資料表的DEFAULT CHARSET 由 latin1 改為 utf8
  3. 手動以database.sql產生預設的資料表格
  4. http://www.phppointofsale.com/
本文由作者本人原發表於噗浪:(http://www.plurk.com/bod_idv_tw)
http://www.plurk.com/p/b6v13w?ref=nf

2011-02-13

在Linux作業環境下,如何將指定的檔案,複製到所在目錄下的所有子目錄內?

如果可以登入系統,直接使用find指令列出符合條件的資料,再用xargs參數代換的方式,結合cp指令完成複製的動作。
例:要複製的檔案市鎖在目錄下的php.ini ---> find . -type d | xargs cp php.ini '{}' /

但很多情況下,要登入系統是有限制的,這時候可以透過php的程式,來執行想要進行的複製動作:
其中:--verbose 是指 explain what is being done
執行的範例:
... ...
`php.ini' -> `themes/default/./php.ini'
`php.ini' -> `themes/default/modules/./php.ini'
`php.ini' -> `themes/default/modules/system/./php.ini'
`php.ini' -> `themes/default/icons/./php.ini'
`php.ini' -> `themes/zetagenesis/./php.ini'
`php.ini' -> `themes/zetagenesis/xotpl/./php.ini'
`php.ini' -> `themes/zetagenesis/modules/./php.ini'
`php.ini' -> `themes/zetagenesis/modules/system/./php.ini'
`php.ini' -> `themes/zetagenesis/language/./php.ini'
`php.ini' -> `themes/zetagenesis/language/english/./php.ini'
`php.ini' -> `themes/zetagenesis/icons/./php.ini'
`php.ini' -> `themes/zetagenesis/icons/action/./php.ini'
`php.ini' -> `themes/zetagenesis/icons/users/./php.ini'
`php.ini' -> `themes/zetagenesis/img/./php.ini'
`php.ini' -> `themes/zetagenesis/css/./php.ini'
`php.ini' -> `themes/bod_blue/./php.ini'
`php.ini' -> `themes/bod_blue/images/./php.ini'
... ...

本文原由作者本人於 2010-06-12 整理發表於 http://bod.tw/modules/tadnews/index.php?nsn=8

2011-02-11

[LDAP vs PHP]:使用php連接LDAP,進行資料的新增、刪除、修改、查詢...

php提供了許多的LDAP相關的函數,可以透過這些函數,連接LDAP server,並進行資料的管理維護作業,如果沒有一套LDAP的管理工具,也懂得PHP,可以考慮自己寫php的程式,來管理ldap。除了以下的函數,還有更多的函數可以選用...

  1. 確定php的LDAP support已enabled 。
  2. 使用 ldap_connect(hostname, port) 連接LDAP,傳回值為一resource id。
  3. 使用 ldap_bind(link_identifier, bind_dn, bind_password) 登入LDAP,傳回值為bool值。
  4. 使用 ldap_search(link_identifier, base_dn, filter, attributes, ...) 取得查詢值,傳回值為 resource id。
  5. 使用 ldap_get_attributes(link_identifier, result_entry_identifier) 取得查詢結果的資料,傳回值為array。
  6. 使用 ldap_modify(link_identifier, dn, entry) 進行資料修改,傳回值為bool值。
  7. 使用 ldap_mod_add(link_identifier, dn, entry) 進行資料新增,傳回值為bool值。
  8. 使用 ldap_mod_del(link_identifier, dn, entry) 進行資料刪除,傳回值為bool值。
  9. 使用 ldap_mod_replace(link_identifier, dn, entry) 進行資料修改,傳回值為bool值。


※ LDAP search filter syntax基本語法:

  1. 語法參考:RFC2254 The String Requesentation of LDAP Search Filter
  2. 例一:(|(cn=HannibalHuang)(cn=HuangHannibal))
  3. 例二:(|(cn=HannibalHuang)(&(ou=People)(cn=HuangHannibal)))

本文原由作者本人於 2010-07-04 整理發表於 http://bod.tw/modules/tadnews/index.php?nsn=23