Điểm:0

How can I debug a Twig error that occurs after migrating from Drupal 8.9 to Drupal 9+

lá cờ cn

I am trying migrate my Drupal 8.9 site to Drupal 9+ and I am stuck with an error its cause I am not able to hunt down. On almost every page I get the following PHP exception:

Twig\Error\RuntimeError: The "replace" filter expects an array or 

"Traversable" as replace values, got "string" in "__string_template__faabd18c7a37a1e54d0ef10115b24022e72bc201187fff502de48bf58589321f" at line 2. in twig_replace_filter() (line 554 of /var/customers/webs/freigeist/www9/vendor/twig/twig/src/Extension/CoreExtension.php).

__TwigTemplate_75ee113db094d36d71f294529e9d7055b2065bf116719e9a04b7e4795be3121d->doDisplay() (Line: 405)
Twig\Template->displayWithErrorHandling() (Line: 378)
Twig\Template->display() (Line: 390)
Twig\Template->render() (Line: 45)
Twig\TemplateWrapper->render() (Line: 235)
Drupal\Core\Template\TwigEnvironment->renderInline() (Line: 52)
Drupal\Core\Render\Element\InlineTemplate::preRenderInlineTemplate()
call_user_func_array() (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 786)
Drupal\Core\Render\Renderer->doCallback() (Line: 377)
Drupal\Core\Render\Renderer->doRender() (Line: 201)
Drupal\Core\Render\Renderer->render() (Line: 157)
Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}() (Line: 578)
Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 158)
Drupal\Core\Render\Renderer->renderPlain() (Line: 419)
Drupal\views\Plugin\views\PluginBase->viewsTokenReplace() (Line: 1356)
Drupal\views\Plugin\views\field\FieldPluginBase->renderAltered() (Line: 1249)
Drupal\views\Plugin\views\field\FieldPluginBase->renderText() (Line: 1177)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender() (Line: 238)
template_preprocess_views_view_field() (Line: 287)
Drupal\Core\Theme\ThemeManager->render() (Line: 436)
Drupal\Core\Render\Renderer->doRender() (Line: 201)
Drupal\Core\Render\Renderer->render() (Line: 1745)
Drupal\views\Plugin\views\field\FieldPluginBase->theme() (Line: 778)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow()
call_user_func_array() (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 786)
Drupal\Core\Render\Renderer->doCallback() (Line: 377)
Drupal\Core\Render\Renderer->doRender() (Line: 201)
Drupal\Core\Render\Renderer->render() (Line: 717)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields() (Line: 584)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping() (Line: 475)
Drupal\views\Plugin\views\style\StylePluginBase->render() (Line: 2170)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1533)
Drupal\views\ViewExecutable->render() (Line: 183)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1630)
Drupal\views\ViewExecutable->executeDisplay() (Line: 81)
Drupal\views\Element\View::preRenderViewElement()
call_user_func_array() (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 786)
Drupal\Core\Render\Renderer->doCallback() (Line: 377)
Drupal\Core\Render\Renderer->doRender() (Line: 201)
Drupal\Core\Render\Renderer->render() (Line: 241)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 578)
Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare() (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse() (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray()
call_user_func() (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch() (Line: 163)
Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 80)
Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 57)
Drupal\Core\StackMiddleware\Session->handle() (Line: 47)
Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch() (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup() (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 47)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 52)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 23)
Stack\StackedHttpKernel->handle() (Line: 717)
Drupal\Core\DrupalKernel->handle() (Line: 19)

I found out that the error might be theme related (I am on Bootstrap). And on some pages I could narrow it down to the system block 'site_branding': Disabling this block makes the error disappear on some pages, but not on all.

My first guess was, that this might be an twig compatibility issue (may be in my bootstrap sub-theme), but it occurs also when I use other themes. So I am completely lost here.

How could I debug this error? Does the error message show, which component could be the cause of the error? Can anybody point out, which change between Drupal 8 and 9 could be responsible of the error?

4uk4 avatar
lá cờ cn
Câu hỏi là gì? Điều gì không rõ ràng về thông báo lỗi? BTW tên mẫu trông không giống mẫu Twig thực, giống mẫu nội tuyến trong PHP hơn. Bạn có thể thử tìm nó trong một thông báo lỗi đầy đủ với dấu vết ngăn xếp.
lá cờ cn
@4k4 Bạn nói đúng đấy, mình hỏi chưa rõ ràng, chắc hôm qua muộn quá. Tôi đã cố gắng để làm cho câu hỏi của tôi rõ ràng hơn bây giờ. Tôi có nên sử dụng mô-đun devel để theo dõi ngăn xếp không.
4uk4 avatar
lá cờ cn
Bạn có thể kích hoạt thông báo lỗi đầy đủ trong lõi Drupal: /admin/config/Development/logging
Điểm:4
lá cờ cn

Đây là dòng cuối cùng trong dấu vết ngăn xếp trước khi đường dẫn kết xuất đưa ra lỗi:

Drupal\views\Plugin\views\PluginBase->viewsTokenReplace() (Dòng: 1356)

Điều này có thể được gây ra bởi một |thay thế bộ lọc viết lại trường Chế độ xem trong Chế độ xem mà bạn đang cố gắng hiển thị dưới dạng nội dung chính của trang.

Xem cảnh báo không dùng nữa trong Drupal 8.9 (Twig 1.x):

function twig_replace_filter($str, $from, $to = null) {
  if (\is_string($from) && \is_string($to)) {
    @trigger_error('Việc sử dụng "thay thế" bằng ký tự thay thế ký tự không được dùng nữa kể từ phiên bản 1.22 và sẽ bị xóa trong Twig 2.0', E_USER_DEPRECATED);
  

https://api.drupal.org/api/drupal/vendor%21twig%21twig%21src%21Extension%21CoreExtension.php/feft/twig_replace_filter/8.9.x

Drupal 9 đã nâng cấp lên Twig 2.x

https://api.drupal.org/api/drupal/vendor%21twig%21twig%21src%21Extension%21CoreExtension.php/feft/twig_replace_filter/9.2.x

lá cờ cn
Tuyệt vời, điều đó đã giúp ích rất nhiều. Đó là một vụ hack bẩn thỉu, trong Chế độ xem chính mà tôi đã quên mất. Tuy nhiên, làm thế nào bạn suy luận được rằng ´Drupal\views\Plugin\views\PluginBase->viewsTokenReplace() (Dòng: 1356)´ là dòng cuối cùng trước lỗi?
4uk4 avatar
lá cờ cn
Các dòng trên là các phương thức hiển thị chỉ chạy vì dòng 419 của lớp cơ sở plugin Chế độ xem này đang bắt đầu quá trình hiển thị cung cấp dữ liệu sẽ được hiển thị. Vì vậy, rất có thể dữ liệu này đang gây ra sự cố, trừ khi một mẫu bị lỗi có liên quan đến việc hiển thị dữ liệu. Nhưng sau đó, thông báo lỗi đã chứa tên mẫu, điều này sẽ giúp việc gỡ lỗi dễ dàng hơn nhiều.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.