最近更新: 2006-12-06

用 SimpleXML functions 和 MVC 架構實作的簡單 RSS 閱讀器

我前幾天發現 blog 邊欄訂閱的 RSS 欄位的內容沒有顯示出來,追蹤了一會兒,發現是 blog 系統在輸出 RSS 內容時,沒有處理換行字元,令 JavaScript 碰到非預期的敘述斷行導致執行失敗。追蹤過程中,我順手寫了一個 PHP 程式測試這個狀況。後來我把這程式擴充一下,改寫成一個簡單的 RSS 閱讀器。

這個 PHP 程式,使用 SimpleXML functions 處理 RSS 文件,並且實踐了一個非常簡單的 MVC 架構。

Part of Control

程式實踐了 MVC 架構,但其實缺了 Model 這一塊。原本讀取 RSS 文件並轉成 SimpleXML 個體的動作應該放在 Model 中的,但因為只有一行,我就直接放在 Control 中了。

SimpleXML processing with PHP》示範了更多 SimpleXML functions 的使用內容。

<?php
// begin of test case
$rssUri = (
    (isset($_GET['rss']) and !empty($_GET['rss']))
    ? $_GET['rss']
    : 'http://www-128.ibm.com/developerworks/news/dw_technl.rss'
);
$rssCached = false;
//end of test case

$rss = simplexml_load_string( file_get_contents($rssUri) );
/*
$charTranslateTable = array(
    "'" => "\x5C'",
    "\x5C" => "\x5C\x5C",
    "\n" => '',
    "\r" => ''
);
foreach ($rss->channel->item as $item) {
    echo 'document.write('<a class="rssLink" href="',
        $item->link,
        '">',
        strtr($item->title, $charTranslateTable),
        "</a>');\n";
}
*/
if ($rssCached) {
    //@readfile();
}
else {
    include 'rssView.phtml';
}
?>

Part of View (rssView.phtml)

View 的內容使用了 PHP 的原始用法,以 .phtml 為延伸檔名,使用文字性的區塊語法。當初 PHP2/3 出現時,原本目的就是在 HTML 中插入程式性敘述,所以模仿 SSI 的 .shtml 檔名採用 .phtml 為檔名,又為了避免 {, } 字元夾雜在 HTML 敘述中不易閱讀,所以提供了可讀性較高的文字性區塊語法,如 if...endif; for...endfor; while... endwhile;

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>RSS View</title>
  </head>
  <body>
    <style type="text/css">
    #dir {
      width: 40%;
      float: left;
    }
    
    #viewBlock {
      width: 55%;
      height: 100%;
      float: left;
      border: 1px;
    }
    </style>
  
    <div id="dir">
    <script language="php">
    function html_anchor($attrSet, $innerContent) {
        $a = array('<a');
        foreach ($attrSet as $attrName => $attrValue) :
            array_push($a, ' ', $attrName, '="', $attrValue, '"');
        endforeach;
        array_push($a, '>', $innerContent, '</a>');
        return implode('', $a);
    }
    </script>

    <dl>
      <?php foreach ($rss->channel->item as $item): ?>
        <dt>
          <?php echo html_anchor(
            array('href' => $item->link, 'target' => 'viewBlock'),
            $item->title);
          ?>
        </dt>
        <dd><?php echo $item->description;?></dd>
      <?php endforeach; ?>
    </dl>
    </div>

    <iframe id="viewBlock" name="viewBlock" height="100%">
    </iframe>

  </body>
</html>
相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/2552134.html