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

写一个简单的导入csv 进drupal 数据库的模块。

很多人有问我,Feeds 模块怎么用,如何导入,说真的,我也没细看,不过如果说只需要导入功能的话,其实不需要一定要feeds,只是几句简单的代码就能实现。

我们来建一个模块,名字叫thinkincsvimport,先在sites/all/modules/建立文件夹thinkincsvimport。 并在里面建立三个文件:thinkincsvimport.info / thinkincsvimport.module / thinkincsvimport.pages.inc

1,thinkincsvimport.info,填写基本资料

name = thinkincsvimport
description = thinkincsvimport.
core = 7.x
package = http://www.thinkinsoft.com
files[] = thinkincsvimport.module

2,thinkincsvimport.module,定义一个地址

<?php
/**
 * Implements hook_menu().
 */
function  thinkincsvimport_menu() {
  $items['csvimport/import'] = array(
    'title' => t('CSV import'),
    'description' => t('CSV import'),
    'page callback' => 'csvimport',
    'file' => 'thinkincsvimport.pages.inc',
    'access arguments' => TRUE,
    'type' => MENU_NORMAL_ITEM,
  );
  return $items;
}

 

3,thinkincsvimport.pages.inc,导入数据库

Drupal 7 以编程方式创建词汇表

Drupal 7 里面有这样一个函数:taxonomy_save_vocabulary(&$vocabulary),这个函数用来创建一个新的词汇表或者更新一个已有的词汇表。参数$vocabulary是一个关联数组(注意它不是一个词汇表对象!),包含以下键:

? name: 词汇表的名字。

? description: 词汇表的描述。

? help: 一个帮助文本,在节点创建表单中,它显示在这个词汇表字段的下面。

? nodes: 一个数组,包含了这个词汇表适用的所有节点类型。

? hierarchy: 0表示没有层级,1表示单个层级,2表示多个层级。

? relations: 0表示禁用相关术语, 1表示允许相关术语。

? tags: 0表示禁用自由标签化, 1表示启用自由标签化。

? multiple: 0表示禁用术语的多选,1表示启用多选。

? required: 0表示节点被提交前术语是可选的(这将引入一个默认的“没有选择任何选项”术语), 1表示节点提交前术语是必选的。

? weight: 词汇表的重量;它影响它在节点提交表单的词汇表字段集里面的位置。

? module: 负责这个词汇表的模块的名字。如果没有传递这个键,那么它的值默认为taxonomy。

? vid: 词汇表ID。如果没有传递这个键,那么将创建一个新的词汇表。

taxonomy_save_vocabulary(&$vocabulary)函数返回SAVED_NEW 或者 SAVED_UPDATED。

Drupal 7 模板改写建议

原文:Drupal 7 Template (Theme Hook) Suggestions

核心默认主题改写建议

区块

基模板:block.tpl.php
block--[region|[module|--delta]].tpl.php
查找顺序:

  1. block--module--delta.tpl.php
  2. block--module.tpl.php
  3. block--region.tpl.php

例子:block--block--1.tpl.php,block--sidebar_first.tpl.php,block--custom--my-block.tpl.php

 

评论

基模板:comment.tpl.php
comment--node-[type].tpl.php
例子:comment--node-article.tpl.php

基模板:comment-wrapper.tpl.php
comment-wrapper--node-[type].tpl.php
例子:comment-wrapper--node-article.tpl.php

字段

基模板:field.tpl.php
field--[type|name[--content-type]|content-type].tpl.php
查找顺序:

nginx 下的drupal 无法正常显示头像解决办法。

今天在   wiki 上看了 一下  drupal 的 nginx 设置,http://wiki.nginx.org/Drupal    按照上面的设置,基本上没有问题,但是会出现一个小问题,就是  用户头像无法正常的显示,然后查了一下是rewrite规则没有写好,在nginx.conf 里    修改    添加下面的 代码

    location / { 
        if (!-e $request_filename) { 
            rewrite ^/(.*)$ /index.php?q=$1 last; 
        } 
    } 

 

最后当然要重启一下nginx,问题解决。

判断用户是否管理员角色。

user_access() 是可以检查用户是否管理员。而超级管理员默认是没角色的。所以超级管理员可以用下面的方式判断:

<?php
if(user_access('administer')) 
{....your code goes here....}
?>

然而,如果你想判断一个登陆了的用户,是否拥有某一角色,举例角色名叫 buyer

<?php
global $user;
if(is_array($user->roles) && in_array('buyer', $user->roles))

{... your code goes here ...}

?>

通过hook_form_alter()隐藏现有表单中的表单元素。

举个例子说明如何通过hook_form_alter()隐藏现有表单中的表单元素。我建议用Devel 模块判断元素的结构。安装Devel 后,你可以通过dpm($form)调试。

<?php
function mymodule_form_alter(&$form, $form_state, $form_id) {
  global $user;

  // "hide" a few fieldsets for non-admins
  // (the lead developer only wants UID 1 to see these fields; I suggest doing it by role though!)
  // Note that you can also check out the $form_id variable for a different way to which form this is
  if ($form['#id'] == 'node-form' && $user->uid != 1) {       
    $form['author']['#access'] = FALSE;
    $form['revision_information']['#access'] = FALSE;
  }
}
?>

Drupal 模块的 Hooks(钩子)。

Drupal 一个CMS(Content Management System),Drupal的模块系统实现了一个钩子系统,什么是钩子?我已经开始了解钩子是允许您在多个地方调用。让我们先来看看一个PHP函数的编写和应用:

function do_something($thing)
{
    //这里写一些代码实现一些功能
    //例如插入数据库资料
    //标记一个物体
    //唱一首歌。。。。         
    return $something
}
 
... 程序的其他地方  ...
do_something();

一旦我们编写函数和部署代码,我们不能轻易改变它。也就是说,它虽然很容易被编辑,但是其他程序员不敢乱改,因为他们不懂这个函数的工作原理。所以要很好的跟其他程序员沟通,就必须通过很详细的代码注释。即使你有一个团队并且拥有完善的沟通,也有问题因为修改函数而产生副作用。所以就有一个概念:永远不改现有代码,除非你已经完全了解代码所做的任何事情。

我们试图解决问题,当“一些事情”发生,我们想采取额外的动作,需求的变化,就需要新的功能加入,这对于一个开发人员来说,我们得要随时应付这些新功能的加入。那么,我们如何不改变核心代码,但又能实现这些功能呢?

 

钩子系统很好的解决了这个问题。当你想做些什么,不是直接调用一个函数,而是调用一个钩子。

//老方法,直接call do_something函数
//do_something();
 
//新方法,调用do_something的 hook
module_invoke_all('do_something');

当一个hook 被调用了,Drupal 会

  1. 获得所有安装并启用模块列表
  2. 问每一个模块:你有do_something 这个 hook吗?
  3. 如果有,那么Drupal在这些模块实现了钩子调用函数

然而如果作为一个核心的开发者,你可以达到 “你想要”的同时,还能让其他开发者通过钩子实现“他们想要”

举个例子?

这些都是抽象的概念,我们需要举个例子说明

Views 3:添加文章作者名称字段

1) 先在relationship添加" Content: Author "字段。

2) 在Field里面就出现" User:Name"文章作者名称字段了。

让NetBeans支持Drupal命令。

在我用的编辑器中感觉netbeans还是比较不错的,免费、简单、功能易用、扩展性高。

默认情况下,NetBeans 是支持Symfony的命令。而Drupal 是不支持的。

我们可以通过下面设置,让NetBeans支持Drupal自动完成函数。

一、下载最新版的NetBeans,选择PHP版本就可以,当然,如果你需要支持其他的话,也可以选择ALL。

二、在Tools > PluginsInstalled tab里面,确保PHP是打开的

三、设置drupal的代码规范。

Preferences (or Tools > Options) > Editor > Formatting,选择PHP。然后选择Tabs And Indents。别勾选"Use All Language Settings"。其他设置如下:

通过Pathauto 模块的API为自定义模块创建alias(别名)。

Pathauto 模块是一个非常了得的模块,它能够基于规则自动为节点创建路径别名,而不需要手动为每一篇文件设置路径别名。而它的API也非常易于使用。这里以一个简单例子为教程:

1,首先安装Pathauto模块,这是必须的。

2,通过hook_menu 建立地址。

<?php
/**
 * Implements hook_menu().
 */
function  group_article_menu() {
  $items['node/%node/article'] = array(
    'title' => '群组文章',
    'page callback' => 'group_article_page',
	'page arguments' => array(1),
    'access arguments' => TRUE,
    'type' => MENU_LOCAL_TASK,
    'weight' => 10,
  );  
  return $items;
}

 

3,建立menu回调函数

<?php
function group_article_page($node) {
  return $node->title;
}

 

假使node/1/article为例,可以得到下面页面

 

页面

订阅 RSS - 博客