010Zend Framework | 英太郎の鯖缶

カテゴリアーカイブ: 010Zend Framework

Zend Frameworkでクッキー無しの場合のリダイレクトラッパー

2008年11月02日

Zend Frameworkでiモードなど、セッションクッキーが使えない環境などでのリダイレクトラッパーをちょいと書いてみました。

&lt?php
/**
* Chaos-Portal-Project
*
* Chaos_Controller_Action
*
* @category   Chaos
* @package    Chaos_Controller_Action
* @copyright  2008 CPMSTAFF
* @author     eitaro
* @version    1.0.0
* @since      File available since Release 1.0.0
*/

require_once 'Zend/Controller/Action.php';

abstract class Chaos_Controller_Action extends Zend_Controller_Action
{

/**
* リダイレクトのラッパ
*
* @param string $url
* @param $options
* @return void
*/
public function _redirect($url, $options = array())
{
if (empty($_COOKIE)) {
if (! preg_match('{^https*://}i', $url)) {
if ($id = session_id()) {
$name = session_name();
$id = strip_tags($id);

list($url, $param) = explode('?', $url, 2);
$url .= sprintf('?%s=%s', $name, urlencode($id));
if ($param) {
$url .= sprintf('&%s', $param);
}
}
}
}

return parent::_redirect($url, $options);
}
}

使い方ですが、コントローラーで

class IndexController extends Zend_Controller_Action

と書くところを、

class IndexController extends Chaos_Controller_Action

のように変更します。
後は、リダイレクト時勝手にセッションクエリーを追加してくれるようになります。

セッションクッキーなどは、PHP側にまかせているので、php.ini や .htaccess でセッションクエリーを自動で出力するようにしています。
例:.htaccess で設定

php_flag magic_quotes_gpc off
php_flag session.use_trans_sid On
php_flag session.use_cookies On

実装の確認はちゃんとやってないので、問題があったらまた書き直します:-)


→続きを読む:

Zend_Mailで文字化けするので、ラッパーを作ってみた。

2008年10月28日

最近Zend Frameworkを使用してプログラム中なんですが、メール送信で文字化けしちゃうので、ラッパーを軽く作ってみました。
文字コードをISO-2022-JP指定時に勝手にエンコード変更する形です。
※多言語管理するなら、呼び出し側での切り替えの仕組みちょっと考えないといけません:-(

<?php
/**
* Chaos-Portal-Project
*
* @category   Chaos
* @package    Chaos_Mail
* @copyright  2008 CPMSTAFF
* @author     eitaro
* @version    1.0.0
* @since      File available since Release 1.0.0
*/

// ロードクラス指定
Zend_Loader::loadClass('Zend_Mail');

class Chaos_Mail extends Zend_Mail
{
/**
* Constructor
*
* @return void
*/
public function __construct($charset)
{
parent::__construct($charset);
}

/**
* Sets the text body for the message.
*
* @param  string $txt
* @param  string $charset
* @param  string $encoding
* @return Zend_Mail Provides fluent interface
*/
public function setBodyText($txt, $charset = null, $encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE)
{
if ('ISO-2022-JP' == $this->_charset) {
$txt = mb_convert_encoding($txt, 'ISO-2022-JP', mb_detect_encoding($txt));
}
return parent::setBodyText($txt , $charset , $encoding);
}

/**
* Sets the subject of the message
*
* @param   string    $subject
* @return  Zend_Mail Provides fluent interface
*/
public function setSubject($txt)
{
if ('ISO-2022-JP' == $this->_charset) {
$txt = mb_convert_encoding($txt, 'ISO-2022-JP', mb_detect_encoding($txt));
}
return parent::setSubject($txt);
}

/**
* Sets From-header and sender of the message
*
* @param  string    $email
* @param  string    $name
* @return Zend_Mail Provides fluent interface
*/
public function setFrom($email, $name = '')
{
if ('ISO-2022-JP' == $this->_charset) {
$name = mb_convert_encoding($name, 'ISO-2022-JP', mb_detect_encoding($name));
}
return parent::setFrom($email, $name);
}

/**
* Adds To-header and recipient
*
* @param  string $email
* @param  string $name
* @return Zend_Mail Provides fluent interface
*/
public function addTo($email, $name = '')
{
if ('ISO-2022-JP' == $this->_charset) {
$name = mb_convert_encoding($name, 'ISO-2022-JP', mb_detect_encoding($name));
}
return parent::addTo($email, $name);
}

/**
* Adds Cc-header and recipient
*
* @param  string    $email
* @param  string    $name
* @return Zend_Mail Provides fluent interface
*/
public function addCc($email, $name='')
{
if ('ISO-2022-JP' == $this->_charset) {
$name = mb_convert_encoding($name, 'ISO-2022-JP', mb_detect_encoding($name));
}
return parent::addCc($email, $name);
}
}

呼び出すとき、

$mail = new Chaos_Mail('ISO-2022-JP');

とするだけ、後はオリジナルと同じ形で扱えるはずです。