Score:1

Render view inside block with caching

ธง lc

My setup is a bit unconventional. I have a view displaying a block, relying on a contextual filter (let's call it product ID). I also have a custom block that renders this view programmatically because I need to include this block in multiple places on the page and I have some custom logic that pulls the actual product ID to call the view with. Basically:

$view = Views::getView('view_id'); 
$args = ['product_id' => $whatever_product];
return $view->buildRenderable('views_block_id', $args);

The process basically works but, as usual, I'll have problems when there are several such blocks on the page. Views only caches using the block id as a cache tag, so the first rendered view gets cached and displayed in all places. Naturally, switching off the cache would work:

return $view->buildRenderable('views_block_id', $args, FALSE);

but not exactly what I have in mind, I don't want to lose the benefits of caching.

My initial thought was quite simple, let's use custom cache tags in the view, thanks to views_custom_cache_tag. So I did, including the argument from the contextual filter:

views_block:view_id-views_block_id
custom:{{ arguments.product_id }}

But it still doesn't work.

Is there any other way I missed? I can't push new cache tags right before I try to render the view. The usual view hooks don't get called in this case (the second block already gets the cached variant, without even bothering to go near the hooks).

4uk4 avatar
cn flag
*โดยปกติแล้ว การปิดแคชจะทำงานได้* `return $view->buildRenderable('views_block_id', $args, FALSE);` หากใช้งานได้ให้ใช้มัน คุณไม่จำเป็นต้องแคชผลลัพธ์ที่เรนเดอร์ของ View เมื่อคุณอยู่ในบล็อกที่แคชด้วยตัวมันเอง
lc flag
ถ้าฉันมีบล็อกเดียวกันสองครั้งบนหน้าเว็บซึ่งบังเอิญอ้างถึงผลิตภัณฑ์อื่น ฉันคงไม่พอใจมากหากบล็อกนั้นแคชด้วยตัวใดตัวหนึ่ง :-) ลองคิดดู ถ้าบล็อกแคชตัวเองด้วยรหัสอินสแตนซ์ที่เพิ่มเข้ามาเอง ไม่ใช่แค่รหัสทั่วไป...
lc flag
ตกลง ขอบคุณ หากคุณคัดลอกคำตอบเดียวกัน เรายินดีที่จะยอมรับ
Score:2
ธง cn

ในบล็อก คุณสามารถปิดการแคชของ View ที่แสดงผลได้ ViewExecutable::buildRenderable:

$view->buildRenderable('views_block_id', $args, FALSE)

เนื่องจากผลลัพธ์ที่เรนเดอร์ของแต่ละอินสแตนซ์ของบล็อกถูกแคชไว้แล้ว

อย่างไรก็ตาม แท็กแคชจะไม่เกี่ยวข้องเมื่อแคชตัวแปรขององค์ประกอบเดียวกันสิ่งนี้ถูกควบคุมโดยคีย์แคชและบริบทเท่านั้น ด้วย cache=FALSE คุณปิดใช้งานแคชคีย์ แต่ไม่ใช่บริบท ซึ่งควรยังคงขยายไปถึงระดับบล็อก หากไม่มีบริบท คุณสามารถตั้งค่าบริบทแคชได้ด้วยตนเอง เช่น สำหรับเส้นทางหรือเส้นทางการสอบถามเส้นทาง URL หากรหัสผลิตภัณฑ์ขึ้นอยู่กับบริบทนั้น

แก้ไข: ฉันได้ลบคำสั่ง return เนื่องจากอาจจำเป็นต้องสร้างอาร์เรย์เรนเดอร์จริงด้วย View ที่ฝังไว้

lc flag
ในกรณีเฉพาะนี้ มันทำงานได้ดีกับการส่งคืน นี่เป็นบรรทัดสุดท้ายของฟังก์ชัน `build()` แล้ว ขอบคุณ.
steve avatar
in flag
ฉันมีสิ่งที่ฉัน _think_ เป็นการตั้งค่าที่คล้ายกัน ยกเว้นว่าฉันควรเพิ่มว่าบล็อกเดียวที่กำหนดเองของฉันอาจแสดงหนึ่งบล็อกมุมมอง _หรือมากกว่านั้น มุมมองถูกอ้างอิงจากวิวฟิลด์หลายค่าบนโหนด และในบางกรณี มุมมองเดียวกันจะถูกอ้างอิงด้วยการแสดงผลและอาร์กิวเมนต์ที่แตกต่างกัน ในกรณีเหล่านี้ซึ่งมีการอ้างอิงมุมมองเดียวกันมากกว่าหนึ่งครั้ง จะใช้เฉพาะการแสดงผลแรกสำหรับการแสดงผลทั้งหมด และการเพิ่มอาร์กิวเมนต์ 'FALSE' ในเมธอด 'buildRenderable' ไม่สามารถแก้ปัญหานี้ได้

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา