Custom Views argument Validator: views_plugin_argument_validate

views_plugin_argument_validate
Views 的 argument 是一個非常好用的 filter,
同一組 views 的顯示,條件但應用不同的內容類型,或者作者,或者建立日期等眾多的應用都可以體現到 arguments 的強大之處
而且還可以為 arguments 驗證,符合某些條件才會通過
例如 node 一定要是某個內容類型之類的

這次的需求是,Views 的 argument 傳入日期,例如 frontpage/20130320 就顯示三月二十日的內容
但這個 Views 只會提供七日前的內容,七日之後這個 Views 便會返回 403,存取權限不足 (單一 Node 的存取不在此限)
所以便寫了以下一個自定義的 argument validator:

<?php
//example.module 先提示 views 這個模組有使用 views 的 api:
function example_views_api() {
  return array(
   
'api' => 3.0,
   
'path' => drupal_get_path('module', 'example') . '/includes',
  );
}
?>

<?php
//includes/example.views.inc
//MODULENAME.views.inc 定義一個客制的 argument validator
function exmaple_views_plugins() {
  return array(
   
'argument validator' => array(
     
'days_limit' => array(
       
'title' => t('7 days limit'),
       
'handler' => 'example_plugin_argument_validate_7_days_limit',
       
'path' => drupal_get_path('module', 'example') . '/includes',
      ),
    ),
  );
}
?>

handler 會自己有一個檔案,需要在 example.info 中定義:

files[] = includes/example_plugin_argument_validate_7_days_limit.inc

真正實現的代碼:

<?php
//example_plugin_argument_validate_7_days_limit.inc
class example_plugin_argument_validate_7_days_limit extends views_plugin_argument_validate {

  function
construct() {
   
parent::construct();
  }

  function
validate_argument($argument) {
    global
$user;

    if (
in_array('administrator', $user->roles)) {
      return
TRUE;
    }

    if(
is_numeric($argument)) {
     
// as the argument is in form of CCYYMMDD, validate it should be no more than 7 days ago
     
$date = strtotime($argument);
     
$days_ago = strtotime("-7 day");
      if(
$days_ago < $date) {
        return
TRUE;
      }
    }
    return
FALSE;
  }
}
?>
AttachmentSize
Image icon views_plugin_argument_validate.png19.16 KB
Google