欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

drupal 7 change field size 改变 修改字段 最大 大小 有大用 有大大用

更改字段的最大长度

更改字段的最大长度

大家好,

我创建了一个带有文本字段的内容类型,现在我必须更改其最大长度,如果内容类型上已经有记录并且它告诉我它已经有记录时不能更改,我该怎么办?

谢谢。

注释

drupalshrek 的图片

我认为没有简单的方法。

我认为应该工作的一种方法是:备份数据库、删除记录、更改字段大小、从备份中重新导入数据(不是结构)。

神兽史莱克

jfha73的图片

我做了,但它仍然显示错误的值,我还在数据库中查找内容类型,但我找不到它,谁能告诉我 Drupal 7 在数据库中存储此信息(内容类型)的位置?所以我可以检查是否有这个?

谢谢,

VM的图片

节点类型存储在节点类型表中——非核心字段存储在它们自己的表中。

jfha73的图片

我找到了表格,但上面没有任何内容说明字段长度,所以我回到方块 1,所以如果数据库中字段的表格有正确的大小,我怎样才能使我的内容类型为显示/允许这个尺寸,而不是以前的尺寸?

谢谢,

jfha73的图片

感谢一百万,这奏效了。

nitin.k 的图片

安装 devel,转到 URL(http://sitename/devel/php)并在文本编辑器中运行代码。


<?php

/**
  * Changes the field maximum length.
  */

// Provide field name and length for the field.
$field_name = "field_url_text";
$new_length = 500;  


$field_table = 'field_data_' . $field_name;
$field_revision_table = 'field_revision_' . $field_name;
$field_column = $field_name . '_value';
 
  // Alter value field length in fields table
  db_query("ALTER TABLE `{$field_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )");
  // Alter value field length in fields revision table
  db_query("ALTER TABLE `{$field_revision_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )");
 
  // Update field config with new max length
  $result = db_query("SELECT CAST(`data` AS CHAR(10000) CHARACTER SET utf8) FROM `field_config` WHERE field_name = '{$field_name}'");
  $config = $result->fetchField();
  $config_array = unserialize($config);
  $config_array['settings']['max_length'] = $new_length;
  $config = serialize($config_array);
  db_update('field_config')
    ->fields(array('data' => $config))
    ->condition('field_name', $field_name)
    ->execute();
?>

克劳利的画像

有效

goodmuyis的图片

由于某些原因,这在具有成功消息状态的本地主机(Acquia Dev Stack)上工作,但现在在实时服务器上工作并且没有状态消息。我必须将数据库备份到本地主机,运行代码,然后在线恢复

DLZJ的图片

嗨,尼丁 K

这也适用于 Drupal 8 吗?谢谢

迪帕克·戈亚尔的图片

您可以设置 jquery 中任何文件的最大长度

$(".form-item-title input").attr('maxlength','40');


来自  https://www.drupal.org/forum/support/post-installation/2014-05-15/change-the-maximum-length-of-a-field





问过 
查看 44k 次
50

我曾经为一个网站设置了一个字段的长度限制。现在客户想在该字段中添加更多字符。

我无法从 Drupal 更改最大大小,因为我收到以下错误消息:

数据库中有该字段的数据。无法再更改字段设置。

但是必须有一个解决方案。我应该在数据库中更改它吗(该字段是由Field-collections模块实现的)?

7个答案   正确答案 

94
+50

Dylan Tack 解决方案是最简单的,但就我个人而言,我喜欢探索 Drupal 数据库的内部区域,看看那里是如何管理事物的。

因此,假设您有一个文本字段,其机器名称是 field_text 的 10 个字符,您希望增加到 25 个字符:

  • 数据将存储在两个表中:field_data_field_text 和 field_revision_field_text

  • 定义存储在 field_config 中用于存储数据,而 field_config_instance 用于该字段的每个实例(标签之类的东西)。

现在让我们做一个小小的心脏手术。

  1. 更改数据表列定义:

    ALTER TABLE `field_data_field_text` 
    CHANGE `field_text_value` `field_text_value` VARCHAR( 25 ) 
    CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
    
    ALTER TABLE `field_revision_field_text` 
    CHANGE `field_text_value` `field_text_value` VARCHAR( 25 ) 
    CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
    
  2. 更改定义列,这个非常棘手,因为它存储在BLOB中,但这不会阻止您这样做。

    SELECT CAST(`data` AS CHAR(10000) CHARACTER SET utf8) 
    FROM `field_config` WHERE field_name = 'field_text';
    
    a:7:{s:12:"translatable";s:1:"1";s:12:"entity_types";a:0:{}s:8:"settings";a:2:
        {s:10:"max_length";s:2:"10";s:17:"field_permissions";a:5:
        //a lot more stuff...
    
    UPDATE `field_config` 
    SET data = 'a:7:{...a:2:{s:10:"max_length";s:2:"25";...}'
    WHERE `field_name` = 'field_text'
    
  • 刷新缓存。

  • 这是一个 PHP序列化数组,有趣的部分是s:10:"max_length";s:2:"10";,这意味着这个数组有一个属性名为max_length(名称是一个 10 个字符的字符串 - 因此是“s”),其值为 10(这是一个 2 个字符长的字符串)。这很容易,不是吗?

  • 更改其值就像用 替换s:2:"10"零件一样简单s:2:"25"注意:如果您的新值的字符长度较长,则必须相应地调整“s”部分。例如,输入 100 将s:3:"100"作为 100 的长度为 3 个字符。

  • 让我们把这个新值放回数据库中,不要忘记保留整个字符串。

  • 这会给你类似的东西:

  • 剖析这个BLOB的内部结构:

  • ???

  • 利润!

  • 顺便说一下,PhpMyAdmin 有一些设置允许直接修改 BLOB 列,但为什么要走简单的路呢?

    PS:这也可以在将一些 PHP 代码放入视图中并由于代码中的错误而获得 WSOD 时挽救您的生命。

    21
    function mymodule_update_7100() {
      $items = array();
      _field_maxlength_fix('field_name');
      return $items;
    }
    
    function _field_maxlength_fix($field_name, $maxlength = 255) {
      _alter_field_table($field_name, $maxlength);
      $data = _get_field_data($field_name);
      $data = _fix_field_data($data, $maxlength);
      _update_field_config($data, $field_name);
    }
    
    function _alter_field_table($field_name, $maxlength) {
      db_query("ALTER TABLE field_data_".$field_name." CHANGE ".$field_name."_value ".$field_name."_value VARCHAR( ".$maxlength." ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL");
      db_query("ALTER TABLE field_revision_".$field_name." CHANGE ".$field_name."_value ".$field_name."_value VARCHAR( ".$maxlength." ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL");
    }
    
    function _get_field_data($field_name) {
      $qry = "SELECT data FROM field_config WHERE field_name = :field_name";
      $result = db_query($qry, array(':field_name' => $field_name))->fetchObject();
      return unserialize($result->data);
    }
    
    function _fix_field_data($data, $maxlength) {
      $data['settings']['max_length'] = (string)$maxlength;
      return serialize($data);
    }
    
    function _update_field_config($data, $field_name) {
      $qry = "UPDATE field_config SET data = :data WHERE field_name = :field_name";
      db_query($qry, array(':data' => $data, ':field_name' => $field_name));
    }
    
    9

    这似乎是当前文本模块的限制。 text_field_settings_form()有这样的评论:“ @todo:如果 $has_data,添加一个只允许 max_length 增加的验证处理程序。”。

    作为临时解决方法,您可以'#disabled' => $has_data在 modules/field/modules/text/text.module 中的第 77 行左右注释掉。

    我找不到针对此特定案例的现有问题,但您可以在#372330上提及它。

    • 2个
      感谢您的回答。我已经对该行进行了注释,现在我可以修改字段中的值,但是在 sumbit 之后出现以下错误:Attempt to update field Serial No failed: field_sql_storage cannot change the schema for an existing field with data.. 
      – 雷达
       2011 年 8 月 27 日 8:36
    • 关于提交drupal问题,请继续做。 
      – 雷达
       2011 年 8 月 27 日 8:37
    • 1个
      我无法让它工作。评论该行后,我仍然收到 ALTER TABLE 失败的 MYSQL 错误。  2014 年 9 月 4 日 19:49
    • 如果你得到一个FieldUpdateForbiddenException: cannot change the schema for an existing field with data,你还需要在 上注释掉 L282 modules/field/modules/field_sql_storage/field_sql_storage.module 
      – 死神
       2015 年 11 月 23 日 6:12
    • 1个
      @Dalin 我的评论对 D7 应该仍然有效,尽管这个答案可以使用一些编辑来包括我的评论和你的 D8 等价物。 
      – 死神
       2017 年 10 月 24 日 1:39
    8个

    德鲁巴 7

    在 Drupal 7 中创建文本字段时,您必须为数据选择一个最大长度。只要您为此字段创建任何数据,最大长度在 Drupal 字段设置中就会变得不可变。

    可以理解的是,这将因减少最大长度而被禁用,因为它可能导致数据丢失,但是,应该可以增加任何字段的最大长度。Drupal 7 文本模块代码中的待办事项显示这是有意为之但从未实现的。

    需要发生的三件事:

    1. 更改 field_data_{fieldname} 表中 value 列的 VARCHAR 长度

    2. 更改 field_revision_{fieldname} 表中值列的 VARCHAR 长度

    3. 更新字段的配置以反映新的最大长度设置 以下函数完成所有这 3 个步骤并采用 2 个简单的参数,包括字段名称和新的最大长度。

    /**
     * Helper function to change the max length of a text field.
     */
    function MYMODULE_change_text_field_max_length($field_name, $new_length) {
      $field_table = 'field_data_' . $field_name;
      $field_revision_table = 'field_revision_' . $field_name;
      $field_column = $field_name . '_value';
    
      // Alter value field length in fields table.
      db_query("UPDATE `{$field_table}` SET `{$field_column}`=SUBSTR(`{$field_column}`, 0, {$new_length})");
      db_query("ALTER TABLE `{$field_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )");
      // Alter value field length in fields revision table.
      db_query("UPDATE `{$field_revision_table}` SET `{$field_column}`=SUBSTR(`{$field_column}`, 0, {$new_length})");
      db_query("ALTER TABLE `{$field_revision_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )");
    
      // Update field config with new max length.
      $result = db_query("SELECT CAST(`data` AS CHAR(10000) CHARACTER SET utf8) FROM `field_config` WHERE field_name = '{$field_name}'");
      $config = $result->fetchField();
      $config_array = unserialize($config);
      $config_array['settings']['max_length'] = $new_length;
      $config = serialize($config_array);
      db_update('field_config')
        ->fields(array('data' => $config))
        ->condition('field_name', $field_name)
        ->execute();
    }
    

    一旦此功能在您的自定义安装文件中可用,您就可以创建一个新的数据库更新功能,该功能使用此新功能进行所需的更改。

    /**
     * Change max_length of Name field
     */
    function mymodule_update_7002() {
      MYMODULE_change_text_field_max_length('field_name', 50);
    }
    

    来源: http: //nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length


    德鲁巴 8

    这是@Christopher提出的相同功能的版本:

    /**
     * Utility to change the max length of a text field.
     *
     * @param string $field_name
     *   Field name. 
     * @param int $new_length
     *   Field length in characters. 
     *
     * @throws \DrupalUpdateException
     */
    function MYMODULE_change_text_field_max_length($field_name, $new_length) {
      // The transaction opens here. 
      $txn = db_transaction();
    
      try {
        // Update field content tables with new max length.
        foreach (['field_data_', 'field_revision_'] as $prefix) {
          db_query('
          ALTER TABLE {' . $prefix . $field_name . '} 
            MODIFY ' . $field_name . '_value VARCHAR( ' . $new_length . ' )
          ');
        }
    
        // Update field config record with new max length.
        $result = db_query("
            SELECT CAST(data AS CHAR(10000) CHARACTER SET utf8) 
            FROM {field_config} 
            WHERE field_name = :field_name
          ", [':field_name' => $field_name]
        );
        $config = $result->fetchField();
        if ($config) {
          $config_array = unserialize($config);
          $config_array['settings']['max_length'] = $new_length;
          $new_config = serialize($config_array);
          db_update('field_config')
            ->fields(['data' => $new_config])
            ->condition('field_name', $field_name)
            ->execute();
        }
      }
      catch (Exception $e) {
        // Something went wrong somewhere, so roll back now.
        $txn->rollback();
        // Allow update to be re-run when errors are fixed.
        throw new \DrupalUpdateException(
          "Failed to change $field_name field max length: " . $e->getMessage(),
          $e->getCode(), $e
        );
      }
    }
    
    • 1个
      我们在一个项目上使用了这个 drupal 8 方法并遇到了问题,当你运行drush updb --entity-updates我们通过这个函数运行的字段时,它会被标记为需要更新。然后它将尝试在 mysql 中再次更新字段模式。对我们来说,这将失败,因为那里已经有现场数据。这阻止了其他更新任务的运行。  2017 年 7 月 19 日 21:05 
    • 长话短说,创建新字段和迁移数据可能更安全。  2017 年 7 月 19 日 21:05
    • 作为drupal.org/node/3034742的一部分,需要进行一些修改,以便上面的代码在 8.6 或更高版本上正常工作。 
      – d70rr3s
       2020 年 2 月 20 日 9:56
    3个

    试试这个...这会将字段数据类型从 TEXT 更新为 LONG_TEXT 并将max_length从 4000 更新为最大长文本长度...希望这有帮助。

    function my_module_update_1001(&$sandbox) {
      // Check if our field is already created.
      if (field_info_field('sample_text_field')) {
        db_query('ALTER TABLE field_data_sample_text_field CHANGE sample_text_field_value sample_text_field_value LONGTEXT');
        db_query('ALTER TABLE field_revision_sample_text_field CHANGE sample_text_field_value sample_text_field_value LONGTEXT');
        db_query("UPDATE field_config SET type = 'text_long' WHERE field_name = 'sample_text_field' ");
    
        $field = array(
          'field_name' => 'sample_text_field',
          'type' => 'text_long',
          'cardinality' => 1,
          'settings' => array(
             'max_length' => 0,
          ),
        );
        field_update_field($field);    
      }
    }
    
    3个

    D8

    1. core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchem‌a.php用文本“SQL 存储无法更改现有字段的模式”注释掉抛出异常的两行。关于第 1312 和 1403 行。

    2. 在您的浏览器中,导航至/admin/config/development/configuration/single/export配置类型为“字段存储”,并选择有问题的字段。复制配置。

    3. 导航到/admin/config/development/configuration/single/import配置类型为“现场存储”。粘贴配置。改变长度。

    4. 提交表格。

    请注意(您可能已经知道),如果您缩短长度,则现有数据将被截断。

    1个

    在Drupal 7中,我对phpmyadmin中的2个表进行了修改,并刷新了缓存。

    1. “field_data_field_lorem”:将“field_lorem_value”更改为“longtext”

    2. “field_config”:将“type”更改为“text_long”

    • 您是否将此作为补丁提交给 D7?如果这确实是问题所在,那么您真的应该向他们发布补丁以解决核心代码中的这个问题。  2011 年 8 月 15 日 15:32
    • 我已经从 phpmyadmin 更改了我的字段大小值(从 10 到 25 类型的 VARCHAR),并刷新了缓存,但是不起作用。在数据库 ramained VARCHAR(25) 但在 Drupal 中,该字段的最大大小值与之前的 10 相同。也许有一些隐藏字段设置? 
      – 雷达
       2011 年 8 月 16 日 13:37

    不是您要找的答案?浏览其他标记的问题或者问你自己的问题



    来自  https://drupal.stackexchange.com/questions/8829/how-to-change-the-length-of-field-settings













    https://drupal.stackexchange.com/questions/8829/how-to-change-the-length-of-field-settings


    普通分类: