Drupal是世界上最大的开源软件,Drupal本身有上万的开发人员,而使用Drupal的开发者有上百万。全世界有约2%的网站是使用Drupal开发的。
在没有开始真正学习之前,我们先了解Drupal可以做什么和7个使用Drupal的理由。
Drupal是世界上最大的开源软件,Drupal本身有上万的开发人员,而使用Drupal的开发者有上百万。全世界有约2%的网站是使用Drupal开发的。
在没有开始真正学习之前,我们先了解Drupal可以做什么和7个使用Drupal的理由。
今天把一个Drupal 7的网站升级到PHP 7,过程很顺利,没有什么大问题。只见到后台有少量PHP警告,用户登出的时候页面有2条警告。可以认为Drupal 7在PHP 7上运行是基本没有问题的。下面一个issue跟踪这Drupal 7 Core在PHP 7上的问题:
如果表格数据全部来自数据库,可以直接使用Drupal 7的tablesort功能。
$header = array(
array('data' => '学号', 'field' => 'school_id'),
array('data' => '姓名', 'field' => 'name'),
array('data' => '班别', 'field' => 'class'),
array('data' => '操作'), // 此列不支持排序
);$query = db_select('cj3_exam_scores', 's')
$query->extend('TableSort')
->orderByHeader($header);
$result = $query->execute();$rows = ...; // 把$result的值填到$rows里
在叙述完7个使用Drupal的理由之后,我们公平一点,说7个不使用Drupal的理由:
Drupal很复杂,很难入门。即使它具有不需要编程的CMS特性,对于懂编程的人来说也很难学。Drupal作为CMS,其易学程度绝对和Wordpress不是一个档次。
国内很少人用Drupal,想找本像样的中文书籍都难。运气好能找到的很可能只是讲CMS部分的书籍,而不涉及怎样编写自定义模块内容。换句话说,要想学习Drupal,要直接学习英文的学习资料。
在国内找个Drupal程序员很困难。
不过,需要说明的是,容易入门的东西,精通了也不会让我们有什么过人之处。难学的东西还有很多人学说明学了它确实很有用。
做了一个简单的测试,打开一个很干净的页面,需要做25秒数据库连接,尽管只需要9ms(当数据查询繁忙的时候很可能不止这个时间)。启用的模块越多,系统运行越慢。我做过的一个很简单的网站数据库里有65张表,一个复杂一些的网站有250张表,这对系统资源是很大的压力。
Drupal是一个基于PHP语言编写的开源内容管理框架(CMF,CMS+Framework),它既可以让人不需要编写代码就搭建起一个网站,又可以像PHP框架那样编写复杂的自定义功能模块。
全球有2%【数据来源】的网站使用Drupal创建。它具有以下10大优点:
截止至2015年5月,一共有38,140名开发者为Drupal贡献代码。拥有超过30000个模块和2000个主题。我们可以边开发自己的网站,边学习别人的代码。遇到问题,可以得到庞大的社区支持。
使用Drupal可以搭建任何类型的网站:门户网站、博客、论坛、购物网站、新闻网站等都是很简单的事情,每添加一种功能只需要启用若干模块,然后用一定的方式和现有系统连接起来。如果功能很特殊,可以自己添加新模块,就像使用普通PHP框架那样实现定制的功能就可以了。
理解本文需要先知道如何创建一个Drupal 7模块。
Drupal 7的文件API分为unmanaged file和managed file两种类型,managed file会在数据库中记录文件的信息及引用记录。
Drupal文件对象有一个uri属性,它的形式如public://myfile.jpg,通过file_create_url($file->uri)可以把uri转换成web可访问的路径,如http://howto.eguidedog.net/sites/default/files/myfile.jpg
Drupal内建了public、private和temporary流报装器(stream wrapper),PHP文件操作函数可以直接操作这些uri,例如我们可以通过filesize(‘public://myfile.jpg')获取文件大小,而不需要先转换成本地文件的地址。
Drupal中的private目录应该是放在一个不能直接从Web访问的目录,其内容通过PHP返回(这里有一个副作用是增加了系统开销)。
在表单生成函数中添加文件控件:
Drupal 7的managed_file类型有个bug,不支持prefix和suffix属性,可以通过增加一个container绕过:
$array['rows'][] = array(
'file_managed_container' => array(
'#prefix' => '<td>',
'#suffix' => '</td>',
'file_managed_element' => array(
'#type' => 'managed_file',
...
),
),
);
最新评论