Drupal 7 问题汇总

  1. cron无法自动运行的问题

Cron无法自动运行,而可以点击cron链接手动运行。出现这个问题的原因很可能是drupal系统变量中的install_task没有被设置为完成。

解决办法:

drush vset install_task done

  1. 使用第三方libraries模块时,libraries目录下已存放第三方库文件,且后台libraries的日志显示第三方库(JS/CSS)文件已经正常安装,或是使用drush lls命令显示第三方库也显示正常,但是在renderable array中使用 $renderable_array[‘#attached’][‘libraries_load’][] = array(‘third_party_libs_name’) 却无法载入第三方库的情况
$renderable_array['#attached']['libraries_load'][] = array('third_party_libs_name')

使用这种方式有几个前提,而官网的document却没有完全说明这一点

1.该方法的应用对象为 renderable array, 即为元数据的数组
2.该 renderable_array 必须有 #theme 键指定一个 主题层的生成(render)函数
针对以上的情况, [‘#attached’][‘libraries_load’] 的适用情况为比较小的页面元素,如 block、form 或是 markup

具体的原因为当主题函数在解析 renderable array 为遇到libraries_load时,会调用 libraries_load()方法,并传入 ‘third_party_libs_name’ 作为参数,这样相关的第三方库文件 js/css 文件就会追加到页面的 header.

举个例子

假如需要某一个页面添加第三方前端库,可能需要使用 hook_page_build(&$page) 或是 hook_page_alter(&$page), 然而在 drupal 中 其实是没有 theme_page() 这个函数的,页面的渲染方式实际上通过预处理函数 preprocesser,然后将 $page 分割成小的变量,最终在tpl.php的前端模板中打印出来,所以hook_page_build(&$page) 或是 hook_page_alter(&$page) 是无法使用 #attched 这种方式。针对这种情况,比较方便的方法是直接调用 libraries_load() 方法来添加第三方前端库。

除此之外 可以针对 页面中小的的构成元素,如 block 或是 markup 的 renderable array 中追加 [‘#attached’][‘libraries_load’] 来加载第三方前端库。

学习SQL的方法

比较好的学习办法是打开phpmyadmin的console窗口
在浏览器界面对数据库进行操作,对照console中的SQL语句

数据库结构修改

# 建立新的数据库表
CREATE TABLE IF NOT EXISTS `database_name`.`table_name`(
    `id` INT UNSIGNED AUTO_INCREMENT,
    `Field1` VARCHAR(8) NOT NULL,
    `Field2` VARCHAR(4) NOT NULL,
    `Field3` INT(1) NOT NULL,
    PRIMARY KEY ( `id` ),
)ENGINE=InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;

# 修改数据表的名称
RENAME TABLE `database_name`.`table_name` TO `database_name`.`new_table_name`;

数据导出

# 导出整个数据库
mysqldump -u user -p database > database.sql
# 导出单个数据表 (包括表结构和表数据)
mysqldump -u user -p database table > table.sql
# 仅导出数据表中的数据 -t 参数
mysqldump -u user -p -t database table > table.sql
# 仅导出数据表中的表结构 -d 参数
mysqldump -u user -p -d database table > table.sql

数据导入

# 导入整个数据库
mysql -u user -p database < database.sql

在导入导出表的时候,如果开发和生产服务器的的数据库名称或是用户不同,建议导出的时候仅导出开发服务器数据库表的数据,然后在生产服务器使用mysql的source命令来导入数据。

# 查看数据库中是否含有表
show tables like 'table_name';