2011年3月9日水曜日

kohana3.1.xでファイルのアップロード

kohana3.1.xで、ファイルのアップロードを作る機会があったので備忘録。

kohana3.0.x から 3.1.xの移行でバリデーション周りが変更になったので注意。


View (HTML)

<form action="/" method="post" accept-charset="utf-8" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="Upload" />
</form>


Controller

public function action_upload()
 {
  
  if (isset($_FILES['file'])) {
   
   // バリデーションインスタンスを作成
   $validation = Validation::factory($_FILES);
   
   // バリデーションルールを設定
   $validation->rules('file',
    array(
     array('Upload::not_empty'), 
     array('Upload::valid'), 
     array('Upload::type', array(':value', array('jpg', 'png', 'gif'))), 
     array('Upload::size', array(':value', '2M')), 
    )
   );
   
   // チェックして
   if ($validation->check()){
    // アップロード
    $file_name = Upload::save($_FILES['file'] /*[, $filename, $directory, $chmod ]*/);
    
   } else {
    // エラー処理
    $validation->errors('error');
    
   }
  }
 }

message (error.php)

return array
(
 'file' => array(
  'Upload::not_empty' => 'ファイルが指定されていません。',
  'Upload::valid' => 'データが不完全です。',
  'Upload::type' => '許可されていないファイルタイプです。',
  'Upload::size' => 'ファイルサイズ制限以上のファイルです。',
 ),
);

解説


バリデーション Validation::factory();
バリデーションインスタンスを作成します。3.0.xでは'Validate::'だったので注意です。

バリデーションルールの設定 Validation::rules();
バリデーションルールを設定します。こちらも3.0.xから変更があり、引数の渡し方が違っていますので注意です。
今回はファイルアップロードですので、Uploadクラス(ヘルパー)のテストを使用しています。
Upload::not_empty
空でないかチェック
Upload::valid
ファイル情報が適正かチェックします。必須項目の場合は、このルール前にnot_emptyのチェックを行ってください。
Upload::type
拡張子をチェックします。第1引数は(3.0.xとは違い)ファイルを指定します。ここでは3.1.xから追加されたコンテキスト変数':value'(フィールドの値)を使用します。第2引数は、許可する拡張子の文字列を配列で指定します。
Upload::size
ファイルサイズをチェックします。第1引数はファイルを指定し、第2引数は最大ファイルサイズを指定します。書式は、数値+単位(B, K, MiB, GB, etc..)になります。

アップロード処理 Upload::save()
第1引数が、アップロードするファイルのデータ。必須。
第2引数$filenameは、アップロード後のファイル名を任意の名称にする場合に指定。指定がなければ、タイムスタンプ+デフォルト名になり、Upload::$remove_spacesがTRUEの場合(デフォルト)はファイル名に含まれるスペースは、'_'(アンダーバー)に変換されます。
第3引数$directoryは、アップロードするディレクトリを指定します。デフォルト値は、Upload::$default_directoryに保持されており、'upload'です。
第4引数は、アクセス権限を指定します。デフォルトは0644です。
戻り値は、アップロード後のファイルのフルパスが返ってきます。

エラー処理
$validation->errors()の引数は、メッセージファイルのファイル名を指定します。
メッセージファイルの指定があれば、メッセージ配列から設定したメッセージを返し、メッセージファイルの指定がなければ失敗したルール名('Upload::not_empty'など)が返ります。

2011年3月3日木曜日

jQuery Templates plugin(jquery-tmpl)で{{if}}を使ってみた

jQueryのテンプレートプラグイン「jQuery Templates Plugin (jquery-tmpl)」で{{if}}を使ってみました。

書式

{{if fieldNameOrExpression}} content {{/if}}
'fieldNameOrExpression'は、データアイテムの名前、Javascriptの関数や式を評価します。


値があれば、タグの中身を表示する
//json
{[
    {title:'Title1', description:'Description'},
    {title:'Title2'}
]}

//tmpl
<p>{{if description}} ${title} {{/if}}</p>

//result
<p>Title1</p>

値の内容が1件以上であれば、タグの中身を表示する
lengthは、tmplデータアイテム名+'.length'で求められ1つ以上でTRUEになります。
//json
{[
    {title:'Title1', options:['opt1','opt2']},
    {title:'Title2', options:[]}
]}

//tmpl
<p> ${title}{{if options.length}} has options{{/if}}</p>

//result
<p>Title1 has options</p>
<p>Title2</p>


比較演算子で評価
通常のjavascriptでのif式のように評価します。
通常と違い、tmplデータアイテム名はコーテーションで囲まず(上記例と同様)に使用するようです。
//json
{[
    {title:'Title1', type:'hidden'},
    {title:'Title2', type:'show'}
]}

//tmpl
<p>{{if type == 'show'}}${title}{{/if}}</p>

//result
<p>Title1</p>

javascriptで簡単に数値かどうか確認(Numeric)

javascriptで変数を数値かどうか確認したくなりました。

簡単に。

整数値の場合
関数parseInt(文字列の引数をパースし、指定された基数の整数を返す)を用いてチェックします。
var num = チェックする変数
if ( num == parseInt(num)){
    // 整数値
} else {
    // 整数値でない
}

浮動少数(少数点以下を含む)値の場合
関数parseFloat(文字列の引数をパースし、浮動小数点数を返す)を用いてチェックします。
var num = チェックする変数
if ( num == parseFloat(num)){
    // 数値
} else {
    // 数値でない
}

2011年3月2日水曜日

ホワイトスペースについて

Kohana3.1.x検証中に、APPPATH/config/以下のコンフィグファイルが読み込めない(syntax errorが発生)現象に見舞われました。ガイド(Getting Started)のソースで検証していたのでコードに問題がないと思い込んでいたのが愚かしいですが、原因はブラウザからのコピペ時に半角でないスペースが含まれていた事でありました。

Kohanaというかphpというか、もっと一般的なミスでありました。
全角スペースでなかったので見落としてしまっていたのです。
ああ恥ずかしい。

具体的には、文字参照でいうところの'&#160;'や'&nbsp;'が空白行に入っており、削除すると解決しました。

検証

wikidepiaのスペース#「コンピュータにおけるスペース」項にある一覧表の文字参照をデコードし、テスト用のソースにペーストして走らせてエラーがでるか確認しました。

Bloogerをスマートフォンから閲覧する(Bloggerモバイルテンプレート編)

「BloogerをiPhoneで閲覧したい」と思い調べていたら、ブロッガーインドラフト(Blogger in Draft)にオフィシャルのモバイルテンプレートが、2010年12月17日付けで発表されていました。

Blogger in draft : New mobile templates for reading on the go

Bloogerのドラフト版管理画面から「モバイル テンプレート(ベータ版)」を使用できます。

かんたんな導入方法
  1. http://draft.blogger.com/へアクセス(ログイン)。
    または、Dashboardの下の方にある「その他のコンテンツ>ツールとリソース>Blogger in Draft」をクリック
  2. 「設定>メールとモバイル」へ移動
  3. 「モバイル テンプレート(ベータ版)」の「モバイル テンプレートを表示する」の項目で、「はい。テンプレートのモバイル バージョンを携帯端末で表示する。」を選択して保存
  4. 完了。簡単。

特長
  • スマートフォンからアクセスした時にモバイルビューに自動的にリダイレクト
  • いくつかのテンプレートをサポート
  • いくつかのガジェットをサポート(Header, Blog, Profile, AdSense, Attribution.)
  • AdSenseが設定されている場合は、モバイル版AdSenseが表示されます
  • コメントが作成できます
  • ビデオを閲覧できます


簡単かつよく出来てますね。
これを有効にして完了としました。

2011年3月1日火曜日

kohana3.1.xのDebugクラス

Kohana3.1.xに移行作業中、Kohana::debug()がsyntax errorになるので、調べてみましたら、どうも、Kohana::debugは、Debug::varsに変更されている模様。

ユーザーガイド


Kohana 3.0.xの場合
// Display a dump of the $foo and $bar variables
echo Kohana::debug($foo, $bar);

// Display this line of source code
echo Kohana::debug_source(__FILE__, __LINE__);

// Displays "APPPATH/cache" rather than the real path
echo Kohana::debug_path(APPPATH.'cache');


Kohana 3.1.xの場合
// Display a dump of the $foo and $bar variables
echo Debug::vars($foo, $bar);

// Display this line of source code
echo Debug::source(__FILE__, __LINE__);

// Displays "APPPATH/cache" rather than the real path
echo Debug::path(APPPATH.'cache');

Bloogerをスマートフォンから閲覧する(Blogger Touch編)

「BloogerをiPhoneで閲覧したい」と思い調べてみました。

Blogger Touch

Bloogerのサイトフィード(Atom)を読み込んで、まるでWordPressのPlugin「WPtouch」のようなテーマで表示できるウェブサービス。

かんたんな導入方法
  1. Blogger Touch」サイトへアクセス
  2. Mobile Edition Maker: create mobile edition/view」をクリック
  3. BloogerのURLを入力するフォームが表示されるので、ブログのURLを入力して、「GO」ボタンをクリック
  4. Googleアカウントに飛ばされるので、「メール」と「パスワード」を入力して「ログイン」ボタンをクリック
  5. 認証が成功するとBlogger Touchに飛ばされ、Step 1:Enter the basic infoが表示されます。
  6. ここでbloggertouchでの転送先URL(ID)を入力します。http://bloggertouch.appspot.com/〇〇
  7. 次にStep 2:Insert Code into the sidebarが表示されます。
  8. 「Step 2: 1.Goto: Site Feeds」では、Bloogerの「設定>サイトフィード」へ移動して、「ブログフィードを許可」を「完全」に変更して保存してください。と書いてあります。
  9. 「Step 2: 2.Add Code」は、ボタンになっており、押すとBloogerの管理画面「ページ要素を追加」に飛ばされ、「ブログを選択」して「ウェジェットを追加」ボタンを押すと、テンプレートに追加されます。
  10. 最後に「Step 3: Verification」では、コード正常に追加されているか確認して完了です。
  11. 完了するとDashboardが表示され、登録されているブログの一覧が表示されます。
  12. Dashboardでは、各ブログ設定の細かな編集、削除、コードの発行などができます。

Blogger Touchの特長
  • Google Analyticsが設定されている場合、特別な設定なしにそのまま引き継がれます
  • AdSenseが設定されている場合、モバイル版AdSenseに変換され表示されます。(現在調整中))
  • 検索ウェジェットが使用できます。
  • ページ繰りが使用できます。
  • ページが使用できます。
  • 無料です



と、ここまで調べて設定したりしたのですが、ブロッガーインドラフトにオフィシャルのモバイルテンプレートが、2010年12月17日付けで発表されていました。

2011年2月17日木曜日

javascriptでキャピタライズ(一文字目を大文字にする)

一文字目だけを大文字にする


toUpperCaseを使って
String.prototype.capitalizeFirstLetter = function(){
 return this.charAt(0).toUpperCase() + this.slice(1);
};

replaceを使って
String.prototype.capitalizeFirstLetter = function(){
 return this.replace(/^\w/, function($0) { return $0.toUpperCase();});
};

動作例
var str = 'test strings';
alert(str.capitalizeFirstLetter());
// Test string

単語の先頭を大文字化する

String.prototype.capitalize = function(){
 return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
};

動作例
var str = 'test strings';
alert(str.capitalize());
// Test String

2011年2月15日火曜日

kohana3.0からkohana3.1にアップデート

いつのまにやら、kohana3.0からkohana3.1にアップデートしていました(汗


UPGRADING FROM V3.0

Kohana 3.0 to 3.1 Upgrade Troubleshooting


内容をチェックしたいところですが、時間が無いのでとりいそぎメモ。
内容をチェックして、なんとなく訳したのでメモ。


kohana3.0でリダイレクトする

phpフレームワークのkohana3.0でリダイレクト

Controllerクラスにて、equest::instance()->redirect()を用いて、リダイレクト先を指定します。

リダイレクトの例


public function action_hoge()
{
    Request::instance()->redirect('hoge/index');
}

kohana3.0でHTTP Status codeを出力する

phpフレームワークのkohana3.0でHTTP Status codeを出力します。

Controllerクラスにて、$this->request->statusを用いてコード番号を指定します。

404 Not Foundの例


public function action_hoge()
{
    // HTTP Status code.
    $this->request->status = 404;
}


追記: kohana3.1.xの場合

Controllerクラスにて、$this->request->status()メソッドを用いて、引数にコード番号を指定します。
public function action_hoge()
{
    // HTTP Status code.
    $this->response->status(404);
}

2011年2月14日月曜日

kohana3.0でjson形式で出力する

phpフレームワークのkohana3.0でjson形式で出力する時のメモです。

Controllerクラスの出力を以下のように、何らかの連想配列をjson_encodeで送ります。
Content-Typeの指定方法を忘れるのでメモです。

public function action_hoge()
{
    $hoge = array(...); //何らかの連想配列

    $this->request->headers['Content-Type'] = 'application/json';
    $this->request->response = json_encode($hoge->get_entries());
}

追記: Kohana3.1.xの場合

request / responseクラスが別れたので記述が変更になります。

public function action_hoge()
{
    $hoge = array(...); //何らかの連想配列

    $this->response->headers('Content-Type', 'application/json');
    $this->response->body(json_encode($data));
}

jQuery Templates plugin(jquery-tmpl)を使ってみる

jQuery1.5でコア組み込まれるかと思っていた、テンプレートエンジン「jQuery Templates Plugin」を使ってみました。(組み込まれていると思って書いて、"has no method 'tmpl'"ってエラーがでてやっと気がついた)


使用するには、プラグインファイルを読み込みます。
jquery v1.4.2以上が必要です。


ファイルの読み込み


Microsoft CDNから読み込んでみる場合
<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.5.min.js"></script>
<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js">


参考サイト



使用メモ


繰り返しタグ{{each}}{{/each}}の2重構造でも動いた

{{each 配列名}}でjsonデータに同名の配列があり、lengthが2以上だったら、自動的にループするのですが、配列の中に配列がある構造でも問題なく動作(ループ)しました。すばらしい。
//tmpl
{{each categories}}
<h2>${categoryName}</h2>
 <ul>
  {{each lists}}
   <li><a href="#${url}">${name}</a></li>
  {{/each}} 
 </ul>
{{/each}}

//json
 {
 "categories" : [
  { "categoryName" : "category1", "lists" : [
   { "name" : "sample1", "url" : "http://url1.sample/"},
   { "name" : "sample2", "url"  : "http://url2.sample/"}
  ]},
  { "categoryName" : "category2", "lists" : [
   { "name" : "sample3", "url" : "http://url3.sample/"},
   { "name" : "sample4", "url" : "http://url4.sample/"}
  ]}
 ]
}

2011年2月7日月曜日

bloggerにSyntaxHighlighterをインストールする

技術メモなのでシンタックスハイライターは必須ですからして初めにインストールしておきます。

今回インストールするのは、SyntaxHighlighter - Alex Gorbatchevにしました。バージョンは3.0.83です。ファイルのホスティングもしておられるので有り難く使用させていただきます。

Syntax Highlighter

簡単インストール

  1. ダッシュボード > デザイン > HTMLの編集 へ移動
  2. テンプレートをすべてダウンロード
  3. <head>内に以下のソースをコピーしてペースト(テーマとブラシは必要なものを記述。)
  4. テンプレートを保存して、ファイルをアップロードすれば完了

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeRDark.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
<script type='text/javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>

簡単な使い方


<pre />タグを使う

<pre>タグで記述する場合は、<は、&lt;に、>は&gt;エスケープすること。
<pre class="brush: js">
...code
</pre>

<script />タグを使う

<script>タグで記述する場合はエスケープ不要。
コードは<![CDATA[...]]タグで囲む必要がある。
RSSフィード等には反映されないので注意すること。
<script type="syntaxhighlighter" class="brush: js"><![CDATA[
...core
]]></script>

備考

  • バージョン3.0.83からshAutoloader.jsが導入されているが今回は未使用。