2011-06-30 33 views
5

我想創建一個動態php日期格式。例如:顯示節點今天發佈的時間,只顯示當天比今天早一些的日/月。我希望這種格式在Drupal中可以像Drupal中的其他預定義日期格式一樣(不僅僅在主題級別)自定義日期格式(使用php邏輯回調)

我找到了hook_date_format_types的(僅限D7)鉤子,但即使那個似乎沒有允許回調,我可以定義這個PHP邏輯。

有誰知道哪個掛鉤會使這成爲可能嗎?或者是一個這樣做的模塊?

+0

如果你是在一個視圖中顯示這個日期作爲一個字段,那麼你可以使用一個視圖的字段模板文件來處理,以獲得所需要的PHP邏輯您 另一方面,如果這不是視圖中的日期字段,並且您剛剛使用創建的節點時間,則可以使用節點模板文件來格式化日期。 我是沒有意識到任何可用於日期格式的回調函數,這是一個有趣的想法,但我可以肯定地看到它的一些應用程序。 –

+0

是的,我知道我可以在模板/預處理級別完成此操作,但它會是很乾淨呃如果你能創建一個真正的全球自定義日期格式... –

回答

1

在Drupal6中,format_date()有硬編碼的日期和時間。另外,format_date()不允許回調,但它確實允許自定義字符串。這就是你可以應用一個技巧的地方:不是在那裏硬編碼字符串,而是調用一個返回字符串的函數。

function mydate_format($timestamp) { 
    $now = time(); 
    if (($now - $timestamp) < (60*60*24)) { 
    return "H:i"; 
    } 
    else { 
    return "d:m:Y"; 
    } 
} 

print format_date($timestamp, 'custom', mydate_format($timestamp)); 

第二個選擇是重新定義的日期 - 時間戳,但是,既hackish的和有限的。日期格式使用variable_get()定義,但不會沿傳遞時間戳;所以基於時間戳值切換格式的例子是不可能的。

的settings.php

$conf['date_format_long'] = $conf['debug'] ? 'r' : 'l, F j, Y - H:i'; 

這從一個值切換到另一個,根據您的settings.php是否具有標誌「調試」設置爲TRUE或沒有。如上所述:由於您無法獲取任何上下文,因此對此的使用受到限制。

第三種方法是使用Date API,它提供了onlinle可配置的時間格式。但是,這既笨拙又不安全(在數據庫中輸入可執行的PHP)。它也取決於一個非常大的模塊集。並且與第一種解決方案具有相同的缺點:不能使用format_date,但必須使用修改後的函數調用,而不是format_date()。查看The Drupal.org date themeing handbook的所有選項。

GOTCHA在所有情況下,Drupal都不會爲緩存內容調用此函數。如果你想讓日期真正動態化,你需要避免全部緩存,或者在客戶端JavaScript中實現日期格式。

TL; DR:您不能在不更改主題級別的某些代碼的情況下擁有動態日期格式。使用回調函數來生成「自定義」dateformat是最簡單的工作解決方案。

0

您可以使用Date API模塊添加自定義日期格式。日期API模塊位於日期模塊內。啓用Date API模塊後,您可以轉到路徑「admin/settings/date-time/formats /添加」以添加您的自定義格式。

「admin/settings/date-time/formats/configure」是配置日期格式的路徑。

看看這些。快樂的編碼。

感謝 RT

+0

我知道日期API模塊,但這不是我要找的。請回顧一下問題:我想添加一個使用一些PHP邏輯回調的格式。不是使用php date()語法的簡單格式。 –

0

你可以去node.tpl.php(可能在網站/所有/主題/ THEME_NAME/node.tpl.php)。在這裏你可以找到$創建的變量,重新設置日期,你可以使用你的自定義函數,並根據需要更改創建的$。之後,所有節點將使用格式化的日期。

Regatds, Chintan。

+0

我意識到這一點,但這仍然不是我要求的。我想創建一個可以在整個drupal中使用的動態php自定義格式。你的解決方案是在模板級別,只在特定的tpl。 –

+0

嘿!你應該修改你的問題,它有點混亂。您要求更改站點範圍節點的日期格式,查看其中令人困惑的粗體部分。 – Chintan

+0

謝謝,我修改了一下。希望現在更清楚。 –

0

使用功能模塊。創建一個功能。

在生成的要素模塊的[feature] .module文件中,創建一個hook_nodeapi函數並使用條件語句格式化該字段,該條件語句考慮當前日期()以顯示日期,併爲其提供日期進入$ node-> content var。

這就是搖滾明星會做(的方式 - ;

+0

我不同意 – stefgosselin