Project

General

Profile

Bug(バグ) #1462

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

Added by Minoru Takai about 12 years ago. Updated over 11 years ago.

Status:
Fixed(完了)
Priority:
Normal(通常)
Target version:
Start date:
2010-08-02
Due date:
% Done:

100%

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

Description

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

Related issues

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

Associated revisions

Revision b5b96b4b (diff)
Added by Youichi Kimura over 11 years ago

now admins can clear the customizecss (fixes #1462)

History

#1 Updated by Rimpei Ogawa about 12 years ago

  • 3.6 で発生するか set to Yes

#2 Updated by Minoru Takai about 12 years ago

  • Assignee deleted (Minoru Takai)

#3 Updated by Youichi Kimura over 11 years ago

  • Status changed from New(新規) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

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

#4 Updated by Youichi Kimura over 11 years ago

  • Assignee set to Youichi Kimura

#5 Updated by Masato Nagasawa over 11 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 70

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

#6 Updated by Minoru Takai over 11 years ago

  • Status changed from Pending Testing(テスト待ち) to Fixed(完了)
  • % Done changed from 70 to 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; ?>
    

Also available in: Atom PDF