我改编自 drupal.org 上的 Features issue #1439136: Support imagefield default images 的以下代码可用于功能 API 版本 1。
它可以通过更改挂钩名称轻松适应功能 API 版本 2,如下面的注释和 cmets 中所述。
此代码示例应添加到您的主模块文件modulename.module。我建议最好添加到定义实体和字段的功能模块中。它应该适用于任何 Drupal 可部署实体。我已经将它与用户、节点、分类词汇和字段集合项一起使用。
要在您自己的模块中实现此功能,请复制以下代码,然后:
- 将所有出现的
modulename 替换为您的模块机器名称。
- 在
modulename_images_fields_defaults() 返回的数组中定义所有字段图像默认值。
- 使用名为
images 的文件夹将默认图像放入模块路径中。
注意事项:
- 可以从名为
modulename.features.field.inc 的Feature API 1 文件轻松定位和复制现场机器名称。
- 在功能 API 2 中,字段定义分为
modulename.features.field_bases.inc 和 modulename.features.field_instances.inc,因此挂钩也被重命名,可用于字段基础或字段实例:
hook_field_default_field_bases_alter()
hook_field_default_field_instances_alter()
代码:
<?php
/**
* Define images for use as defaults in fields info.
*
* @return array
*/
function modulename_images_fields_defaults() {
return array(
'node-content_type_name-field_image' => 'default-image.png',
'field_collection_item-field_collection_item_field_name-field_image' => 'default-image.png',
'taxonomy_term-vocabulary_name-field_image' => 'default-image.png',
);
}
/**
* Implements hook_field_default_fields_alter().
*
* Alter field default values right before fields info is cached by features.
*
* @todo: Update to hook_field_default_field_bases_alter if Features upgraded.
*
* @param &$fields
* By reference. The fields that have been declared by another feature.
*/
function modulename_field_default_fields_alter(&$fields) {
$source = drupal_get_path('module', 'modulename') . '/images';
$destination = file_default_scheme() . '://default_images';
$field_default_images = modulename_images_fields_defaults();
foreach ($field_default_images as $field_name => $filename) {
if (isset($fields[$field_name])) {
_modulename_field_default_fields_alter_image(
$fields[$field_name], $filename, $source, $destination
);
}
}
}
/**
* Alter image field default using managed source file.
*
* @param $field
* @param $filename
* @param $source_path
* The source folder path relative to the Drupal root where the image
* filename can be found.
* @param $destination_uri
* The destination folder path as a stream wrapper uri ie. "scheme://target".
*/
function _modulename_field_default_fields_alter_image(&$field, $filename, $source_path, $destination_uri) {
// See if a default image hasn't been set for this field yet
if (!isset($field['field_config']['settings']['default_image'])
|| empty($field['field_config']['settings']['default_image'])
) {
// Dynamically set the default image on the field
$source_file_uri = "$source_path/$filename";
// Check to see if managed file exists.
$result = db_select('file_managed', 'f')
->fields('f', array('fid'))
->condition('f.uri', "$destination_uri/$filename")
->execute();
$fid = $result->fetchField();
// Simulate an upload of the default image.
if (!$fid && file_exists($source_file_uri)) {
$file = new stdClass;
$file->filename = $filename;
$file->timestamp = REQUEST_TIME;
$file->uri = $source_file_uri;
$file->filemime = file_get_mimetype($source_file_uri);
$file->uid = 1;
$file->status = 1;
$file = file_copy($file, $destination_uri, FILE_EXISTS_REPLACE);
$fid = isset($file->fid) ? $file->fid : '';
}
$scheme = file_uri_scheme($destination_uri) ?: file_default_scheme();
$field['field_config']['settings']['default_image'] = intval($fid);
$field['field_config']['settings']['uri_scheme'] = $scheme;
}
}