Lỗi khi tạo bộ lọc Twig tùy chỉnh


7

Tôi đang cố gắng tạo bộ lọc Twig tùy chỉnh trong Drupal 8. Mục tiêu là sử dụng bộ lọc tùy chỉnh của tôi trong một mẫu như vậy:

{{ a_variable|myfilter }}

Tôi đã tạo một mô-đun tùy chỉnh với 3 tệp:

MODULE.info.yml
MODULE.services.yml
src/TwigExtension/MyExtension.php

Các MODULE.info.ymltập tin chứa các giá trị thông thường.

Các MODULE.services.ymltập tin có chứa:

services:
  MODULE.twig_extension:
#   arguments: ['@renderer']  #  <-- Initial code (USELESS)
    class: Drupal\MODULE\TwigExtension\MyExtension
    tags:
      - { name: twig.extension }

Các src/TwigExtension/MyExtension.phptập tin có chứa:

namespace Drupal\MODULE\TwigExtension;

// use Drupal\Core\Template\TwigExtension;  // <-- Initial code (WRONG)

class MyExtension extends \Twig_Extension {    
// class MyExtension extends TwigExtension {  // <-- Initial code (WRONG)

  /**
   * Generates a list of all Twig filters that this extension defines.
   */
  public function getFilters() {
    return [
      new \Twig_SimpleFilter('myfilter', array($this, 'myFilter')),
    ];
  }

  /**
   * Gets a unique identifier for this Twig extension.
   */
  public function getName() {
    return 'MODULE.twig_extension';
  }

  /**
   * Replaces all instances of "animal" in a string with "plant".
   */
  public static function myFilter($string) {
    return str_replace(array('animal'), array('plant'), $string);
  }

}

Mã ban đầu của tôi gặp lỗi sau: "Gọi hàm thành viên createdFromRoute () trên một đối tượng không trong /core/lib/Drupal/Core/Template/TwigExtension.php trên dòng 224".

Nhưng bây giờ tôi đã sửa mã theo câu trả lời của lauriii và nó hoạt động hoàn hảo!


1
Hừm, tôi đã kiểm tra việc thực hiện của tôi và tất cả có vẻ ổn. Có phải bạn đang sử dụng lỗi đến từ phần mở rộng của bạn? Có lẽ bạn đang gọi chức năng xấu trong twig ở đâu đó? Cố gắng chuyển sang một số chủ đề cốt lõi và gọi chức năng của bạn n ở đó.

Đó là một lỗi tinh tế, thay thế TwigExtensionbằng \Twig_Extension. ;-)
AngularChef

1
leopathu.in/content/create-custom-twig-filter-drupal-8 Bài viết này giải thích tốt về bộ lọc twig tùy chỉnh với ví dụ và bạn cũng có thể tải xuống mã mẫu từ trang.
Leopathu

Câu trả lời:


8

Vấn đề trong đoạn mã trên là lớp mở rộng Twig của bạn đang mở rộng lớp mở rộng Drupal Twig nội bộ. Điều đó phá vỡ các tiện ích mở rộng Twig được thêm bởi lõi Drupal và đó là lý do tại sao bạn gặp lỗi.

Để khắc phục điều này, bạn nên làm cho các tiện ích mở rộng Twig của mình mở rộng lớp mở rộng Twig nội bộ Twigs. Lớp của bạn nên được định nghĩa như thế này:

class MyExtension extends \Twig_Extension {

Sau khi thực hiện thay đổi đó, bạn cũng có thể xóa các đối số được đặt cho lớp đó khỏi MODULE.services.yml


Tuyệt vời, nó hoạt động! Cảm ơn bạn rất nhiều, lauriii. Tôi sẽ cập nhật mã gốc của tôi để phản ánh câu trả lời của bạn.
AngularChef

Lạ thật ... Mã ban đầu của tôi được mô hình hóa sau khi tìm thấy trong twig_extension_testmô-đun lõi.
AngularChef

Có một bản vá đang chờ xử lý để sửa lỗi twig_extension_test. Các mô-đun kiểm tra không phải luôn luôn là ví dụ tốt nhất không may.
Cottser

0

mẫu ở trên vẫn bị tắt .. (nghĩa là: mệnh đề 'đối số' trong .service dường như là cần thiết)

hãy xem / core / module / system / tests / module / twig_extension_test để mô hình bộ lọc twig và chức năng từ!


theo dõi: vì bất kỳ lý do gì ... twig_extension_test dường như chỉ hoạt động khi được xem trong đường dẫn / quản trị viên ...
skaught

0

có vẻ như chúng ta cần sử dụng lớp \ Twig_Extension trực tiếp hơn.

MODULE.service.yml services: MODULE.twig.filters: arguments: ['@renderer'] class: Drupal\MODULE\TwigExtension\HexToRgb tags: - { name: twig.extension }

/src/TwigExtension/HexToRgb.php

/**
 * @file
 * Contains Drupal\MODULE\TwigExtension.
 */

namespace Drupal\MODULE\TwigExtension;


/**
 * A Twig extension (filter) converts hex color to rgb.
 */
class HexToRgb extends \Twig_Extension {

  /**
   * Generates a list of all Twig filters that this extension defines.
   */
  public function getFilters() {
    return array(
      new \Twig_SimpleFilter('hexToRGB', [$this, 'hexToRGB'], ['is_safe' => ['html']]),
      new \Twig_SimpleFilter('rangeToPercent', [$this, 'rangeToPercent'], ['is_safe' => ['html']]),
    );
  }

  /**
   * Gets a unique identifier for this Twig extension.
   */
  public function getName() {
    return 'MODULE.twig.filters';
  }

  /**
   * convert 3 or 6 char hex color to comma seperated RGB colors
   */
  public static function hexToRgb($hex=000000) {
    $r = $g = $b = FALSE;
    $hex = str_replace("#", "", $hex);

    if(strlen($hex) == 3) {
      $r = hexdec(substr($hex, 0, 1).substr($hex, 0, 1));
      $g = hexdec(substr($hex, 1, 1).substr($hex, 1, 1));
      $b = hexdec(substr($hex, 2, 1).substr($hex, 2, 1));
    } else {
      $r = hexdec(substr($hex, 0, 2));
      $g = hexdec(substr($hex, 2, 2));
      $b = hexdec(substr($hex, 4, 2));
    }

    $rgb = array($r, $g, $b);

    return implode(",", $rgb);
  }

  /**
   * convert range (0 to 100) to a percent with 2 decimals
   */
  public static function rangeToPercent($range=0) {
    return round(($range/100), 2);
  }


}


arguments: ['@renderer']là không cần thiết vì \Twig_Extensionlớp không có hàm tạo.
Tim

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.