2017-06-07 283 views
1

我正在編寫一個擴展HtmlHelper並覆蓋\HtmlHelper::image()方法來計算圖像尺寸並將它們添加爲HTML屬性的自定義幫助程序。我至今原始圖片的正常工作:圖像的文件系統路徑

public function image($path, $options = array()) { 
    if (!array_key_exists('width', $options) && !array_key_exists('height', $options)) { 
     $stamp = Configure::read('Asset.timestamp'); 
     Configure::write('Asset.timestamp', false); 

     $path = $this->assetUrl($path, $options + array('pathPrefix' => Configure::read('App.imageBaseUrl'))); 
     list($width, $height) = @getimagesize(rtrim(WWW_ROOT, '\\/') . $path); 
     if (!is_null($width)) { 
      $options['width'] = $width; 
     } 
     if (!is_null($height)) { 
      $options['height'] = $height; 
     } 

     Configure::write('Asset.timestamp', $stamp); 
    } 
    return parent::image($path, $options); 
} 

...但有這些瑕疵:

從插件無法在磁盤上找到
  • 圖片(他們應該),例如:

    echo $this->Html->image('/debug_kit/img/cake.icon.png', array('alt' => 'CakePHP')); 
    

    ...產生這個文件系統路徑:

    …\src\webroot/debug_kit/img/cake.icon.png 
    

    ...因此getimagesize()失敗,因爲實際位置是:

    …\src\Plugin\DebugKit\webroot\img\cake.icon.png" 
    
  • 外部圖片(這應該被忽略)經過全過程:

    echo $this->Html->image('http://placekitten.com/200/300'); 
    …\src\webroothttp://placekitten.com/200/300 
    

我一直在尋找一個內置方法將CakePHP圖片URL(以\HtmlHelper::image()接受的任何格式轉換爲文件系統路徑(類似於null,但不適用時),但找不到任何格式。需要磁盤路徑的本地功能(如\Helper::assetTimestamp())被封裝在大量不可重用的代碼中。

有沒有優雅的解決方案?

回答

1

我會說,是非常有三種選擇:

  • 提交補丁資產文件系統路徑檢索功能添加到核心。
  • 從助手複製大量代碼(assetUrl(),webroot()assetTimestamp())。
  • 使用本地URL的Web請求(理想情況下與緩存結合)。
0

嘗試使用DS而不是使用\或/,它們有時會導致操作系統出現問題。 DS是由cakephp提供的目錄分隔符PHP的DIRECTORY_SEPARATOR簡稱,它在Linux上爲/,在Windows上爲\。 Check the doc

+0

我不認爲這是真的。 PHP可以處理兩個都沒有任何問題。路徑分隔符不會改變路徑缺少幾個組件的事實(例如'Plugin \ DebugKit')。 (順便說一下,我正在使用CakePHP/2,而不是3) –

+0

您是否嘗試過使用它與插件name.path,請參閱此文檔: - https://book.cakephp.org/2.0/en/core-libraries/ helpers/html.html#HtmlHelper :: image – Deejay

+0

不確定你的意思。我對'image()'方法本身沒有任何問題,插件圖片工作得很好。我想要做一些額外的處理,我需要資源的完整文件系統路徑。我可以編寫50行重複核心PHP功能的代碼,但我想避免這種情況。 –