問題点 #11031

$this->BcHtml->css() の挙動がおかしい

Added by - garyuten over 6 years ago. Updated about 5 years ago.

Status:終了Start date:
Priority:通常Due date:
Assignee:- garyuten% Done:

0%

Category:テーマ
Target version:4.0.5

Description

  • optionの 'inline' => false にすると BcBaser->scripts() ?> に出力されない
  • CSSが存在しているパスを指定しても書き換えられて参照できなくなる

optionの 'inline' => false にすると BcBaser->scripts() ?> に出力されない

// /lib/Baser/View/Helper/BcBaserHelper.php の845行目あたり

    public function css($path, $options = array()) {
        if ($options === false) {
            $options['inline'] = false;
        }
        $options = array_merge(array(
            'rel' => 'stylesheet',
            'inline' => true
        ), $options);
        $rel = $options['rel'];
        unset($options['rel']);
        $result = $this->BcHtml->css($path, $rel, $options);

        var_dump($result); //←確認用出力

        if ($options['inline']) {
            echo $result;
        }
    }

確認用出力 結果

どれもテーマ内に記述

出力 'inline' => true

$this->BcBaser->css(array(
  '../theme/hogehoge/assets/css/style.css'
), array('inline' => true));


bodyタグ内に出力
string() " 
<link rel="stylesheet" type="text/css" href="/css/../theme/hogehoge/assets/css/style.css" />
" 

出力 'inline' => false

$this->BcBaser->css(array(
  '../theme/hogehoge/assets/css/style.css'
), array('inline' => false));


scripts() に出力されるはずが、 $this->BcHtml->css() を通すと NULLが返される
NULL

CSSが存在しているパスを指定しても書き換えられて参照できなくなる

ここのパス指定は「テーマ内のCSSから相対」で出すようですが、
相対はしなくていいので指定したパスをそのまま出力してください。

特に相対ルートパス("/")で始まった場合は、テーマ内のCSSでなく、webroot直下に置かれたファイルを参照したい場合なので、何も変換せずにそのまま出力して欲しいです。

構成例:サブディレクトリにインストールしている場合

[/]
└ [/basercms/]
 └[assets] //参照ファイル群
  └[common]
   ├[css]
   ├[js]
   …

ケース:パスが書き換えられる(相対ルートパス)

$this->BcBaser->css(array(
  '/assets/common/css/style.css'
), array('inline' => true));


出力結果: <link rel="stylesheet" type="text/css" href="/basercms/assets/common/css/style.css" />
→404エラーに

これを以下のように出力したい。

<link rel="stylesheet" type="text/css" href="/assets/common/css/style.css" />

ケース:絶対パス(http://〜

$this->BcBaser->css(array(
  'http://basercms.com/basercms/assets/common/css/style.css'
), array('inline' => true));


出力結果: <link rel="stylesheet" type="text/css" href="'http://basercms.com/basercms/assets/common/css/style.css" />
→OK


History

#1 Updated by 江頭 竜二 over 6 years ago

一個一個回答しますね。

「optionの 'inline' => false にすると BcBaser->scripts() ?> に出力されない」の件はご存知のとおり仕様です。

inline というのは、コンテンツ本体かどうかを指すのですが、
false にすると、head タグ内に出力する為(BcBaser->scriptsの箇所に出力する為)出力内容が、一次領域にバッファされ戻り値は、null となります。
コンテンツ本体で利用する場合、デフォルトが false の方がよいと思いますが、BcBaser->css は、元々、head タグ内での利用を想定している為、書いた箇所にそのまま出力するよう、inline のデフォルトが、true となっています。

デフォルトを false とした場合、head 内に書いた場合に、いちいち、inline を true に設定しなければなりません。

どちらかを立てればこちらが立たず的な感じですね。
どうしましょう?

次、「CSSが存在しているパスを指定しても書き換えられて参照できなくなる」の件です。
こちらも仕様なのですが、BcBaser->css だとか、BcBaser->img だとかは、元々、サブフォルダからルートへの移動に耐えうるために利用する仕組みです。

ですので、スラッシュ(/)というのは、サーバーのドキュメントルートではなく、baserCMSの設置場所を指す仕様となっています。

こちらもそのまま出力する仕様にしてしまうと、本来の機能が機能しなくなってしまいます。

サブフォルダに設置して、その上のパスを参照する場合は、わざわざ、BcBaser->css だとかを使わず、そのままHTMLで記述してはどうでしょう?

僕の実際の案件では、デモ環境から本番環境への移動など、フォルダ階層の移動がない場合、BcBaser->css はほとんど使ってないです。

#2 Updated by 江頭 竜二 over 5 years ago

  • Target version changed from 4.0.1 to 4.0.2

#3 Updated by 江頭 竜二 over 5 years ago

  • Assignee set to - garyuten
  • Target version changed from 4.0.2 to 4.0.3

我流さん、時間のある時に確認お願いしますー。今回見送ります。

#4 Updated by 江頭 竜二 over 5 years ago

  • Target version changed from 4.0.3 to 4.0.4

#5 Updated by 江頭 竜二 over 5 years ago

  • Target version changed from 4.0.4 to 4.0.5

#6 Updated by - garyuten about 5 years ago

  • Status changed from 担当 to 終了

江頭 竜二 は書きました:

コンテンツ本体で利用する場合、デフォルトが false の方がよいと思いますが、BcBaser->css は、元々、head タグ内での利用を想定している為、書いた箇所にそのまま出力するよう、inline のデフォルトが、true となっています。

なるほど、仕様わかりました。
inlineを未設定であれば通常はheadタグ内に表示されるということで、現状でOKです。

次、「CSSが存在しているパスを指定しても書き換えられて参照できなくなる」の件です。
僕の実際の案件では、デモ環境から本番環境への移動など、フォルダ階層の移動がない場合、BcBaser->css はほとんど使ってないです。

わかりました、この機能は今後使わないようにします。

Also available in: Atom PDF