freo 公式の更新情報を管理画面に表示する

【2017/05/23】従来のGoogle Feed API が2016/12/15以降使用できなくなったので、YQL APIによるJavascriptに変更しました。
【2019/06/18】さらにYQL APIが2019/01/03以降使用できなくなったので、自力でRSSを取得する方法に変更しました。
参考:Google Ajax Feed APIを使わないでRSSを取得してみた(メサイア・ワークス)

なお、従来の js/gAjax.js は不要なので削除し、またtemplates/internals/admin/header.html
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript" src="{$freo.core.http_url}{$smarty.const.FREO_JS_DIR}gAjax.js"></script>
がある場合はその部分を削除してください。

RSS を取得する PHP

<?php
    //明示的に時差を表記する
    date_default_timezone_set('Asia/Tokyo');
    // カレントの言語を日本語に設定する
    mb_language("ja");
    // 内部文字エンコードを設定する
    mb_internal_encoding("UTF-8");
    // RSSのソース元(RSS1=RDF専用)
    $rss = simplexml_load_file("http://freo.jp/info/news/feed");
    //RSSフィードの取得指定数
    $rss_num = 5;
    // NEWマークの表示日数
    $mark_date = 15;

    // RSSフィードの分だけループ
    $i=0;
    foreach ($rss->item as $item) {
        //名前空間接頭辞の定義を取得
        $dc = $item->children('http://purl.org/dc/elements/1.1/');
        //タイトル・詳細・リンク・日付を、変数に格納する
        $json[$i]['title'] = (string)$item->title;
        $json[$i]['desc'] = (string)$item->description;
        $json[$i]['link'] = (string)$item->link;
        //日付の整形
        $json[$i]['date'] = date("Y/m/d H:i", strtotime((string)$dc->date));
        // NEWマークの表示
        $json[$i]['check_date'] = (time() - (strtotime((string)$dc->date))) / (24 * 3600);
        if($json[$i]['check_date'] <= $mark_date) {
            $json[$i]['new_mark'] = '<em>New!</em>'; // NEWマークをつける場合に表示するHTML要素
        } else {
            $json[$i]['new_mark'] = '';
        }
        //指定数になったら、取得を止める
        $i++;
        if($rss_num <= $i) break;
    }
    
    //ヘッダーを吐き出して終了    
    header('Content-Type: application/json; charset=UTF-8');
    echo $_GET['callback'] . "(" . json_encode($json). ")";
?>
これを update_rss.php という名前で freo の js ディレクトリに保存します(libs/freo ディレクトリだと403エラーが出るので不可)

PHP を表示させる Javascript

$.getJSON(
    freo_path + "js/update_rss.php?callback=?",
    function(json) {
        //出力先要素(ID指定)を変数に格納
        var container = document.getElementById("feed");          
        var htmlstr = '<ul>';

        //フィードの分だけループ
        for (var i = 0; i < json.length; i++) {
            htmlstr += '<li><a href="' + json[i]['link'] + '" target="_blank" rel="noopener">' + json[i]['title'] + '</a> (' +json[i]['date'] + ')' + json[i]['new_mark'] + '<br />' + json[i]['desc'] + '</li>';
        }
        // 要素に出力
        htmlstr += '</ul>';
        container.innerHTML = htmlstr;
    }
)
// 通信エラーの表示
.fail(function(jqXHR, textStatus, errorThrown ) {
    $("#feed").append('<span class="attention">エラーが発生しました。</span>' + textStatus + ' ' + jqXHR.status + ' ' + jqXHR.statusText);
});
これを update_rss.js という名前で freo の js ディレクトリに保存します。

管理画面テンプレートを編集

  • templates/internals/admin/default.html
  • templates/internals/admin/header.html
を以下のように編集します。
templates/internals/admin/default.html の3行目に以下を挿入
<h2>freo 更新ニュース</h2>
<div id="feed"></div>
templates/internals/admin/header.html</head> 直前に以下を挿入
<!--{if $smarty.request.freo.work == 'default' or $smarty.request.freo.work == 'status'}-->
<script type="text/javascript" src="{$freo.core.http_url}{$smarty.const.FREO_JS_DIR}update_rss.js"></script>
<!--{/if}-->
これで管理画面にログインした時のステータス画面でのみ freo 公式サイトの更新情報が表示されます。

元ネタは10pressに記載されていたもの

  • 最終更新:2019-06-19 20:58:55

このWIKIを編集するにはパスワード入力が必要です

認証パスワード