Modül dizininde bulunan resim için Tema Resim Stili


10

Muhtemelen bu Drupal 6 bakış açısından çok fazla gelen ama ...

Bir görüntü bir modül klasöründe yaşarken belirli bir görüntü stilindeki bir görüntüyü nasıl temayabilirim? Bu beni batırıyor ve biliyorum ki basit bir şey eksik.

İşte yapmaya çalıştığım şeyi gösteren bazı örnek kod:

$file_uri = 'public://sites/all/modules/my_module/logo.jpg';
$data['logo'] = theme('image_style', array('style_name' => 'medium', 'path' => $file_uri));

File_build_uri () kullansam bile, var olmayan bir dosyanın yolunu bulurum. Resmi files dizinine taşır ve $ file_uri dosyasını 'public: //logo.jpg' olarak değiştirirsem gayet iyi çalışır.

Görüntüyü modül kodunun bir parçası olarak dosya dizinine kopyalamam gerekir mi? Eğer öyleyse, bu çok saçma değil mi?

Neyi kaçırıyorum? Böyle bir şeyin nasıl yapılacağına dair belgeler var mı? Drupal belgelerini incelemek için bir saatten fazla zaman harcadım ve tamamen kurudum.


public: //sites/all/modules/my_module/logo.jpg siteler / varsayılan / dosyalar / siteler / tüm / modüller / my_module / logo.jpg'ye etkili bir şekilde tercüme edilir - bu yüzden yukarıdakiler işe yaramaz. Sanırım soru şu, sadece theme_image_style üzerinden çalıştırmak için dosyayı kopyalamaktan nasıl kaçınırım?
PrairieHippo

Yanıtlar:


4

Ne yazık ki tasarım gereği. Gönderen theme_image_style()kabul edilebilir parametrelerin Dokümanlar açıklaması:

path: Görüntü dosyasının Drupal files dizinine göre yolu. Bu işlev, dosyalar dizininin dışındaki görüntülerle veya uzaktan barındırılan görüntülerle çalışmaz . Bu, 'images / image.jpg' gibi bir biçimde veya 'public: //images/image.jpg' gibi bir akış sarmalayıcı kullanıyor olmalıdır.

Vurgu madeni.

Görüntü tarzı sistemi sadece ortak dosyalar dizini bağlamında çalışıyor gibi görünüyor (belki de özel, emin değilim).

Son zamanlarda benzer bir durumla karşılaştım ve kendim kodlamak zorunda kaldım (çekirdek görüntü modülünden çok fazla ödünç almama rağmen).


Teşekkürler - gerçekten bu şekilde işe yaramasaydı ama sanırım geliştiriciler neden bu yaklaşımı seçtiğini akla getirebilirim.
PrairieHippo

9

Ben sadece bu rastladı ve bunu işlemek için kod yazmak zorunda kaldı.

Bu theme_image_style(), sayfa isteğinin yürütülmesi sırasında görüntü türevleri oluşturmak için etkili bir şekilde klonlar . Nesil, normalde bir 404'ü tetikleyecek güvenlik sorunlarını atlar, ancak bu, sayfanın ilk ziyaretinde daha yavaş bir sayfa anlamına gelir.

Yalnızca ortak dosya şemasını kullanıyorum, ancak bunun özel dosya şeması tabanlı stillerle başarısız olmasını beklerdim.

    /**
     * Implements hook_theme().
     */
    function MODULE_theme() {
      return array(
        'remote_image_style' => array(
          'variables' => array(
            'style_name' => NULL,
            'path' => NULL,
            'width' => NULL,
            'height' => NULL,
            'alt' => '',
            'title' => NULL,
            'attributes' => array(),
          ),
        ),
      );
    }

    /**
     * Returns HTML for an image using a specific image style.
     *
     * Clones theme_image_style() with the additional step of forcing the creation
     * of the derivative to bypass any 404 issues.
     */
    function theme_remote_image_style($variables) {
      // Determine the dimensions of the styled image.
      $dimensions = array(
        'width' => $variables['width'],
        'height' => $variables['height'],
      );
      image_style_transform_dimensions($variables['style_name'], $dimensions);

      $variables['width'] = $dimensions['width'];
      $variables['height'] = $dimensions['height'];

      $image_style_dest_path = image_style_path($variables['style_name'], $variables['path']);
      if (!file_exists($image_style_dest_path)) {
        $style = image_style_load($variables['style_name']);
        image_style_create_derivative($style, $variables['path'], $image_style_dest_path);
      }
      $variables['path'] = file_create_url($image_style_dest_path);
      return theme('image', $variables);
    }

2

theme_image_style() PHP'nin gerçek yollarını değil, akış paketlerini kullanarak bir URI'yi kabul eder.

input://bir PHP akım sarmalayıcı, oysa public://, private://ve temporary://temsil Drupal akışı sargı olan sites/default/files, özel ve geçici klasörleri.

Kesinlikle bir modülde bulunan resimli bir görüntü stilini kullanmaya gerekiyorsa, kontrol etmek isteyebilirsiniz system_stream_wrapper ekler modülü module://, theme://, profile://ve library://dere sarmalayıcılarını.

Uyarı: Mevcut soru ile alakasız olabilir, ancak diğer yazılarda bahsedildiği için, http: //, https: // veya feed: / / . Yine de belirtildiği gibi, bu akış sarmalayıcıları salt okunurdur ve herhangi bir yazma işlemi gerçekleştiremez ancak bunun image_style_url()gibi işlevlerle kullanılabileceğine inanıyorum theme_image_style().

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.