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>
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>
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>
OpenPNE 3 - Bug(バグ) #3510 (Fixed(完了)): opConfig::get() の $default に null 以外を指定すると sns_config.yml ...
http://redmine.openpne.jp/issues/3510
2013-12-04T08:56:58Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p>sns_config.yml には下記のようにデフォルト値を設定する項目があり、例えば <code>opConfig::get('sns_name')</code> とした場合に sns_config テーブルに該当する値が存在しない場合は <code>'MySNS'</code> が返るようになっている。また、sns_config.yml でデフォルト値が定義されていない項目については opConfig::get() の第二引数 $default の値が返る。</p>
<pre><code class="yaml syntaxhl"><span class="CodeRay"><span class="key">general</span>:
<span class="key">sns_name</span>:
<span class="key">Name</span>: <span class="string"><span class="delimiter">"</span><span class="content">sns_name</span><span class="delimiter">"</span></span>
<span class="key">Caption</span>: <span class="string"><span class="delimiter">"</span><span class="content">SNS名</span><span class="delimiter">"</span></span>
<span class="key">FormType</span>: <span class="string"><span class="delimiter">"</span><span class="content">input</span><span class="delimiter">"</span></span>
<span class="key">ValueType</span>: <span class="string"><span class="delimiter">"</span><span class="content">text</span><span class="delimiter">"</span></span>
<span class="key">Default</span>: <span class="string"><span class="delimiter">"</span><span class="content">MySNS</span><span class="delimiter">"</span></span>
<span class="key">IsRequired</span>: <span class="string"><span class="content">true</span></span>
</span></code></pre>
<p>しかし opConfig::get() の第二引数 $default に null 以外の値を指定すると、sns_config テーブルに存在しない設定項目について sns_config.yml に記述されている Default の値は無視され $default の値が返ってしまう。</p>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<pre><code class="php syntaxhl"><span class="CodeRay"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> <span class="function">get</span>(<span class="local-variable">$name</span>, <span class="local-variable">$default</span> = <span class="predefined-constant">null</span>)
{
<span class="local-variable">$setting</span> = <span class="predefined-constant">self</span>::getConfigurationSetting();
<span class="local-variable">$result</span> = <span class="predefined-constant">null</span>;
<span class="local-variable">$result</span> = <span class="constant">Doctrine</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">SnsConfig</span><span class="delimiter">'</span></span>)->get(<span class="local-variable">$name</span>, <span class="local-variable">$default</span>);
<span class="keyword">if</span> (<span class="predefined">isset</span>(<span class="local-variable">$setting</span>[<span class="local-variable">$name</span>]))
{
<span class="keyword">if</span> (<span class="predefined">is_null</span>(<span class="local-variable">$result</span>))
{
<span class="local-variable">$result</span> = <span class="predefined-constant">self</span>::getDefaultValue(<span class="local-variable">$name</span>);
}
}
<span class="keyword">return</span> <span class="local-variable">$result</span>;
}
</span></code></pre>
<p>SnsConfigTable::get() の第二引数に $default を指定しているため、sns_config テーブル内に該当するレコードが存在しない場合に <code>is_null($result)</code> が false となり、$result が sns_config から取得された値なのか区別ができなくなってしまうことが原因。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>SnsConfigTable::get() の第二引数には null を指定し、最後の <code>return $result;</code> の箇所で $default を使用するか否かの判定を行う。</p>
OpenPNE 3 - Bug(バグ) #3485 (Fixed(完了)): PC向けUIの未ログイン時に jQuery 等のライブラリがロードされない
http://redmine.openpne.jp/issues/3485
2013-11-15T06:22:05Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p><code>jquery.min.js</code> などのライブラリが PC 向け UI の未ログイン時には読み込まれない。これにより jQuery 等に依存するプラグインが未ログイン時の画面で動作できない状態となっている。</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/op3/repository/revisions/27853bc5/entry/apps/pc_frontend/templates/_layout.php">source:apps/pc_frontend/templates/_layout.php@27853bc5</a> の下記コードの通り、未ログイン時には <code>use_javascript('jquery.min.js')</code> を通過しないためこれらのライブラリのロードが行われない。</p>
<pre><code class="php syntaxhl"><span class="CodeRay"><span class="inline-delimiter"><?php</span> <span class="keyword">if</span> (opConfig::get(<span class="string"><span class="delimiter">'</span><span class="content">enable_jsonapi</span><span class="delimiter">'</span></span>) && opToolkit::isSecurePage()): <span class="inline-delimiter">?></span>
<span class="inline-delimiter"><?php</span>
use_helper(<span class="string"><span class="delimiter">'</span><span class="content">Javascript</span><span class="delimiter">'</span></span>);
use_javascript(<span class="string"><span class="delimiter">'</span><span class="content">jquery.min.js</span><span class="delimiter">'</span></span>);
use_javascript(<span class="string"><span class="delimiter">'</span><span class="content">jquery.tmpl.min.js</span><span class="delimiter">'</span></span>);
use_javascript(<span class="string"><span class="delimiter">'</span><span class="content">jquery.notify.js</span><span class="delimiter">'</span></span>);
use_javascript(<span class="string"><span class="delimiter">'</span><span class="content">op_notify.js</span><span class="delimiter">'</span></span>);
<span class="local-variable">$jsonData</span> = <span class="predefined">array</span>(
<span class="string"><span class="delimiter">'</span><span class="content">apiKey</span><span class="delimiter">'</span></span> => <span class="local-variable">$sf_user</span>->getMemberApiKey(),
<span class="string"><span class="delimiter">'</span><span class="content">apiBase</span><span class="delimiter">'</span></span> => app_url_for(<span class="string"><span class="delimiter">'</span><span class="content">api</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">homepage</span><span class="delimiter">'</span></span>),
<span class="string"><span class="delimiter">'</span><span class="content">baseUrl</span><span class="delimiter">'</span></span> => <span class="local-variable">$sf_request</span>->getRelativeUrlRoot().<span class="string"><span class="delimiter">'</span><span class="content">/</span><span class="delimiter">'</span></span>,
);
<span class="predefined">echo</span> javascript_tag(<span class="string"><span class="delimiter">'</span><span class="content">
var openpne = </span><span class="delimiter">'</span></span>.json_encode(<span class="local-variable">$jsonData</span>).<span class="string"><span class="delimiter">'</span><span class="content">;
</span><span class="delimiter">'</span></span>);
<span class="inline-delimiter">?></span>
<span class="inline-delimiter"><?php</span> <span class="keyword">endif</span> <span class="inline-delimiter">?></span>
</span></code></pre>
<p><code>opConfig::get('enable_jsonapi') && opToolkit::isSecurePage()</code> という条件は API キーの出力を行うか否かを判断するための条件であるが、 <a class="changeset" title="add notification center for PC (refs #2767)" href="http://redmine.openpne.jp/projects/op3/repository/revisions/9f50bdf66e3cdaaa4372669902995a1558d8cbe8">9f50bdf66e3cdaaa4372669902995a1558d8cbe8</a> にて誤って use_javascript をこの if ブロック内に追加してしまったことが原因で当チケットの問題が発生した。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>jQuery 等をロードする <code>use_javascript</code> を <code>opConfig::get('enable_jsonapi') && opToolkit::isSecurePage()</code> の if ブロックの外に移動する。</p>
OpenPNE 3 - Bug(バグ) #3367 (New(新規)): デイリーニュースで使用されるガジェットのパラメータがエスケープされている
http://redmine.openpne.jp/issues/3367
2013-06-25T12:38:21Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p>管理画面のガジェット設定 (/design/gadget?type=dailyNews) からデイリーニュースで使用するガジェットを設定できるが、このガジェットのパラメーターに対してエスケープが施された状態でメール送信されてしまう。<br />例えば、デイリーニュースのガジェットに「フリーエリア」を追加して「内容」に「>>>> aaaaa <<<<」を設定すると、送信されるデイリーニュースのメール本文には「>>>> aaaaa <<<<」が出力される。</p>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p>メールテンプレートにおけるエスケープ処理の問題は <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): The Parameter will be escape in the mail (メールに含まれるパラメータがエスケープされている) (Fixed(完了))" href="http://redmine.openpne.jp/issues/1344">#1344</a> によって修正されており、その修正内容は下記のようなものでした。</p>
<pre><code class="diff syntaxhl"><span class="CodeRay"><span class="line head"><span class="head">--- </span><span class="filename">a/lib/util/opMailSend.class.php</span></span>
<span class="line head"><span class="head">+++ </span><span class="filename">b/lib/util/opMailSend.class.php</span></span>
<span class="change"><span class="change">@@</span> -81,6 +82,7 <span class="change">@@</span></span> <span class="keyword">class</span> <span class="class">opMailSend</span>
<span class="local-variable">$view</span> = <span class="keyword">new</span> sfTemplatingComponentPartialView(<span class="local-variable">$context</span>, <span class="string"><span class="delimiter">'</span><span class="content">superGlobal</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">notify_mail:</span><span class="delimiter">'</span></span>.<span class="local-variable">$target</span>.<span class="string"><span class="delimiter">'</span><span class="content">_</span><span class="delimiter">'</span></span>.<span class="local-variable">$template</span>, <span class="string"><span class="delimiter">'</span><span class="delimiter">'</span></span>);
<span class="local-variable">$context</span>->set(<span class="string"><span class="delimiter">'</span><span class="content">view_instance</span><span class="delimiter">'</span></span>, <span class="local-variable">$view</span>);
<span class="line insert"><span class="insert">+</span> <span class="local-variable">$view</span>->getAttributeHolder()->setEscaping(<span class="predefined-constant">false</span>);</span>
<span class="local-variable">$view</span>->setPartialVars(<span class="local-variable">$params</span>);
<span class="local-variable">$view</span>->setAttribute(<span class="string"><span class="delimiter">'</span><span class="content">renderer_config</span><span class="delimiter">'</span></span>, <span class="predefined">array</span>(<span class="string"><span class="delimiter">'</span><span class="content">twig</span><span class="delimiter">'</span></span> => <span class="string"><span class="delimiter">'</span><span class="content">opTemplateRendererTwig</span><span class="delimiter">'</span></span>));
<span class="local-variable">$view</span>->setAttribute(<span class="string"><span class="delimiter">'</span><span class="content">rule_config</span><span class="delimiter">'</span></span>, <span class="predefined">array</span>(<span class="string"><span class="delimiter">'</span><span class="content">notify_mail</span><span class="delimiter">'</span></span> => <span class="predefined">array</span>(
</span></code></pre>
<p>一方、デイリーニュースの送信には、メールテンプレートこそ使用しているものの本文中で include_component を使用しており、呼び出されるコンポーネントのために新たに sfViewParameterHolder が生成されます。この sfViewParameterHolder は呼び出し元ビューのエスケープ設定を引き継がず、sfConfig から sf_escaping_method や sf_escaping_strategy の値を取得して設定するため、コンポーネント内では <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): The Parameter will be escape in the mail (メールに含まれるパラメータがエスケープされている) (Fixed(完了))" href="http://redmine.openpne.jp/issues/1344">#1344</a> の修正による効果が及ばないことになります。これが原因で、デイリーニュースのガジェット内ではエスケープが有効な状態でテンプレートが出力されます。</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(バグ) #3289 (Rejected(差し戻し)): 自動リンク機能で末尾のスラッシュを省略すると後続の日本語テキストもURLとしてリンクされてしまう
http://redmine.openpne.jp/issues/3289
2012-12-27T07:38:14Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="現象"></a>
<h3 >現象<a href="#現象" class="wiki-anchor">¶</a></h3>
<p>op_auto_link_text (<a class="source" href="http://redmine.openpne.jp/projects/op3/repository/entry/lib/helper/opUtilHelper.php">source:lib/helper/opUtilHelper.php</a>) を使用する箇所(アクティビティ、日記の本文・コメントなど)で、次のような現象が起こる。</p>
<p><code>http://example.com/テキスト</code> と入力して投稿すると <code><a href="http://example.com/">http://example.com/</a>テキスト</code> のように日本語の部分を除いて自動リンク機能が働くが、<br /><code>http://example.comテキスト</code> と入力して投稿すると <code><a href="http://example.comテキスト">http://example.comテキスト</a></code> のようなリンクが生成されてしまう。</p>
<a name="原因"></a>
<h3 >原因<a href="#原因" class="wiki-anchor">¶</a></h3>
<p>op_auto_link_text による自動リンクで使用される正規表現は次のように定義されている。</p>
<pre><code class="php syntaxhl"><span class="CodeRay"> <span class="predefined">define</span>(<span class="string"><span class="delimiter">'</span><span class="content">SF_AUTO_LINK_RE</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">~
( # leading text
<</span><span class="content">\w</span><span class="content">+.*?>| # leading HTML tag, or
[^=!:</span><span class="char">\'</span><span class="content">"/]| # leading punctuation, or
^| # beginning of line, or
</span><span class="content">\s</span><span class="content">? # leading whitespaces
)
(
(?:https?://)| # protocol spec, or
(?:www</span><span class="content">\.</span><span class="content">) # www.*
)
(
[-</span><span class="content">\w</span><span class="content">]+ # subdomain or domain
(?:</span><span class="content">\.</span><span class="content">[-</span><span class="content">\w</span><span class="content">]+)* # remaining subdomains or domain
(?::</span><span class="content">\d</span><span class="content">+)? # port
</span><span class="content">\/</span><span class="content">?
[a-zA-Z0-9_</span><span class="content">\-</span><span class="content">\/</span><span class="content">.,:;</span><span class="content">\~</span><span class="content">\?</span><span class="content">@&=+$%#!()]*
)
([^a-zA-Z0-9_</span><span class="content">\-</span><span class="content">\/</span><span class="content">.,:;</span><span class="content">\~</span><span class="content">\?</span><span class="content">@&=+$%#!()]|</span><span class="content">\s</span><span class="content">|<|$) # trailing text
~xu</span><span class="delimiter">'</span></span>);
</span></code></pre>
<p>この正規表現はUTF-8モードが有効となっており(末尾の <code>u</code> オプションによる)、このモードではpreg_match内部でPCREに対して PCRE_UCF オプションが使用される。このオプションでは <code>\d</code>, <code>\D</code>, <code>\s</code>, <code>\S</code>, <code>\w</code>, <code>\W</code> などの <strong>重要な</strong> 文字クラスの挙動が変わり、例えば <code>\d</code> は全角数字にもマッチし、 <code>\w</code> は漢字や平仮名にもマッチするようになる。これによって、ドメイン部分の <code>[-\w]+</code> に日本語のテキストがマッチしてしまうため前述のような現象が起こる。</p>
<a name="参考"></a>
<h4 >参考<a href="#参考" class="wiki-anchor">¶</a></h4>
<ul>
<li><a href="https://bugs.php.net/bug.php?id=52971" class="external">PHP :: Bug #52971 :: PCRE-Meta-Characters not working with utf-8</a></li>
<li><a href="https://github.com/php/php-src/blob/master/ext/pcre/php_pcre.c#L359-L366" class="external">php-src/ext/pcre/php_pcre.c at master · php/php-src · GitHub</a></li>
</ul>
<a name="修正内容"></a>
<h3 >修正内容<a href="#修正内容" class="wiki-anchor">¶</a></h3>
<p>SF_AUTO_LINK_RE で使用されている <code>\w</code>, <code>\s</code>, <code>\d</code> を <code>[0-9A-Za-z]</code>, <code>\ </code>, <code>[0-9]</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(バグ) #1972 (Fixed(完了)): テーブル単位でデータベース接続先を設定しても無視される
http://redmine.openpne.jp/issues/1972
2011-03-24T07:15:43Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="現象"></a>
<h3 >現象<a href="#現象" class="wiki-anchor">¶</a></h3>
<p>config/ProjectConfiguration.class.php 内で、<br /><code><pre>
$manager->openConnection('sqlite:/var/local/dbfiles/openpne3-uploads.sqlite', 'slave-uploads');
$manager->bindComponent('File', 'slave-uploads');
$manager->bindComponent('FileBin', 'slave-uploads');
</pre></code><br />のような設定を追加しても、指定したとおりに接続先が変更されない。</p>
<a name="原因"></a>
<h3 >原因<a href="#原因" class="wiki-anchor">¶</a></h3>
<p>opDoctrineQuery や opDoctrineRecord がDBレプリケーション処理のために、テーブルに紐付いているコネクションを無視して上書きしてしまうため。</p>
<a name="修正内容"></a>
<h3 >修正内容<a href="#修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
OpenPNE 3 - Bug(バグ) #1961 (Fixed(完了)): mobile_frontend内のアクションでforwardを使用するとパラメータが文字化けする
http://redmine.openpne.jp/issues/1961
2011-03-22T05:40:21Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="現象"></a>
<h3 >現象<a href="#現象" class="wiki-anchor">¶</a></h3>
<p>mobile_frontend内のアクションでforwardを使用するとGET・POSTパラメータが文字化けする</p>
<a name="原因"></a>
<h3 >原因<a href="#原因" class="wiki-anchor">¶</a></h3>
<p>forwardを実行するとsfMobileIOFilterが再度実行されてしまい「SJIS-win→UTF-8」の変換が二重に行われてしまうため文字化けが起きる</p>
<a name="修正内容"></a>
<h3 >修正内容<a href="#修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
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>