2010-08-24 54 views
2

該任務相對簡單:如何根據Drupal中的Cookie提供不同的緩存版本的頁面?

Drupal網站顯示帶縮略圖的文章列表。有些訪問者希望通過單擊按鈕/鏈接來查看圖片,並保存該首選項。

例如http://patterntap.com/collections/index/

alt text

的問題是所有遊客都是匿名的,並給予一定的交通,啓用頁面緩存。

我的想法是使用一些簡單的JavaScript來設置cookie,刷新頁面並根據cookie值(或其存在/不存在)顯示或隱藏圖像。

除了Drupal早期提供緩存頁面和修改緩存版本的唯一快捷方式,我可以通過黑客手段包括/ bootstrap.inc並將自定義類添加到主體類,然後使用css隱藏圖像。

我知道一個非常錯誤的方法。但我想知道是否有一種方法可以保存不同版本的頁面並提供正確的版本?

編輯:

  • 需要保持相同的URI
  • 的JS來顯示/隱藏圖像,而無需重新加載,並設置Cookie已經到位
  • hook_boot()是不是真的被稱爲緩存的網頁,所以不能通過自定義模塊來做
  • .htaccess mods?

編輯/解決方案: 最後與Rimian的建議一起去了。但是可以使用我們自己的cache.inc實現完成任務,如Mobile Tools模塊中所示。具體來說,通過擴展cache.inc並更新settings.php以包含

$conf['page_cache_fastpath'] = FALSE; 
$conf['cache_inc'] = 'path/to/my/module/my_module_cache.inc'; 
+0

我想不出有什麼辦法可以在Drupal中解決這個問題,短缺黑客bootstrap.inc。你有沒有考慮過把它作爲Drupal核心開發者的建議? – anschauung 2010-08-25 01:24:32

+0

*嘆息* 沒有考慮,但可能是一個很好的呼籲,建議它的核心開發者。 我剛剛意識到,這可能是通過結合[jeffreymb](http://stackoverflow.com/users/107768/jeffreymb)的建議,使用GET變量和基於cookie的.htaccess重寫。 理論上,GET變量可以是透明的。 **滾動袖子** – zerolab 2010-08-25 22:30:47

+0

自定義cache.inc實現在6.x網站上運行良好。大多數情況下,我的cache.inc是標準核心,但我添加了page_cache_fastpath()函數。它的任務是在數據庫加載之前檢測客戶端狀態,然後爲所有相關緩存表設置自定義db_prefix。我以前在我的.install文件中創建了這些表。通過這種方式,核心的所有標準數據庫和緩存功能都可以在不同的表格上完美工作。所以你根據你的標準有效地獲得多個緩存。 – 2014-04-18 15:06:46

回答

1

所以,讓我來解決這個問題。如果用戶選擇要隱藏緩存頁面上的一些圖像?

爲什麼不寫一些jQuery或JavaScript並將其加載到緩存頁面中,並與文檔的所有其餘部分一起使用?

然後,客戶端/瀏覽器會決定運行腳本並隱藏圖像,具體取決於您傳遞給該頁面的請求或Cookie中的某些參數?該腳本獲得緩存,只有在您調用腳本時纔會運行。

如果你是爲了這樣的事情而剽竊bootstrap,你真的需要重新思考你在做什麼。瘋! :)

而且看看cache_get和cache_set:

http://api.drupal.org/api/drupal/includes--cache.inc/6

+0

我已經在使用一些JavaScript來注入執行這項工作的兩個選項(隱藏圖像和設置cookie)。 但是,該任務是在相同的URL下提供頁面。 這個hack-the-boostrap-crazy-solution是在http://thebrowser.com上直播的,但是我很不習慣保持它那樣長,因此問題:) – zerolab 2010-08-25 22:15:20

1

我不知道我100%的明白你正在嘗試做的,但這裏有我的想法。你的根本問題之一是你試圖在同一個uri上訪問基本上不同的內容。

如果這確實是你想要做的,那麼Rimian提出的檢查chache_get和chache_set的建議可能是值得的。

就我個人而言,通過不同的URI可以訪問「帶縮略圖」和「不帶縮略圖」。根據你想要完成的事情,一個GET變量我可以成爲更好的方法。使用這兩個選項中的任何一個,您都可以在主題圖層隱藏或顯示縮略圖。具有不同路徑或獲取變量的頁面將分開緩存。

如果您希望訪問者無需重新加載頁面即可切換視圖,那麼jQuery和Cookie可能會滿足您的需求。這不需要重新加載頁面,來回切換將非常簡單。

+0

我可能不得不說服我的老闆說不同的uri是唯一的解決方案(即使任務是將它保存在一個乾淨的網址下)。 沒有重新加載的部分已經到位,與js和cookie。 從我所瞭解的bootstrap.inc中可以看出,即使在運行'hook_boot()'或'hook_init()'之前準備好緩存頁面的cookie,我也無法真正做很多事情,因此如果相同即使用戶以前沒有使用縮略圖選項,用戶仍會以縮略圖的方式返回到uri,但他們仍然會獲得前一頁的緩存版本 – zerolab 2010-08-25 22:22:26

相關問題