Drupalコンソールを使用して多言語のカスタムコンテンツエンティティを作成しました。編集/表示の基本的なものは多言語でも正常に動作します。しかし、何らかの理由で、 「Translation」は、エンティティの編集フォームのフォーム要素(翻訳メタデータを含むもの)を詳しく説明します。
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;
}
}
}
_
無効にしようとする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;
}
}
}
それが理にかなっていると思います。
完全を期すために、フォーム表示モードによる非表示を機能させるために実際に使用する作業コードを次に示します。
(私のカスタムエンティティの名前は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()
関数を記述するだけです。