http://redmine.openpne.jp/
http://redmine.openpne.jp/favicon.ico
2012-03-22T06:11:04Z
OpenPNE Issue Tracking System
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=13516
2012-03-22T06:11:04Z
Youichi Kimura
kim.upsilon@bucyou.net
<ul><li><strong>対象バージョン</strong> を <i>OpenPNE 3.7.0</i> から <i>261</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=13880
2012-03-27T05:23:28Z
Shouta Kashiwagi
kashiwagi@openpne.jp
<ul><li><strong>対象バージョン</strong> を <i>261</i> から <i>OpenPNE 3.8.x</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16029
2012-12-04T05:14:02Z
kaoru n
<ul><li><strong>ステータス</strong> を <i>New(新規)</i> から <i>Accepted(着手)</i> に変更</li><li><strong>担当者</strong> を <i>kaoru n</i> にセット</li><li><strong>3.8 で発生するか</strong> を <i>Unknown (未調査)</i> にセット</li></ul>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16033
2012-12-04T09:41:21Z
kaoru n
<ul></ul><p>原因は、上記記述内容ではなく(opValidatorDateは使用していない)、以下の記述内容にありました。</p>
<p>入力チェックに使用しているクラスsfValidatorDate内で入力値のEmptyチェックを行っています(sfValidatorDateのisEmpty)が、与えられた引数がarrayの場合に「array_filter」という関数を使用しています。<br />この関数は(<a class="external" href="http://php.net/manual/ja/function.array-filter.phpより">http://php.net/manual/ja/function.array-filter.phpより</a>)<br /><pre>
コールバック関数が与えられなかった場合、 input のエントリの中で FALSE と等しいもの (boolean への変換 を参照ください) がすべて削除されます。
</pre> <br />ということで、年に入力された0がfalse扱いされ削除されます。<br />その後Emptyチェックを行うため、年に0のみが入力された場合、Emptyと判定され必須項目ではないためエラーチェックに引っかかりません。</p>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16034
2012-12-04T10:08:51Z
kaoru n
<ul><li><strong>3.6 で発生するか</strong> を <i>Unknown (未調査)</i> から <i>Yes (はい)</i> に変更</li><li><strong>3.8 で発生するか</strong> を <i>Unknown (未調査)</i> から <i>Yes (はい)</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16036
2012-12-05T01:06:52Z
kaoru n
<ul></ul><p>opValidatorDateのバグはバグとして存在していて、コミュニティイベントの作成時にsfValidatorDateで現れる現象としては同じですが、起こっているバグは別問題でした。<br />ですので、このチケットでは、opValidatorDateのバグを扱い、コミュニティイベントの作成時の件は別チケットを起票します。</p>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16037
2012-12-05T07:28:13Z
kaoru n
<ul><li><strong>ステータス</strong> を <i>Accepted(着手)</i> から <i>Pending Review(レビュー待ち)</i> に変更</li><li><strong>担当者</strong> を削除 (<del><i>kaoru n</i></del>)</li><li><strong>進捗率</strong> を <i>0</i> から <i>50</i> に変更</li></ul><p><a class="external" href="https://github.com/openpne/OpenPNE3/pull/62">https://github.com/openpne/OpenPNE3/pull/62</a><br />プルリクエストしました。</p>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16174
2012-12-26T09:13:52Z
Mutsumi Imamura
imamura@openpne.jp
<ul><li><strong>対象バージョン</strong> を <i>OpenPNE 3.8.x</i> から <i>OpenPNE 3.8.4</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16175
2012-12-26T09:19:14Z
Mutsumi Imamura
imamura@openpne.jp
<ul><li><strong>対象バージョン</strong> を <i>OpenPNE 3.8.4</i> から <i>OpenPNE 3.9.0-old</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16183
2012-12-26T12:48:08Z
Mutsumi Imamura
imamura@openpne.jp
<ul><li><strong>担当者</strong> を <i>Yuya Watanabe</i> にセット</li></ul>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16194
2013-01-07T16:26:34Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><p>sfValidatorBase.class.php では値が下記の 3 つのいずれかになる場合に isEmpty() が true となる.<br /><pre>
特別な値 NULL (値がセットされていない変数を含む)
空の文字列
要素の数がゼロである 配列
</pre></p>
<p>sfValidatorDate.class.php では上記に加えて,配列の中の物が下記のものも isEmpty() が true となる値である.<br /><pre>
boolean の FALSE
integer の 0 (ゼロ)
float の 0.0 (ゼロ)
文字列の "0"
空のタグから作成された SimpleXML オブジェクト
</pre></p>
<p>PHP: 論理型 (boolean) - Manual<br /><a class="external" href="http://php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting">http://php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting</a></p>
<p>わざわざ isEmpty() をオーバーライドしているのは, sfValidatorBase#isEmpty() が単項目のみを考慮しているため.<br />下記コミットで配列で渡された場合を考慮している.<br /><a class="external" href="http://trac.symfony-project.org/changeset/7081">http://trac.symfony-project.org/changeset/7081</a></p>
<p>ただし,上記コミットのテストコードを見て分かる通り(下記に記述),それぞれの中身が null, '', array() 以外のものであることを考慮していない.つまり,動作としては正しいが過剰にフィルタしているという推測ができる.このコミットが5年前(2013/01/08 現在)であり,それ以降 isEmpty() については修正がされていないため sfValidatorDate のバグとして Symfony 側を修正するという手もあるが,ここでは議論しないこととする.<br /><pre>
158 // required
159 $v = new sfValidatorDate();
160 foreach (array(
161 array('year' => '', 'month' => '', 'day' => ''),
162 array('year' => null, 'month' => null, 'day' => null),
163 '',
164 null,
165 ) as $input)
166 {
167 try
168 {
169 $v->clean($input);
170 $t->fail('->clean() throws an exception if the date is empty and required is true');
171 }
172 catch (sfValidatorError $e)
173 {
174 $t->pass('->clean() throws an exception if the date is empty and required is true');
175 }
176 }
</pre></p>
<p>sfValidatorDate#isEmpty() が 0 をどう扱うかについて言明していないことを考慮すると, opValidatorDate#isEmpty() によって入力がないかどうかを調べる際に 0 を空入力としないようにする修正は妥当であると思われる.ただし, プルリクエストのように sfValidatorBase#isEmpty() をそのまま使ってしまう場合, $value の値が配列である場合にそれぞれの値が空入力であるかどうかという点について考慮されなくなってしまうため間違いである.</p>
<p>また, year のみを考慮しているが現実としてはこの値を西暦とすると紀元前など正の整数以外の年が存在することを鑑みた上で 0 より大きい値のみを受け付けるという仕様として認識できるが,月および日については 0 月 8 日や 1 月 0 日などは存在しないため、むしろ月および日について修正を行う必要があるのではないかという考え方もできる.</p>
<a name="別件"></a>
<h3 >別件<a href="#別件" class="wiki-anchor">¶</a></h3>
<p>下記のようなコードが合った場合の出力として, isEmpty() が true か false かによって返ってくる型が違う.これは sfValidatorBase の中で isEmpty() が true の場合は getEmptyValue() によって返ってくる値をそのまま返し, false の場合は sfValidatorDate の処理を通って返ってくるという違いが発生するため.仕様といえば仕様だが直感的ではなさそう.<br /><pre>
$validator = new opValidatorDate();
$validator->setOption('empty_value', new DateTime('1989-01-08'));
var_dump($validator->clean(array('year' => '', 'month' => '', 'day' => '')));
var_dump($validator->clean(array('year' => '', 'month' => '', 'day' => '', 'hour' => '10')));
</pre></p>
<p>出力<br /><pre>
object(DateTime)#23 (3) {
["date"]=> string(19) "1989-01-08 00:00:00"
["timezone_type"]=> int(3)
["timezone"]=> string(10) "Asia/Tokyo"
}
string(10) "1989-01-08"
</pre></p>
<a name="別件2"></a>
<h3 >別件2<a href="#別件2" class="wiki-anchor">¶</a></h3>
<p>lib/vendor/symfony/test/unit/validator/sfValidatorDateTest.php より,timezone についてのテストコードを拝借してきて opValidatorDate に適用してみたときにテストがパスしない.sfValidatorDate に変更すると通る.</p>
<pre>
1 <?php
2
3 include_once dirname(__FILE__) . '/../../bootstrap/unit.php';
4
5 $t = new lime_test(1, new lime_output_color());
6
7 $v = new opValidatorDate();
8
9 $t->diag('opValidatorDate');
10
11 // timezones
12 $defaultTimezone = new DateTimeZone(date_default_timezone_get());
13 $otherTimezone = new DateTimeZone('US/Pacific');
14 if ($defaultTimezone->getOffset(new DateTime()) == $otherTimezone->getOffset(new DateTime()))
15 {
16 $otherTimezone = new DateTimeZone('US/Eastern');
17 }
18
19 $date = new DateTime('2000-01-01T00:00:00-00:00');
20 $date->setTimezone($otherTimezone);
21 $v->setOption('with_time', true);
22 $clean = $v->clean($date->format(DATE_ATOM));
23
24 $date->setTimezone($defaultTimezone);
25 $t->is($clean, $date->format('Y-m-d H:i:s'), '->clean() respects incoming and default timezones');
</pre><br /><pre>
$ php opValidatorDateTestForTimezone.php
not ok 1 - ->clean() respects incoming and default timezones
# Failed test (./opValidatorDateTestForTimezone.php at line 25)
# got: '1999-12-31 16:00:00'
# expected: '2000-01-01 09:00:00'
</pre>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16195
2013-01-08T01:00:07Z
Yuya Watanabe
watanabe@openpne.jp
<ul><li><strong>ステータス</strong> を <i>Pending Review(レビュー待ち)</i> から <i>Accepted(着手)</i> に変更</li><li><strong>進捗率</strong> を <i>50</i> から <i>0</i> に変更</li></ul><a name="コードからみる仕様"></a>
<h3 >コードからみる仕様<a href="#コードからみる仕様" class="wiki-anchor">¶</a></h3>
<p>付録 B - バリデーター (1_2) - Symfony<br /><a class="external" href="http://symfony.com/legacy/doc/forms/1_2/ja/B-Validators#chapter_b_sub_sfvalidatordate">http://symfony.com/legacy/doc/forms/1_2/ja/B-Validators#chapter_b_sub_sfvalidatordate</a></p>
<ul>
<li>次のキーで構成される配列: year、month、day、hour、 minute と second
<ul>
<li>すべて数字</li>
<li>year は 4 桁以内の数字</li>
<li>year, month, day は all or nothing</li>
<li>checkdate() が true になるような (year, month, date) の組み合わせがセットされている.</li>
<li>with_time が指定されている場合は (hour), (hour, minute), (hour, minute, second) の組み合わせがセットされている.</li>
</ul>
</li>
<li>提供されるのであれば date_format 正規表現にマッチする文字列</li>
<li>PHP の strtotime() 関数によって解析できる文字列</li>
<li>タイムスタンプを表す整数</li>
</ul>
<ul>
<li>required が false かつ isEmpty() が false である場合は empty_value は strtotime() 関数によって解析できる文字列か date('YmdHis', $value) で解析できる数字列でなければならない.</li>
</ul>
<p>opValidaterDate</p>
<ul>
<li>次のキーで構成される配列: year、month、day、hour、 minute と second
<ul>
<li>すべて数字</li>
<li>year は 4 桁以内の数字</li>
<li>year, month, day は all or nothing</li>
<li>checkdate() が true になるような (year, month, date) の組み合わせがセットされている.</li>
<li>with_time が指定されている場合は (hour), (hour, minute), (hour, minute, second) の組み合わせがセットされている.</li>
</ul>
</li>
<li>提供されるのであれば date_format 正規表現にマッチする文字列</li>
<li>PHP の strtotime() 関数によって解析できる文字列</li>
</ul>
<ul>
<li>required が false かつ isEmpty() が false である場合は empty_value は DateTime オブジェクトでなければならない</li>
</ul>
sfValidatorDate と opValidatorDate を外側から見た場合の違いとしては,下記の2つがある.
<ul>
<li>opValidaterDate は入力にタイムスタンプを許容しない</li>
<li>opValidaterDate は empty_value に DateTime を用いる必要がある</li>
</ul>
<a name="isEmpty-について"></a>
<h3 >isEmpty について<a href="#isEmpty-について" class="wiki-anchor">¶</a></h3>
<p>意図としては任意の値が空ではない(0 は空でないとする)状態を考えたいので下記のようなものが考えられる.</p>
<pre>
function isEmpty($value) {
if (!is_array($value)) {
return parent::isEmpty($value);
}
foreach ($value as $v) {
if (!in_array($v, array(null, '', array()), true)) {
return false;
}
}
return true;
}
</pre>
<a name="setTimezone-の挙動について"></a>
<h3 >setTimezone の挙動について<a href="#setTimezone-の挙動について" class="wiki-anchor">¶</a></h3>
<p>sfValidatorDate と opValidatorDate の挙動に差があるが,今回は考慮しないこととする.</p>
<a name="修正方針"></a>
<h3 >修正方針<a href="#修正方針" class="wiki-anchor">¶</a></h3>
<p>上記 isEmpty のコードを用いて空判定を行う. つまり, 0 は空文字列ではないという扱い.<br />また,タイムスタンプを許容しないことおよび empty_value が DateTime であるべきということをコメントで明記しておく.</p>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16201
2013-01-08T07:24:14Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><p>下記観点のテストケースを追加した結果を示しておく.</p>
<ul>
<li>(boolean) として扱う場合に false となるもので 空として扱うものと扱わないもの</li>
<li>required が true の場合と false の場合</li>
<li>isEmpty が true の場合と false の場合</li>
</ul>
空入力として扱う値
<ul>
<li>'',</li>
<li>null,</li>
<li>false, </li>
<li>array()</li>
<li>new SimpleXMLElement('<hoge />')</li>
</ul>
空入力として扱わない値
<ul>
<li>0</li>
<li>'0'</li>
</ul>
<pre>
$ prove --exec php opValidatorDateTest.php
opValidatorDateTest.php .. Failed 10/80 subtests
Test Summary Report
-------------------
opValidatorDateTest.php (Wstat: 0 Tests: 76 Failed: 6)
Failed tests: 58, 60, 68-69, 75-76
Parse errors: Bad plan. You planned 80 tests but ran 76.
Files=1, Tests=76, 0 wallclock secs ( 0.04 usr 0.01 sys + 0.43 cusr 0.06 csys = 0.54 CPU)
Result: FAIL
</pre>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16202
2013-01-08T08:44:08Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><p>浮動小数点を空入力として扱わないとしてテストを追加.<br />手元の環境ですべてのテストにパスすることを確認.</p>
<pre>
$ prove --exec php opValidatorDateTest.php
opValidatorDateTest.php .. ok
All tests successful.
Files=1, Tests=84, 1 wallclock secs ( 0.04 usr 0.01 sys + 0.43 cusr 0.06 csys = 0.54 CPU)
Result: PASS
</pre>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16203
2013-01-08T09:20:17Z
Yuya Watanabe
watanabe@openpne.jp
<ul><li><strong>ステータス</strong> を <i>Accepted(着手)</i> から <i>Pending Review(レビュー待ち)</i> に変更</li><li><strong>進捗率</strong> を <i>0</i> から <i>50</i> に変更</li></ul><p>更新履歴 <a class="changeset" title="Merge branch 't2882' (fixes #2882)" href="http://redmine.openpne.jp/projects/op3/repository/revisions/54730f08546bf98f8886cc0941b76ebfab24e086">54730f08546bf98f8886cc0941b76ebfab24e086</a> で適用されました。</p>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=16210
2013-01-09T12:12:38Z
Kousuke Ebihara
ebihara@tejimaya.com
<ul><li><strong>ステータス</strong> を <i>Pending Review(レビュー待ち)</i> から <i>Pending Testing(テスト待ち)</i> に変更</li><li><strong>進捗率</strong> を <i>50</i> から <i>70</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #2882: opValidatorDate で「年」に 0 を入力した場合に空値として認識される
http://redmine.openpne.jp/issues/2882?journal_id=22228
2017-04-03T08:11:22Z
isao sano
sano@tejimaya.com
<ul><li><strong>ステータス</strong> を <i>Pending Testing(テスト待ち)</i> から <i>Won't fix(対応せず)</i> に変更</li><li><strong>進捗率</strong> を <i>70</i> から <i>0</i> に変更</li></ul><p>OpenPNE 3.8.4 にて対応済みであったため、対応せずとします。</p>