「CakePHP」タグアーカイブ

別ポートでVirtual Hostを設定してCakePHPを運用する場合の注意点

ポート:8080
VirtuakHost用ドキュメントルート:/var/www/html2
VirtuakHost用のCakePHP:cakephp2
として
httpd.confで
1.ポート番号
→ Listen 8080
2.Virtual Host用に
Directory VirtuakHost用ドキュメントルート>を追加し「AllowOverride All」等を設定


    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all

3.Virtual Host設定


    DocumentRoot /var/www/html2
    ServerName URL:8080

4.VirtuakHost用のCakePHPをサーバに展開

5.VirtuakHost用ドキュメントルート上のindex.phpでROOTを設定

define('ROOT', dirname(dirname(__FILE__)) . DS. 'cakephp2');

CakePHPで不達メールの一覧を取得するモデルを作ってみた

お問い合わせフォームからメールを送信することもままあると思いますが、
不達メールの問題はついて回るかと思います。
そこでPOP3でメールサーバに接続し不達メールの一覧を取得するモデルを作ってみました。
[PHP]
/**
* 不達メールモデル
*/
class BounceMail extends AppModel {
var $useTable = false;
var $name = ‘BounceMail’;

var $mboxconnstr = “{メールサーバーホスト名:110/pop3}INBOX”;
var $user = “ユーザー名”;
var $passwd = “パスワード”;
var $subject = “Undelivered Mail Returned to Sender”;

function find($conditions = null, $extra = array()) {
$records = array();
$mbox = imap_open($this->mboxconnstr, $this->user, $this->passwd);
if ($mbox == false) {
return $records;
}
$mail_check = imap_check($mbox);
for($i=1;$i<=$mail_check->Nmsgs;$i++) {
$headinfo = imap_headerinfo($mbox, $i);
$bodyinfo = imap_body($mbox, $i);
if ($headinfo->Subject == $this->subject) {
$rtn = preg_match(“/<.+@.+?>/”, $bodyinfo, $rslt);
if ($rtn == true) {
if (is_array($rslt)) {
foreach($rslt as $key=>$val) {
if (!empty($conditions)) {
foreach($conditions as $condition){
// 日付範囲指定の条件
if (isset($condition[‘dateFrom’])) {
if (date(“Ymd”, strtotime($headinfo->date)) < date("Ymd", strtotime($condition['dateFrom']))) { continue 2; } } if (isset($condition['dateTo'])) { if (date("Ymd", strtotime($headinfo->date)) > date(“Ymd”, strtotime($condition[‘dateTo’]))) {
continue 2;
}
}
}
}
$records[$i][“datetime”] = date(“Y-n-j H:i:s”, strtotime($headinfo->date));
$records[$i][“mail”] = rtrim(ltrim($val, “<"), ">“);
break;
}
}
}
}
}
imap_close($mbox);
return $records;
}

function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
$rslt = $this->find($conditions, $extra);
$count = count($rslt);
return count($rslt);
}

function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) {
$rslt = $this->find($conditions, $extra);
$records = array();
$end = $page * $limit;
$start = $end – $limit + 1;
$i = 0;
foreach($rslt as $row){
if (++$i >= $start && $i <= $end) { $records[] = $row; } } return $records; } } [/PHP]

Googleカレンダーから祝日を取得して配列に展開するコンポーネントを作ってみた。

ここを参照して作ってみました。
国については適宜追加してください。
[PHP]
class HolidayComponent extends Object {
/**
* 指定年の祝日リストを配列で取得します。
*/
function getHoliday($year = null, $country = ‘ja’){
$ret = array();;
if(empty($year)){
$dateBegin = date( “Y-m-01” );
$dateEnd = date( “Y-m-t” );
}else{
$dateBegin = date( “Y-01-01”, mktime( 0, 0, 0, 1, 1, $year ) );
$dateEnd = date( “Y-12-t”, mktime( 0, 0, 0, 12, 1, $year ) );
}
$query = “start-min=” . $dateBegin . “&start-max=” . $dateEnd . “&max-results=100”;
switch($country){
case ‘ja’:
$feed = “http://www.google.com/calendar/feeds/japanese__ja@holiday.calendar.google.com/public/full” . “?” . $query;
break;
case ‘us’:
$feed = “http://www.google.com/calendar/feeds/usa__ja@holiday.calendar.google.com/public/full” . “?” . $query;
break;
case ‘uk’:
$feed = “http://www.google.com/calendar/feeds/uk__ja@holiday.calendar.google.com/public/full” . “?” . $query;
break;
case ‘ch’:
$feed = “http://www.google.com/calendar/feeds/china__ja@holiday.calendar.google.com/public/full” . “?” . $query;
break;
case ‘ph’:
$feed = “http://www.google.com/calendar/feeds/philippines__ja@holiday.calendar.google.com/public/full” . “?” . $query;
break;
default :
$feed = “http://www.google.com/calendar/feeds/japanese__ja@holiday.calendar.google.com/public/full” . “?” . $query;
break;
}

$xml = simplexml_load_file( $feed );
if(!$xml){
return $ret;
}
$ii = 0;
foreach( $xml->entry as $entry ){
$gd = $entry->children( “http://schemas.google.com/g/2005” );
$attributes = $gd->when->attributes();
foreach( $attributes as $name => $value ){
if( $name == “startTime” ){
$ret[$ii][‘date’] = “”.$value.””;
$ret[$ii][‘title’] = “”.$entry->title.””;
$ii++;
break;
}
}
}
usort($ret, array($this, “_cmp”));
return $ret;
}
/**
* 指定年の祝日リスト配列のソート
*/
function _cmp($a, $b) {
if ($a[‘date’] == $b[‘date’]) {
return 0;
}
return ($a[‘date’] < $b['date']) ? -1 : 1; } } [/PHP]

CakePHPで普通のHtmlやPHPを配置する

ガッチリできあがったCakePHPで作成したサイトがあるとして、他で作った「普通に」作った簡単な問い合わせフォーム的なものをサブディレクトリに配置したい場合って結構あると思います。
その時は「.htaccess」を細工すればOK。
元の.htaccessが


	RewriteEngine On
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

で、普通のHtmlファイルを配置したいサブディレクトリを「XXXX」とすると


	RewriteEngine On
	RewriteBase /
	RewriteCond %{REQUEST_URI} ^/XXXX/(.*)$
	RewriteRule ^.*$ - [L]

を先頭に追加して以下のようにする。


	RewriteEngine On
	RewriteBase /
	RewriteCond %{REQUEST_URI} ^/XXXX/(.*)$
	RewriteRule ^.*$ - [L]

# Begin CakePHP

	RewriteEngine On
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

参照元はこちら。

本番環境がEUC設定のサーバな時のCakePHPでの対処

php.iniでEUC設定してあるレンタルサーバにCakePHP1.3を導入した時のメモ
1.MySQL→UTF-8、CakePHP→UTF-8。
2.CakePHPから→MySQLへのデータ書込みで日本語文字が文字化け、MySQLに日本語データだけ登録されない状態が発生。
3.php.iniは変更不能
4..htaccessでphp_valueの指定も不能(Internal Error になる)

app_controllerに以下の記述
「beforeFilter」で$this->dataの内容をutf-8に強制的にエンコードする

function esc2utf8(&$val,$key) {
	$val = mb_convert_encoding($val,"UTF-8","auto");
}

function beforeFilter() {
	if($this->data){
		array_walk_recursive($this->data, array($this, 'esc2utf8'));
	}
}

Ktai Library でiModeの時のredirectでURLがおかしくなっていた。

 CakePHP 1.2 prefix付きURL生成時の注意点

上記URLを参考にAppController内でiMode用にredirectをオーバーライドしている所に
若干コードを追加

最後にURLを生成している

$url = Router::url($url, true);

の前に

if(isset($url['prefix'])){
  if($url['prefix']=='mobile'){
     $url['prefix'] = '';
  }
}

を追加。
姑息的措置と思われだけど、これでなんとか解決した。
あ、結局「Ktai Library」の0.2.0を使わせてもらってます。
付け足し
ktai.php などでライブラリをインポートしているところが
環境によって正しくインポートされないので以下の処置

//require_once(VENDORS.'ecw'.DS.'lib3gk.php');
  App::import('Vendor', 'lib3gk', array('file' => 'lib3gk.php'));