2017-06-07 3 views
1

Ich schreibe einen benutzerdefinierten Helper, der HtmlHelper erweitert und überschreibt die \HtmlHelper::image() Methode, um die Bilddimensionen zu berechnen und sie als HTML-Attribute hinzuzufügen. Was ich habe, so arbeitet weit in Ordnung für regelmäßige Bilder:Dateisystem Pfad für Bilder

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); 
} 

... aber hat diese Fehler:

  • Bilder von Plug-Ins können nicht auf der Festplatte befinden (und sie sollten), zB :

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

    ... erzeugt diesen Pfad Dateisystem:

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

    ... also nicht getimagesize() weil tatsächliche Lage ist:

    …\src\Plugin\DebugKit\webroot\img\cake.icon.png" 
    
  • Externe Bilder (die ignoriert werden sollte) gehen durch den gesamten Prozess:

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

ich für eine gesucht haben eingebaute Methode, um eine CakePHP-Bild-URL zu konvertieren (in jedem Format, das von \HtmlHelper::image() akzeptiert wird, in einen Dateisystempfad (o etwas wie null, wenn dies nicht zutrifft), aber ich konnte keine finden. Native Features, die einen Festplattenpfad benötigen, wie \Helper::assetTimestamp(), sind in Tonnen von nicht wiederverwendbarem Code verpackt.

Gibt es eine elegante Lösung?

Antwort

1

Ich würde sagen, dass es ziemlich viel nur drei Optionen sind:

  • einen Patch Senden Asset Dateisystempfad Retrieval-Funktionalität auf den Kern hinzuzufügen.
  • Kopieren Sie eine Menge Code aus dem Helfer (assetUrl(), webroot() und).
  • Verwenden Sie Webanfragen für lokale URLs (idealerweise kombiniert mit Caching).
0

Verwenden Sie DS anstelle von \ oder /, sie können manchmal Probleme mit dem Betriebssystem verursachen. DS ist Verzeichnis Trennzeichen von CakePHIP zur Verfügung gestellt Kurz für PHP DIRECTORY_SEPARATOR, der/auf Linux und \ auf Windows ist. Check the doc

+0

Ich glaube nicht, dass das stimmt. PHP kann beides ohne irgendein Problem behandeln. Pfadtrennzeichen ändern nicht die Tatsache, dass im Pfad mehrere Komponenten fehlen (z. B. 'Plugin \ DebugKit'). (BTW, ich benutze CakePHP/2, nicht 3.) –

+0

Haben Sie versucht, es mit Plugin name.path verwenden, verweisen Sie dieses Dokument: - https://book.cakephp.org/2.0/en/core-libraries/ helpers/html.html # HtmlHelper :: image – Deejay

+0

Nicht sicher, was Sie genau meinen. Ich habe kein Problem mit der 'image()' Methode selbst, Plug-in-Bilder funktionieren gut. Ich möchte eine zusätzliche Verarbeitung vornehmen, für die ich den vollständigen Dateisystempfad des Assets benötige. Ich könnte 50 Codezeilen schreiben, die PHP-Kernfunktionen duplizieren, aber das möchte ich vermeiden. –

Verwandte Themen