Pear Calendar

Pear::Calendar を使ってみました。

beta 版なので -f を付けて install しました。
-f は強制的に install する場合のやり方なので、
本来は以下のようにするようです。

# pear install Calendar-beta

Pear::Clanendar には目的に応じて使うクラスを選ぶようになっているのですが、カレンダーのレイアウトを意識しているのが面白そうだったので Calendar/Month/Weekdays.php を使ってみました。(他もそうなのかもしれませんが…)

使い方はこんな感じです。
2009年1月の場合。

<?php
require_once 'Calendar/Month/Weekdays.php';
// 0 で先頭を日曜日に指定しています
$cm = new Calendar_Month_Weekdays(2009, 1, 0);
$cm->build();
echo "<table>";
while($day = $cm->fetch()) {
    // 日付が存在しない場所だった場合
    if (!$day->isEmpty()) {
        $date = sprintf("%d", $day->thisDay());
    } else {
        $date = "";
    }
    // カレンダーの先頭の場合
    if ($day->isFirst()) {
        echo "<tr>";
    }
    // カレンダーの先頭の場合
    if ($day->isFirst()) {
        echo "<td style=background-color:#fcc>";
    } else {
        echo "<td>";
    }
    echo $date . "</td>";
    // カレンダーの右端の場合
    if ($day->isLast()) {
        echo "</tr>";
    }
}
echo "</table>";
?>

カレンダーのレイアウトを意識している点が面白いです。
説明文が変ですが言いたい事が伝わると思います :mrgreen:

カテゴリー: php

WordPress XHTML validator

一度公開した記事のソースが見たくて編集をしようとしたところ
編集ができなくなってしまいました!

色々と調べてみたところ以下のようなプロセスが沢山動いている事に気が付きました。

USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
apache   11688  0.0  0.0  4440  996 ?        SN   00:46   0:00 xmllint --nonet --xmlout --
encode UTF-8 -

xmllintでピンときました!

先日WordPress XHTML validator というプラグインをインストールしていたのでそれが原因?

install instructions に tidy が必要と書いてあったのですが、
無くても動いているようだったので無視していた事を思い出しました。

そこで tidy をインストールしたところ解決しました 🙂

ちゃんとインストールしないとダメですね 😆

Ethna 携帯サイト用 validate

Ethna で携帯サイトを開発していて、キャリアによってフォームから

入力される文字列の文字コードが SJIS の場合と UTF-8 の場合があり、

max(文字列の長さ) の validate で、それぞれの文字コードの strlen()

の結果が違うのでうまくいきませんでした。

文字コードを統一してから validate すれば良いのですが、

そうもできない事情があり、validate plugin を作成してみました。

SJIS か UTF-8 が入力される $nickname の validate の場合に

ActionForm で以下のように定義します。

validate の条件は半角で8文字、全角で4文字以下の場合。

 
var $form = array(
 
'nickname' => array(
 
'type' => VAR_TYPE_STRING,
 
'form_type' => FORM_TYPE_TEXT,
 
'name' => 'ニックネーム',
 
'required' => true,
 
'utf8max' => array(
 
'utf8max' => true,
 
'max' => 8),
 
),
 
);

そして、以下のような Validate Plugin を作成しました。

example/app/plugin/Validate/Example_Plugin_Validator_Utf8max.php

 
<?php
 
class Example_Plugin_Validator_Utf8max extends Ethna_Plugin_Validator
{
function &validate($name, $var, $params)
{
$true = true;
$type = $this->getFormType($name);
if (isset($params['utf8max']) == false || $this->isEmpty($var, $type)) 
{
return $true;
}
$encode に文字列の文字コードが入っている
if ($encode == 'UTF-8') {
if (mb_strwidth($var, 'UTF-8') > $params['max']) {
$msg = "{form}は全角%d文字以下(半角%d文字以下)で入力して下さい";
return Ethna::raiseNotice($msg, E_FORM_MAX_STRING,
array(intval($params['max']/2), $params['max']));
}
} else {
if (strlen($var) > $params['max']) {
$msg = "{form}は全角%d文字以下(半角%d文字以下)で入力して下さい";
return Ethna::raiseNotice($msg, E_FORM_MAX_STRING,
array(intval($params['max']/2), $params['max']));
}
}
}
}
?>

意図する validate ができましたが、もっともっと良い方法があると思います。
皆さんはどうやっているのでしょうか…?

SoftBank の mailto

SoftBank の mailto には rawurlencode() で。

携帯電話用に mailto を作成していて SoftBank だけうまくいかなかった。

原因は urlencode() を使って subject, body をエンコーディングしていたから。

urlencode() だとスペース(空白)が ”+” になってしまい、
SoftBank の携帯が “+” をデコードせずそのまま表示してしまいます。

DoCoMo, AU は問題なし。

SoftBank だけ rawurlencode() を使うようにしたところOK。
文字コードは UTF-8 で。

$body = rawurlencode($body);
 
$subject = rawurlencode($subject);
 
echo "<a href="mailto:" . $rcptaddr . "?subject=" . $subject . "&amp;body=" . $body . "">メールする</a>";