Styl obrazu motywu dla obrazu znajdującego się w katalogu modułów

10

Prawdopodobnie dochodzi do tego ze zbyt dużego punktu widzenia Drupala 6, ale ...

Jak utworzyć motyw obrazu w danym stylu obrazu, gdy ten obraz znajduje się w folderze modułu? To doprowadza mnie do szału i wiem, że brakuje mi czegoś prostego.

Oto przykładowy kod pokazujący, co próbuję zrobić:

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

Nawet jeśli użyję file_build_uri (), to skończę ze ścieżką do pliku, który nie istnieje. Jeśli przeniosę obraz do katalogu plików i zmienię $ file_uri na 'public: //logo.jpg', to działa dobrze.

Czy muszę skopiować obraz do katalogu plików jako część kodu modułu? Jeśli tak, czy to nie jest śmieszne?

czego mi brakuje? Czy istnieje dokumentacja, jak to zrobić? Spędziłem ponad godzinę przeglądając dokumentację Drupala i całkowicie wyszedłem.

PrairieHippo
źródło
public: //sites/all/modules/my_module/logo.jpg skutecznie przekłada się na strony / default / files / sites / all / modules / my_module / logo.jpg - dlatego powyższe nie działa. Zgadnij, jakie mam pytanie: jak uniknąć kopiowania pliku, aby uruchomić go przez theme_image_style?
PrairieHippo

Odpowiedzi:

4

Niestety jest to zgodne z projektem. Z theme_image_style()opisu dopuszczalnych parametrów doktorów:

ścieżka: ścieżka pliku obrazu względem katalogu plików Drupal. Ta funkcja nie działa z obrazami spoza katalogu plików ani ze zdalnie hostowanymi obrazami . Powinien być w formacie takim jak „images / image.jpg” lub przy użyciu opakowania strumienia, takiego jak „public: //images/image.jpg”.

Podkreśl moje.

Wygląda na to, że system stylów obrazów działa tylko w kontekście katalogu plików publicznych (być może również prywatnych, nie jestem pewien).

Niedawno spotkałem się z podobną sytuacją i ostatecznie musiałem sam ją kodować (chociaż dużo pożyczyłem od głównego modułu obrazu).

Clive
źródło
Dzięki - naprawdę chciałbym, żeby to nie działało w ten sposób, ale chyba potrafię zrozumieć, dlaczego programiści wybrali takie podejście.
PrairieHippo
9

Właśnie się z tym spotkałem i musiałem napisać kod, aby sobie z tym poradzić.

To skutecznie klonuje, theme_image_style()aby utworzyć pochodne obrazu podczas wykonywania żądania strony. Generacja omija problemy z bezpieczeństwem, które normalnie wywoływałyby błąd 404, ale oznacza to również wolniejszą stronę przy pierwszej wizycie.

Używam tylko publicznego schematu pliku, ale spodziewam się, że to się nie powiedzie ze stylami opartymi na schemacie pliku prywatnego.

    /**
     * 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);
    }
Ziemia.
źródło
2

theme_image_style() akceptuje URI przy użyciu owijania strumieni PHP, a nie rzeczywistych ścieżek.

input://PHP jest strumień wrapper, natomiast public://, private://i temporary://to Drupal owijarki stream za reprezentowanie sites/default/files, foldery prywatne i tymczasowe.

Jeśli na pewno trzeba użyć styl obrazu z obrazu znalezionego w module, może chcesz sprawdzić system_stream_wrapper moduł, który dodaje module://, theme://, profile://i library://owijarki strumieniowych.

Uwaga: Może to być nieistotne dla bieżącego pytania, ale ponieważ zostało wspomniane w innych postach, chciałbym również wskazać moduł remote_stream_wrapper , który dodaje obsługę dowolnego adresu URL za pomocą http: //, https: // lub feed: / / . Jak już wspomniano, te opakowania strumieniowe są tylko do odczytu i nie mogą wykonywać żadnych operacji zapisu, ale uważam, że można ich używać z image_style_url()powiązanymi funkcjami, takimi jak theme_image_style().

vensires
źródło