web-dev-qa-db-ja.com

カスタムコンテンツエンティティ:編集フォームで翻訳の詳細を非表示にできません

Drupalコンソールを使用して多言語のカスタムコンテンツエンティティを作成しました。編集/表示の基本的なものは多言語でも正常に動作します。しかし、何らかの理由で、 「Translation」は、エンティティの編集フォームのフォーム要素(翻訳メタデータを含むもの)を詳しく説明します。

フォーム表示設定のスクリーンショット: Settings in form display

編集フォームのスクリーンショット: Translation details still visible in edit form

Config export _core.entity_form_display.chunk.weather_daswetter.default.yml_の翻訳もhiddenセクションに正しくリストされています:

_id: chunk.weather_daswetter.default
targetEntityType: chunk
bundle: weather_daswetter
mode: default
third_party_settings:
  stuff_from_field_group_module_here: nothing_with_translation
content:
  all_visible_fields_listed_correctly
hidden:
  changed: true
  created: true
  langcode: true
  translation: true
  uid: true
_

真っ青に、コアのContentTranslationHandlerのフィールドを自分のsrc/Entity/Chunk.php->baseFieldDefinitions()に再リストし、それらを明示的に構成可能に設定しようとしましたが、これでもどちらも役に立ちませんでした:

_/**
 * @ContentEntityType(
 *   id = "chunk",
 *    ...
 *   translatable = TRUE,
 *   ...
 * )
 */
class Chunk extends ContentEntityBase implements ChunkInterface {
  use EntityOwnerTrait;
  use EntityChangedTrait;
  use EntityPublishedTrait;

  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
    $fields = parent::baseFieldDefinitions($entity_type);
    $fields += static::ownerBaseFieldDefinitions($entity_type);
    $fields += static::publishedBaseFieldDefinitions($entity_type);

    // tried adding this, did not help
    if ($fields['content_translation_status']) {
      $fields['content_translation_status']->setDisplayConfigurable('form', TRUE);
    }

    if ($fields['content_translation_outdated']) {
      $fields['content_translation_outdated']->setDisplayConfigurable('form', TRUE);
    }

    if ($fields['content_translation_uid']) {
      $fields['content_translation_uid']->setDisplayConfigurable('form', TRUE);
    }

    if ($fields['content_translation_created']) {
      $fields['content_translation_created']->setDisplayConfigurable('form', TRUE);
    }
  }
}
_

「翻訳」のフォーム表示モードコントロールが機能しないのはなぜですか?

私はこれをUIで表示および構成可能にしたいので、_hook_form_alter_の使用を避けたいです。

更新:
hook_form_alterを使用してみましたが、これも機能しません。

_
function wt_chunks_form_alter(&$form, $form_state, $form_id) {
  if ($form['#entity_type'] == 'chunk') {
    /** @var $formMode \Drupal\Core\Entity\Entity\EntityFormDisplay */
    $formMode = $form_state->getStorage()['form_display'];
    $hiddenFields = $formMode->get('hidden');
    if (in_array('translation', $hiddenFields)) {
      //code goes into here, but the key 'content_translation' 
      //does not exist in the $form array
      $form['content_translation']['#access'] = FALSE;
    }
  }
}
_
2
Hudri

無効にしようとするtranslationフィールドは、メタデータを含むフィールドではありません。

翻訳メタデータはDrupal\content_translation\ContentTranslationHandlerで生成され、次のアクセスチェックがtrueの場合に自動的に適用されます。

'#access' => $this->getTranslationAccess($entity, $new_translation ? 'create' : 'update')->isAllowed(),

この問題を解決するには、エンティティ設定フォームにチェックボックスを追加して、翻訳を無効にすることができます。

また、エンティティのカスタムTranslationHandlerを作成する必要があります。

エンティティのアノテーションで、これをhandlersの下に追加します。

"translation" = "Drupal\MY_MODULE\MyEntityTranslationHandler",

カスタム翻訳ハンドラは次のようになります。

namespace Drupal\MY_MODULE;

use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;

class MyEntityTranslationHandler extends ContentTranslationHandler {

  public function entityFormAlter(array &$form, FormStateInterface $form_state, EntityInterface $entity) {
    $form = parent::entityFormAlter($form, $form_state, $entity);
    if (// Some condition...) {
      $form['content_translation']['#access'] = FALSE;
    }
  }

}

それが理にかなっていると思います。

2
user72672

完全を期すために、フォーム表示モードによる非表示を機能させるために実際に使用する作業コードを次に示します。

(私のカスタムエンティティの名前はchunkです)

ファイル_src/Entity/Chunk.php_

_namespace Drupal\MY_MODULE\Entity;

use ...

/**
 * Defines the Chunk entity.
 *
 * @ContentEntityType(
 *   id = "chunk",
 *   label = @Translation("Chunk"),
 *   ...
 *   handlers = {
 *     ...
 *     "translation" = "Drupal\MY_MODULE\ChunkTranslationHandler",
 *     ...
 *   },
 *   translatable = TRUE,
 *   ...
 * )
 */
class Chunk extends ContentEntityBase implements ChunkInterface {
  ...
  // no special code required here, just notice the translation handler annotation above
  ...
_

ファイル_src/ChunkTranslationHandler.php_

_namespace Drupal\MY_MODULE;

use Drupal\content_translation\ContentTranslationHandler;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;

/**
 * Defines the translation handler for chunk.
 */
class ChunkTranslationHandler extends ContentTranslationHandler {

  public function entityFormAlter(array &$form, FormStateInterface $form_state, EntityInterface $entity) {
    parent::entityFormAlter($form, $form_state, $entity);
    /** @var $formMode \Drupal\Core\Entity\Entity\EntityFormDisplay */
    $formMode = $form_state->getStorage()['form_display'];
    $hiddenFields = $formMode->get('hidden');
    if (in_array('translation', $hiddenFields) && array_key_exists('content_translation', $form)) {
      $form['content_translation']['#access'] = FALSE;
    }
  }
}
_

これは上記の@JDrupalのソリューションと同じですが、実際にはTranslationフィールドのフォーム表示構成を使用します(つまり、UIの無効なセクションに移動すると、すべての翻訳メタデータフィールドが非表示になります)。

Drupalコンソールの_drupal generate:entity:content_を使用する場合は、カスタムentityFormAlter()関数を記述するだけです。

1
Hudri