プロジェクト

全般

プロフィール

Bug(バグ) #1462

Cannot modify Custom CSS in an empty character string (カスタムCSSを空にして保存することができない)

Minoru Takai13年以上前に追加. ほぼ13年前に更新.

ステータス:
Fixed(完了)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
2010-08-02
期日:
進捗率:

100%

3.6 で発生するか:
Yes
3.8 で発生するか:
Unknown (未調査)

説明

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; ?>
    

関連するチケット

関連している OpenPNE 3 - Backport(バックポート) #2142: Cannot modify Custom CSS in an empty character string (カスタムCSSを空にして保存することができない) Fixed(完了) 2010-08-02 2011-06-24
関連している OpenPNE 3 - Backport(バックポート) #2143: Cannot modify Custom CSS in an empty character string (カスタムCSSを空にして保存することができない) Fixed(完了) 2010-08-02

関係しているリビジョン

リビジョン b5b96b4b (差分)
Youichi Kimura約13年前に追加

now admins can clear the customizecss (fixes #1462)

履歴

#1 Rimpei Ogawa13年以上前に更新

  • 3.6 で発生するかYes にセット

#2 Minoru Takai13年以上前に更新

  • 担当者 を削除 (Minoru Takai)

#3 Youichi Kimura約13年前に更新

  • ステータスNew(新規) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 b5b96b4b99eb3c0cad5daf14650265c8bbefc83a で適用されました。

#4 Youichi Kimura約13年前に更新

  • 担当者Youichi Kimura にセット

#5 Masato Nagasawaほぼ13年前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

レビュー問題ありません。
説明のフォーマット統一と、
バックポートチケットの作成をお願いします。

#6 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; ?>
    

他の形式にエクスポート: Atom PDF