Bug(バグ) #3250
Yuya Watanabe さんが約12年前に更新
h3. 概要
日記投稿時にアクティビティへの投稿が失敗するため日記投稿が行えない
日記を保存する際に SimpleXMLElement のインスタンスである $xml 変数から title と content を取得してきているが,それぞれ $xml と同じように SimpleXMLElement のインスタンスとなる.そのため,Diary オブジェクトの保存を行う際に発生する postSave() の時にアクティビティ投稿の処理が走るが,そのときに title に指定したものをテンプレートのプレースホルダに入れるのだがこれが文字列でないため更新に失敗し,全体として失敗した処理となって API は 500 を返す.
opWebAPIPlugin 側
<pre>
lib/api/opAPIDiary.class.php
51 public function insert(SimpleXMLElement $xml)
...
59 $diary = new Diary();
60 $diary->setTitle($xml->title);
61 $diary->setBody($xml->content);
62 $diary->setMember($member);
63 $diary->save();
</pre>
opDiaryPlugin 側 (142 行目)
<pre>
lib/model/doctrine/PluginDiary.class.php
132 public function postInsert($event)
133 {
134 if (Doctrine::getTable('SnsConfig')->get('op_diary_plugin_update_activity', false))
135 {
136 $body = '[Diary] '.$this->title;
137 $options = array(
138 'public_flag' => sfConfig::get('op_activity_is_open', false) && $this->is_open ? 0 : $this->public_flag,
139 'uri' => '@diary_show?id='.$this->id,
140 'source' => 'Diary',
141 'template' => 'diary',
142 'template_param' => array('%1%' => $this->title),
</pre>
h3. 再現手順
# 管理画面 > プラグイン設定 > opDiaryPlugin 「設定」 > アクティビティ更新設定 > 使用する
# 下記のようなファイルを作成(author の指定が id である点については #1911 を参照)
<pre>
$ cat diary.xml
<?xml version="1.0" encoding="UTF-8" ?>
<entry xmlns="http://www.w3.org/2005/Atom">
<title type="text">日記タイトル</title>
<content type="text">日記本文</content>
<author>
<id>1</id>
</author>
</entry>
</pre>
# 下記コマンドを実行する
<pre>
$ curl http://sns.example.com/api.php/feeds/diary -d "@diary.xml"
<?xml version="1.0" encoding="utf-8" ?>
<error code="500" message="Internal Server Error" />
</pre>
h3. 修正案
オブジェクトへ値を渡す際に明示的に string 側を渡す.下記のものはキャストを行なっているが, SimpleXMLObject を正しく文字列に変換できる方法が望ましい.
<pre>
lib/api/opAPIDiary.class.php
59 $diary = new Diary();
60 $diary->setTitle((string)$xml->title);
61 $diary->setBody((string)$xml->content);
62 $diary->setMember($member);
63 $diary->save();
</pre>