有關 hook_menu 的 title arguments

hook_menu 中有一個選項是 title arguments
page arguments 大家可能用得比較多
而使用 title arguments 的機會比較少
而 API reference 也沒有有關的例子可以參考
我便約略介紹一下

首先,有關 title 的參數有三個:
title,字符,是未經翻譯的標題,會用於 <title> 內,一般的 theme 也會在 content 用 h1 輸出
title callback,可選參數,預設是 t(),這讓上面的 title 會預設經過翻譯然後輸出,所以上面的 title 不需要使用 t() 包起來
title argument,可選參數,必需是陣列,例如array(1)

假設 hook_menu 定義:

<?php
items
['admin/settings/joe/abc'] = array(
 
'title' => 'Testing page',
);
?>

最後 title 的處理: <?php t('Testing page') ?>

或者:

<?php
items
['admin/settings/joe/abc'] = array(
 
'title' => 'Testing page',
 
'title callback' => 'strtoupper'
);
?>

最後 title 的處理: <?php strtoupper('Testing page') ?>

以上的例子會令 title 避開 t()
所以應該自定義一個 callback:

<?php
items
['admin/settings/joe/abc'] = array(
 
'title' => 'Testing page',
 
'title callback' => 'strtoupper_t'
);

function
strtoupper_t($str) {
  return
t(strtoupper($str));
}
?>

最後 title 的處理: <?php strtoupper_t('Testing page') ?>

最後一個 title arguments 的例子:

<?php
items['admin/settings/joe/%'] = array(
  'title' => 'Testing @string page',
  'title arguments' => array('@string' => 3)
);

最後 title 的處理: <?php t('Testing @string page', array('@string' => arg(3))) ?>
以上的例子中的 title arguments 的 key 是 @string, 因為 title 有一個 t() 接受的 placeholder
所以 title arguments 便可以作為一個變數傳到 t(),替換變數了

建立內容後跳轉到指定 URL

我突然在需要使用的時候發現我竟然沒有寫下:

<?php
/**
 * hook_form_alter()
 */
function hook_form_alter(&$form, &$form_state)
{
 
// callback
 
$form['actions']['submit']['#submit'][] = 'custom_checkin_redirect';
}
/**
 * callback
 */
function custom_checkin_redirect($form, &$form_state)
{
 
$form_state['redirect'] = 'check-in'; // any url works here
}
?>

Rules 沒有我想要的欄位可以 compare

Rules 原生的 node 欄位只有很少的幾個
例如 created, updated 之類的
但我想比較的是 cck 的欄位呀
一個 checkbox 有沒有選到
一個 node reference 是否為空
一個字符欄位有否包含某些字等等

其實只要先加一個 'entity has field' 的 condition
選你想要比較的欄位
再到 data compare 便會出現你需要的欄位了

又或者更直接的方法是加一個 content is type
選擇你需要的 content type, 但如此的話便必需要是單一 content type 了

話說回來,要在 rules 和 hooks 之間選擇才是真正的困難
相關討論: http://www.drupaler.co.uk/blog/rules-versus-hooks-or-abstraction-shock

Programmically add custom role filter to views 3.x

<?php
  $user_view
= views_get_view('user');
  if (!
$user_view || !$user_view->access('block')) {
    return;
  }
 
$user_view->add_item('block', 'filter', 'users_roles', 'rid',
    array(
'value' => array('type' => 'int', 'value' => 6, 'operator' => '=')));
?>

因為懶,deploy features懶,懶得使用 DB API
直接拿現成的 views 自己加

24至25小時前註冊使用者:

<?php
 
//after 24 hours
 
$user_view->add_item('block', 'filter', 'users', 'created',
    array(
'value' => array('type' => 'date', 'value' => date('U', strtotime('-24 hours'))), 'operator' => '<='));
 
//before 25 hours
 
$user_view->add_item('block', 'filter', 'users', 'created',
    array(
'value' => array('type' => 'date', 'value' => date('U', strtotime('-25 hours'))), 'operator' => '>'));

?>

Drupal7.x send HTML email

<?php
function mymodule_mail_alter(&$message) {
 
// if ($message['id'] == 'modulename_messagekey') {

 
if ($message['id'] == 'mymodule_messageKey') {
   
$message['headers']['MIME-Version'] = '1.0';
   
$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
  }
}
?>

費話少講

Pages

Google