【问题标题】:Programmatically adding default image to content type以编程方式将默认图像添加到内容类型
【发布时间】:2014-02-01 09:20:45
【问题描述】:

有没有办法将“默认图像”文件添加到内容类型字段,使用功能、模块或任何东西。到目前为止我发现的唯一方法是将图像链接添加到没有图像创建的每个节点,但我想知道是否可以使用更好的东西并推荐

我在这里找到了一些相关信息question。

-- 编辑--

为了澄清,我的意思是“内容类型中图像字段的默认图像”

但是,我正在使用功能创建内容类型,并使用脚本创建站点。我不能使用表格或任何相关的东西,因为我自己可能永远不会接触该网站。我想全部自动化(:

谢谢!

【问题讨论】:

    标签: image drupal drupal-7 default content-type


    【解决方案1】:

    默认图像不会出现在功能中,但您可以在模块中使用 hook_field_default_fields_alter 为该字段设置默认图像。

    这是 Drupal 网站上关于它的讨论: https://drupal.org/node/1439136

    comment 6 是一个单一的用例,您可以根据自己的领域进行调整,而comment 7 是一个更通用的解决方案,您可以将其用于多个领域。

    【讨论】:

    • 感谢您的回答!请查看我刚刚所做的编辑,我认为 hook_form_alter 在这种情况下不起作用,对吗?
    • 好的,我明白了。我会根据新信息更新我的答案。
    • 嗯,非常感谢!但是钩子似乎永远不会被触发。我在 test_field_default_fields_alter(&$fields){} 中添加了一个看门狗语句 - 并且 - 我尝试创建一个新的内容类型,添加一个字段,保存一个字段的每个部分,但没有显示..
    • 我认为它可能是功能的一部分,您启用了吗?
    【解决方案2】:

    我一直想尝试类似的东西。不确定它究竟是如何工作的,但总体思路如下:

    创建规则 - 插入内容类型。

    让规则设置一个将是图像的数据值。

    在我的例子中,我打算创建一个新的内容类型 (ImageNodes),它只是一个小的静态节点集。每个 ImageNodes 节点将包含一个键和一个图像。在我的规则中设置数据值时,我将检查正在插入的内容中的另一个字段,并将其用作对正确 ImageNodes 节点的引用。

    这种方法将允许我在插入时将默认图像附加到我的内容节点,以允许它根据插入节点的内容附加替代图像。

    注意,这种方法可以通过将图像创建为实体引用(或类似)来实现,或者规则模块足够智能,我可以将 ImageNodes 节点中的图像字段复制到内容中的图像字段正在插入的节点。向规则添加条件将使您能够仅在未选择默认图像时注入默认图像。

    【讨论】:

    • 嗯,谢谢你的信息!我曾想过类似的事情,但我想知道是否可以避免使用像 node_insert 或 node_update 这样的钩子来限制我对字段而不是节点处理的数据量......但我想它会是一样的......是的
    【解决方案3】:

    我改编自 drupal.org 上的 Features issue #1439136: Support imagefield default images 的以下代码可用于功能 API 版本 1。

    它可以通过更改挂钩名称轻松适应功能 API 版本 2,如下面的注释和 cmets 中所述。

    此代码示例应添加到您的主模块文件modulename.module。我建议最好添加到定义实体和字段的功能模块中。它应该适用于任何 Drupal 可部署实体。我已经将它与用户、节点、分类词汇和字段集合项一起使用。

    要在您自己的模块中实现此功能,请复制以下代码,然后:

    1. 将所有出现的modulename 替换为您的模块机器名称。
    2. 在modulename_images_fields_defaults() 返回的数组中定义所有字段图像默认值。
    3. 使用名为 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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 2020-07-16
      相关资源
      最近更新 更多