OpenPNE Issue Tracking System: チケット
http://redmine.openpne.jp/
http://redmine.openpne.jp/favicon.ico
2017-02-27T09:19:05Z
OpenPNE Issue Tracking System
Redmine
OpenPNE 3 - Bug(バグ) #4168 (Fixed(完了)): opI18N::__() のパラメータに語形変化の設定をしたSnsTermインスタンスを渡しても反映されない
http://redmine.openpne.jp/issues/4168
2017-02-27T09:19:05Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>SnsTerm の <a href="https://github.com/openpne/OpenPNE3-doc/blob/master/cookbook/3.6/ja/use-sns-term-from-plugin.rst#%E8%A4%87%E9%9B%91%E3%81%AA%E4%BD%BF%E7%94%A8%E4%BE%8B" class="external">複雑な使用例</a> に記載されている下記のようなコードが正しく動作せず、語形変化が適用されていない「friend」のまま出力される。</p>
<pre><code class="php syntaxhl"><span class="CodeRay"><span class="inline-delimiter"><?php</span> <span class="predefined">echo</span> __(<span class="string"><span class="delimiter">'</span><span class="content">%friend% are removed.</span><span class="delimiter">'</span></span>, <span class="predefined">array</span>(<span class="string"><span class="delimiter">'</span><span class="content">%friend%</span><span class="delimiter">'</span></span> => <span class="local-variable">$op_term</span>[<span class="string"><span class="delimiter">'</span><span class="content">friend</span><span class="delimiter">'</span></span>]->pluralize()->fronting())); <span class="inline-delimiter">?></span>
</span></code></pre>
<p>この問題は <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): occurs "warning" when second argument of the __() i18n translation method is non-array (i18nの翻訳メソ... (Fixed(完了))" href="http://redmine.openpne.jp/issues/1759">#1759</a> における <a class="changeset" title="fixed non-array (fixes #1759)" href="http://redmine.openpne.jp/projects/op3/repository/revisions/9b2f55d84ecb1e0cc2aa47a77b9b42f0582799f5">9b2f55d8</a> の修正以降から発生している。</p>
<p>これにより、opDiaryPlugin の日記作成画面を英語で表示した際に「My Friends」と表示されるべき箇所が「my friend」と表示される状態になっている。</p>
<p><img src="http://redmine.openpne.jp/attachments/download/653/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2017-02-27_18.00.07.png" style="width:567px;" alt="" /></p>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p>前提として、SnsTerm は以下のような性質を持っている。</p>
<ol>
<li>SnsTerm インスタンスに設定した語形変化は <code>SnsTerm::__toString()</code> が呼ばれると初期状態に戻る
<ul>
<li><pre><code class="php syntaxhl"><span class="CodeRay"><span class="local-variable">$term</span> = <span class="constant">Doctrine_Core</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">SnsTerm</span><span class="delimiter">'</span></span>)->get(<span class="string"><span class="delimiter">'</span><span class="content">my_friend</span><span class="delimiter">'</span></span>);
<span class="local-variable">$term</span>->titleize();
<span class="predefined">var_dump</span>((<span class="predefined-type">string</span>)<span class="local-variable">$term</span>); <span class="comment">// "My Friend" </span>
<span class="predefined">var_dump</span>((<span class="predefined-type">string</span>)<span class="local-variable">$term</span>); <span class="comment">// "my friend" </span>
</span></code></pre></li>
</ul>
</li>
<li>SnsTerm インスタンスは SnsTermTable クラス内でキャッシュされる
<ul>
<li><pre><code class="php syntaxhl"><span class="CodeRay"><span class="local-variable">$term</span> = <span class="constant">Doctrine_Core</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">SnsTerm</span><span class="delimiter">'</span></span>)->get(<span class="string"><span class="delimiter">'</span><span class="content">my_friend</span><span class="delimiter">'</span></span>);
<span class="local-variable">$term</span>->titleize();
<span class="comment">// $term と同一のインスタンスが返る</span>
<span class="local-variable">$term2</span> = <span class="constant">Doctrine_Core</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">SnsTerm</span><span class="delimiter">'</span></span>)->get(<span class="string"><span class="delimiter">'</span><span class="content">my_friend</span><span class="delimiter">'</span></span>);
<span class="predefined">var_dump</span>((<span class="predefined-type">string</span>)<span class="local-variable">$term2</span>); <span class="comment">// "My Friend" </span>
</span></code></pre></li>
</ul></li>
</ol>
<p>それを踏まえて、<code>opI18N::__()</code> メソッドの動作を追うと以下のようになる。</p>
<pre><code class="php syntaxhl"><span class="CodeRay"> <span class="comment">// 以下のように呼ばれる。期待する出力は「Friends are removed.」</span>
<span class="predefined">echo</span> __(<span class="string"><span class="delimiter">'</span><span class="content">%friend% are removed.</span><span class="delimiter">'</span></span>, <span class="predefined">array</span>(<span class="string"><span class="delimiter">'</span><span class="content">%friend%</span><span class="delimiter">'</span></span> => <span class="local-variable">$op_term</span>[<span class="string"><span class="delimiter">'</span><span class="content">friend</span><span class="delimiter">'</span></span>]->pluralize()->fronting()));
....
<span class="comment">// lib/i18n/opI18N.class.php</span>
<span class="keyword">public</span> <span class="keyword">function</span> <span class="function">__</span>(<span class="local-variable">$string</span>, <span class="local-variable">$args</span> = <span class="predefined">array</span>(), <span class="local-variable">$catalogue</span> = <span class="string"><span class="delimiter">'</span><span class="content">messages</span><span class="delimiter">'</span></span>)
{
<span class="keyword">if</span> (<span class="predefined">empty</span>(<span class="local-variable">$this</span>->parsed[<span class="local-variable">$string</span>])) <span class="comment">// 初回の呼び出しでは true になる</span>
{
<span class="local-variable">$this</span>->parsed[<span class="local-variable">$string</span>] = <span class="predefined">array</span>();
<span class="local-variable">$matches</span> = <span class="predefined">array</span>();
<span class="predefined">preg_match_all</span>(<span class="string"><span class="delimiter">'</span><span class="content">/%([a-zA-Z_]+)%/</span><span class="delimiter">'</span></span>, <span class="local-variable">$string</span>, <span class="local-variable">$matches</span>); <span class="comment">// 「%friend%」がヒットする</span>
<span class="predefined">array_shift</span>(<span class="local-variable">$matches</span>);
<span class="keyword">foreach</span> (<span class="local-variable">$matches</span> <span class="keyword">as</span> <span class="local-variable">$match</span>)
{
<span class="keyword">foreach</span> (<span class="local-variable">$match</span> <span class="keyword">as</span> <span class="local-variable">$v</span>)
{
<span class="keyword">if</span> (<span class="local-variable">$this</span>->terms[<span class="local-variable">$v</span>])
{
<span class="local-variable">$term</span> = <span class="local-variable">$this</span>->terms[<span class="local-variable">$v</span>]; <span class="comment">// 性質 2 より、語形変化が適用されたままのインスタンスが返る</span>
<span class="keyword">if</span> (<span class="local-variable">$this</span>->titleize) <span class="comment">// デフォルトで false</span>
{
<span class="local-variable">$term</span> = <span class="local-variable">$term</span>->titleize();
}
<span class="local-variable">$this</span>->parsed[<span class="local-variable">$string</span>][<span class="string"><span class="delimiter">'</span><span class="content">%</span><span class="delimiter">'</span></span>.<span class="local-variable">$v</span>.<span class="string"><span class="delimiter">'</span><span class="content">%</span><span class="delimiter">'</span></span>] = (<span class="predefined-type">string</span>)<span class="local-variable">$term</span>; <span class="comment">// ここで返るのは「Friends」</span>
}
}
}
}
<span class="local-variable">$parsedString</span> = <span class="local-variable">$this</span>->parsed[<span class="local-variable">$string</span>];
<span class="keyword">if</span> (<span class="predefined">is_array</span>(<span class="local-variable">$args</span>))
{
<span class="keyword">foreach</span> (<span class="local-variable">$args</span> <span class="keyword">as</span> <span class="local-variable">$k</span> => <span class="local-variable">$v</span>)
{
<span class="keyword">if</span> (<span class="local-variable">$v</span> <span class="keyword">instanceof</span> <span class="constant">SnsTerm</span>)
{
<span class="local-variable">$args</span>[<span class="local-variable">$k</span>] = (<span class="predefined-type">string</span>)<span class="local-variable">$v</span>; <span class="comment">// 性質 1 より、ここで返るのは「friend」</span>
}
}
<span class="local-variable">$parsedString</span> = <span class="predefined">array_merge</span>(<span class="local-variable">$parsedString</span>, <span class="local-variable">$args</span>); <span class="comment">// 「Friends」が「friend」に上書きされる</span>
}
<span class="comment">// 「friend are removed.」が出力される (不具合)</span>
<span class="keyword">return</span> <span class="predefined-constant">parent</span>::__(<span class="local-variable">$string</span>, <span class="local-variable">$parsedString</span>, <span class="local-variable">$catalogue</span>);
}
</span></code></pre>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p><a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): occurs "warning" when second argument of the __() i18n translation method is non-array (i18nの翻訳メソ... (Fixed(完了))" href="http://redmine.openpne.jp/issues/1759">#1759</a> の修正を一旦取り消し、上記のような SnsTerm の不具合が生じないように <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): occurs "warning" when second argument of the __() i18n translation method is non-array (i18nの翻訳メソ... (Fixed(完了))" href="http://redmine.openpne.jp/issues/1759">#1759</a> の修正を再度行う。</p>
OpenPNE 3 - Bug(バグ) #4034 (Fixed(完了)): member/registerInputアクションでメンバー登録のフォームを生成する際にE_NOTICEエラーが発生する
http://redmine.openpne.jp/issues/4034
2016-10-31T09:19:22Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>新規メンバー登録で使用される member/registerInput の画面で下記のような E_NOTICE レベルのエラーが発生する(pc_frontend_dev.php を使用するとエラー出力を確認できる)</p>
<pre>
Notice: Undefined index: IsRegist in /home/upsilon/git/openpne3/master/lib/form/doctrine/MemberConfigForm.class.php on line 51
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p><code>MemberConfigForm::generateConfigWidgets()</code> メソッドで下記のように <code>$value['IsRegist']</code> を参照しているが、member_config.yml で定義された設定の中には IsRegist が省略されている項目も存在するため未定義なインデックスの参照としてエラーが発生する場合がある。</p>
<p><a class="source" href="http://redmine.openpne.jp/projects/op3/repository/revisions/ac9a15cd/entry/lib/form/doctrine/MemberConfigForm.class.php#L51">source:lib/form/doctrine/MemberConfigForm.class.php@ac9a15cd#L51</a>:</p>
<pre><code class="php syntaxhl"><span class="CodeRay"> <span class="keyword">foreach</span> (<span class="local-variable">$this</span>->memberConfigSettings <span class="keyword">as</span> <span class="local-variable">$key</span> => <span class="local-variable">$value</span>) {
<span class="keyword">if</span> (<span class="local-variable">$this</span>->isNew && <span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">IsRegist</span><span class="delimiter">'</span></span>] || !<span class="local-variable">$this</span>->isNew && <span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">IsConfig</span><span class="delimiter">'</span></span>]) {
<span class="local-variable">$this</span>->setMemberConfigWidget(<span class="local-variable">$key</span>);
}
}
</span></code></pre>
<p>類似の不具合として過去に修正された <a class="issue tracker-1 status-13 priority-3 priority-lowest closed child" title="Bug(バグ): opFormItemGenerator::generateValidator() に渡すフィールドの IsRequired や IsTrim を省略すると E_NOTICE レベルのエラーが発生する (Won't fix(対応せず))" href="http://redmine.openpne.jp/issues/3428">#3428</a> がある。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
opSkinThemePlugin - Bug(バグ) #4026 (Pending Review(レビュー待ち)): PC向けのテンプレートのみ存在する画面をスマートフォンで閲覧するとテーマC...
http://redmine.openpne.jp/issues/4026
2016-10-19T06:01:24Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="現象"></a>
<h3 >現象<a href="#現象" class="wiki-anchor">¶</a></h3>
<p>opSkinThemePlugin は、リクエストのあった User-Agent に応じて PC 向けの CSS とスマートフォン向けの CSS を分けて出力できるが、スマートフォンで PC 向けのテンプレートのみ用意された画面を開くと PC, スマートフォン向けのいずれの CSS も読み込まれない現象が起こる。<br />具体的には opAuthMailAddressPlugin の新規登録画面 (/opAuthMailAddress/requestRegisterURL) などで発生する。</p>
<a name="原因"></a>
<h3 >原因<a href="#原因" class="wiki-anchor">¶</a></h3>
<p><code>opThemeEvent::enableSkinByTheme()</code> メソッドでは、<code>opWebRequest::isSmartphone()</code> の結果が true の場合にはスマートフォン向け CSS のみを設定し、false の場合には PC 向け CSS のみを設定という動作となっている。<br />しかし、スマートフォンから閲覧した場合は表示される画面が常にスマートフォン向けのレイアウトであるとは限らず、PC 向けテンプレートのみ用意されている画面であれば PC 向けのレイアウトで表示される。<br />そのため、スマートフォンからの閲覧でかつ PC 向けのレイアウトが表示される場合に、PC 向け CSS が設定されておらずスキンが適用されていない状態で表示されていた。</p>
<a name="修正内容"></a>
<h3 >修正内容<a href="#修正内容" class="wiki-anchor">¶</a></h3>
<p><code>opWebRequest::isSmartphone()</code> の結果が true の場合にはスマートフォン向け CSS と PC 向け CSS の両方が設定されるように修正する。</p>
OpenPNE 3 - Bug(バグ) #4013 (Fixed(完了)): メールアドレス変更を行うと member_config に name='captcha' のレコードが追加される
http://redmine.openpne.jp/issues/4013
2016-09-23T08:16:57Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p>メールアドレス変更を行うと、member_config に下記のような name = 'captcha' のレコードが追加される。</p>
<pre>
> SELECT * FROM member_config WHERE name = 'captcha' \G
*************************** 1. row ***************************
id: 145
member_id: 2
name: captcha
value: Array
value_datetime: NULL
name_value_hash: 7fee6c903f71b6b14b0b6b6636ab3f5b
created_at: 2016-08-31 15:30:37
updated_at: 2016-08-31 15:30:37
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p><a class="source" href="http://redmine.openpne.jp/projects/op3/repository/revisions/43190aa1/entry/lib/form/MemberConfigForm/MemberConfigPcAddressForm.class.php#L28">source:lib/form/MemberConfigForm/MemberConfigPcAddressForm.class.php@43190aa1#L28</a>:<br /><pre><code class="php syntaxhl"><span class="CodeRay"> <span class="keyword">public</span> <span class="keyword">function</span> <span class="function">__construct</span>(<span class="constant">Member</span> <span class="local-variable">$member</span> = <span class="predefined-constant">null</span>, <span class="local-variable">$options</span> = <span class="predefined">array</span>(), <span class="local-variable">$CSRFSecret</span> = <span class="predefined-constant">null</span>)
{
<span class="predefined-constant">parent</span>::__construct(<span class="local-variable">$member</span>, <span class="local-variable">$options</span>, <span class="local-variable">$CSRFSecret</span>);
<span class="keyword">if</span> (sfConfig::get(<span class="string"><span class="delimiter">'</span><span class="content">op_is_use_captcha</span><span class="delimiter">'</span></span>, <span class="predefined-constant">false</span>))
{
<span class="local-variable">$this</span>->embedForm(<span class="string"><span class="delimiter">'</span><span class="content">captcha</span><span class="delimiter">'</span></span>, <span class="keyword">new</span> opCaptchaForm());
}
}
</span></code></pre></p>
<p>MemberConfigPcAddressForm, MemberConfigMobileAddressForm では embedForm を使用して opCaptchaForm を追加している。一方で、saveConfig メソッドでは追加された captcha フィールドをそのまま member_config テーブルに格納しようとするため上記のような現象が発生する。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
OpenPNE 3 - Bug(バグ) #4012 (Fixed(完了)): メールアドレス設定から意図的に他のメンバーと同じメールアドレスを設定できる
http://redmine.openpne.jp/issues/4012
2016-09-23T06:36:35Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>再現手順:</p>
<ol>
<li>メンバーA でログインし、PCメールアドレス設定 (/member/config?category=pcAddress) を開く</li>
<li>PCメールアドレスに <code>hoge@example.com</code> を入力して「送信」ボタンをクリック
<ul>
<li><code>hoge@example.com</code> 宛に確認メールが届くが、この時点ではメールに記載されている URL を開かない</li>
</ul>
</li>
<li>メンバーB でログインし、PCメールアドレス設定 (/member/config?category=pcAddress) を開く</li>
<li>PCメールアドレスに <code>hoge@example.com</code> を入力して「送信」ボタンをクリック</li>
<li>メンバーA によって送られた「メールアドレス変更ページのお知らせ」のメールに記載されている URL を開く</li>
<li>メンバーA のパスワードを入力して「送信」ボタンをクリック</li>
<li>メンバーB によって送られた「メールアドレス変更ページのお知らせ」のメールに記載されている URL を開く</li>
<li>メンバーB のパスワードを入力して「送信」ボタンをクリック</li>
<li>メンバーA, メンバーB のPCメールアドレスが同じ <code>hoge@example.com</code> に設定された状態になる</li>
</ol>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p><code>lib/config/config/member_config.yml</code> では pc_address および mobile_address に対して <code>IsUnique: true</code> が指定されており、実際に「PCメールアドレス設定」のフォームでは <code>MemberConfigForm::isUnique()</code> によって重複チェックが行われている。<br />しかし、メールアドレス変更については、変更後のメールアドレス宛に <code>/member/configComplete?token=***</code> のURLをメールで送った上で、確認が完了するまでは pc_address を変更しないという例外的な対応を取っている。そのため、MemberConfigForm のバリデーション時には重複しなかったが /member/configComplete の時点で重複するような場合には対処できていなかった。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p><code>opMemberActions::executeConfigComplete()</code> において、pc_address_pre または mobile_address_pre を pc_address または mobile_address に変更する直前にも重複チェックを行う。これにより、上記の再現手順でいう手順 8 の段階でエラーが発生するようになる。</p>
<p>なお、手順 4 の段階で pc_address_pre が重複するためこの時点でエラーを発生させるといった修正も考えられるが、これをエラーとしてしまうと悪意のあるメンバーが任意のメールアドレスを確認が未完了のまま放置することによって他のメンバーがそのメールアドレスを使用できない状態に出来てしまうため、pc_address_pre に対する重複チェックは行わない。</p>
opLikePlugin - Bug(バグ) #4011 (Fixed(完了)): いいねを追加した先の日記やコメント等が削除されても対応するniceテーブルのレコードが削除されない
http://redmine.openpne.jp/issues/4011
2016-09-09T04:59:41Z
Youichi Kimura
kim.upsilon@bucyou.net
<p>nice テーブルの設計上、参照整合性を設定することができないためアプリケーションレベルで対応する必要がある。</p>
<pre>
> SHOW CREATE TABLE nice\G
*************************** 1. row ***************************
Table: nice
Create Table: CREATE TABLE `nice` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`member_id` int(11) NOT NULL,
`foreign_table` char(1) COLLATE utf8_bin NOT NULL,
`foreign_id` int(11) NOT NULL,
`foreign_hash` varchar(32) COLLATE utf8_bin NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `member_id_foreign_table_foreign_id_UNIQUE_idx` (`member_id`,`foreign_table`,`foreign_id`),
KEY `foreign_hash_id_idx` (`foreign_hash`,`id`),
KEY `member_id_idx` (`member_id`),
CONSTRAINT `nice_member_id_member_id` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)
</pre>
OpenPNE 3 - Bug(バグ) #4000 (Fixed(完了)): MemberConfigFormのIsUnique制約に対するエラーメッセージが適切に出力されていない
http://redmine.openpne.jp/issues/4000
2016-08-31T06:55:03Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="現象"></a>
<h3 >現象<a href="#現象" class="wiki-anchor">¶</a></h3>
<p>「PC メールアドレス設定」(/member/config?category=pcAddress) で、変更後のメールアドレスが他のメンバーとメードアドレスが重複する場合に「Invalid pc_address.」というエラーメッセージが表示される。</p>
<a name="原因"></a>
<h3 >原因<a href="#原因" class="wiki-anchor">¶</a></h3>
<p>当初 <a class="issue tracker-1 status-12 priority-4 priority-default closed" title="Bug(バグ): PC版のPCメールアドレス設定エラーが翻訳されていない (Invalid(無効))" href="http://redmine.openpne.jp/issues/3736">#3736</a> ではこの不具合を英日の翻訳漏れとして扱っていたが、実際には <a class="issue tracker-1 status-5 priority-5 priority-high3 closed" title="Bug(バグ): PC・携帯登録時に携帯個体識別番号の登録を必須で登録すると携帯メールアドレスが登録されない (Fixed(完了))" href="http://redmine.openpne.jp/issues/1069">#1069</a> で追加したエラーメッセージが「Invalid %name%.」であったのに対して翻訳は「Invalid %name%.」ではなく「Invalid mobile_address.」に対して行われていたことに起因する問題であった。</p>
<p><a class="source" href="http://redmine.openpne.jp/projects/op3/repository/revisions/43190aa1/entry/lib/form/doctrine/MemberConfigForm.class.php#L232">source:lib/form/doctrine/MemberConfigForm.class.php@43190aa1#L232</a>:<br /><pre><code class="php syntaxhl"><span class="CodeRay"> <span class="keyword">throw</span> <span class="keyword">new</span> sfValidatorError(<span class="local-variable">$validator</span>, <span class="string"><span class="delimiter">'</span><span class="content">Invalid %name%.</span><span class="delimiter">'</span></span>, <span class="predefined">array</span>(<span class="string"><span class="delimiter">'</span><span class="content">name</span><span class="delimiter">'</span></span> => <span class="local-variable">$name</span>));
</span></code></pre></p>
<p><a class="source" href="http://redmine.openpne.jp/projects/op3/repository/revisions/43190aa1/entry/i18n/messages.ja.xml#L85">source:i18n/messages.ja.xml@43190aa1#L85</a><br /><pre><code class="xml syntaxhl"><span class="CodeRay"> <span class="tag"><trans-unit</span> <span class="attribute-name">id</span>=<span class="string"><span class="delimiter">"</span><span class="delimiter">"</span></span><span class="tag">></span>
<span class="tag"><source></span>Invalid mobile_address.<span class="tag"></source></span>
<span class="tag"><target></span>メールアドレスが無効です。<span class="tag"></target></span>
<span class="tag"></trans-unit></span>
</span></code></pre></p>
<p>このことで mobile_address 以外の IsUnique 制約を使用する全ての設定項目に対しては未翻訳のエラーメッセージが出力される状態となっていた。</p>
<p>また、この問題は「Invalid %name%.」に対する翻訳を追加するだけでは解決しない(「Invalid pc_address.」と表示されるまま変わらない)。<br />そもそも <code>sfValidatorError::__construct($validator, $code, $arguments)</code> の第 2 引数はエラーメッセージそのものを渡すのではなくバリデーター内部で識別するエラーコードを渡すものであり、今まで <code>Invalid pc_address.</code> のようなエラーメッセージが表示されていたのはエラーコードに対応するメッセージが存在しなかったためである。「%name%」のようなトークンを含むテキストに対して opI18n クラスによるローカライゼーションが正しく機能するためには、例えば以下のように適切な用法に書き換える必要がある。</p>
<pre><code class="php syntaxhl"><span class="CodeRay"> <span class="keyword">public</span> <span class="keyword">function</span> <span class="function">setMemberConfigWidget</span>(<span class="local-variable">$name</span>)
{
....
<span class="keyword">if</span> (!<span class="predefined">empty</span>(<span class="local-variable">$config</span>[<span class="string"><span class="delimiter">'</span><span class="content">IsUnique</span><span class="delimiter">'</span></span>]))
{
<span class="local-variable">$uniqueValidator</span> = <span class="keyword">new</span> sfValidatorCallback(<span class="predefined">array</span>(
<span class="string"><span class="delimiter">'</span><span class="content">callback</span><span class="delimiter">'</span></span> => <span class="predefined">array</span>(<span class="local-variable">$this</span>, <span class="string"><span class="delimiter">'</span><span class="content">isUnique</span><span class="delimiter">'</span></span>),
<span class="string"><span class="delimiter">'</span><span class="content">arguments</span><span class="delimiter">'</span></span> => <span class="predefined">array</span>(<span class="string"><span class="delimiter">'</span><span class="content">name</span><span class="delimiter">'</span></span> => <span class="local-variable">$name</span>),
<span class="string"><span class="delimiter">'</span><span class="content">empty_value</span><span class="delimiter">'</span></span> => <span class="local-variable">$this</span>->validatorSchema[<span class="local-variable">$name</span>]->getOption(<span class="string"><span class="delimiter">'</span><span class="content">empty_value</span><span class="delimiter">'</span></span>),
));
<span class="local-variable">$uniqueValidator</span>->addMessage(<span class="string"><span class="delimiter">'</span><span class="content">duplicate</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">Invalid %name%.</span><span class="delimiter">'</span></span>);
....
}
<span class="keyword">public</span> <span class="keyword">function</span> <span class="function">isUnique</span>(<span class="local-variable">$validator</span>, <span class="local-variable">$value</span>, <span class="local-variable">$arguments</span> = <span class="predefined">array</span>())
{
....
<span class="keyword">throw</span> <span class="keyword">new</span> sfValidatorError(<span class="local-variable">$validator</span>, <span class="string"><span class="delimiter">'</span><span class="content">duplicate</span><span class="delimiter">'</span></span>, <span class="predefined">array</span>(<span class="string"><span class="delimiter">'</span><span class="content">name</span><span class="delimiter">'</span></span> => <span class="local-variable">$name</span>));
}
</span></code></pre>
<p>ここまで修正してようやく「Invalid %name%」に対して翻訳文が出力される状態になる。</p>
<p>これらの経緯をまとめると、下記の問題点が積み重なった結果として冒頭の「現象」が現れたといえる。</p>
<ul>
<li>独自のエラーメッセージを追加するために <code>sfValidatorBase::addMessage()</code> を使用せず <code>sfValidatorErorr::__construct()</code> の引数 <code>$code</code> に直接エラーメッセージを指定していた</li>
<li>上記が原因でローカライゼーションが正しく機能せず「Invalid %name%.」に対する翻訳が行えなかったため、やむなく「Invalid mobile_address.」に対して訳文を追加していた(と思われる)</li>
<li>mobile_address 以外の IsUnique 制約を使用する member_config の設定項目については、訳文が存在しないため原文のままエラーメッセージが出力される状態となった</li>
</ul>
<a name="修正内容"></a>
<h3 >修正内容<a href="#修正内容" class="wiki-anchor">¶</a></h3>
<p>MemberConfigForm 内でエラーメッセージを記述している箇所を上記の <code>sfValidatorBase::addMessage()</code> を使用した用法に書き換えた上で、下記の翻訳文を追加する。</p>
<pre><code class="xml syntaxhl"><span class="CodeRay"> <span class="tag"><trans-unit</span> <span class="attribute-name">id</span>=<span class="string"><span class="delimiter">"</span><span class="delimiter">"</span></span><span class="tag">></span>
<span class="tag"><source></span>Invalid %name%.<span class="tag"></source></span>
<span class="tag"><target></span>不正な %name% です。<span class="tag"></target></span>
<span class="tag"></trans-unit></span>
</span></code></pre>
<p>また、この翻訳文の改善について <a class="issue tracker-1 status-5 priority-4 priority-default closed parent" title="Bug(バグ): MemberConfigFormとMemberProfileFormでIsUnique制約に対するエラーメッセージが統一されていない (Fixed(完了))" href="http://redmine.openpne.jp/issues/3999">#3999</a> にて扱っており、修正の際にはコンフリクトする可能性がある点を留意する必要がある。</p>
OpenPNE 3 - Bug(バグ) #3999 (Fixed(完了)): MemberConfigFormとMemberProfileFormでIsUnique制約に対するエラーメッセージが...
http://redmine.openpne.jp/issues/3999
2016-08-31T06:53:05Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p>MemberConfigForm と MemberProfileForm には、例えばメールアドレス設定のように SNS 内の他のメンバーと設定値が重複することを禁止するための IsUnique 制約が備わっている。<br />両者はほぼ同一の機能であるがそれぞれ別のエラーメッセージが使われており、MemberConfigForm では「Invalid %name%.」(携帯メールアドレス設定では ja_JP で「メールアドレスが無効です。」と表示される) に対して MemberProfileForm では「The inputted value is already exist.」(ja_JP で「すでに登録されています。」と表示される) が使用されている。</p>
<p>MemberConfigForm のエラーメッセージ:</p>
<p><img src="http://redmine.openpne.jp/attachments/download/622/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2016-08-31_15.31.43.png" style="width:549px;" alt="" /></p>
<p>MemberProfileForm のエラーメッセージ:</p>
<p><img src="http://redmine.openpne.jp/attachments/download/623/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2016-08-31_15.35.48.png" style="width:677px;" alt="" /></p>
<p>これらのメッセージは他メンバーとの重複という同じ問題に対するエラーメッセージであるため、いずれか一方に揃えるべきである。<br />また、「Invalid %name%.」に対して「The inputted value is already exist.」の方がより的確にエラーの原因を説明していること、前者のメッセージは OpenPNE 内部で使用する設定名をそのままメッセージに使用しておりユーザーに対して表示するメッセージとしては適切でないことから、統一するとすれば後者のメッセージが望ましいと考える。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p><code>MemberConfigForm::isUnique()</code> で使用するエラーメッセージを「The inputted value is already exist.」に変更する。また、これに伴い不要となった翻訳文を <code>i18n/messages.ja.xml</code> から削除する。</p>
opBlogPlugin - Bug(バグ) #3986 (Accepted(着手)): v0.9.0からv1.0.2へのマイグレーション後とv1.0.2のクリーンインストール後でDBスキーマに...
http://redmine.openpne.jp/issues/3986
2016-07-27T11:32:27Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p>マイグレーションスクリプトの不備により v1.0.2 へのマイグレーションと v1.0.2 のクリーンインストール後で <code>blog_rss_cache</code> テーブルのスキーマに差異が生じている。</p>
<pre>
$ cd plugins/opBlogPlugin
$ git checkout v0.9.0
$ ../../symfony doctrine:build --env=test --all --and-load
$ git checkout v1.0.2
$ ../../symfony openpne:migrate --env=test --no-update-plugin --target=opBlogPlugin
$ echo 'SHOW CREATE TABLE blog_rss_cache\G' | mysql -u root openpne_test > schema-migrate.txt
$ ../../symfony doctrine:build --env=test --all --and-load
$ echo 'SHOW CREATE TABLE blog_rss_cache\G' | mysql -u root openpne_test > schema-rebuild.txt
$ diff -u schema-migrate.txt schema-rebuild.txt
</pre>
<pre><code class="diff syntaxhl"><span class="CodeRay"><span class="line head"><span class="head">--- </span><span class="filename">schema-migrate.txt 2016-07-27 17:45:29.927593471 +0900</span></span>
<span class="line head"><span class="head">+++ </span><span class="filename">schema-rebuild.txt 2016-07-27 17:46:18.371593471 +0900</span></span>
<span class="line change"><span class="change">@@</span> -11,5 +11,7 <span class="change">@@</span></span>
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `date_INDEX_idx` (`date`),
<span class="line delete"><span class="delete">-</span> KEY `member_id_date_idx` (`member_id`,`date`)</span>
<span class="line insert"><span class="insert">+</span> KEY `member_id_date_idx` (`member_id`,`date`),</span>
<span class="line insert"><span class="insert">+</span> KEY `member_id_idx` (`member_id`),</span>
<span class="line insert"><span class="insert">+</span> CONSTRAINT `blog_rss_cache_member_id_member_id` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`)</span>
) ENGINE=InnoDB DEFAULT CHARSET=utf8
</span></code></pre>
<p>不足している箇所:</p>
<ul>
<li>インデックス <code>member_id_idx</code> (Doctrine によって自動で追加されたもの) が追加されていない</li>
<li>外部キー制約 <code>blog_rss_cache_member_id_member_id</code> が追加されていない</li>
</ul>
<p>特に <code>blog_rss_cache_member_id_member_id</code> が存在しない不一致については、v1.0.3 で修正された <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): opBlogPlugin を使用しているメンバーが退会しようとすると500エラーとなる (Fixed(完了))" href="http://redmine.openpne.jp/issues/3473">#3473</a> に関するマイグレーション時に問題となる。<br />具体的には v0.9.0 をクリーンインストールした状態から v1.0.3 にマイグレーションすると下記のエラーが発生して異常終了する。</p>
<pre>
migrating of opBlogPlugin encountered the following errors:
Error #1 - SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'blog_rss_cache_member_id_member_id'; check that column/key exists. Failing Query: "ALTER TABLE `blog_rss_cache` DROP FOREIGN KEY blog_rss_cache_member_id_member_id"
</pre>
<p>このエラーが発生した場合、マイグレーションが途中まで完了した状態かつ <code>opBlogPlugin_revision</code> が更新されないままロールバックされずに中断されるため、復旧が困難な <strong>非常に面倒な状態になる</strong>。(チケットの優先度を高めにしたのはこのため)</p>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p><code>data/migrations/1.0.0/001_add_blog_rss_cache_table.php</code> に必要な定義が不足していたことが原因。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正にあたって下記のパターンを考慮する必要がある。</p>
<ul>
<li>v0.9.0 をクリーンインストールした状態から最新版にマイグレーション
<ul>
<li><code>opBlogPlugin_revision</code> が存在しない状態からリビジョン 1, 2, 3, 4 の差分が一度に適用される</li>
<li>この場合、リビジョン 1 を直接修正することで <code>blog_rss_cache_member_id_member_id</code> を追加できる</li>
<li>一方で、リビジョン 1 を修正したとしても、追加された <code>blog_rss_cache_member_id_member_id</code> の存在をリビジョン 4 の up メソッド内でチェックすることはできない</li>
<li>各リビジョンの up メソッド内で呼ばれる addForeignKey などのメソッドは即時に SQL として実行されるものではない(全てのリビジョンの up メソッドが呼ばれた後に一度に実行される)</li>
</ul>
</li>
<li>v0.9.0 をクリーンインストールした状態から一度 v1.0.2 にマイグレーションしてから最新版にマイグレーション
<ul>
<li><code>opBlogPlugin_revision</code> が存在しない状態からリビジョン 1, 2, 3 の差分が適用され、その後リビジョン 4 が適用される</li>
<li>修正前のリビジョン 1 がすでに適用された状態からのマイグレーション</li>
<li>リビジョン 4 が実行される時点では <code>blog_rss_cache_member_id_member_id</code> が存在しない状態</li>
</ul>
</li>
<li>v1.0.2 をクリーンインストールした状態から最新版にマイグレーション
<ul>
<li><code>opBlogPlugin_revision</code> が 3 の状態からリビジョン 4 が適用される</li>
<li>リビジョン 4 が実行される時点では <code>blog_rss_cache_member_id_member_id</code> が存在する状態</li>
</ul>
</li>
<li>最新版をクリーンインストール</li>
</ul>
<p>上記の全てのパターンでインストールまたはマイグレーションが正常に完了し、かつ最終的な <code>blog_rss_cache</code> テーブルのスキーマが同一でなければならない。</p>
opOpenSocialPlugin - Bug(バグ) #3937 (Pending Review(レビュー待ち)): 管理画面の「アクティビティの連続投稿禁止時間」の値を変更しても連続投稿禁...
http://redmine.openpne.jp/issues/3937
2016-04-27T11:02:44Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p>管理画面の「アクティビティの連続投稿禁止時間」はデフォルトで 30 秒となっているが、この値を 1 秒や 60 秒に変更しても設定したとおりの時間にならず常に 30 秒で連続投稿が制限される。</p>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p><a class="source" href="http://redmine.openpne.jp/projects/plg-open-social/repository/revisions/6d81bffd/entry/lib/services/opOpenSocialActivityService.class.php#L185">source:lib/services/opOpenSocialActivityService.class.php@6d81bffd#L185</a></p>
<pre><code class="php syntaxhl"><span class="CodeRay"> <span class="keyword">if</span> (sfConfig::get(<span class="string"><span class="delimiter">'</span><span class="content">opensocial_activity_post_limit_time</span><span class="delimiter">'</span></span>, <span class="integer">30</span>))
{
<span class="local-variable">$object</span> = <span class="constant">Doctrine</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">ActivityData</span><span class="delimiter">'</span></span>)->createQuery()
->where(<span class="string"><span class="delimiter">'</span><span class="content">foreign_table = ?</span><span class="delimiter">'</span></span>, <span class="constant">Doctrine</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">Application</span><span class="delimiter">'</span></span>)->getTableName())
->andWhere(<span class="string"><span class="delimiter">'</span><span class="content">foreign_id = ?</span><span class="delimiter">'</span></span>, <span class="local-variable">$memberApplication</span>->getApplicationId())
->andWhere(<span class="string"><span class="delimiter">'</span><span class="content">member_id = ?</span><span class="delimiter">'</span></span>, <span class="local-variable">$member</span>->getId())
->orderBy(<span class="string"><span class="delimiter">'</span><span class="content">created_at DESC</span><span class="delimiter">'</span></span>)
->fetchOne();
<span class="keyword">if</span> (<span class="local-variable">$object</span>)
{
<span class="local-variable">$interval</span> = <span class="predefined">time</span>() - <span class="predefined">strtotime</span>(<span class="local-variable">$object</span>->getCreatedAt());
<span class="keyword">if</span> (<span class="local-variable">$interval</span> < sfConfig::get(<span class="string"><span class="delimiter">'</span><span class="content">opensocial_activity_post_limit_time</span><span class="delimiter">'</span></span>, <span class="integer">30</span>))
{
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="constant">SocialSpiException</span>(<span class="string"><span class="delimiter">"</span><span class="content">Service Unavailable</span><span class="delimiter">"</span></span>, <span class="integer">503</span>);
}
}
}
</span></code></pre>
<p>「アクティビティの連続投稿禁止時間」の設定値は上記の箇所で使用されているが、この設定は sns_config テーブルに格納される値であるため sfConfig ではなく opConfig ないし <code>Doctrine_Core::getTable('SnsConfig')->get()</code> を使わなければ期待した値を取得することができない。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p><code>sfConfig::get('opensocial_activity_post_limit_time', 30)</code> としている箇所を <code>Doctrine_Core::getTable('SnsConfig')->get('opensocial_activity_post_limit_time', 30)</code> に変更する。</p>
opOpenSocialPlugin - Bug(バグ) #3936 (Pending Review(レビュー待ち)): SNSメンバーによるアプリ追加を許可しても「新しいアプリをインストールす...
http://redmine.openpne.jp/issues/3936
2016-04-27T05:21:19Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p>管理画面から opOpenSocialPlugin の「アプリ設定」(/pc_backend.php/opOpenSocialPlugin) にある「SNSメンバーのアプリ追加を許可」を「許可」または「SNS管理者の許可が必要」にセットすると、管理画面だけでなく SNS メンバーが OpenSocial アプリをインストールすることができるようになる。</p>
<p>しかし、「アプリを新しく追加する」(/application/install) のページへ移動するためのリンクが、すでにアプリを追加しているメンバーにしか表示されないため、SNS メンバーが新たにアプリをインストールしたい場合には既にインストールされている他の適当なアプリを追加する必要がある。</p>
<p>アプリが追加されていないメンバーの表示:<br /><img src="http://redmine.openpne.jp/attachments/download/618/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2016-04-27_13.07.36.png" style="width:734px;" alt="" /></p>
<p>アプリが追加されているメンバーの表示:<br /><img src="http://redmine.openpne.jp/attachments/download/617/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2016-04-27_13.05.21.png" style="width:735px;" alt="" /></p>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p><a class="source" href="http://redmine.openpne.jp/projects/plg-open-social/repository/revisions/6d81bffd/entry/apps/pc_frontend/modules/application/templates/listSuccess.php#L31">source:apps/pc_frontend/modules/application/templates/listSuccess.php@6d81bffd#L31</a></p>
<pre><code class="php syntaxhl"><span class="CodeRay"><span class="inline-delimiter"><?php</span> <span class="keyword">if</span> (<span class="local-variable">$isOwner</span> && <span class="predefined">isset</span>(<span class="local-variable">$memberApplications</span>) && <span class="predefined">count</span>(<span class="local-variable">$memberApplications</span>)) : <span class="inline-delimiter">?></span>
<span class="inline-delimiter"><?php</span> <span class="predefined">echo</span> sortable_element(<span class="string"><span class="delimiter">'</span><span class="content">order</span><span class="delimiter">'</span></span>, <span class="predefined">array</span>(
<span class="string"><span class="delimiter">'</span><span class="content">url</span><span class="delimiter">'</span></span> => <span class="string"><span class="delimiter">'</span><span class="content">@application_sort</span><span class="delimiter">'</span></span>,
<span class="string"><span class="delimiter">'</span><span class="content">tag</span><span class="delimiter">'</span></span> => <span class="string"><span class="delimiter">'</span><span class="content">div</span><span class="delimiter">'</span></span>,
<span class="string"><span class="delimiter">'</span><span class="content">only</span><span class="delimiter">'</span></span> => <span class="string"><span class="delimiter">'</span><span class="content">sortable</span><span class="delimiter">'</span></span>,
<span class="string"><span class="delimiter">'</span><span class="content">with</span><span class="delimiter">'</span></span> => <span class="string"><span class="delimiter">'</span><span class="content">Sortable.serialize("order")+"&</span><span class="delimiter">'</span></span>.<span class="predefined">urlencode</span>(<span class="local-variable">$form</span>->getCSRFFieldName()).<span class="string"><span class="delimiter">'</span><span class="content">=</span><span class="delimiter">'</span></span>.<span class="predefined">urlencode</span>(<span class="local-variable">$form</span>->getCSRFToken()).<span class="string"><span class="delimiter">'</span><span class="content">"</span><span class="delimiter">'</span></span>
)); <span class="inline-delimiter">?></span>
<span class="tag"><div</span> <span class="attribute-name">class</span>=<span class="string"><span class="delimiter">"</span><span class="content">moreInfo</span><span class="delimiter">"</span></span><span class="tag">></span>
<span class="tag"><ul</span> <span class="attribute-name">class</span>=<span class="string"><span class="delimiter">"</span><span class="content">moreInfo</span><span class="delimiter">"</span></span><span class="tag">></span>
<span class="tag"><li></span>
<span class="inline-delimiter"><?php</span> <span class="predefined">echo</span> link_to(__(<span class="string"><span class="delimiter">'</span><span class="content">App Gallery</span><span class="delimiter">'</span></span>), <span class="string"><span class="delimiter">'</span><span class="content">@application_gallery</span><span class="delimiter">'</span></span>) <span class="inline-delimiter">?></span>
<span class="inline-delimiter"><?php</span> <span class="keyword">if</span> (<span class="local-variable">$isOwner</span>): <span class="inline-delimiter">?></span>
<span class="inline-delimiter"><?php</span> <span class="keyword">if</span> (<span class="local-variable">$isInstallApp</span>): <span class="inline-delimiter">?></span>
<span class="tag"><li></span><span class="inline-delimiter"><?php</span> <span class="predefined">echo</span> link_to(__(<span class="string"><span class="delimiter">'</span><span class="content">Install new App</span><span class="delimiter">'</span></span>), <span class="string"><span class="delimiter">'</span><span class="content">@application_install</span><span class="delimiter">'</span></span>) <span class="inline-delimiter">?></span><span class="tag"></li></span>
<span class="inline-delimiter"><?php</span> <span class="keyword">endif</span>; <span class="inline-delimiter">?></span>
<span class="inline-delimiter"><?php</span> <span class="keyword">if</span> (<span class="local-variable">$isInstalledApp</span>): <span class="inline-delimiter">?></span>
<span class="tag"><li></span><span class="inline-delimiter"><?php</span> <span class="predefined">echo</span> link_to(__(<span class="string"><span class="delimiter">'</span><span class="content">Apps Installed by You</span><span class="delimiter">'</span></span>), <span class="string"><span class="delimiter">'</span><span class="content">@application_installed_list</span><span class="delimiter">'</span></span>) <span class="inline-delimiter">?></span><span class="tag"></li></span>
<span class="inline-delimiter"><?php</span> <span class="keyword">endif</span>; <span class="inline-delimiter">?></span>
<span class="inline-delimiter"><?php</span> <span class="keyword">endif</span>; <span class="inline-delimiter">?></span>
<span class="tag"></li></span>
<span class="tag"></ul></span>
<span class="tag"></div></span>
<span class="inline-delimiter"><?php</span> <span class="keyword">endif</span>; <span class="inline-delimiter">?></span>
</span></code></pre>
<p>上記のコードのうち <code>sortable_element</code> はメンバーが持っているアプリケーションを並べ替えるために必要な部分となっているが、<code>div.moreInfo</code> に表示される項目についてはメンバーがアプリケーションを持っているか否かは関係なく <code>$isOwner</code> が true であれば表示すべき部分であるため、この if の条件が適切でないことが原因であるといえる。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>メンバーがアプリケーションを持っているか否かに関わらず <code>$isOwner</code> が true であれば <code>div.moreInfo</code> を表示する</p>
OpenPNE 3 - Bug(バグ) #2882 (Won't fix(対応せず)): opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882
2012-03-13T09:13:24Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="現象"></a>
<h3 >現象<a href="#現象" class="wiki-anchor">¶</a></h3>
<p>opValidatorDate を使用しているフォーム(コミュニティイベントの作成画面など)で、日付を入力する項目の「年」に <code>0</code> を入力すると空値として扱われる。</p>
<ul>
<li>コミュニティイベントの作成画面の場合、「募集期日」の「年」に <code>0</code> と入力された状態(「月」「日」は入力しない)で送信しても「正しくありません。」と表示されずにイベントの作成が完了する。</li>
</ul>
<a name="原因"></a>
<h3 >原因<a href="#原因" class="wiki-anchor">¶</a></h3>
<p>lib/validator/opValidatorDate.class.php の 100 行目付近</p>
<pre><code class="php syntaxhl"><span class="CodeRay"> <span class="comment">// if one date value is empty, all others must be empty too</span>
<span class="local-variable">$empties</span> =
(!<span class="predefined">isset</span>(<span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">year</span><span class="delimiter">'</span></span>]) || !<span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">year</span><span class="delimiter">'</span></span>] ? <span class="integer">1</span> : <span class="integer">0</span>) +
(!<span class="predefined">isset</span>(<span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">month</span><span class="delimiter">'</span></span>]) || !<span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">month</span><span class="delimiter">'</span></span>] ? <span class="integer">1</span> : <span class="integer">0</span>) +
(!<span class="predefined">isset</span>(<span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">day</span><span class="delimiter">'</span></span>]) || !<span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">day</span><span class="delimiter">'</span></span>] ? <span class="integer">1</span> : <span class="integer">0</span>);
</span></code></pre>
<p>この判定で、「年」(<code>$value['year']</code>) に <code>"0"</code> が入力されると <code>!isset($value['year']) || !$value['year']</code> が <code>true</code> となり空値と判定されることが原因。</p>
<p>参照: <a href="http://php.net/manual/ja/types.comparisons.php" class="external">PHP: PHP 型の比較表 - Manual</a></p>
<a name="修正内容"></a>
<h3 >修正内容<a href="#修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
OpenPNE 3 - Bug(バグ) #1936 (Fixed(完了)): opAnonymousMember クラスにStrict Standardsエラーが含まれている
http://redmine.openpne.jp/issues/1936
2011-03-01T08:14:16Z
Youichi Kimura
kim.upsilon@bucyou.net
<p>error_reporting に E_STRICT を設定している環境において、以下のエラーが出力される場合があります。</p>
<code><pre>
PHP Strict Standards: Declaration of opAnonymousMember::getConfig() should be compatible with that of Member::getConfig() in /home/upsilon/git/openpne3/sqlite/lib/user/opAnonymousMember.class.php on line 158
Strict Standards: Declaration of opAnonymousMember::getConfig() should be compatible with that of Member::getConfig() in /home/upsilon/git/openpne3/sqlite/lib/user/opAnonymousMember.class.php on line 158
PHP Strict Standards: Declaration of opAnonymousMember::delete() should be compatible with that of Member::delete() in /home/upsilon/git/openpne3/sqlite/lib/user/opAnonymousMember.class.php on line 158
Strict Standards: Declaration of opAnonymousMember::delete() should be compatible with that of Member::delete() in /home/upsilon/git/openpne3/sqlite/lib/user/opAnonymousMember.class.php on line 158
PHP Strict Standards: Declaration of opAnonymousMember::save() should be compatible with that of opDoctrineRecord::save() in /home/upsilon/git/openpne3/sqlite/lib/user/opAnonymousMember.class.php on line 158
Strict Standards: Declaration of opAnonymousMember::save() should be compatible with that of opDoctrineRecord::save() in /home/upsilon/git/openpne3/sqlite/lib/user/opAnonymousMember.class.php on line 158
</pre></code>
OpenPNE 3 - Bug(バグ) #1839 (Won't fix(対応せず)): [PATCH] 一部のファイルに不要な実行権限が設定されている
http://redmine.openpne.jp/issues/1839
2010-12-09T07:37:47Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="現象"></a>
<h3 >現象<a href="#現象" class="wiki-anchor">¶</a></h3>
<p>直接実行できないphpファイルや画像ファイルなどに実行可能権限が設定されています。</p>
<a name="修正内容"></a>
<h3 >修正内容<a href="#修正内容" class="wiki-anchor">¶</a></h3>
<p>ソースツリー内にELFファイルは存在しないため、ファイルの一行目がシバン行 (先頭が「#!」で開始) であるか否かで実行権限を設定します</p>
<pre>
find * -type f ! -regex '.*\.git.*' -print0 | xargs -0r -Ifile sh -c 'head -n1 file | grep -q "^#!" && chmod +x file || chmod -x file'
</pre>
opCommunityTopicPlugin - Enhancement(機能追加・改善) #1526 (Rejected(差し戻し)): イベントの参加者を編集できるようにしてほしい
http://redmine.openpne.jp/issues/1526
2010-08-21T15:25:10Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="概要"></a>
<h3 >概要<a href="#概要" class="wiki-anchor">¶</a></h3>
<p>普段あまり書き込みをしないメンバーがイベントに参加する際に参加者一覧と実際の参加者が一致しなくなることがあるため、イベントの作成者が参加者を編集(追加・削除)できるようにしてほしいです。</p>