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

2012-11-11

在 CodeIgniter 使用圖形驗證

◎方式一: 使用內建的 CAPTCHA Helper
   在使用手冊中, 建議用 DB 來記錄 captcha word; 個人是比較習慣使用 session 來記錄, 這樣可以省掉 DB 的操作。步驟:

1. 在 controller 類別的建構式中載入 CAPTCHA Helper 和 SESSION Class。
$this->load->library('session');
$this->load->helper('captcha');

2. 建立一個目錄用來暫存 captcha 圖片, 注意該目錄必須設定為 writeable。以下的範例是在 document root 建立名為 captcha 的目錄, 目錄裡的圖形檔過期後會自動被刪除。

3. 在 controller 類別中定義產生圖形的方法:
    private function captcha_img() 
    {
        $pool = '0123456789';
        $word = '';
        for ($i = 0; $i < 4; $i++){
            $word .= substr($pool, mt_rand(0, strlen($pool) -1), 1);
        }
        $this->session->set_userdata('captcha', $word);
        $vals = array(
            'word'  => $word,
            'img_path'  => './captcha/',
            'img_url'  => $this->data['baseURL'] . 'captcha/',
            'expiration' => 1200
            );
        $cap = create_captcha($vals);
        return $cap['image'];
    }
●   $word 為亂數產生的字串, 可以自訂產生的方式。
●   接著將 $word 值設定到 session 存起來, 以方便之後的比對。
●   $vals 為建立 captcha 時的設定:
   ○   word: 欲顯示的文字
   ○   img_path: 暫存圖形的目錄
   ○   img_url: 圖形目錄的 URL
   ○   expiration: 過期的時間, 單位為秒
●   $cap['image'] 會是包含圖片路徑的 <img> 標籤的字串

4. 比對驗證碼:
$this->input->post('captcha') == $this->session->userdata('captcha')

 CAPTCHA Helper 優點是使用起來方便, 不需額外安裝其它外掛; 缺點是較為陽春, 預設大小為 150 * 30, 外觀幾乎不能用設定方式更改。

2010-12-15

開發 CodeIgniter 時,NetBeans 的程式碼自動完成設定

CodeIgniter auto complete with Netbeans

原理是把以下的註解格式存成 php 檔,放置 nbproject 目錄內

/**
* @property CI_Loader $load
* @property CI_Form_validation $form_validation
* @property CI_Input $input
* @property CI_Email $email
* @property CI_DB_active_record $db
* @property CI_DB_forge $dbforge
*/

2008-03-10

在 CodeIgniter 裡建立 SabreAMF 的 gateway

承上一篇 結合 CodeIgniter 和 SabreAMF
接著是建立 gateway, 請參考 Using Flex 2 RemoteObject and SabreAMFGetting started with SabreAMF 的作法。
我們會將 gateway 放在 Controllers 裡。Server side remoting 程式則是放在 Models 裡。
在 ci_project/system/application/controllers/ 新增檔案 gateway.php
<?php
class Gateway extends Controller {
function Gateway()
{
parent::Controller();
}

function index()
{
require_once('SabreAMF/CallbackServer.php');
try {
$callbackServer = new SabreAMF_CallbackServer();
$callbackServer->onInvokeService = array($this, 'invokeService');
$callbackServer->exec();
}catch(Exception $e){
echo $e->getMessage();
}
}

function invokeService($service, $method, $data) {
$modelPath = str_replace( '.', '/', $service);
$this->load->model($modelPath, 'amf_model');
return call_user_func_array( array( $this->amf_model, $method ), $data );
}
}
?>

測試的 Models 放在 ci_project/system/application/models/test/test_model.php
<?php
class Test_model extends Model
{
function Test_model()
{
parent::Model();
}

function myMethod($d1, $d2)
{
$ret = array(
array( 'ID' => $d1, 'name' => 'okok', 'phone' => $d2 ),
array( 'ID' => '35712', 'name' => 'Esbd V. Mb', 'phone' => '235-4263' ),
array( 'ID' => '46823', 'name' => 'Ftce W. Nc', 'phone' => '346-5374' ),
);
return $ret;
}
}
?>

Flash CS3 AS3 的 client 測試
import fl.data.DataProvider;
var nc:NetConnection = new NetConnection();
//nc.objectEncoding = ObjectEncoding.AMF3;

var onResult:Function = function(result:Object) {
QopDump.echo(result);
dg.dataProvider = new DataProvider(result);
};
var onStatus:Function = function(info:Object) {
QopDump.echo(info);
};
var responder:Responder = new Responder(onResult, onStatus);
nc.connect("http://localhost/ci/?/gateway");

nc.call("test.Test_model.myMethod", responder, ["888", "666"]);

Flex 的 client 測試
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:RemoteObject id="ro"
destination=" "
endpoint="http://localhost/ci/?/gateway"
source="test.Test_model"
result="resultHandler( event )"
fault="faultHandler( event )">
</mx:RemoteObject>
<mx:Script>
<![CDATA[
import mx.rpc.events.*;
import mx.controls.Alert;
import mx.rpc.*;

private function load():void {
ro.myMethod('first','123-456789');
}
private function resultHandler( event:ResultEvent ):void {
Alert.show( QopDump.go(event.result) );
dg.dataProvider = event.result;
}
private function faultHandler( event:FaultEvent ):void {
Alert.show( event.toString() );
}
]]>
</mx:Script>
<mx:Button click="load()" label="Load" />
<mx:DataGrid id="dg" />
</mx:Application>

結合 CodeIgniter 和 SabreAMF

參考這篇 將 Zend Framework 放進 CodeIgniter
將符合 PEAR 規定的 library 掛上 CodeIgniter
1. 設定 config
修改 ci_project/system/application/config/config.php
$config['enable_hooks'] = TRUE;


2. 增加 hooks 設定
於 ci_project/system/application/config/hooks.php 增加
$hook['pre_controller'][] = array(
'class' => 'Pearroot',
'function' => 'index',
'filename' => 'pearroot.php',
'filepath' => 'hooks',
);


3. 增加 hooks 程式
於 ci_project/system/application/hooks/ 裡增加 pearroot.php
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Pearroot
{
function index()
{
set_include_path(get_include_path() . PATH_SEPARATOR . BASEPATH . 'pearroot/');
}
}
?>


4. 放置 SabreAMF 目錄
建立 ci_project/system/pearroot/ 目錄並將 SabreAMF/ 放置其底下, 就完成初步的設定。
下一篇 在 CodeIgniter 裡建立 SabreAMF 的 gateway

FB 留言