translations_pack-1.0.0-beta3/translations_pack.module
translations_pack.module
<?php
use Drupal\Core\Entity\ContentEntityFormInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Drupal\translations_pack\Form\TranslationForm;
use Drupal\translations_pack\TranslationsPackHandler;
use Drupal\translations_pack\TranslationsPackNodeHandler;
use Drupal\language\Entity\ContentLanguageSettings;
// workaround for bug of empty entity id when ajax used on new content form
function translations_pack_form_alter(&$form, FormStateInterface $form_state, $form_id) {
$form_object = $form_state->getFormObject();
if (isset($form['actions']['submit'])) {
if ($form_object instanceof ContentEntityFormInterface) {
$form['actions']['submit']['#submit'][] = 'translations_pack_save_newid';
$entity = $form_object->getEntity();
if (isset($entity->translations_pack_original)) {
$form['actions']['submit']['#value'] = t('Save (all translations)');
}
}
if ($form_object instanceof TranslationForm) {
// override other module changes to retain submission callback
$form['actions']['submit']['#value'] = 'save';
}
}
}
function translations_pack_save_newid(array $form, FormStateInterface $form_state) {
$entity = $form_state->getFormObject()->getEntity();
if ($entity->id()) {
$form_state->setValue('translations_pack_newid', $entity->id());
$form_state->setValue('translations_pack_entity', $entity);
}
}
function translations_pack_module_implements_alter(&$implementations, $hook) {
if ($hook == 'form_alter' && isset($implementations['translations_pack'])) {
$alter = $implementations['translations_pack'];
unset($implementations['translations_pack']);
$implementations['translations_pack'] = $alter;
}
}
function translations_pack_entity_type_alter(array &$entity_types) {
static $map = [
'node' => 'NodeTranslationHandler',
'term' => 'TermTranslationHandler',
'default' => 'ContentTranslationHandler'
];
$namespace = 'Drupal\translations_pack\handlers\\';
foreach ($entity_types as $name => $entity_type) {
if (!$entity_type->isTranslatable()) {
continue;
}
$id = $entity_type->id();
if (!isset($map[$id])) {
$id = 'default';
}
$entity_type->setHandlerClass('translation', $namespace . $map[$id]);
if ($entity_type->hasHandlerClass('translations_pack')) {
continue;
}
if ($name == 'node') {
$entity_type->setHandlerClass('translations_pack', TranslationsPackNodeHandler::class);
}
else {
$entity_type->setHandlerClass('translations_pack', TranslationsPackHandler::class);
}
}
}
function translations_pack_form_language_content_settings_form_alter(&$form, FormStateInterface $form_state) {
foreach (Element::children($form['settings']) as $entity_type) {
foreach (Element::children($form['settings'][$entity_type]) as $bundle) {
$bundle_settings = &$form['settings'][$entity_type][$bundle];
if (!isset($bundle_settings['translatable'])) {
continue;
}
$config = ContentLanguageSettings::loadByEntityTypeBundle($entity_type, $bundle);
if (!$config) {
continue;
}
$enabled = $config->getThirdPartySetting('translations_pack', 'pack_enabled');
$selector =
":input[name=\"settings[{$entity_type}][{$bundle}][translatable]\"]";
$bundle_settings['settings']['translations_pack'] = [
'#type' => 'checkbox',
'#title' => 'Translations pack',
'#default_value' => $enabled,
'#states' => [
'visible' => [
$selector => [
'checked' => TRUE,
],
],
],
];
}
}
$form['#submit'][] = 'translations_pack_language_content_settings_submit';
}
function translations_pack_language_content_settings_submit(array $form, FormStateInterface $form_state) {
foreach ($form_state->getValue('settings') as $entity_type => $bundles) {
foreach ($bundles as $bundle => $values) {
$config = ContentLanguageSettings::loadByEntityTypeBundle($entity_type, $bundle);
if (!isset($values['translatable'])) {
continue;
}
$enabled = $values['translatable'] && $values['settings']['translations_pack'];
$config->setThirdPartySetting('translations_pack', 'pack_enabled', $enabled);
$config->save();
}
}
}
