CakePHP:日付から12星座を表示するヘルパー

10月 19th, 2007 admin

ヘルパーにマスターデータを入れておいていいのかって気もしますが・・・とにかく今までネットに公開されたCakePHPのヘルパーの中で一番使われないものであることは確実ですね。
12星座ってもっとスマートに求める方法はあるんでしょうか?

期待する状態

サンプル

< ?php
$str = "2007-01-03";
echo $html->dateto12astro($str);
?>

出力

やぎ座

設置方法

/app/views/helpers/html.phpに(ない人はcakeフォルダからコピーしてもってくる)以下の関数を追加

	/*
	 * 日付を12星座に変換します。
	 * param:GNU » Date Input Formats  形式に準拠した日付文字列(例:yyyy-mm-dd)
	 */
	function dateto12astro($date){
		$str = intval(date("nd",strtotime($date)));
		switch ($str){
			case $str <= 119:
				return "やぎ座";
			break;
			case $str <= 218;
				return "みずがめ座";
			break;
			case $str <= 320;
				return "うお座";
			break;
			case $str <= 419;
				return "おひつじ座";
			break;
			case $str <= 520;
				return "おうし座";
			break;
			case $str <= 621;
				return "ふたご座";
			break;
			case $str <= 722;
				return "かに座";
			break;
			case $str <= 822;
				return "しし座";
			break;
			case $str <= 922;
				return "おとめ座";
			break;
			case $str <= 1023;
				return "てんびん座";
			break;
			case $str <= 1121;
				return "さそり座";
			break;
			case $str <= 1221;
				return "いて座";
			break;
			case $str <= 1231;
				return "やぎ座";
			break;
		}
		return false;
	}

関係ないですがWeb ad Fortune 12星座占いデータのWebAPIというのがあるんですね。占いサイトを始める人にはぴったり

CakePHP::PeriSign認証を作りました。

9月 22nd, 2007 admin

154年の信頼と実績 日本ペリサイン
http://www.perisign.com/

征夷大将軍のホームページさんのペリサインシールを見て感動して、そのまま悪い乗りで作りました。ちょうどcakephp1.2の練習になるなと思いながらやったのですが、フォーム関係のヘルパーがかなり違っていて時間がかかりました。1.1よりスマートになった感じですかね。

本来の認証では、登録情報に基づく識別IDみたいなのとリファラーのホスト名をチェックしてるんだと思うんですが、ブログのユーザなどにも対応するため、このperisign認証ではIDと、登録時に申請してもらったURLで判別しています。

不具合などありましたら、こちらのコメント欄にお願いします。

CakePHP::date形式の日付を年月日形式に変換するヘルパー

9月 3rd, 2007 admin

DBなどからdate形式とかdatetime形式の値をとってきて表示するってのがよくあるんですが
年月日形式にするのが非常に面倒くさい。この機能がないからdate形式が嫌いだ。(一発で変換する方法あるんでしょうか?)

期待する状態

サンプル

< ?php
$str = "2007-09-03";
echo $html->dateFormat($str);
?>

出力

2007年09月03日

設置方法

/app/views/helpers/html.phpに(ない人はcakeフォルダからコピーしてもってくる)以下の関数を追加


/**
* Returns a Formatted Date.
*
* @param string $date date formatted strings
* @param string $format format strings as date()
* @return string
* @access public
*/
function dateFormat($date,$format = "Y年m月d日") {
return date($format,strtotime($date));
}
function df($date,$format = "Y年m月d日") {
return $this->dateFormat($date,$format);
}

$html->df()でもアクセスできるし、2個目の引数でdate()関数と同じ形式でフォーマットを指定できます。

CakePHP::mcrypt用(暗号化)のコンポーネント

7月 16th, 2007 admin

個人情報を扱うアプリケーションなどで、万が一データベースの中身が抜かれても(復号キーさえ盗まれなければ)(ほぼ)大丈夫なようにデータを暗号化して保存しておくことを考えてみた。

ダウンロード


cakephp_components_mcrypt.zip

cakephp_components_mcrypt1.zip v0.2

準備

通常はVMWAREなどでテスト環境を作って開発を行うのだけど、今回はお手軽にXAMPPを使っている。
XAMPPのphp.iniはなぜか3つあり、mcryptを有効にするまで3つとものextension=php_mcrypt.dllを有効にした。(たぶんどれか必要ない)

c:\xampp\bin\php.ini
c:\php\php.ini
c:\php\php4\php.ini

でapacheを再起動

debianだと

apt-get install php5.1-mcrypt
apache2 -k graceful

だけでOK。

mcryptが使えない人にはPEAR::Crypt_Blowfishがあるが、これはブロック暗号化モードでECBモードしか選べないということなので十分に安全とはいえないので注意。

設置

/app/controllers/components/mcrypt.php
に置くだけ

使用例

/app/controllers/users_controller.php

class UsersController extends AppController {

  var $name = 'Users';
  var $components = array("Mcrypt");

  function index(){
    $test = "VISA::0011-2233-4455-6677::日本タロウ";
    $encrypt = $this->Mcrypt->encrypt($test);
    $decrypt = $this->Mcrypt->decrypt($encrypt);
    echo $encrypt."";
    echo trim($decrypt)."";
  }
}

出力

�pZ�s“ ���Du�n���"��SE�"�Q{x����u�b
VISA::0011-2233-4455-6677::日本タロウ

参考サイト

mcrypt 関数 (コロンブスの卵)
ブロック暗号モード(block cipher mode) triplefalcon
人力検索 PHPでの文字列暗号化で、どの暗号種類を使ってよいかわかりません・・・

Todo

  • row_keyを置く場所は、apacheしかアクセスできない場所がよい

mysqlに保存するときは

PHP: mcrypt_generic – Manual

もし MySQL データベースにデータを格納する場合は、 varchar フィールドに値を挿入する際に末尾のスペースが取り除かれることを 覚えておきましょう。暗号化されたデータの最後にスペース(ASCII 32)が 含まれていた場合、この処理によってデータが破壊されてしまいます。 かわりに tinyblob/tinytext (あるいはより大きな) フィールドを 使用してください。

2007/07/16 追記
初期化ベクトルIVを毎回初期化していたのですが、セッションをまたぐ場合にIVの値が違うと復号できないので固定に修正。
phpマニュアルでは固定では駄目なようなことが書いてあるが、そのコメントのところでは「それは間違っている」と書いてある。
僕も間違っていると思うのだが・・・

CakePHP::ViewをJavascriptで出力

7月 12th, 2007 admin

ViewをJavascriptで出力という表現があっているかどうかわかりませんが・・・Viewの内容をdocument.writeで書き出してくれます。

コード

/app/controllers/ads_controller.php

< ?php
class AdsController extends AppController {

	var $name = 'Ads';
	var $layout = "javascript";

	function index(){
		$this->set('data','exaple data');
	}
}
?>

/app/views/layouts/javascript.thtml

< ?php
header("Content-type: application/x-javascript");
$content_for_layout = r(array("\r\n","\n"),"",$content_for_layout);
echo 'document.write("'.r('"','\"',$content_for_layout).'")';;
?>

/app/views/ads/index.thtml

< ?php echo $data ?>

example.html

<script type="text/javascript" src="http://localhost/cake/ads/"></script>

出力

example.html

exaple data

ポイントはコントローラーでjavascript用のレイアウトの使用を宣言すること、レイアウトで、javascriptのヘッダを出力し、ビューの改行を削除しているところです。(1行づつdocument.writeをつけたほうがいいかも。)

※r()はCakePHPが用意してくれているstr_replaceのラッパー