Drupal 7 开发内部培训资料, 分头诗人

drupal写一个block的过程

1.

hook_block_info(){

 $blocks['xxxx']=array(

    'info' => t('xxxx'),

    'cache' => DRUPAL_CACHE_GLOBAL,

  )

return $blocks;

}

 

2.

function xxxx_block_view($delta = '') {
  
  switch ($delta) {
    case 'xxxx':
      
      $block['subject'] = NULL;
     
      $block['content'] = xxxx_contents($delta);
      break;
  }
  return $block;
}

 

3.

function xxxx_contents($delta = '') {
  
  switch ($delta) {
    case 'xxxx':
    
      $add_xxxx_link = array(
        '#theme' => 'link',
        '#text' => t('xxxx'),
        '#path' => 'node/add/xxxx',
        '#options' => array(
          'attributes' => array(),
          'html' => FALSE,
         ),
      );
      return $add_xxxx_link;
  }
}

Drupal 8 -- 改变将会很大

根据官方说法,Drupal 8将会在2013年9月左右出release版本,“我们期望Drupal 8给我们带来什么?” 这个是最近比较热门的问题。Drupal 8 release版本将会跟dev版本有很大不同,这是肯定的,而对于drupaler来说,期待Drupal 8一些重要的更改,包括它的架构和用户体验等。

你可以查看Drupal的所有改变,在Change Records for Drupal Core page里面,我将列出几个最大的改变。

每一个版本的Drupal都改变很大。

1、核心:Drupal 8 Symfony框架

最大的改变是,Drupal 8将会把Symfony 2 应用于核心里面。Symfony 2前面有说过,它是一个企业级的php 框架,它的强大是很多php框架望尘莫及的。

Symfony 2的加入,会带来什么样的改变?

  1. 第一个是symfony庞大的函数库,让Drupal 开发者花在写基础函数的时间大大的减少,开发者可以更多时间处理其他问题;
  2. 第二个是symfony的功能非常丰富,面向对象,MVC的模型架构。而这些,正是Drupal一直以来渴望得到的。

 

2、模板:Drupal 8模板引擎将会用Twig

Drupal 8 采用Twig templating framework 作为默认的模板引擎,以代替以往的PHPTemplate 模板引擎,这可能是因为 Twig 也是Symfony 2的默认模板引擎的缘故,Twig 将大大优化Drupal 模板的逻辑,使得更安全,更快速,并且更易于开发。

尚不清楚的是,有多少Drupal主题将被支持,还有是多少主题将被保存到Drupal 8,但这只是普及问题,Twig无疑是一个需要加强Drupal主题体系结构,使其更快和更有序的很好的选择。

Drupal 8 -- 响应式的Toolbar

现在Drupal 8 dev 的toolbar 大体跟Drupal 7比较类似,还没有响应设计的:

正式版中,核心Toolbar模块,这个效果是很大机会会调整的,在过往一年,很多热心的drupaler都加入了社区,并且尝试改善Toolbar。

在Drupal 7中,有一个模块Mobile friendly navigation toolbar,实现在移动端也能很好的应用管理菜单。

关于响应式Toolbar问题,Drupal 开发Team 也有一些初步的构想,比较当前D8工具栏设计到D7工具栏。

 

目前,工具栏Toolbar是正在积极讨论,无论是在设计和实现细节。

我们一直有关注Toolbar这方面的讨论,到现时位置,已经开始慢慢清晰,一个成功的响应工具栏的解决方案不能简单的就只是为了移动。一个成功的解决方案应该还需要考虑折叠手机的友好设计。

在这里,我们将考察一些不同用户的工具栏需求,说明当前的设计满足这些用例。

“作为一个内容作者……我希望能够在任何设备管理我的网站,我的工具自动适应屏幕大小。”

Drupal 8 初探 -- Drupal 8的安装过程。

首先我们看看第一个版面安装界面。先出现的界面,让我们选择语言,这跟Drupal 6是一样的,而Drupal 7的第一个界面,是选择profile,这有一点顺序的改变。

而安装语言的po文件存放文件,也有所改变,在Drupal7 po文件是放在/profiles/standard/translations/里的,在Drupal8改了一下,地址变成了/sites/default/files/translations

 

Save an continue 按钮,进入第二个界面是Choose profile,默认只有StandardMinimal两种,这个跟Drupal 6,Drupal 7是一样的。我们选择Standard,继续下一步,系统通过Verify requirements后,直接进入第四部Set up database,数据库设置这步,也是沿用Drupal 7一样的风格,同样的,我们得先在mysql新建数据库才能进行,安装过程不会自动生成数据库,如果没建立数据库,会报错SQLSTATE[42000] [1049] Unknown database 'drupal8'。我们这里先在mysql 新建 数据吗名为:drupal8,再返回drupal 8安装界面中,设置好数据库的名称,用户名,密码,还有表前缀,继续下一步:

关于Drupal 8,你了解多少?

假如你是专业、上进、积极的Drupal开发者,假如你时时跟进Drupal核心和社区的一切新闻,请绕行,此文不针对深度Drupal程序员。
假如你听说过Drupal 8、了解不多,建议直接忽略此段从“Drupal 8概况”开始读起。

 

Drupal 8概况

 


- Drupal 8 什么时候发布?- 2013年8月。

- Drupal 8有什么了不起的?- 这大概会成为有史以来最有野心的一个内容管理系统。

- 谁会使用Drupal 8?- 刚开始当然是开发者和少数使用者。Drupal 7 花了一年半的时间,市场份额才超过Drupal 6。Drupal 8 要超越Drupal 7预计要到2013年。

- Drupal 8升级容易吗?- 不容易。其难度等同于Drupal 5升级到Drupal 6,或者说从Drupal 6 到 Drupal 7。

- 我还在使用Drupal 5/6/7。我该怎么办?- 建议Drupal 5用户现在就升级到Drupal 7;Drupal 6用户的时间相对宽裕,至少在Drupal 8 发布之前都是支持Drupal 6的;Drupal 7用户们至少还有四到五年的时间考虑是否要升级到Drupal 8。


Drupal 8 发布日程

 

  • 2012年12月1日:功能确定
  • 2013年2月1日:开发完成
  • 2013年8月Drupal Europe大会之日:正式发布

 

Drupal 8优化

 


Drupal 8 制定了一系列优化方案(initiative)。每项优化方案现状如下图:

 

如何用节点队列来创建高级图片轮播?

用到的模块:
以下模块必须被安装并启用:
Dynamic display block 模块(RC6)
jQuery update 模块
CCK 模块
Views 模块
filefield 模块
imagefield 模块
imageapi 模块
imagecache (optional)
Nodequeue


创建内容
在nodequeue可以被用来创建节点队列之前,我们必须先新建一个内容类型“新闻”。
1.    在之前的教程中我们已经介绍过如何新建内容类型,这里就不冗述了,只要保证你的内容类型有以下属性就行了。
·         标题 - 作为幻灯片的标题和完整的节点页面的标题
·         翻页器文字 - 用来显示在翻页器上面。(新建一个text field(文本属性)就行了)
·         幻灯片文字 - 用来悬浮显示在幻灯片上方 (新建text field(文本属性))
·         幻灯片图片 - 作为幻灯片的图片和翻页器的图片 (新建imagefield(图片属性))
·         正文 - 完整节点的详细文字 (和每一个content type有的正文一样)

 

2.    创建一些示例节点 - 你可以随便填入一些内容来新建示例节点,至少新建两个.

Drupal Flag 模块中,一句话调出 加入收藏 的链接到任何位置。

Drupal Flag 是一个非常强大的模块,很多社区功能都是通过Flag 实现。flag 会在<?php print render($content['links']); ?>,中增加链接,但这句代码,会附带了很多跟收藏功能无关的链接,如留言链接,点击次数链接,这些都是我们不想看到的,很多时候,我们只想出现 加入收藏,这时候你可能会想到,我用css 把其他的link隐藏不就好了,是的,只是这会产生一些垃圾的html代码,换句话说,就是代码不够优雅。

那如何能单独的只打印 加入收藏 的链接呢?很简单,flag提供了一个函数给我们调用。我们只需要在html代码中输入<?php print flag_create_link('bookmarks', $node->nid); ?> 就能打印出 加入收藏的功能按钮,是不是很简单?我们也可以再加个div 做点css样式如:


		<div class="bookmarks">
    	<?php print flag_create_link('bookmarks', $node->nid); ?>
    </div>

Invalid multibyte sequence in argument in check_plain() 错误解决

今天写了个小模块,调试的过程中发现一个错误  

Warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument in check_plain() (line 1545 of C:\Program Files (x86)\Zend\Apache2\htdocs\drupal\includes\bootstrap.inc).

 

写写我自己的解决思路。

1.首先怀疑是中文的问题,我的模块里title 属性  写了中文的值,把中文全部改成英文字母就没有报错了。

2.看看 bootstrap.inc  的代码 ,  发现问题在1476行  

return htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); 

     在后面加上一句  

if (drupal_validate_utf8($text)) return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');

 return htmlspecialchars($text, ENT_QUOTES);

 

问题基本解决。

drupal 7 中 在node.tpl.php 中显示图片的样式

drupal 7 中 在node.tpl.php 中显示图片的样式比较简单,只需要几段的代码就能实现。

 

<?php
      $image_uri = $node->field_image['und'][0]['file']['uri'];
      $image_url_with_style = image_style_url('square_thumbnail',$image_uri);//square_thumbnail是图片样式
      echo '<img src="'.$image_url_with_style.'">';
?>

 

如果字段类型为"Multimedia asset"(Media 模块的字段),而不是系统的“Image”,则要稍微改改代码

 

<?php
      $image_uri = $node->field_image_media['und'][0]['file']->uri;
      $image_url_with_style = image_style_url('square_thumbnail',$image_uri);
      echo '<img src="'.$image_url_with_style.'">';
?>

Drupal Commerce - 通过Rule控制续费到期用户。

Drupal Commerce 可以很方便的设置订阅性质的付费网站,可以通过Commerce subscription products 模块,在用户的数据里面增加一个过期日期,而Commerce subscription products只是增加了过期日期,却没发现有判断是否角色已经到期,所以要判断用户是否到期了,我们得自己写一些代码跟配置来实现,首先我们会想到的是两种方法,

  1. 一种是通过cron 去每日定期访问某页,然后循环读取每个用户的过期日期,如果现在的日期过期日期大的话,删除用户(或者是去掉此用户某个角色如角色Premium User);
  2. 第二种方法是通过在用户登录时候,做一个判断,是否现在的日期过期日期大,如果是的话去掉此用户某个角色如角色Premium User

此文是基于第二种方法的,因为第二种方法相对比较简单,那么该怎么做呢,我们的用rules模块做辅助,

首先我们通过hook_rules_condition_info() 这个hook 去增加一个能用于rules里面的条件

/**
 * Implementation of hook_rules_condition_info().
 */
function thinkinpremium_rules_condition_info() {
  return array(
    'thinkinpremium_condition_sp_validity' => array(
      'label' => t('Subscription validity'),
      'base' => 'thinkinpremium_condition_sp_validity',
    ),
  );
}

然后再写一个与它对应的函数,此函数是在数据库中读取当前用户的过期日期,并且与当前日期做比较,如果当前日期大于过期日期,返回true,否则返回false:

页面

订阅 RSS - 博客