Drupal 7 Form Token

表单的Token 是为了防欺骗的验证.
Drupal 表单Token的生成是 $form[‘token’] 加上 一个私有的key, 这个key是由以下函数生成

$key = drupal_get_private_key();

Form Token生成函数生成.

$token = drupal_get_token();

Token的验证函数:

drupal_valid_token(token_value, token_id);

// Examples:
  if (isset($form['#token'])) {
    if (!drupal_valid_token($form_state['values']['form_token'], $form['#token'])) {
      // Setting this error will cause the form to fail validation.
      form_set_error('form_token', t('Validation error, please try again. If this error persists, please contact the site administrator.'));
    }
  }

PHP 使用file_get_contents 模拟POST抓取数据

// POST数据.
$data = array(
  'name' => 'xiukun',
  'pass' => 'password123',
);
$data = http_build_query($data);

// 模拟浏览器的header头信息.
$headers = array(
  'Content-type: application/x-www-form-urlencoded',
  'Content-Length: ' . strlen($data),
  'Cookie: PHPSESSID = '. session_id(),
  'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36',
  'Referer: http://www.drupalmodule.cn/index.php',
 );
$opts = array(
  'http'=>array(
    'method'=>'POST',
    'header'=> implode("\r\n", $headers),
    'content' => $data
  )
);

// 创建资源流.
$context = stream_context_create($opts);
$html = file_get_contents('http://www.drupalmodule.cn/push.php', false, $context);
echo ($html);

HTML 5 Video

http://blog.denivip.ru/index.php/2012/06/html5-player-development/?lang=en

获取Video

// 原生方法获取
document.getElementById("player")

// JQuery
var player = $ ('#player')[0];

当前播放时间

// 获取当前播放时间.
var currentTime = player.currentTime;

// 设置当前播放时间.
player.currentTime = 60;

声音控制

// 静音0
player.volume = 0;

player.volume = 1;

事件绑定和移除

// 绑定一个事件.
player.addEventListener('ended', onEndFunc);

// 移出一个事件.
player.removeEventListener('ended', onEndFunc);

var onEndFunc = function() {
}

事件列表

  • onabort – 播放中断事件
  • oncanplay – 可以播放时触发的事件, 视频已加载有足够的部分
  • oncanplaythrough – 可以播放时触发的事件, 内容已经完全缓冲
  • ondurationchange – 内容的时间发生变化事件
  • onemptied – 当断开链接的时候产生的事件
  • onended – 播放结束事件.
  • onerror – 视频文件下载错误事件.
  • onloadeddata – 事件文件下载事件
  • onloadedmetadata – 元数据加载事件(metada).
  • onloadstart – 视频文件开始下载事件
  • onpause – 暂停事件
  • onplay – 开始播放事件
  • onplaying – playback event (to be run until the video stops)
  • onprogress – 视频下载进度事件(将运行直到整个内容下载)
  • onratechange – playback rate change event
  • onreadystatechange – 视频“播放器”准备状态更改事件
  • onseeked – 视频寻求结束事件
  • onseeking – an event raised at content seek
  • onstalled – 浏览器未能获得内容引发的事件
  • onsuspend – 当浏览器停止获取数据事件
  • ontimeupdate – 当播放时间发生变化时事件,能时时监控当前播放的时间
  • onvolumechange – 声音发生变化事件
  • onwaiting – 当播放停止因为下一帧的视频资源不可用触发的事件



	

PHP 时间计算

此代码取自Drupal, 分享给广大PHP爱好者
https://api.drupal.org/api/drupal/includes!common.inc/function/format_interval/7

function format_interval($interval, $granularity = 2) {
  $units = array(
    '@count年' => 31536000,
    '@count月' => 2592000,
    '@count星期' => 604800,
    '@count天' => 86400,
    '@count小时' => 3600,
    '@count分钟' => 60,
    '@count秒' => 1
  );
  $output = '';
  foreach ($units as $key => $value) {
    if ($interval >= $value) {
      $output .= str_replace('@count', floor($interval / $value), $key);
      $interval %= $value;
      $granularity--;
    }

    if ($granularity == 0) {
      break;
    }
  }
  return $output ? $output : '刚刚';
}

// 传入的时候是两个时间的比较结果.
var_dump(format_interval(500));

// 输出
8分钟20秒

当然你还可以这样.
var_dump(format_interval(511100, 4));

// 输出
5天21小时58分钟20秒

Drupal Views Filter

过滤Query(hook_views_query_alter())

过滤字段类型为DatabaseCondition

通常我们可以使用以下来进行条件的重写

foreach ($query->where[1]['conditions'] as $key => &$conditions) {
    if (is_object($conditions['field'])) {
        $conditions = &$conditions['field']->conditions();
        if ($conditions[0]['field'] == 'myfield') {
           $conditions[0]['value'] = 'myvalue';
       }
        continue;
    }
}

给过滤条件加默认的

默认情况下并不能对不存在的字段进行过滤.
方法1

/**
 * Implements hook_views_pre_build().
 * 
 * @param object $view
 * @return object
 */
function mymodule_views_pre_build($view) {
  if ($view->name == 'myview' && $view->current_display == 'page') {
    $view->display['page_2']->handler->handlers['filter']['myfield']->value = 'test';
    return $view;
  }
}

方法2: 使用hook_views_query_alter();
如果不字段名和表名怎么写, 可以先进行一次有值的过滤,然后打印出$condition[‘field’]名来参考

if ($view->name == 'myview' && $view->current_display == 'page') {
  $query->add_field('mytable', 'myfield', 'mytable.myfield');
  $query->add_where(1, 'mytable.myfield', array(8099), 'IN');
}