برنامه نویسی

Come correggere l’errore “نام موجود پیکربندی موجود توسط FieldStorageConfigInterface::getBundles() برگردانده شد”

Fonte: نحوه رفع “نام موجود پیکربندی موجود توسط FieldStorageConfigInterface::getBundles()”

من شخصاً پس از به‌روزرسانی یک سایت تاریخی که با دروپال 8 متولد شد، به نسخه 9 منتقل شد و اکنون با آپدیت دروپال 10 مواجه شده است، با این خطا مواجه شدم.

در طول سال ها این سایت دستخوش افزودن ها، اصلاحات و حذف های متعدد فیلدها شده است و هر بار “کثیفی” زیادی را با خود به همراه داشته است.

با به‌روزرسانی دروپال 10، متوجه خطاهای بسیار زیادی در گزارش‌ها شدم، بنابراین لازم بود با جستجو مشکل را برطرف کنم.

با تشکر از انجمن من توانستم راه حل ذکر شده در لینک بالای پست را پیدا کنم.
می‌خواهم راه‌حل را گزارش کنم تا راحت‌تر جواب را پیدا کنم، زیرا پست اصلی بسیار طولانی و کمی پراکنده شده است.

برای رفع خطا چندین راه وجود دارد:

  • با استفاده از a HOOK_update:
function YOURMODULENAME_update_10001() {
  ## Fixes:
  ## A non-existent config entity name returned by FieldStorageConfigInterface::getBundles(): entity type: paragraph, bundle: text, field name: field_image
  $entity_type = 'paragraph';
  $bundle = 'text';
  $field_name = 'field_image';

  /** @var \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value_factory */
  $key_value_factory = \Drupal::service('keyvalue');
  $field_map_kv_store = $key_value_factory->get('entity.definitions.bundle_field_map');
  $map = $field_map_kv_store->get($entity_type);
  // Remove the field_dates field from the bundle field map for the page bundle.
  unset($map[$field_name]['bundles'][$bundle]);
  // Remove field definition if empty.
  if (empty($map[$field_name]['bundles'])) {
    unset($map[$field_name]);
  }

  $field_map_kv_store->set($entity_type, $map);

  // Remove entity type definition if empty after unsetting.
  if (empty($field_map_kv_store->get($entity_type))) {
    $field_map_kv_store->delete($entity_type);
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در کد قبلی، یک خطا در موجودیت نوع به عنوان مثال نشان داده شده است paragraphسول باندل text جایی که میدان ایجاد مشکل است field_image.
این کار تعریف میدان را پاک می کند field_image حذف ارجاع آن به بسته نرم افزاری text و اگر در پایان پاکسازی اگر مزرعه بسته های دیگری در داخل خود نداشته باشد، خود میدان حذف می شود.
با همین منطق ادامه می دهیم، اگر در انتها نوع موجودیت نیز خالی باشد، اقدام به لغو آن می کنیم.

اگر خطا در بیش از یک فیلد وجود داشته باشد، به راحتی می توانید تابع را در یک فیلد وارد کنید foreach که در آن پارامترها تغییر می کند $entity_type، $bundle ه $field_name.

  • ایجاد فرم سفارشی:

1 – با ایجاد یک پوشه به نام هر چیزی که شما ترجیح می دهید شروع کنید، من از placeholder استفاده می کنم [MY_MODULE] برای نشان دادن نام ماژول.

2 – داخل پوشه یک فایل با نام ایجاد کنید [MY_MODULE].info.yml و محتوای آن باید:

name: My Module
description: Fixes Error - A non-existent config entity name returned by FieldStorageConfigInterface::getBundles().
package: Custom
type: module
core_version_requirement: ^9.4 || ^10
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3 – فایل دیگری به نام ایجاد کنید drush.services.yml و این کد را وارد کنید:

services:
  update.commands:
    class: \Drupal\[MY_MODULE]\Commands\UpdateCommands
    arguments:
      - '@keyvalue'
    tags:
      - { name: drush.command }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4 – یک پوشه ایجاد کنید src، که داخل آن پوشه دیگری ایجاد می کند Commands.

5 – داخل پوشه Commands، فایل را ایجاد کنید UpdateCommands.php و این کد را داخل آن قرار دهید:



namespace Drupal\[MY_MODULE]\Commands;

use Drush\Commands\DrushCommands;
use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;

/**
 * A Drush commandfile.
 *
 * In addition to this file, you need a drush.services.yml
 * in root of your module, and a composer.json file that provides the name
 * of the services file to use.
 *
 * See these files for an example of injecting Drupal services:
 *   - http://git.drupalcode.org/devel/tree/src/Commands/DevelCommands.php
 *   - http://git.drupalcode.org/devel/tree/drush.services.yml
 */
class UpdateCommands extends DrushCommands {

  /**
   * The key value store to use.
   *
   * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface
   */
  protected $keyValueStore;

  /**
   * @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value_factory
   *   The key value store to use.
   */
  public function __construct(KeyValueFactoryInterface $key_value_factory) {
    $this->keyValueStore = $key_value_factory;
  }

  /**
   * Corrects a field storage configuration. See https://www.drupal.org/project/drupal/issues/2916266 for more info
   *
   * @command update:correct-field-config-storage
   *
   * @param string $entity_type
   *   Entity type
   * @param string $bundle
   *   Bundle name
   * @param string $field_name
   *   Field name
   */
  public function correctFieldStorageConfig($entity_type, $bundle, $field_name) {
    $field_map_kv_store = $this->keyValueStore->get('entity.definitions.bundle_field_map');
    $map = $field_map_kv_store->get($entity_type);
    unset($map[$field_name]['bundles'][$bundle]);

    // Remove field definition if empty.
    if (empty($map[$field_name]['bundles'])) {
      unset($map[$field_name]);
    }

    $field_map_kv_store->set($entity_type, $map);

    // Remove entity type definition if empty after unsetting.
    if (empty($field_map_kv_store->get($entity_type))) {
      $field_map_kv_store->delete($entity_type);
    }
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

6 – فرم را در پوشه قرار دهید web/modules/custom/ سایت خود را از رابط گرافیکی یا با آن فعال کنید drush en [MY_MODULE].

7 – اکنون می توانید از دستور drush که به تازگی با آن ساخته شده است استفاده کنید drush update:correct-field-config-storage [ENTITY_TYPE] [BUNDLE] [FIELD_NAME]. با استفاده از مثال قبلی این دستور را دریافت می کنیم drush update:correct-field-config-storage paragraph text field_image.

8 – پس از انجام دستور خطا باید برطرف شود و می توانید ماژول را با آن غیرفعال کنید drush pmu [MY_MODULE] و سپس آن را حذف کنید.

یک تشکر بزرگ از جامعه دروپال است که راه حلی را که من کمی تغییر دادم پیدا کرد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا