[OpenPNE3]管理画面付きプラグイン(opFreepagePlugin)#6 プラグインのパッケージング

Written by uechoco 3月 07
この記事を読む時間:1219くらい

前回まででopFreepagePluginの開発部分は完了しました。今回はプラグインのバージョン情報を定義し、アーカイブ化することで、外部に公開できるファイルにしたいと思います。なお、このプラグインのパッケージング方法はOpenPNE 3.0.0で確認しているものです。近いうちにプラグインリリース用symfony拡張コマンドを充実させる予定もあるようですので、その点は加味してご覧ください。

プラグインのパッケージングは非常に簡単です。まずはプラグイン情報が書かれたpackage.xmlを作成します。これもコマンド1つで作成できます。今回はopFreepagePluginをバージョン0.9.0、ステータスをbeta、リリース文を”First release”とします。以下のようなコマンドになります。

  1. ./symfony opPlugin:define opFreepagePlugin 0.9.0 beta "First release"

以下のような出力がなされます。

  1. [uechooc@localhost pneroot]$ ./symfony opPlugin:define opFreepagePlugin 0.9.0 beta "First release"
  2. >> sfPearFrontendPlugin Attempting to discover channel "plugins.openpne.jp"...
  3. >> sfPearFrontendPlugin downloading channel.xml ...
  4. >> sfPearFrontendPlugin Starting to download channel.xml (598 bytes)
  5. >> sfPearFrontendPlugin .
  6. >> sfPearFrontendPlugin ...done: 598 bytes
  7. >> sfPearFrontendPlugin Auto-discovered channel "plugins.openpne.jp", alias
  8. >> sfPearFrontendPlugin "plugins.openpne.jp", adding to registry
  9. >> sfPearFrontendPlugin Attempting to discover channel "pear.symfony-project.com"...
  10. >> sfPearFrontendPlugin downloading channel.xml ...
  11. >> sfPearFrontendPlugin Starting to download channel.xml (663 bytes)
  12. >> sfPearFrontendPlugin ...done: 663 bytes
  13. >> sfPearFrontendPlugin Auto-discovered channel "pear.symfony-project.com", alias
  14. >> sfPearFrontendPlugin "symfony", adding to registry
  15. >> sfPearFrontendPlugin Attempting to discover channel
  16. >> sfPearFrontendPlugin "plugins.symfony-project.org"...
  17. >> sfPearFrontendPlugin downloading channel.xml ...
  18. >> sfPearFrontendPlugin Starting to download channel.xml (639 bytes)
  19. >> sfPearFrontendPlugin ...done: 639 bytes
  20. >> sfPearFrontendPlugin Auto-discovered channel "plugins.symfony-project.org", alias
  21. >> sfPearFrontendPlugin "symfony-plugins", adding to registry
  22. >> sfPearFrontendPlugin Analyzing
  23. >> sfPearFrontendPlugin apps/mobile_frontend/modules/freepage/actions/actions.class.php
  24. >> sfPearFrontendPlugin Analyzing
  25. >> sfPearFrontendPlugin apps/mobile_frontend/modules/freepage/templates/indexSuccess.php
  26. >> sfPearFrontendPlugin Analyzing
  27. >> sfPearFrontendPlugin apps/pc_backend/modules/opFreepagePlugin/actions/actions.class.php
  28. >> sfPearFrontendPlugin Analyzing
  29. >> sfPearFrontendPlugin apps/pc_backend/modules/opFreepagePlugin/templates/editSuccess.php
  30. >> sfPearFrontendPlugin Analyzing
  31. >> sfPearFrontendPlugin apps/pc_backend/modules/opFreepagePlugin/templates/indexSuccess.php
  32. >> sfPearFrontendPlugin Analyzing
  33. >> sfPearFrontendPlugin apps/pc_backend/modules/opFreepagePlugin/templates/listSuccess.php
  34. >> sfPearFrontendPlugin Analyzing
  35. >> sfPearFrontendPlugin apps/pc_backend/modules/opFreepagePlugin/templates/newSuccess.php
  36. >> sfPearFrontendPlugin Analyzing
  37. >> sfPearFrontendPlugin apps/pc_backend/modules/opFreepagePlugin/templates/_form.php
  38. >> sfPearFrontendPlugin Analyzing
  39. >> sfPearFrontendPlugin apps/pc_backend/modules/opFreepagePlugin/templates/_submenu.php
  40. >> sfPearFrontendPlugin Analyzing
  41. >> sfPearFrontendPlugin apps/pc_frontend/modules/freepage/actions/actions.class.php
  42. >> sfPearFrontendPlugin Analyzing
  43. >> sfPearFrontendPlugin apps/pc_frontend/modules/freepage/templates/indexSuccess.php
  44. >> sfPearFrontendPlugin Analyzing config/config.php
  45. >> sfPearFrontendPlugin Analyzing lib/opFreepagePluginRouting.class.php
  46. >> sfPearFrontendPlugin Analyzing lib/filter/FreepageFormFilter.class.php
  47. >> sfPearFrontendPlugin Analyzing lib/filter/base/BaseFreepageFormFilter.class.php
  48. >> sfPearFrontendPlugin Analyzing lib/form/FreepageForm.class.php
  49. >> sfPearFrontendPlugin Analyzing lib/form/base/BaseFreepageForm.class.php
  50. >> sfPearFrontendPlugin Analyzing lib/model/Freepage.php
  51. >> sfPearFrontendPlugin Analyzing lib/model/FreepagePeer.php
  52. >> sfPearFrontendPlugin Analyzing lib/model/map/FreepageMapBuilder.php
  53. >> sfPearFrontendPlugin Analyzing lib/model/om/BaseFreepage.php
  54. >> sfPearFrontendPlugin Analyzing lib/model/om/BaseFreepagePeer.php

いろいろなファイルを解析していますが、これらはパッケージ内に含まれるファイル一覧を作成し、それぞれのファイルのチェックサムを取得している処理です。package.xmlには様々な設定項目があるのですが、コマンドラインで指定できる項目以外は固定で挿入されてしまいます。例えば、ライセンスはApache Licenseで固定されています。

パッケージ情報が生成できたので、アーカイブを作成します。これもコマンド一発です。以下のコマンドはopFreepagePluginのアーカイブををカレントディレクトリに作成します。

  1. ./symfony opPlugin:archive opFreepagePlugin ./

このコマンドを実行後、カレントディレクトリにはopFreepagePlugin-0.9.0.tgzというファイルが作成されています。バージョン名が付加されたtgzファイルですね。あとはこのファイルを公開すれば完成です。PEARのチャンネルサーバがあればコマンドラインからのインストールにも対応できると思うのでいいですね。plugins.openpne.jpなんかが一般開放されるとうれしいのですが。

以上でこの連載シリーズは終了です。OpnePNE3のプラグインが増えるといいですね!技術的な知識がある運営者ならばプラグインで独自の機能を作って自分のSNSを盛り上げることも可能でしょう。OpenSocialとsymfonyプラグインの双方で拡張できるOpenPNE3の可能性は無限大です!

[OpenPNE3]管理画面付きプラグイン(opFreepagePlugin)#5 ルーティング拡張でプラグイン独自のURL

Written by uechoco 3月 01
この記事を読む時間:124くらい

前回まででほとんどの機能は完成しています。今回は利便性の向上を目的として、ルーティングの拡張を行います。前回までの内容ですと、フリーページにアクセスする際は/freepage/id/1といったURLでした。どうせなら、/id/というのを削りたいですね。しかしながら、プラグインとして追加する以上、サイト管理者にrouting.ymlを書き換えてもらうなどという対応はよろしくありません。OpenPNE3のベースとなるsymfonyではプラグインからルーティングを拡張するための仕組みが用意されていますsymfony 1.1 日本語 マニュアル 第17章 – symfonyを拡張する – プラグインの機能にもその記述があります。OpenPNE3.0系ではこの機能にのっとってルーティング拡張をしているようです。

早速試してみましょう。/plugins/opFreepagePlugin/config/config.phpを新規作成し、以下の内容を追加します。
[phpcode]
dispatcher->connect(‘routing.load_configuration’, array(‘opFreepagePluginRouting’, ‘listenToRoutingLoadConfigurationEvent’));
?>
[/phpcode]
そして、/plugins/opFreepagePlugin/lib/opFreepagePluginRouting.class.phpを新規作成し、以下の内容を記述します。

[phpcode]
getSubject();

$routes = array(
‘freepage_id’ => new sfPropelRoute(
‘/freepage/:id’,
array(‘module’ => ‘freepage’, ‘action’ => ‘index’),
array(‘id’ => ‘\d+’),
array(‘model’ => ‘Freepage’, ‘type’ => ‘object’)
),
);

$routes = array_reverse($routes);
foreach ($routes as $name => $route)
{
$routing->prependRoute($name, $route);
}
}
}
[/phpcode]
さきほどご紹介したマニュアルのページとは少しソースコードの形式が違っていますね。これはopDiaryPluginのルーティング拡張部分を参考にしたコードです。特徴としては、配列によって簡単にルーティング設定を追加することができるようになっています。

これだけでURLが変わります。

  1. ./symfony cc

でキャッシュをクリアして、新しいルーティングを適応させます。

試しに/freepage/1、/mobile_frontend.php/freepage/1とURLを打ってみてください。ちゃんとアクセスできると思います。

次回は最終回です。OpenPNE3のプラグインのパッケージング方法をご紹介したいと思います。

[OpenPNE3]管理画面付きプラグイン(opFreepagePlugin)#4 PC/モバイルの動作画面の作成

Written by uechoco 2月 27
この記事を読む時間:736くらい

前回まででopFreepagePluginの管理画面側は完成しています。今回はいよいよPCとモバイルの動作画面を作ります。

まずはPC版から。symfonyコマンドでpc_frontendのappとmoduleを作ります。moduleはfreepageという名前にします。

  1. ./symfony opGenerate:app opFreepagePlugin pc_frontend
  2. ./symfony opGenerate:module opFreepagePlugin pc_frontend freepage

新しく作られたapps/pc_frontend/modules/freepage/actions/actions.class.phpのexecuteIndexメソッドを変更します。

[phpcode]
public function executeIndex($request)
{
// forward 404 page unless freepage does exist
$this->forward404Unless($this->freepage = FreepagePeer::retrieveByPk($request->getParameter(‘id’)), sprintf(‘Object freepage does not exist (%s).’, $request->getParameter(‘id’)));

if ($this->freepage->getAuth()) {
if (($member = $this->getUser()->getMember()) && $member->getIsActive()) {
// ok
} else {
$this->forward404(‘This page is for sns members.’);
}
}

// forward 404 page unless app_type is ‘pc’;
$this->forward404Unless($this->freepage->getAppType() == ‘pc’, sprintf(‘This page is for %s application.’, $this->freepage->getAppType()));

$this->getResponse()->setTitle($this->freepage->getTitle());
}
[/phpcode]
このIndexアクションでは、

  • idがパラメータとして存在するか
  • パラメータidがfreepageテーブルに存在するか
  • 該当フリーページが認証付きページの場合、認証済みのユーザであるかどうか
  • 該当フリーページがPC用かどうか

をチェックしています。認証済みユーザの認証部分の処理はもっとスマートな方法がありそうですね。近いうちに調べてみます。続いてさきほど自動生成されたapps/pc_frontend/modules/freepage/templates/indexSuccess.phpにも変更を加えます。
[phpcode]
getRaw(‘freepage’)->getBody(); ?>
[/phpcode]
今回は本質的ではないのでデザインを考慮していません。大事なポイントは、HTMLエンティティがエスケープされていない生のデータを取得して、表示しているところです。こうしないと管理画面で苦労して書いたタグがそのまま出てしまうことになるので、生データを出力します。

これでPC版は完成です。(http://example.com/freepage/id/1)
03_opfreepage_pc

続いてモバイル版も作りましょう。ほとんど同じ手順で作ることができます。まずはmobile_frontend appを作り、freepage moduleを追加します。

  1. ./symfony opGenerate:app opFreepagePlugin mobile_frontend
  2. ./symfony opGenerate:module opFreepagePlugin mobile_frontend freepage

自動生成されたapps/mobile_frontend/modules/freepage/actions/actions.class.phpを書き換えます。PC版との違いはPC/mobile判定部分だけです。
[phpcode]
public function executeIndex($request)
{
// forward 404 page unless freepage does exist
$this->forward404Unless($this->freepage = FreepagePeer::retrieveByPk($request->getParameter(‘id’)), sprintf(‘Object freepage does not exist (%s).’, $request->getParameter(‘id’)));

if ($this->freepage->getAuth()) {
if (($member = $this->getUser()->getMember()) && $member->getIsActive()) {
// ok
} else {
$this->forward404(‘This page is for sns members.’);
}
}

// forward 404 page unless app_type is ‘mobile’;
$this->forward404Unless($this->freepage->getAppType() == ‘mobile’, sprintf(‘This page is for %s application.’, $this->freepage->getAppType()));

$this->getResponse()->setTitle($this->freepage->getTitle());
}
[/phpocde]

そしてapps/mobile_frontend/modules/freepage/templates/indexSuccess.phpを変更します。こちらはデザインが入っていないのでPC版の同ファイルと同じ内容です。
[phpcode]
getRaw(‘freepage’)->getBody(); ?>
[/phpcode]

モバイル版も完成です。(http://example.com/mobile_frontend.php/freepage/id/1)
04_opfreepage_mobile

次回はルーティングの調整をします。

[OpenPNE3]管理画面付きプラグイン(opFreepagePlugin)#3 管理画面編集フォーム作成

Written by uechoco 2月 19
この記事を読む時間:64くらい

 前回はopFreepagePluginの管理画面の一覧表示部分を作ってみました。今回はそこにデータを追加するための新規作成・編集削除の2画面を一気に作ります。symfonyを使ったことある人ならば、「propel:generate-crud的な感じ」と言えばソースコードの構成が伝わるかもしれません。

まずはactions.class.phpに以下の6つのメソッドを追加します。
[phpcode]

public function executeNew(sfWebRequest $request)
{
$this->form = new FreepageForm();
}

public function executeCreate(sfWebRequest $request)
{
$this->forward404Unless($request->isMethod(‘post’));

$this->form = new FreepageForm();

$this->processForm($request, $this->form);

$this->setTemplate(‘new’);
}

public function executeEdit(sfWebRequest $request)
{
$this->forward404Unless($freepage = FreepagePeer::retrieveByPk($request->getParameter(‘id’)), sprintf(‘Object freepage does not exist (%s).’, $request->getParameter(‘id’)));
$this->form = new FreepageForm($freepage);
}

public function executeUpdate(sfWebRequest $request)
{
$this->forward404Unless($request->isMethod(‘post’) || $request->isMethod(‘put’));
$this->forward404Unless($freepage = FreepagePeer::retrieveByPk($request->getParameter(‘id’)), sprintf(‘Object freepage does not exist (%s).’, $request->getParameter(‘id’)));
$this->form = new FreepageForm($freepage);

$this->processForm($request, $this->form);

$this->setTemplate(‘edit’);
}

public function executeDelete(sfWebRequest $request)
{
$request->checkCSRFProtection();

$this->forward404Unless($freepage = FreepagePeer::retrieveByPk($request->getParameter(‘id’)), sprintf(‘Object freepage does not exist (%s).’, $request->getParameter(‘id’)));
$freepage->delete();

$this->redirect(‘opFreepagePlugin/list’);
}

protected function processForm(sfWebRequest $request, sfFormPropel $form)
{
$form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
if ($form->isValid())
{
$freepage = $form->save();
$this->redirect(‘opFreepagePlugin/list’);
}
}
[/phpcode]
これでもうアクションの追加は終わりです。あとは対応するビューの作成とフォームの調整です。

templates/ディレクトリにnewSuccess.phpを作成し、以下のコードを入力します。
[phpcode]


$form)) ?>
[/phpcode]
続いて、editSuccess.phpを作成し、以下のコードを入力します。
[phpcode]


$form)) ?>
[/phpcode]
この2つのビューは新規作成と編集画面に対応するものですが、非常に似ていますし、短いですね。というのも、肝心のフォームの描画は部分テンプレートとして分離しています。templares/ディレクトリに_form.phpを作成して、以下のコードを追加します。
[phpcode]


renderHiddenFields() ?>
 02_opfreepage_edit

次回はPC/mobileの実際の表示画面の作成をやります。次回の内容でプラグインの機能部分は終わって、それ以降はプラグインの微調整と、プラグインのリリースなどが待っています。あともう少しでプラグインの完成です!

[OpenPNE3]管理画面付きプラグイン(opFreepagePlugin)#2 管理画面の作成

Written by uechoco 2月 17
この記事を読む時間:532くらい

 前回はopFreepagePluginの初期設定として、ディレクトリの作成とDBスキーマの作成を行いました。今回は管理画面内のプラグイン独自の設定画面を開発方法を学びます。開発を行う前に、OpenPNE3のプラグイン設定画面の仕組みを説明します。

 OpenPNE3では、プラグインごとに設定画面が持てるような仕組みを持っていて、設定画面がある場合はプラグイン一覧からリンクが張られています。

00_plugin_list

 プラグイン独自の設定画面を作成するには、プラグイン内にpc_backendアプリケーション用のディレクトリを用意し、そこにプラグインと同名のモジュールを追加します。つまり、プラグインと同名のモジュールがあるかないかで設定画面の有無を判断しています。例えば、opFreepagePluginであれば、/plugins/opFreepagePlugin/apps/pc_backend/modules/opFreepagePlugin/actionsディレクトリを持っていれば「設定画面あり」とみなされます。

 では具体的にopFreepagePluginに設定画面を追加してみます。まずはターミナルで

  1. ./symfony opGenerate:app opFreepagePlugin pc_backend

を実行し、/plugins/opFreepagePlugin/apps/pc_backend/modulesディレクトリを作成します。続いて

  1. ./symfony opGenerate:module opFreepagePlugin pc_backend opFreepagePlugin

を実行し、pc_backendアプリケーション用のopFreepagePluginモジュールを追加します。デフォルトでactions.class.phpとindexSuccess.phpも作られます。また、この時点で既にプラグイン一覧にはopFreepagePluginの設定画面へのリンクが表示されています。

/actions/actions.class.phpにはexecuteIndex()メソッドが最初から記述されています。これを下記のように書き換え、さらにexecuteList()メソッドを追加します。

[phpcode]
public function executeIndex($request)
{
$this->redirect(‘opFreepagePlugin/list’);
}

/**
* Executes list action
*
* @param sfRequest $request A request object
*/
public function executeList($request)
{
$this->freepage_list = FreepagePeer::doSelect(new Criteria());
return sfView::SUCCESS;
}
[/phpcode]

上記記述で追加したlistアクションはフリーページの一覧を表示するアクションで、opFreepagePluginの設定画面を開くと最初に表示されることを想定しています。このlistアクションに対応するビューとして、/templates/listSuccess.phpを作成します。

[phpcode]



ID
getId(), ‘opFreepagePlugin/edit?id=’.$freepage->getId()) ?> getTitle() ?> getBody()) . __(‘文字’) . ‘)’ ?> getAppType() ?> getAuth() ? ‘あり’ : ‘なし’) ?> getCreatedAt() ?> getUpdatedAt() ?>


[/phpcode]

listSuccess.phpの冒頭でsubmenuという名前の部分テンプレートをスロットとして読み込んでいます。この冒頭3行は管理画面のビューの典型的なパターンですので覚えて損はないです。そのほかの部分はfreepageテーブルの内容を表形式に出力し、編集や新規作成へのリンクを加えています。

 最後に先ほど触れたsubmenuという名前の部分テンプレートを/templates/_submenu.phpに作成します。

[phpcode]

  • [/phpcode]

    とりあえずこれでフリーページの一覧は表示できるようになりました。まだ新規作成や編集のリンクは動いていませんが、試しにフリーページをデータベースに直接登録してみると、以下のような画面になります。

    01_opfreepage_list

     今回はここまでです。おさらいですが、管理画面にプラグイン独自の設定画面を追加するには、プラグイン名と同名のモジュールを作成すればよいということを忘れないでください。

     次回は管理画面の残りの機能として、新規作成・編集・削除画面を作ります。フォームの使い方勉強にもなりそうです。