Drupal 7:为字段设置默认值
我最近正在研究一个包含内容类型作为功能的模块。当模块被启用时,hook_install()钩子设置了一个分类术语的集合,这些术语在内容类型中用作一个字段。在对此进行测试时,我意识到尽管这些术语已正确安装,但该字段的默认值会根据模块安装在哪个系统上而发生变化。这样做的原因是术语ID被用于从数据库中提取默认术语,这是Drupal中的正常行为。这里的问题是,如果一个术语的ID不同(因为添加了一个),那么这会产生更改字段默认值的连锁效应。
为了解决这个问题,我需要一种基于给定分类术语设置字段默认值的方法。在对Drupal源代码进行一些研究和阅读之后,我找到了一种以编程方式设置分类字段默认值的方法。
在开始之前,需要先做一些设置。正如我之前所说,我正在处理的模块包含一个功能,该功能包含一个内容类型和几个字段,其中一个是分类参考。为了在内容类型的分类字段上设置默认值,我需要确保首先正确组装所有组件。在hook_install()模块的钩子中,我添加了一个调用,features_revert()以便我可以确保我即将完成的其余操作能够正常工作。这features_revert()函数的工作原理类似于单击功能模块管理部分中的“恢复功能”按钮,并将强制恢复给定的参数。为了使其在安装钩子期间工作,还需要包含正确的特征文件,因此钩子的开头包括与节点、字段和分类法相关的特征文件。
function my_module_install() { //确保包含正确的功能文件 module_load_include('inc', 'my_module', 'my_module.features'); module_load_include('inc', 'my_module', 'my_module.features.field'); module_load_include('inc', 'my_module', 'my_module.features.taxonomy'); //确保内容类型、字段和分类词汇确实存在。 features_revert( array( 'my_module' => array( 'taxonomy', 'node', 'field' ) ) ); }
作为旁注,最好在不同的钩子(例如,hook_enable()或hook_modules_enabled())中运行此代码,以便features_revert()不需要该函数。但是,我发现您不能依赖在任何安装和启用挂钩中完全实现的功能。强制只使用您需要在功能中使用的组件是确保您需要的一切准备就绪的好方法。
下一步是加载词汇表并向其中添加默认术语。以下代码将六个术语添加到名为“task_status”的词汇表中,该词汇表也包含在安装挂钩中。
//设置“状态”词汇术语。 $task_status_vocab = taxonomy_vocabulary_machine_name_load('task_status'); $statuses = array( 'New', 'Being Worked On', 'Postponed', 'Failed QA/Testing', 'Cancelled', 'Ready For QA/Testing' ); foreach ($statuses as $status) { $term = new stdClass(); $term->name = $status; $term->vid = $task_status_vocab->vid; taxonomy_term_save($term); }
现在一切都设置好了,可以设置默认字段值。我们首先需要做的是运行数据库查询来挑选正确的术语,以便我们可以将分类字段设置为正确的值。
//获取默认状态的tid $term = db_select('taxonomy_term_data', 'td') ->fields('td', array('tid', 'name')) ->condition('name', 'New') ->condition('vid', $task_status_vocab->vid) ->execute() ->fetchObject();
现在我们需要获取刚刚找到的termID,并将其设置为字段的默认值,这涉及三个步骤。第一步是使用field_read_instance()我们可以修改的函数获取字段的实例。第二步是使用分类术语ID(称为tid)的新默认值修改该字段。最后一步是使用该field_update_instance()函数用新的字段信息更新字段实例。
//为分类字段设置默认分类术语。 //获取我们可以修改的字段的实例 $instance = field_read_instance('node', 'field_task_status', 'task'); //更新字段的默认值 $instance['default_value'] = array(array('tid' => $term->tid)); //将字段保存回数据库。 field_update_instance($instance);
这里唯一的问题是,一旦更新了默认值,该功能将报告自己被覆盖(确实如此)。这是不可避免的,但它不会导致很多问题。一个主要问题是,如果您将来需要再次恢复该功能的字段组件,那么您将需要一种使用正确默认值更新字段的方法。即使没有功能,这对于任何领域来说都是一个很好的技巧。