Image 以编程方式将默认图像添加到内容类型
是否有一种方法可以使用功能、模块或任何东西将“默认图像”文件添加到内容类型字段中。到目前为止,我找到的唯一方法是将图像链接添加到没有图像创建的每个节点,但我想知道是否可以使用更好的和推荐的方法 我在这里找到了一些相关信息 --编辑-- 为了澄清,我的意思是“内容类型中图像字段的默认图像” 但是,我正在使用功能创建内容类型,并使用脚本创建站点。我不能使用该表单或任何相关内容,因为我本人可能永远不会接触该网站。我想把它全部自动化(:Image 以编程方式将默认图像添加到内容类型,image,drupal,drupal-7,default,content-type,Image,Drupal,Drupal 7,Default,Content Type,是否有一种方法可以使用功能、模块或任何东西将“默认图像”文件添加到内容类型字段中。到目前为止,我找到的唯一方法是将图像链接添加到没有图像创建的每个节点,但我想知道是否可以使用更好的和推荐的方法 我在这里找到了一些相关信息 --编辑-- 为了澄清,我的意思是“内容类型中图像字段的默认图像” 但是,我正在使用功能创建内容类型,并使用脚本创建站点。我不能使用该表单或任何相关内容,因为我本人可能永远不会接触该网站。我想把它全部自动化(: 谢谢!默认图像不会出现在功能中,但您可以在模块中使用hook\u
谢谢!默认图像不会出现在功能中,但您可以在模块中使用hook\u field\u Default\u fields\u alter来设置该字段的默认图像 以下是Drupal网站上关于它的讨论:
注释6是一个单独的用例,您可以根据自己的领域进行调整,而注释7是一个更通用的解决方案,您可以在多个领域使用。我一直想尝试类似的方法。不确定它将如何工作,但总体思路如下: 在插入内容类型时创建规则 让规则设置一个将成为图像的数据值 在我的例子中,我打算创建一个新的内容类型(ImageNodes),它只是一个小的静态节点集。每个ImageNodes节点将由一个键和一个图像组成。在我的规则中设置数据值时,我将检查插入内容中的另一个字段,并将其用作对正确ImageNodes节点的引用 这种方法允许我在插入时将默认图像附加到我的内容节点,以允许它根据插入节点的内容附加备用图像
注意,这种方法可以通过将图像创建为实体引用(或类似引用)来实现,或者规则模块足够智能,我可以将ImageNodes节点中的图像字段复制到要插入的内容节点中的图像字段。向规则添加条件将使您能够仅在未选择任何图像的情况下插入默认图像。以下代码是我在drupal.org上改编的,用于Features API第1版 尽管如此,通过更改钩子名称(如下面的注释和注释中所述),可以很容易地对其进行调整,以使用特性API版本2 此代码示例应添加到您的主模块文件
modulename.module
。我建议最好添加到定义实体和字段的功能模块中。它应适用于任何Drupal可字段实体。我已将其用于用户、节点、分类词汇表和字段集合项
要在您自己的模块中实现此功能,请复制以下代码,然后:
modulename
modulename\u images\u fields\u defaults()
返回的数组中定义所有字段图像默认值images
的文件夹将默认图像放入模块路径<?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;
}
}
- 可以很容易地从名为
modulename.Features.Field.inc的Features API 1文件中找到并复制字段计算机名称
- 在Features API 2中,字段定义分为
和modulename.Features.field_base.inc
,因此钩子也被重命名,可以用于字段基或字段实例:modulename.Features.field_instances.inc
hook\u field\u default\u field\u base\u alter()
hook\u field\u default\u field\u instances\u 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;
}
}
谢谢你的回答!请看我刚才所做的编辑,我认为hook\u form\u alter在这种情况下不起作用,对吗?好的,我明白了。我会根据新的信息更新我的答案。嗯,非常感谢!但是hook似乎从来没有被触发过。我在一个test\u fields\u default\u fields\u alter(&$fields){}-还有-我试着创建一个新的内容类型,添加一个字段,保存字段的每个部分,但什么都没有显示..这个钩子只是drupalcommerce的一部分吗?只显示了我想它可能是功能的一部分,你启用了吗?嗯,谢谢你提供的信息!我也想过类似的事情,但我想知道我是否可以避免使用钩子节点_insert或node_update将我处理的数据量限制在字段而不是节点上…但我想应该是相同的…ish