YiiでjQueryの重複読み込み回避

結局メニューなどでjQuery使っててレイアウトのヘッダで定義することが多いと思う。その際にwidgetなどでjQueryを利用していると重複してよびだしてしまう。

以下のようにconfigに定義することで回避可能。

 'components'=>array(
  'clientScript'=>array(
    'scriptMap'=>array(
      'jquery.js'=>false,
     ),
  ),

Yiiとは編集

PEAR:Mailで日本語メール送信

結構面倒くさかったので忘れないように記述しておく。

  mb_internal_encoding("UTF-8");
  //接続情報など
  $param = getMailConfig();
  $mailObject = Mail::factory("smtp", $param);
  
  //to,fromにも日本語名称を設定する場合は
  //「mb_encode_mimeheader」を設定
  $headers = array(
    "To" => "to@xxx.jp",
    "From" => "from@xxx.jp",
    "Subject" => mb_encode_mimeheader("日本語件名", "ISO-2022-JP"),
    "Content-Type" => "text/plain; charset=ISO-2022-JP",
    "Content-Transfer-Encoding" => "7bit",
    "MIME-Version" => "1.0",
  );
  
  //本文を取得
  $text = getMail();
  $body = mb_convert_encoding($text, "ISO-2022-JP", "auto");
  
  $mailObject -> send($recipients, $headers, $body);

なんかwebでサンプル探してもheaderとかあまり設定してなかったり「mb_encode_mimeheader」を使用しててもデフォルト任せで指定していないのばかりなんだけど問題ないのかなぁ?

一応、検証してメーラーとかとヘッダの差異がないこと確認したけど設定しない理由とかあるのだろうか???

yiiの国際化対応

yiiの国際化対応はかなり簡単にできるように用意されているが、良い日本語の説明がなかったので防備録。

まず翻訳対象の文字列は「Yii::t('カテゴリ名','翻訳対象のメッセージ')」として記述していく。

カテゴリ名はなんでも良いです。
→「yii、zii」などの予約語でなければ。
→バリデータのメッセージなどはフレームワーク内に入ってる。独自のメッセージに変更したい場合は後述する「message」ディレクトリにCOPYしてくる必要あり。

このカテゴリは同じ翻訳対象メッセージが存在する場合に翻訳を変えたいときに使用する。

ある程度、「Yii::t()」を記述したらここから翻訳ファイルを作成する準備に入ります。

protected/messageに移動してここにフレームワーク内のmessageフォルダからconfig.phpをcopyしてくる。

「languages」の配列でしている部分が翻訳対象なのでここは好きに定義してください。

ここまで準備できたら実際に翻訳作成します。

翻訳ファイルの作成は「yiic」コマンドで作成します。

./protected/yiic message ./protected/message/config.php

※pathは適宜読みかえること。

上記を実行するとmessageフォルダ配下にconfig.phpで指定したロケール分のフォルダが作成されているはずです。
その中に「Yii::t()」で指定したカテゴリ名のファイルがあります。
中を見ると指定したメッセージがKeyでValueが空の配列になっているので翻訳をValueに設定してください。

以上で翻訳ファイルは完成です。

最後に上記の翻訳の適用です。

protected/config/main.phpの設定に以下を加えます。

$config = array(
  'sourceLanguage'=>'ja',
  'language'=>'en_us',

この「sourceLanguage」が作成しているシステムのベース言語になります。
日本語で作成しているなら上記のままでOKでしょう。

その下の「language」がシステムに適用する言語になります。

上記の例だとベースは日本語で作成しているけど英語で表示する指定になってます。
複数言語対応で作成する場合は「language」を動的に変更すれば可能だと思います。
なお、デフォルトは「en_us」なので何も設定しない場合は英語となります。
また翻訳は「sourceLanguage」と「language」が一致しない場合に行われるそうです。

yiiのactiveFormでsubmit時にも有効にする

今回やりたかったのはwebページで内部POPUPした画面で入力フォームを作成するということ。

単純に作成してAjaxを有効にしてもPOST時に親画面に遷移してしまう。

で「enableAjaxValidation」を有効にしたときになんか方法ないかなっと思ったらあった。

 return array(
   'showErrorSummary' => true,
   'method' => 'post',
   'title' => yii::t('default','項目作成'),
   'activeForm'=>array(
     'id'=>'hoge-form',
     'enableAjaxValidation'=>true,
     'clientOptions'=>array('validateOnSubmit'=>true),
   ),
  );

「activeForm」のパラメータ「clientOptions」で「validateOnSubmit」を有効にするだけ。

簡単だね。

yiiでアクション単位のCSS指定

コントローラーのアクション内に以下を記述。

Yii::app()->getClientScript()->registerCssFile(Yii::app()->request->baseUrl . '/css/custom.css');

scriptを指定する場合は多分「registerScriptFile」になると思われる。

yiiでデバッグツールバーを使う。

「yiidebugtb」というextentionを利用するとデバッグ情報が確認できるツールバーを利用することができます。

ただ2010-08-31現在ではHPからダウンロードすると動かなかったので以下から持ってきました。

http://code.google.com/p/yiidebugtb/downloads/list

上記を「protected/extensions/」に展開してコンフィグファイルをREADMEの通りに記述して問題なく利用できました!

PHPでEXCEL作成

phpEXCELを作成する「PHPExcel」を試した。

基本的な使い方は簡単なので省略。

罫線をまとめて作成する方法

/** PHPExcel */
require_once './PHPExcel.php';
require_once './PHPExcel/Writer/Excel5.php';

$oExcel = new PHPExcel();

$oExcel->setActiveSheetIndex(0);

$cell_style = array(
    'borders' => array(
    'top'     => array('style' => PHPExcel_Style_Border::BORDER_THIN),
    'bottom'     => array('style' => PHPExcel_Style_Border::BORDER_THIN),
    'left'     => array('style' => PHPExcel_Style_Border::BORDER_THIN),
    'right'     => array('style' => PHPExcel_Style_Border::BORDER_THIN),
    'vertical'     => array('style' => PHPExcel_Style_Border::BORDER_THIN),
    'horizontal'     => array('style' => PHPExcel_Style_Border::BORDER_THIN),
    )
);

//第二引数は範囲指定
$oExcel->getActiveSheet()->duplicateStyleArray($cell_style,'a1:f1');

$writer = new PHPExcel_Writer_Excel5($objPHPExcel);
$writer->save("sample.xls");