携帯端末用Web制作バイブル 第2版 (ADVANCED WEB DESIGN BOOKS)

  4798111287
  http://www.amazon.co.jp/o/ASIN/4798111287/todaysnonsenc-22/ref=nosim/
  八木澤 知彦 (著)
  翔泳社; 第2版版
  ISBN: 4798111287
  2006/6/27
  2,940 円

本書は文字、絵文字、メール、電話の使い方から、画像、アニメ、動画、サウンド、CGI、アプリの作り方まで、i‐mode、EZweb、Vodafone live!の各3キャリアの特性に焦点をあてて徹底解説。携帯電話向けのWebコンテンツ制作者を悩ます、各キャリアごとの仕様の「違い」を紹介します。付録には、一覧できる最新の携帯端末ごとの「スペック早見表」、各キャリアごとで異なる「絵文字の一覧表」、「HTMLタグ辞典」が入っています。

PEAR::setErrorHandling でエラー処理を行なう

  PEAR パッケージのエラー処理ですが、よくあるパターンとしては以下のような書き方をすると思います。

$result = $mdb->query('SELECT * FROM table');
if (PEAR::isError($result)) {
    die($result->getMessage());
}


  エラー処理の数が少ない場合はこれでいいのですが、多くなってくると可読性が悪くなります。

  この場合、PEAR::setErrorHandling() を使うことで以下のように簡潔に書くことができます。

PEAR::setErrorHandling(PEAR_ERROR_DIE);

$mdb2->query('SELECT * FROM table');
// PEAR:isError() を使わなくていい


  この書き方は、マニュアルによると「PEAR_Error の生成時に、エラーメッセージが出力され、スクリプトが終了します。」ということになります。

  エラーが発生したら、ログを出力して終了したいという場合は、以下のようにコールバックを利用することができます。

PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError');

function handleError($error)
{
    require_once 'Log.php';
    $log = &Log::singleton('file', 'error.log');
    $log->err($error->getMessage());
    exit('エラー');
}

$mdb2->query('SELECT * FROM table');


  PEAR パッケージをよく使う場合には便利です。

- PEAR::setErrorHandling()
  http://pear.php.net/manual/ja/core.pear.pear.seterrorhandling.php

PEAR::Pager で Digg っぽいページャを作る

  UI Patterns紹介されているように Digg のページャは見た目にも綺麗だし、わかりやすいと思います。
  以下の画像が Digg のページャです。

  Digg Pager

  そこで、PEAR::Pager を使って Digg っぽいページャを作ってみました。

- スクリーンショット
  PEAR::Pager Digg Pager

- デモページ
  http://pocari.org/demo/digg-pager/

  完全に一緒というわけではありませんが、これくらいならば結構簡単に作ることができました。

  ソースは以下のようになります。

<?php
require_once 'Pager/Pager.php';

$params = array(
    'mode'                  => 'sliding',
    'perPage'               => 10,
    'delta'                 => 5,
    'separator'             => '',
    'curPageLinkClassName'  => 'current',
//  上記はこれと同じ意味
//  'curPageSpanPre'        => '<span class="current">',
//  'curPageSpanPost'       => '</span>',
    'prevImg'               => '&#171; Previous',
    'nextImg'               => 'Next &#187;',
    'firstPagePre'          => '',
    'firstPagePost'         => '',
    'lastPagePre'           => '',
    'lastPagePost'          => '',
    'spacesBeforeSeparator' => 0,
    'spacesAfterSeparator'  => 0,
    'totalItems'            => 2180,
    'altFirst'              => 'Go to page 1',
    'altPrev'               => 'Go to Previous Page',
    'altNext'               => 'Go to Next Page',
    'altLast'               => 'Go to Last Page',
    'altPage'               => 'Go to page',
);

$pager =& Pager::factory($params);
$links = $pager->getLinks();
$page_range = $pager->getPageRangeByPageId();
$page_range = range($page_range[0], $page_range[1]);

$link = '';
if ($links['pages'] != '') {
    // 前のページ
    if ($links['back'] != '') {
        // クラスを付ける
        $link .= str_replace('<a href', '<a class="nextprev" href', $links['back']);
    } else {
        $link .= '<span class="nextprev">' . $pager->getOption('prevImg') . '</span>';
    }
    // 最初のページ
    if ($links['first'] != '' && !in_array(1, $page_range)) {
        $link .= $links['first'] . '<span>....</span>';
    }
    // ページ
    $link .= $links['pages'];
    // 最後のページ
    if ($links['last'] != '' && !in_array($pager->numPages(), $page_range)) {
        $link .= '<span>....</span>' . $links['last'];
    }
    // 次のページ
    if ($links['next'] != '') {
        // クラスを付ける
        $link .= str_replace('<a href', '<a class="nextprev" href', $links['next']);
    } else {
        $link .= '<span class="nextprev">' . $pager->getOption('nextImg') . '</span>';
    }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <link rel="stylesheet" type="text/css" href="style.css" />
  <title>PEAR::Pager で Digg っぽいページャを作るデモ</title>
</head>

<body>

<div class="pager">
<?php echo $link; ?>
</div>

</body>
</html>


  CSS は以下のようになります (Digg のものとほとんど同じです)。

div.pager {
    margin-top: 20px;
    font-size: 85%;
}

div.pager a,
div.pager span {
    display: block;
    float: left;
    margin-right: 0.1em;
    padding: 0.2em 0.5em;
}

div.pager a {
    color: #105cb6;
    background-color: #fff;
    border: 1px solid #9aafe5;
    text-decoration: none;
}

div.pager a:hover {
    color: #003;
    background-color: #fff;
    border: 1px solid #2e6ab1;
}

div.pager span.current {
    color: #fff;
    background-color: #2e6ab1;
    border: 1px solid #2e6ab1;
    font-weight: bold;
}

div.pager span.nextprev {
    border: 1px solid #ddd;
    color: #999;
    background-color: #fff;
}

div.pager a.nextprev {
    font-weight: bold;
}