m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

MovableTypeのプラグイン「PageDownloadSet」を作成

機能

ウェブページの一覧画面にボタンを配置して、ボタンをクリック後にZIP形式に圧縮したファイルをダウンロードする。

必要なもの

Archive::Zipは圧縮する上で必要
File::Pathも使います

動き

プラグインを配置するとウェブページ一覧にボタンを表示する

f:id:m_shige1979:20131012184045j:plain
※「ウェブページダウンロード」を追加

押下すると確認画面を出して「はい」の場合にダウンロード

f:id:m_shige1979:20131012184058j:plain

解凍したファイル

f:id:m_shige1979:20131012184106j:plain
※ページタイトルとかだと重複するのでIDにしています。

困ったこと

そもそもCMSでのダウンロード処理とかどうやるのかわからなかった。

CMS用の出力ではなく、ちゃんとヘッダーを出力してごにょごにょする必要があるので、探したらなんかエクスポートの機能があったので拝借

    # 圧縮したファイルを開き、出力する
    open my $fh, "<", $arcfile;
    binmode $fh;
    $app->{no_print_body} = 1;
    $app->set_header(
        "Content-Disposition" => "attachment; filename=$filename" );
    $app->send_http_header( $arc_info->{mimetype} );
    my $data;
    
    # 一定単位にデータを読み込み
    while ( read $fh, my ($chunk), 8192 ) {
        $data .= $chunk;
    }
    close $fh;
    $app->print($data);

CMSの構成が結構複雑で迷った

リファレンス

今回はハッシュ型のみで対応

    # 全てのウェブページをダウンロード
    while(my $page = $iter->()){
    	
    	# IDを取得
    	my $set_id = $page->id;
    	my $id_name = sprintf( "%06d", $set_id );
    	
    	# ディレクトリを作成
    	my $local_path = $wrk_path . "/" . $id_name;
    	$fmgr->mkpath($local_path);
    	
    	# text
    	my $text = $page->text;
    	my $text_more = $page->text_more;
    	
    	# 出力
    	$fmgr->put_data($text, $local_path . '/text.txt');
    	$fmgr->put_data($text_more, $local_path . '/text_more.txt');
    	
    	# ハッシュリファレンスに詳細を設定
    	my $page_info = {};
    	$page_info->{id} = $set_id;
    	$page_info->{title} = $page->title;
    	$page_info->{text} = ($page->text) ? "1": "0";
    	$page_info->{text_more} = ($page->text_more) ? "1": "0";
    	$page_info->{status} = $page->status;
    	
    	# ID別に追加
    	$webpage_hash->{pages}->{$id_name} = $page_info;
    	
    }

慣れてきた

まだ、いくつかの処理はコピペだが、なんとなくやり方はわかってきたっぽい

プラグイン使用に関してやオブジェクトの制御に関してのマニュアルかなんかは欲しいところ

飽きてきた

プラグインばかり作ってきたのでちょっとモチベーションが低下気味、ちょっと別のことに手をつけてみる