GIT 移动分支到指定哈希值

此命令经常用于代码回滚,有了它你就可以回到过去

  1. $git reset –hard 哈希值
发表在 Git | 留下评论

Drupal Views exposed select list use chosen module

  1.  
  2. Drupal.behaviors.yourglobal = {
  3.    attach: function(context, settings) {
  4.       var div_id = '#myfield';
  5.       if(typeof settings.chosen !== 'undefined' && $(div_id, context).length > 0) {
  6.               settings.chosen = settings.chosen || Drupal.settings.chosen;
  7.  
  8.               // Prepare selector and add unwantend selectors.
  9.               var selector = settings.chosen.selector;
  10.  
  11.               // Function to prepare all the options together for the chosen() call.
  12.               var getElementOptions = function (element) {
  13.                 var options = $.extend({}, settings.chosen.options);
  14.  
  15.                 // The width default option is considered the minimum width, so this
  16.                 // must be evaluated for every option.
  17.                 if ($(element).width() < settings.chosen.minimum_width) {
  18.                   options.width = settings.chosen.minimum_width + 'px';
  19.                 }
  20.                 else {
  21.                   options.width = $(element).width() + 'px';
  22.                 }
  23.  
  24.                 // Some field widgets have cardinality, so we must respect that.
  25.                 // @see chosen_pre_render_select()
  26.                 if ($(element).attr('multiple') && $(element).data('cardinality')) {
  27.                   options.max_selected_options = $(element).data('cardinality');
  28.                 }
  29.  
  30.                 return options;
  31.               };
  32.               $(div_id, context).once('chosen', function() {
  33.                 options = getElementOptions(this);
  34.                 $(this).chosen(options);
  35.               });
  36.        }
  37.    },
  38. };
发表在 Drupal | 留下评论

Python 闭包

#!/usr/bin/python
#encode=utf-8

def addx(x):
    def addy(y):
        return x + y

    #返回一个可执行的函数.
    return addy

x = addx(8)

print x(10)
发表在 python | 留下评论

Drupal 7 behaviors

behavior主要用于Drupal Ajax前后可以调用. behavior 以 Drupal.behaviors.helloWorld的方式附加上去,helloWorld为一个函数,当页面加载完成以后Drupal会遍历每一个附件上去的函数. 并且会context和settings,context为当前的上下文。settings是Drupal.settings

在Drupal 7中通常的写法为:

  1. Drupal.behaviors.hehe = {
  2.   attach: function(context, settings) {
  3.     // Ajax后或页面加载完成执行.
  4.   },
  5.   detach: function(){context} {
  6.     // Ajax前执行.
  7.   }
  8. };

https://www.drupal.org/update/modules/6/7#drupal_behaviors

发表在 Drupal | 留下评论

Drupal 用户实现单一登陆

单一登陆什么意思呢?也就是一个账号同时只能在一个地方登陆. 实现方式是当用户登陆成功以后删除当前账号在其它的地方的登陆session

  1. /**
  2.  * Implements hook_user_login().
  3.  *
  4.  * User logged in callback.
  5.  */
  6. function mymodule_user_login(&$edit, $account) {
  7.   // 用户单一登陆实现.
  8.   db_query('DELETE FROM `sessions` WHERE uid=:uid AND sid!=:sid', array(
  9.     ':uid' => $account->uid,
  10.     ':sid' => session_name()
  11.   ));
  12. }
发表在 Drupal | 留下评论

Drupal 用户登陆

看之前请先看 Cookie与Session的工作原理

当运行session_start()时,会创建一个PHPSISSID的Cookie, 而且这个id也是随机生成
但是drupal中的这里有点不大一样. 这个id生成是由drupal_random_key()函数生成. 参考:

  1. session_id(drupal_random_key());

当用户正常登陆以后会根据用户的uid创建一个session. 请检查sessions表
屏幕快照 2015-01-09 16.21.02

当用户第二次打开网站的时候会去检查这个cookie是否存在,如果存在验证这个cookie然后初始化当用户. 如果不存在则重新登陆.
参考函数:
drupal_session_initialize()

Drupal中允许一个用户在多个地方登陆,如果想只能一个地方登陆可以这样:

  1. /**
  2.  * Implements hook_user_login().
  3.  *
  4.  * User logged in callback.
  5.  */
  6. function mymodule_user_login(&$edit, $account) {
  7.   // 用户单一登陆实现.
  8.   db_query('DELETE FROM `sessions` WHERE uid=:uid AND sid!=:sid', array(
  9.     ':uid' => $account->uid,
  10.     ':sid' => session_name()
  11.   ));
  12. }

在Drupal中如果中途改变了全局变量$user, 登陆用户将会切换 Why?

  1. global $user;
  2. $user = user_load(1);

drupal_page_footet()是默认html驱动器(drupal_deliver_html_page)最好执行的函数

global $user;
module_invoke_all('exit');
// Commit the user session, if needed.
drupal_session_commit();

在这个函数将会依次执行drupal_session_commit -> session_write_close -> _drupal_session_write
在_drupal_session_write中更新Session信息

  1.       db_merge('sessions')
  2.         ->key($key)
  3.         ->fields($fields)
  4.         ->execute();
  5.     }
发表在 Drupal | 2条评论

大巧若拙,大辩若讷

最有智慧的人,真正有本事的人,虽然有才华学识,但平时像个呆子,不自作聪明;虽然能言善辩,但好像不会讲话一样。无论是初涉世事还是位居高官,无论是做大事还是一般人际关系,锋芒不可毕露。有了才华固然很好,但在合适的时机运用才华而不被或少被人忌,避免功高盖主,才算是更大的才华,这种才华对社会、对人对己才有真正的用处。

发表在 ubuntu | 留下评论

Drupal Fatal error: Class name must be a valid object or a string in includes/common.inc on line 7680

如果出现Entity这种错误算是比较严重的了。这里只说如何调试
view

  1. /**
  2.  * Get the entity controller class for an entity type.
  3.  */
  4. function entity_get_controller($entity_type) {
  5.   $controllers = &drupal_static(__FUNCTION__, array());
  6.   if (!isset($controllers[$entity_type])) {
  7.     $type_info = entity_get_info($entity_type);
  8.     $class = $type_info['controller class'];
  9.     $controllers[$entity_type] = new $class($entity_type);
  10.   }
  11.   return $controllers[$entity_type];
  12. }

TRY

  1. $class = isset($type_info['controller class']) ? $type_info['controller class'] : 'DrupalDefaultEntityController';

TO

  1. /**
  2.  * Get the entity controller class for an entity type.
  3.  */
  4. function entity_get_controller($entity_type) {
  5.   $controllers = &drupal_static(__FUNCTION__, array());
  6.   if (!isset($controllers[$entity_type])) {
  7.     $type_info = entity_get_info($entity_type);
  8.     $class = $type_info['controller class'];
  9.  
  10.     // 增加一个debug调试,看看问题从哪里来.
  11.     if(gettype($class) == 'string' || gettype($class) == 'object') {
  12.       $controllers[$entity_type] = new $class($entity_type);
  13.     } else  {
  14.       print_r(debug_backtrace());
  15.     }
  16.     $controllers[$entity_type] = new $class($entity_type);
  17.   }
  18.   return $controllers[$entity_type];
  19. }
发表在 Drupal | 留下评论

PHP文件大小格式化与反格式化

此代码来自drupal

  1.  
  2. define('DRUPAL_KILOBYTE', 1024);
  3.  
  4. /**
  5.  * Parses a given byte count.
  6.  *
  7.  * @param $size
  8.  *   A size expressed as a number of bytes with optional SI or IEC binary unit
  9.  *   prefix (e.g. 2, 3K, 5MB, 10G, 6GiB, 8 bytes, 9mbytes).
  10.  *
  11.  * @return
  12.  *   An integer representation of the size in bytes.
  13.  */
  14. function parse_size($size) {
  15.   $unit = preg_replace('/[^bkmgtpezy]/i', '', $size); // Remove the non-unit characters from the size.
  16.   $size = preg_replace('/[^0-9\.]/', '', $size); // Remove the non-numeric characters from the size.
  17.   if ($unit) {
  18.     // Find the position of the unit in the ordered string which is the power of magnitude to multiply a kilobyte by.
  19.     return round($size * pow(DRUPAL_KILOBYTE, stripos('bkmgtpezy', $unit[0])));
  20.   }
  21.   else {
  22.     return round($size);
  23.   }
  24. }
  25.  
  26. /**
  27.  * Generates a string representation for the given byte count.
  28.  *
  29.  * @param $size
  30.  *   A size in bytes.
  31.  * @param $langcode
  32.  *   Optional language code to translate to a language other than what is used
  33.  *   to display the page.
  34.  *
  35.  * @return
  36.  *   A translated string representation of the size.
  37.  */
  38. function format_size($size) {
  39.   if ($size < DRUPAL_KILOBYTE) {
  40.     return str_replace('@count bytes', '@count', $size);
  41.   }
  42.   else {
  43.     $size = $size / DRUPAL_KILOBYTE; // Convert bytes to kilobytes.
  44.     $units = array(
  45.       '@size KB',
  46.       '@size MB',
  47.       '@size GB',
  48.       '@size TB',
  49.       '@size PB',
  50.       '@size EB',
  51.       '@size ZB',
  52.       '@size YB',
  53.     );
  54.     foreach ($units as $unit) {
  55.       if (round($size, 2) >= DRUPAL_KILOBYTE) {
  56.         $size = $size / DRUPAL_KILOBYTE;
  57.       }
  58.       else {
  59.         break;
  60.       }
  61.     }
  62.     return str_replace('@size', round($size, 2), $unit);
  63.   }
  64. }
  65.  
  66. var_dump(format_size(2003330));
  67.  
  68. 输入: 1.91KB
发表在 Drupal, PHP | 留下评论

PHP filter 验证

以前要验证邮箱,ip, url等常用验证通常都是写了一个正则表达式,今天看到在drupal的includes/common.inc中有这么一个函数filter_var一查竟然是php函数,我以前竟然不知道。而且是从php5.2就开始提供了, 用法如此简单.

验证ip:

  1. // ipv4, 最后的参数可以不用。默认就是ipv4.
  2. filter_var('192.168.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
  3.  
  4. // ipv6.
  5. filter_var('fe80::6e40:8ff:fe99:dee2', FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
  6.  
  7. // ipv4 或 ipv6. 只要是后面参数有多个都可以用这种表达方式.
  8. filter_var('192.168.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6);

验证邮箱

  1. filter_var('zhouitpro@gmail.com', FILTER_VALIDATE_EMAIL);

URL

  1. filter_var('http://www.baidu.com', FILTER_VALIDATE_URL);

常用的就以上几个,当然还有mac验证,浮点数和正正常难证等.
参考:http://php.net/manual/zh/function.filter-var.php
参数参考: http://php.net/manual/zh/filter.filters.validate.php

数组批量验证:

  1. $data = array(
  2.   'id' => 10085,
  3.   'url' => 'http://www.baidu.com',
  4.   'myip' => '192.168.0.22',
  5.   'myfl' => 0.23
  6. );
  7. $filter = array(
  8.   'id' => FILTER_VALIDATE_INT,
  9.   'url' => FILTER_VALIDATE_URL,
  10.   'myip' => FILTER_VALIDATE_IP | FILTER_FLAG_IPV6,
  11.   'myfl' => FILTER_VALIDATE_FLOAT
  12. );
  13. $result = filter_var_array($data, $filter);
  14.  
  15.  
  16. // 验证邮箱地址:
  17. $emails = array(
  18.   'zhouitpro@gmail.com',
  19.   '244705779@qq.com',
  20.   'helloworld',
  21. );
  22.  
  23. $filters = filter_var_array($emails, FILTER_VALIDATE_EMAIL);
  24. if(in_array(false, $filters)) {
  25.   var_dump('Email格式不正确');
  26. }
  27.  
  28. // 验证get参数
  29. $filter = array(
  30.   'id' => FILTER_VALIDATE_INT,
  31.   'callback' => FILTER_VALIDATE_URL
  32. );
  33. $filter = filter_var_array($_GET, $filter);
  34. if(in_array(null, $filter) OR in_array(false, $filter)) {
  35.   echo '参数不正确';
  36.   exit();
  37. }

更多请参考:http://php.net/manual/zh/function.filter-var-array.php

验证$_GET, $_POST, $_SERVER, $_SESSION, $_EVT, $_COOKIE数据格式

  1. /**
  2.  * $_GET => INPUT_GET
  3.  * $_POST = > INPUT_POST
  4.  * $_SERVER = INPUT_SERVER
  5.  * $_EVT = INPUT_EVT
  6.  * $_COOKE = INPUT_COOKIE
  7.  * $_SESSION = INPUT_SESSION
  8.  */
  9. var_dump(filter_input(INPUT_GET, 'test', FILTER_VALIDATE_IP));
  10.  
  11. // 以前写法.
  12. $get = isset($_GET['test']) ? $_GET['test'] : null;
  13.  
  14. // 现在可以这样写. 如果test不存在返回null.并不会报错.
  15. $get = filter_input(INPUT_GET, 'test');

参考:http://php.net/manual/zh/function.filter-input.php

发表在 PHP | 留下评论