操作
Bug(バグ) #1462
完了Cannot modify Custom CSS in an empty character string (カスタムCSSを空にして保存することができない)
開始日:
2010-08-02
期日:
進捗率:
100%
予定工数:
3.6 で発生するか:
Yes
3.8 で発生するか:
説明
Overview (概要)¶
管理画面からカスタムCSSを編集する際、当該テキストエリア name="css[css]" の値が空文字列であると(つまりカスタムCSSを空にしようとしても)保存の処理が行われない。
また、既に記述しているカスタムCSSを削除しようと思った場合に、その保存が失敗したことすら示されておらず、管理者を混乱させてしまう(カスタムCSSのクリアが成功したように見えるが実際にはクリアされていない)。
Causes (原因)¶
管理画面にあるカスタムCSSのフォームは次のフォームクラスでバリデートされている。
- apps/pc_backend/modules/design/lib/opCustomCssForm.class.php
11-class opCustomCssForm extends sfForm 12-{ 13- public function configure() 14- { 15- $this->setWidget('css', new sfWidgetFormTextarea(array(), array('rows' => '20', 'cols' => '70'))); 16- $this->setValidator('css', new opValidatorString()); 17- 18- $this->setDefault('css', Doctrine::getTable('SnsConfig')->get('customizing_css')); 19- 20- $this->widgetSchema->setNameFormat('css[%s]'); 21- } 22- 23- public function save() 24- { 25- Doctrine::getTable('SnsConfig')->set('customizing_css', $this->getValue('css')); 26- opToolkit::clearCache(); 27- } 28-}
この 16 行目では opValidatorString() で入力値のバリデートを行っているが、
- lib/validator/opValidatorString.class.php
19-class opValidatorString extends sfValidatorString 20-{ 21- protected function configure($options = array(), $messages = array()) 22- { 23- parent::configure($options, $messages); 24- 25- $this->addOption('ltrim', false); 26- $this->addOption('rtrim', false); 27- }
- lib/vendor/symfony/lib/validator/sfValidatorString.class.php
- lib/vendor/symfony/lib/validator/sfValidatorBase.class.php
51- public function __construct($options = array(), $messages = array()) 52- { 53- $this->options = array_merge(array('required' => true, 'trim' => false, 'empty_value' => null), $this->options);
opValidatorString() を呼んだ場合は ('required' => false) を要素として持つ array() を引数として与えないと、空文字列の場合に「必須項目である」として弾かれてしまう。
Way to fix (修正方針)¶
- opValidatorString(array('required' => false)) のようにしてバリデータの required を false とする
index 531b1d9..bb6013c 100644 --- a/apps/pc_backend/modules/design/lib/opCustomCssForm.class.php +++ b/apps/pc_backend/modules/design/lib/opCustomCssForm.class.php @@ -13,7 +13,7 @@ class opCustomCssForm extends sfForm public function configure() { $this->setWidget('css', new sfWidgetFormTextarea(array(), array('rows' => '20', 'cols' => '70'))); - $this->setValidator('css', new opValidatorString()); + $this->setValidator('css', new opValidatorString(array('required' => false))); $this->setDefault('css', Doctrine::getTable('SnsConfig')->get('customizing_css'));
Notes (補足)¶
- 現時点でも、「半角スペースのみ」や「改行のみ」での保存は可能であり( trim は一切行なわれておらず)、空文字列の保存のみが失敗するような動作となっている
- 改行のみで保存した場合は、改行が1つ省かれて保存されるようである(この挙動はこのチケットで扱うべき問題ではないと考えられる)
- また本件の問題にはならないが、 apps/pc_frontend/templates/_layout.php 等では以下のように記述されている(カスタムCSSの文字列内容を直接真偽値として扱っている)ため、カスタムCSSの内容が空である場合には、カスタムCSSの読み込み自体が行なわれない。
9:<?php if (Doctrine::getTable('SnsConfig')->get('customizing_css')): ?> 10-<link rel="stylesheet" type="text/css" href="<?php echo url_for('@customizing_css') ?>" /> 11-<?php endif; ?>
Youichi Kimura さんが13年以上前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 b5b96b4b99eb3c0cad5daf14650265c8bbefc83a で適用されました。
Masato Nagasawa さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
レビュー問題ありません。
説明のフォーマット統一と、
バックポートチケットの作成をお願いします。
Minoru Takai さんが13年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
動作テストを行いました。同時に修正方針の確認も行いました。
Description にも示しましたが、この問題に対する修正方針は妥当だと判断しました。また動作上も改善されていることが確認できています。(コーディング規約等の観点からも)修正内容に問題はないためチケットをクローズします。
テスト内容¶
- 管理画面からカスタムCSSの内容が空文字列で更新(保存)ができる
- 内容
- 予めカスタムCSSを記述しておき、文字列を全削除して保存を実行する
- 確認方法
- 管理画面上では想定通り保存が完了したことが確認できる
- データベース上に、カスタムCSSが空文字列として保存されている
- 内容
- 空文字列で保存されたカスタムCSSがメンバー側ページにも適用されている
- 内容
- 予め記述していたカスタムCSSを削除することができていることを確認する
- 確認方法
- 予めカスタムCSSを適当に記述し、メンバー側ページを表示してカスタムCSSが効いていることを確認する
- カスタムCSSを空文字列で保存した後に、メンバー側ページを表示して、予め記述していたカスタムCSSが適用されていないことを確認できる
- 実際は、空文字列の場合にはカスタムCSSの読み込みすら行なわれない(後述の補足参照)
- 内容
- 空文字列以外の保存に影響がない
- 内容
- 適当なカスタムCSSを記述して保存を実行する
- 空白類文字のみ(trim が適用された場合に空文字列となる文字列)で記述して保存を実行する
- 確認方法
- 管理画面上でカスタムCSSを確認する
- 改行のみを記述して保存した場合は、改行が1つ除かれることが確認できているが、本チケットで扱うべき問題ではない
- 内容
備考¶
- 現時点でも、「半角スペースのみ」や「改行のみ」での保存は可能であり( trim は一切行なわれておらず)、空文字列の保存のみが失敗するような動作となっている
- 改行のみで保存した場合は、改行が1つ省かれて保存されるようである(この挙動はこのチケットで扱うべき問題ではないと考えられる)
- また本件の問題にはならないが、 apps/pc_frontend/templates/_layout.php 等では以下のように記述されている(カスタムCSSの文字列内容を直接真偽値として扱っている)ため、カスタムCSSの内容が空である場合には、カスタムCSSの読み込み自体が行なわれない。
9:<?php if (Doctrine::getTable('SnsConfig')->get('customizing_css')): ?> 10-<link rel="stylesheet" type="text/css" href="<?php echo url_for('@customizing_css') ?>" /> 11-<?php endif; ?>
操作