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

Written by uechoco 2月 27
[OpenPNE3]管理画面付きプラグイン(opFreepagePlugin)#4 PC/モバイルの動作画面の作成 はコメントを受け付けていません。
この記事を読む時間: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

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

[php]configure: warning: lemon versions supported for regeneration of libsqlite parsers: 1.0 (found: none)

Written by uechoco 2月 20
[php]configure: warning: lemon versions supported for regeneration of libsqlite parsers: 1.0 (found: none) はコメントを受け付けていません。
この記事を読む時間:36くらい

CentOS 5.2でPHP 5.2.8のconfigure中に表題のエラーが発生。

などを参考に

  1. <pre>wget http://www.sqlite.org/cvstrac/getfile/sqlite/tool/lemon.c
  2. gcc -o lemon lemon.c
  3. sudo mv lemon /usr/local/bin</pre>

こうすることで、warningが消えた。

[雑記]個人ブログを分離・新設しました。

Written by uechoco 2月 19
[雑記]個人ブログを分離・新設しました。 はコメントを受け付けていません。
この記事を読む時間:12くらい

少し前からですが、個人ブログを開設しています。

ランニングと本とグルメとキイロイトリをブログ

主に各内容はブログのタイトルに書きならべました。なんてひどいタイトルww。

  • ランニングは、ホノルルマラソンや東京マラソン、日々の練習について書きます。
  • 本は、技術系以外の本を読んだ時にレビューを書いてみようと思っています。ただ、技術系以外の本を読む習慣がありません。(ぉぃ
  • グルメは、浅草・高田馬場・新宿などを中心に、勝手気ままにお店や食べ物を紹介していきます。たまに写真を撮り忘れて書けないこともしばしば。
  • キイロイトリは、キイロイトリです。カオルさんのペットです。かわいいです。かわいいです。かわいいです。部屋にたくさん居ます。

開設する前までに溜めこんだ記事は、内容に合わせて古い日付を付けています。今後各記事はそのままの日付です。

個人的なブログなので、気ままにやっていこうと思います。

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

Written by uechoco 2月 19
[OpenPNE3]管理画面付きプラグイン(opFreepagePlugin)#3 管理画面編集フォーム作成 はコメントを受け付けていません。
この記事を読む時間: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の実際の表示画面の作成をやります。次回の内容でプラグインの機能部分は終わって、それ以降はプラグインの微調整と、プラグインのリリースなどが待っています。あともう少しでプラグインの完成です!

[symfony]Unable to execute INSERT statement. [wrapped: SQLSTATE[23000]: Integrity constraint violation: 1048 Column ‘id’ cannot be null]

Written by uechoco 2月 18
[symfony]Unable to execute INSERT statement. [wrapped: SQLSTATE[23000]: Integrity constraint violation: 1048 Column ‘id’ cannot be null] はコメントを受け付けていません。
この記事を読む時間:15くらい

参照整合性のエラーとか、聞いたことがない。symfonyでモデルクラスを使ってテーブルにsave()すると表題のようなエラーで動いてくれない。ソースコードを疑ったが、どこにも悪いところがない。あとはもうDBだけかとおもってDBDesignerを見直してみると罠があった。該当のテーブルのidカラムのAUTO_INCREMENTのチェックが外れていた。

当然このDBDesignerの設計図から吐き出されるSQLも意図していないものなので、リバースエンジニアリングしてschema.ymlを作ったymlも知っていたはず。ところが、自分でschema.ymlを書き換えて、各テーブルのid属性の値を消してしまったので、symfonyが普通のidカラムだと思って、モデルを作ってしまったようだ。

たぶん、ご操作でたまたまAUTO_INCREMENTのチェックが外れてしまったんだと思うが、このチェックが外れていたおかげで実に2時間を浪費してしまった。なんたる失態。