Theme Image Style สำหรับรูปภาพที่อยู่ในไดเรกทอรีโมดูล


10

อาจมาที่นี่จากมุมมอง Drupal 6 มากเกินไป แต่ ...

ฉันจะกำหนดรูปแบบของภาพในรูปแบบของภาพที่กำหนดได้อย่างไรเมื่อภาพนั้นอยู่ในโฟลเดอร์โมดูล นี่คือสิ่งที่ทำให้ฉันบ้าและฉันรู้ว่าฉันแค่คิดถึงบางสิ่งที่เรียบง่าย

นี่คือตัวอย่างรหัสที่แสดงสิ่งที่ฉันพยายามทำ:

$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 () ฉันจะจบลงด้วยเส้นทางไปยังไฟล์ที่ไม่มีอยู่ ถ้าฉันย้ายรูปภาพไปที่ไดเรกทอรีไฟล์และเปลี่ยน $ file_uri เป็น 'public: //logo.jpg' มันก็ใช้ได้ดี

ฉันจำเป็นต้องคัดลอกรูปภาพไปยังไดเรกทอรีไฟล์เป็นส่วนหนึ่งของรหัสโมดูลหรือไม่ ถ้าใช่มันไร้สาระใช่มั้ย

ฉันกำลังคิดถึงอะไร มีเอกสารเกี่ยวกับวิธีการทำสิ่งนี้หรือไม่? ฉันใช้เวลากว่าหนึ่งชั่วโมงในการขุดเอกสาร Drupal และแห้งสนิท


สาธารณะ: //sites/all/modules/my_module/logo.jpg แปลเป็นเว็บไซต์ / ค่าเริ่มต้น / ไฟล์ / เว็บไซต์ / all / modules / my_module / logo.jpg ได้อย่างมีประสิทธิภาพซึ่งเป็นสาเหตุที่กล่าวมาไม่ทำงาน เดาคำถามที่ฉันมีฉันจะหลีกเลี่ยงการคัดลอกไฟล์เพียงเพื่อรันผ่าน theme_image_style ได้อย่างไร
PrairieHippo

คำตอบ:


4

น่าเสียดายที่มีการออกแบบ จากtheme_image_style()คำอธิบายเอกสารของพารามิเตอร์ที่ยอมรับได้:

path: เส้นทางของไฟล์รูปภาพที่สัมพันธ์กับไดเรกทอรีไฟล์ Drupal ฟังก์ชั่นนี้ไม่ได้ทำงานกับภาพนอกไดเรกทอรีไฟล์หรือด้วยภาพพื้นที่ห่างไกล สิ่งนี้ควรอยู่ในรูปแบบเช่น 'images / image.jpg' หรือใช้ wrapper กระแสเช่น 'public: //images/image.jpg'

เน้นการขุด

ดูเหมือนว่าระบบรูปแบบภาพจะทำงานในบริบทของไดเรกทอรีไฟล์สาธารณะเท่านั้น (อาจเป็นแบบส่วนตัวฉันก็ไม่แน่ใจ)

ฉันวิ่งเข้าไปในสถานการณ์ที่คล้ายกันเมื่อเร็ว ๆ นี้และลงเอยด้วยการเขียนโปรแกรมด้วยตัวเอง (แม้ว่าฉันจะยืมมามากจากโมดูลภาพหลัก)


ขอบคุณ - อยากให้มันใช้งานไม่ได้ แต่ฉันคิดว่าฉันสามารถหาเหตุผลได้ว่าทำไมนักพัฒนาเลือกวิธีนี้
PrairieHippo

9

ฉันเพิ่งเจอสิ่งนี้และต้องเขียนรหัสเพื่อจัดการสิ่งนี้

วิธีนี้theme_image_style()จะทำการโคลนนิ่งเพื่อสร้างอิมเมจอนุพันธ์ในระหว่างการดำเนินการตามคำขอหน้า การสร้างข้ามปัญหาด้านความปลอดภัยซึ่งโดยปกติจะเรียก 404 แต่นั่นก็หมายความว่าหน้าเว็บช้าลงในครั้งแรกที่มีการเยี่ยมชมหน้าเว็บ

ฉันกำลังใช้สคีมาไฟล์สาธารณะเท่านั้น แต่ฉันคาดหวังว่าสิ่งนี้จะล้มเหลวด้วยสไตล์ที่ใช้สคีมาของไฟล์ส่วนบุคคล

    /**
     * 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() ยอมรับ URI โดยใช้ stream wrapper ของ PHP ไม่ใช่เส้นทางจริง

input://เป็นของ PHP เสื้อคลุมสตรีมในขณะที่public://, private://และtemporary://เป็นของ Drupal ห่อกระแสสำหรับการเป็นตัวแทนของsites/default/filesโฟลเดอร์ส่วนตัวและชั่วคราว

หากคุณแน่นอนต้องใช้สไตล์ของภาพที่มีภาพที่พบในโมดูลคุณอาจต้องการตรวจสอบsystem_stream_wrapperโมดูลซึ่งเพิ่มmodule://, theme://, profile://และlibrary://ห่อกระแส

ประกาศ: อาจไม่เกี่ยวข้องกับคำถามปัจจุบัน แต่เนื่องจากมีการพูดถึงในโพสต์อื่น ๆ ฉันจึงต้องการชี้ไปที่โมดูลremote_stream_wrapperซึ่งเพิ่มการรองรับ URL ใด ๆ ที่ใช้ http: //, https: //, หรือ feed: / / . เป็นที่กล่าวถึงแม้ว่าเหล่านี้ห่อกระแสจะอ่านอย่างเดียวและไม่สามารถดำเนินการใด ๆ เขียนแต่ผมเชื่อว่ามันสามารถนำมาใช้กับและฟังก์ชั่นที่เกี่ยวข้องเช่นimage_style_url()theme_image_style()

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.