Hatena::ブログ(Diary)

ヌル日記

2008-10-02

[][]CodeIgniterの学習 14 - (続)自作関数、自作クラス等を設置する場所実験 07:11

昨日のエントリのサンプルソースがあまりにも使えないので、ちょっとだけマシなサンプルを置いて試してみる。

Snoopyを使って http://www.example.com/ の画面を切り取ってみる。

材料

1)ライブラリ:application/libraries/Snoopy.php

ソース:

Snoopy - the PHP net client ( http://snoopy.sourceforge.net/ )

ダウンロードして、Snoopy.class.php → Snoopy.phpリネームして設置


2)ライブラリ:application/libraries/Scraping.php

1)だけで $this->load->library->('snoopy');$this->snoopy->fetch($url); … で使えるのだが、

操作が面倒なので、簡単に呼べるようにラップする。


(ちなみに、このライブラリ内では、わざと

$CI = &get_instance();

$CI -> load -> library( 'snoopy' );

みたいな書き方をしていない。

理由は、既に過去に作って動作している俺俺コードに、極力手を入れないで

Codeigniterに移植する場面を想定しているため。理想と妥協点との兼ね合い。)


ソース:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

//Snoopyを動かす実験、呼び方が面倒なのでここでラップしている
//データ取得のみの適当版
class Scraping{
    var $c; 
    function Scraping(){
        if ( ! class_exists('Snoopy'))
        {
            require_once(APPPATH.'libraries/Snoopy'.EXT);
        }
        $this -> c = new Snoopy();
    }
    //通常のフェッチ
    function getWebHtml($url="",$to_specialchars=true){
        $this ->c -> fetch( $url );
        $str = mb_convert_encoding( (string) $this -> c -> results,"UTF-8","auto");
        return ($to_specialchars) ? htmlspecialchars($str , ENT_QUOTES , "UTF-8" ) : $str ;
    }
    //テキスト形式で取得
    function getWebText($url="",$to_specialchars=true){
        $this -> c -> fetchtext( $url );
        $str = mb_convert_encoding( (string) $this -> c -> results,"UTF-8","auto");
        return ($to_specialchars) ? htmlspecialchars($str , ENT_QUOTES , "UTF-8" ) : $str ;
    }
    //リンクを抽出し配列で戻す
    function getWebLinks($url=""){
        $this -> c -> fetchlinks( $url );
        return (array) $this-> c -> results ;
    }
    //リンクを抽出しデリミタを挟んで文字列として戻す
    function getWebLinksText($url="",$delimiter="<br>"){
        $arr = $this-> getWebLinks($url) ;
        $ret ="";
        foreach($arr as $k => $v){
            $ret .= $v . $delimiter ;
        }
        return $ret;
    }

} //endofclass

/* End of file Scraping.php */
/* Location: ./application/libraries/Scraping.php */
 ?>

3)コントローラー:application/controllers/tasklist.php

変更箇所(_SetTpl)のみ抜粋

<?php
//上略
// ビューの生成 一カ所にまとめた
function _SetTpl( $data )
{ 

  //スクレイピングのテスト
  //画面表示の度に外につなぎにいくのは実用的ではないけどね
  $this -> load -> library("scraping");
  $data["scraping"]["text"] = $this-> scraping -> getWebText("http://www.example.com/");
  $data["scraping"]["html"] = $this-> scraping -> getWebHtml("http://www.example.com/");
  $data["scraping"]["link"] = $this-> scraping -> getWebLinksText("http://www.example.com/","\n");

  //俺俺ライブラリのテスト
  $this -> load -> library( 'oreore' ); 
  $data["ore1"] = $this->oreore->OpenTaiiho(2,"アンロック","スミマセン");

  //静的メソッドとして呼び出してみる
  //でも実際は$this -> load -> libraryの時点で既にnewされているので、あまり意味がない。
  //ヘルパだとinclude_onceしか走らないので、
  //静的メソッド専用として使いたい時はヘルパに寄せた方がいいかも
  $data["ore2"] = Oreore :: OpenHeart("セイテキニヨビダシ!");
  $data["ore3"] = Oreore :: Taiiho("イミガチガッタヨ");

  // カレンダーの生成
  //$tpl["calendar"] = $this -> _MakeCalendar(); 
  // 大枠のテンプレート側の変数(ヘッダ部分のタイトルと、xajax用javascriptタグ)
  $tpl["page_title"] = "タスクリストにようこそ";
  //$tpl["xajax_js"] = $this -> xajax -> getJavascript( base_url() ); // xajax用javascript生成 
  // タスクリスト(実験ソース)のテンプレートにデータをセット
  $tpl["main_content"] = $this -> load -> view( 'tasklist_view', $data , true ); 
  // 大枠のテンプレートに、タスクリストのビューをはめ込む
  $this -> load -> view( 'base_view', $tpl );
} 
 ?>

4)ビュー(中身):application/views/tasklist_view.php

変更箇所のみ抜粋

<h2>↓スクレイピングのテスト↓</h2>
<p>画面表示の度に外につなぎにいくのは実用的ではないけどね</p>
<?php 
    foreach($scraping as $k => $v ){
        echo '<label>'. $k . 'を取得:</label><pre class="gray">' . $v .'</pre>' ;
    }
 ?>

<h2>↓俺俺ライブラリのテスト↓</h2>

(下略)


結果

ふむ、動いた。

(取得したデータを画面上に展開するのはいろんな意味で危険だけど、ここでは実験なのでそこまで考慮してません。ご注意ください。)

f:id:dix3:20081002070349p:image



この要領でさくさく移植していけばいいのだな。たぶん。

トラックバック - http://d.hatena.ne.jp/dix3/20081002/1222899116

ヌル日記の内容は一切無保証です。個人的な作業履歴なので、実用では穴や間違いがあるかもしれません。

こちらの注意書きも一応読んでくださいね