2012年6月22日 星期五

Adobe Shadow: 好用的Mobile Web Debug工具


開發Mobile Web,Debug是一件很麻煩的事
Adobe Shadow提供了很方便的debug工具
可以把PC上Chrome瀏覽的畫面即時顯示在Mobile Device上
還可以讓PC Chrome 顯示Device上操作的相關訊息

簡單描述安裝程序

  1. 在PC上安裝Shadow 應用程式
  2. 在PC上的Chrome安裝 Shadow Extendtion
  3. 在Device(android,iphone ,ipod)安裝shadow app
  4. 在device上開啟app,連線pc,會得到一組序號
  5. 開啟pc上的chrome,執行shadow extension,會要你輸入device提供的序號
  6. 完成連線,Chrome上開的網即同時顯示在device上
  7. 在chrome shadow顯示的device<>按下去,會開啟debug console
  8. 選擇要debug的target,之後device上的動作,訊息都會顯示在pc上


下載網址 http://labs.adobe.com/downloads/shadow.html

2012年5月18日 星期五

Backbone.js Model 07︰Sample 使用Post執行Save and Delete

Backbone.js在與Server執行CRUD的動作,也就是Model的fetch,save,destroy等Method預設是以REST來與Server溝通,因為在REST裡update與delete是用到 HTTP的PUT與DELETE Method
如果你的Server不支援,只允許使用POST與GET
以下是處理方式

Client端
一.開啟設定使用emulateHTTP與emulateJSON
當開啟emulateHTTP時,Backbone會將原本應該用PUT與DELETE  Method與Server溝通,改成以POST Method來送資料,並另外多傳遞一個POST參數_method
1.執行model.save()
原本會以PUT HTTP Method與Server溝通
會變成以POST HTTP Method與Server溝通,
並自動加上一個_method='PUT'的參數送出

2.執行model.destroy()
原本會以DELETE HTTP Method與Server溝通
會變成以POST HTTP Method與Server溝通,
並自動加上一個_method='DELETE'的參數送出

3.開啟emulateJSON
會將要傳遞的model資料序列化後,以一個POST參數model傳遞給server
Backbone.emulateHTTP = true;
Backbone.emulateJSON = true;

二.model執行CRUD相關參數區別
1.model.sync 接收到method值為
"create","read","update","delete"
2.REST Server接收到的HTTP METHOD為
"POST","GET","PUT","DELETE"
3.非REST Server接收到的$_POST['_method']為
"POST","GET","PUT","DELETE"

三.改寫Model SYNC
所有與Server溝通的動作,都會去執行到Sync,當model或collection執行CRUD時,會先去檢查model或Collection內是否有定義sync,如果有就會執行內部的synce,若沒有就會去執行系統global的Backbone.sync

要連結Server的URL,系統會先去檢查Sync內的options.url是否有設定,如果有會採用這裡的url來與Server溝通,若沒有才會去檢查model或collection內的url設定值

所以要讓不同的執行動作連結不同的Server url,規則就必須是寫在sync內
以下是model 改寫sync對應CRUD提供不同的url sample
define(['_Backbone'], function(Backbone) {
    return Backbone.Model.extend({
        sync:function(method, model, options){      
            switch(method){
            case "create":
                options.url =API_Save;
                break;
            case "update":
                options.url = API_Update+"/"+this.id;
                break;
            case "delete":
                options.url = API_Delete+"/"+this.id;
                break;           
             }            
            return Backbone.sync(method, model, options);
        }
    })    
});


Server端(以PHP為例)
一.判斷Client端要執行的動作
$cmd=$_POST['_method'];
$id=$_GET['id']
switch($cmd){
    case "PUT":
        $this-&gt;_update($id);
        break;
    case "DELETE":
        $this-&gt;_delete($id);
        break;
    case "GET":
      $this-&gt;_read($id);
        break;
    case "POST":
      $this-&gt;_create($id);
        break;                    
}
二.取得model資料
$model=$_POST['model'];
if(ini_get("magic_quotes_gpc")=="1"){
    $model=stripslashes($model);
};        
$obj = json_decode($model);
就可以用$obj.prop..形式來讀取傳進來的json相關屬性了

2012年5月15日 星期二

PHP CodeIgniter 安裝與設定

一.環境設定
目標是建置一個可以多個Project共用的使用環境
1.下載CodeIgniter放置於Web目錄下
(或其他主機目錄均可),所有App Project都將共用裡面的system folder
2.Web目錄下建置,CI_Application目錄,用來放置要開發的所有App目錄
3.在CI_Application目錄下,建立新目錄(ex:MyApp1)
在目錄下建立.htaccess檔案,並Copy CodeIgniter下app目錄與index.php到此目錄下, 這樣一個目錄即代表一個App
檔案結構
/ci_application/MyApp1/.htaccess
/ci_application/MyApp1/index.php
/ci_application/MyApp1/app

二.Apache rewrite設定
1.開啟rewrite mod
ubuntu:
cd /etc/apache2/mode-enabled
touch rewrite.load
寫入 LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
window
開啟 conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
2.http conf設定
ubuntu:
開啟 /ect/apache2/sites-avilable/default
window:
開啟 conf/httpd.conf
在相關的<directory>內</directory><br />
AllowOverride All(none都改成All)

三.App Project設定
1..htaccess設定
RewriteBase / 設定在這App內要作rewirte以哪個目錄當作這App根目錄
例
RewriteBase /ci_application/myapp1/
2.index.php設定
設定$system_path與$application_folder,設定的字串可以使用相對路徑寫法
例:目前的設定都是把application目錄放在Project下
web_root/ci_application/MyApp1/app
$application_folder='app'

system目錄統一放在CodeIgniter目錄下
web_root/codeIgniter/system
$system_path='../../codeIgniter/system'
3.app內的config.php設定
//設定這個APP對應到的網址
$config['base_url']    = 'http://192.168.2.104/ci_app/myApp1/';
//設定index_page為空白,就可以讓網址上看不到index.php(只看到路徑/ci_application/myApp1/)
$config['index_page'] = '';
4.app內的database.php設定
設定要使用的db連線相關資訊

2012年4月20日 星期五

SoundManager 延遲初始化

在使用JavaScript做音樂播放上
SoundManager是個很好的工具,可以偵測環境以Flash或HTML5做播放
不過在設計上有一個很大的問題是
當載入SoundManager的JS檔案
他就會立刻initial產生出一個window.soundManager物件
讓你可以用global方式使用window.soundManager做聲音的控制

有問題的是
在物件初始化完成之前
你必需要使用soundManager.url 設定要使用的swf檔案路徑

以官網上的sample來看,設定url的時間點都是在跟init的程序搶時間
除非你在網頁上以inline的方式寫入soundManager.url
否則如果這設定在init程序完成後才設定,那麼soundManager抓不到swf
而造成使用失敗

要如何禳soundManager可以延遲init,以保證soundManager可以正常運作
1.在載入soundManager.js前,先設定
window.SM2_DEFER = true;

2.在載入soundManager.js後
執行
window.soundManager = new SoundManager();    
soundManager.url = "swf/";
soundManager.beginDelayedInit();
這樣就可以保證可以安全運作了

2012年4月7日 星期六

以iScroll建構Mobile Web頁面

希望建制一個有header content footer的網頁,header與footer固定在上下
content可以scroll的頁面,scroll部份使用iScroll來處理
相關注意要項如下
一.網頁
 <div class="wrapper">  
      <div class='header'></div>  
      <div id='myContent' class="content">  
           <div class='scroller'><div class='itemContainer'></div></div>  
      </div>  
      <div class="footer"></div>  
 </div>  
要scroll的內容下需有一個唯一的子節點(div或ul都可),iScroll會對這個div做scroll
在這裡就是對content下的scroller這div
也就是說你在這下面塞的東西都會被scroll

二.CSS
設定一個有footer有header的頁面
1.架構
wrapper,content,footer,header,這四個主要架構要以
position:absolute來定位,而在z-index層次上
wrapper在最下層
content在中間層
footer,header在最上層
在這主要架構下的內部分層,就不需要用absolute來定位
2.尺寸大小
header與footer在高度上定好絕對的高度,寬度以100%設定來與wrapper保持同樣寬度
content因為可能會因為螢幕大小變化或旋轉螢幕而需要調整
這部份就需要靠JS動態改變高度
3.wrapper 整個頁面包裝
.wrapper{
  position:absolute;z-index:1;//以絕對位置設定當作最下層layer
  top:0;left:0;//設定貼在browser的最左上方
  margin:0;padding:0;
  width:300px;//可以用%設定
  height:300px;     
}
4.header 
.header{
  position:absolute;z-index:3;//設定在最上層
  top:0;left:0;//設定貼在wrapper的靠左上方
  margin:0;padding:0;
  width:100%;//設定與wrapper相同寬度
  height:50px;//設定header的絕對高度     
}
5.footer
.footer{
  position:absolute;z-index:3;//設定在最上層
  bottom:0px;left:0;//設定貼在wrapper的靠左下方
  margin:0;padding:0;
  width:100%;//設定與wrapper相同寬度
  height:50px;//設定header的絕對高度     
}
6.content
.content被設定到iscroll,重點是
.content要設定overflow:auto,高度則透過js來設定到達(wrapper-header-footer)高度
.content以下的container絕對不要設定高度,否則內容就無法scroll了
.content{
  position:absolute;z-index:2;//設定在中間層
  top:50px;//設定在header的下方,也就是設定header的高度
  left:0;
  margin:0;padding:0;
  width:100%;
  height:200px;//設定wrapper扣掉header與footer後的高度,這部份由js動態改變值
  overflow:auto;//設定內部的所有內容在超過的時候以scroll顯示
  >.scroller{
    width:100%;//注意千萬不要設定height,內容超過時才可以scroll
    >.itemContainer{
      width:100%;//注意千萬不要設定height,內容超過時才可以scroll
    }       
  }
}

三.JS
1.instance
要當作scroll的DOM container確定已經產生好才去產生iScroll
設定container要以id設定,不要用class
window.scroll=new iScroll('myContent',{
  hScrollBar:false,
  vScrollBar:true,
  hideScrollBar:false
})
2.refresh
在更新container內容,後需執行refresh動作,
且包在setTimeout內執行
setTimeout(function(){
  window.scroll.refresh();
},0)