Extra fields: Add extra field displayText translation

Using Translatable extension
pull/4020/head^2
Julio 4 years ago
parent e451261c20
commit b2131e8115
  1. 2
      config/packages/doctrine.yaml
  2. 1
      config/packages/stof_doctrine_extensions.yaml
  3. 124
      public/main/extrafield/translate.php
  4. 12
      public/main/inc/lib/extra_field.lib.php
  5. 11
      public/main/template/default/extrafield/translate.html.twig
  6. 20
      src/CoreBundle/Entity/ExtraField.php
  7. 6
      src/CoreBundle/Framework/Container.php
  8. 2
      src/CoreBundle/Migrations/Schema/V200/Version20.php
  9. 101
      tests/CoreBundle/Repository/ExtraFieldRepositoryTest.php

@ -33,7 +33,7 @@ doctrine:
mappings:
gedmo_translatable:
type: annotation
prefix: ChamiloCore\Entity\Translation
prefix: Gedmo\Translatable\Entity
dir: "%kernel.project_dir%/vendor/gedmo/doctrine-extensions/src/Translatable/Entity"
alias: GedmoTranslatable # (optional) it will default to the name set for the mapping
is_bundle: false

@ -9,3 +9,4 @@ stof_doctrine_extensions:
timestampable: true
sluggable: true
sortable: true
translatable: true

@ -2,10 +2,10 @@
/* For licensing terms, see /license.txt */
exit;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Entity\Language;
use Chamilo\CoreBundle\Framework\Container;
use Gedmo\Translatable\Entity\Translation;
$cidReset = true;
@ -16,73 +16,45 @@ api_protect_admin_script();
$em = Database::getManager();
$extraField = null;
$extraFieldOption = null;
$variableLanguage = null;
$originalName = null;
if (isset($_GET['extra_field'])) {
$extraField = $em->find('ChamiloCoreBundle:ExtraField', intval($_GET['extra_field']));
$variableLanguage = '$'.api_underscore_to_camel_case($extraField->getVariable());
$originalName = $extraField->getDisplayText(false);
} elseif (isset($_GET['extra_field_option'])) {
$extraFieldOption = $em->find('ChamiloCoreBundle:ExtraFieldOptions', intval($_GET['extra_field_option']));
$extraField = $extraFieldOption->getField();
//$variableLanguage = '$'.ExtraFieldOption::getLanguageVariable($extraFieldOption->getDisplayText());
$originalName = $extraFieldOption->getDisplayText();
}
$extraFieldRepo = Container::getExtraFieldRepository();
$languageRepo = Container::getLanguageRepository();
$fieldId = (int) ($_REQUEST['id'] ?? 0);
if (!$extraField || empty($variableLanguage) || empty($originalName)) {
/** @var ExtraField|null $extraField */
$extraField = $extraFieldRepo->find($fieldId);
if (null === $extraField) {
api_not_allowed(true);
}
$languageId = isset($_GET['sub_language']) ? (int) $_GET['sub_language'] : 0;
$currentUrl = api_get_self().'?id='.$fieldId;
$qb = $languageRepo->getAllAvailable();
$languages = $qb->getQuery()->getResult();
$languages = $em->getRepository(Language::class)->findAllSubLanguages();
$languagesOptions = [0 => get_lang('none')];
$form = new FormValidator('translate', 'POST', $currentUrl);
$form->addHidden('id', $fieldId);
$form->addHeader($extraField->getDisplayText());
foreach ($languages as $language) {
$languagesOptions[$language->getId()] = $language->getOriginalName();
}
$repository = $em->getRepository(Translation::class);
$translations = $repository->findTranslations($extraField);
$defaults = [];
$translateUrl = api_get_path(WEB_CODE_PATH).'admin/sub_language_ajax.inc.php';
$form = new FormValidator('new_lang_variable', 'POST', $translateUrl);
$form->addHeader(get_lang('Add terms to the sub-language'));
$form->addText('variable_language', get_lang('Language variable'), false);
$form->addText('original_name', get_lang('Original name'), false);
$form->addSelect(
'sub_language',
[get_lang('Sub-language'), get_lang('OnlyActiveSub-languagesAreListed')],
$languagesOptions
);
if ($languageId) {
$languageInfo = api_get_language_info($languageId);
$form->addText(
'new_language',
[
get_lang('Translation'),
get_lang(
'If this term has already been translated, this operation will replace its translation for this sub-language.'
),
]
);
$form->addHidden('file_id', 0);
$form->addHidden('id', $languageInfo['parent_id']);
$form->addHidden('sub', $languageInfo['id']);
$form->addHidden('sub_language_id', $languageInfo['id']);
$form->addHidden('redirect', true);
$form->addHidden('extra_field_type', $extraField->getExtraFieldType());
$form->addButtonSave(get_lang('Save'));
/** @var Language $language */
foreach ($languages as $language) {
$iso = $language->getIsocode();
$variable = 'variable['.$iso.']';
$form->addText($variable, $language->getOriginalName().' ('.$iso.')', false);
if (isset($translations[$iso]) && $translations[$iso]['displayText']) {
$defaults['variable['.$iso.']'] = $translations[$iso]['displayText'];
}
}
$form->setDefaults([
'variable_language' => $variableLanguage,
'original_name' => $originalName,
'sub_language' => $languageId,
]);
$form->addRule('sub_language', get_lang('Required'), 'required');
$form->freeze(['variable_language', 'original_name']);
$form->setDefaults($defaults);
$form->addButtonSave(get_lang('Save'));
$interbreadcrumb[] = ['url' => api_get_path(WEB_CODE_PATH).'admin', 'name' => get_lang('Administration')];
@ -107,9 +79,33 @@ switch ($extraField->getExtraFieldType()) {
break;
}
$view = new Template(get_lang('Add terms to the sub-language'));
$view->assign('form', $form->returnForm());
$template = $view->get_template('extrafield/translate.tpl');
$content = $view->fetch($template);
$view->assign('content', $content);
$view->display_one_col_template();
if ($form->validate()) {
$values = $form->getSubmitValues();
foreach ($languages as $language) {
if (!isset($values['variable'][$language->getIsocode()])) {
continue;
}
$translation = $values['variable'][$language->getIsocode()];
if (empty($translation)) {
continue;
}
$extraField = $extraFieldRepo->find($fieldId);
$extraField
->setTranslatableLocale($language->getIsocode())
->setDisplayText($translation)
;
$em->persist($extraField);
$em->flush();
}
Display::addFlash(Display::return_message(get_lang('Updated')));
api_location($currentUrl);
}
$tpl = new Template(get_lang('Translations'));
$tpl->assign('form', $form->returnForm());
$template = $tpl->get_template('extrafield/translate.html.twig');
$content = $tpl->fetch($template);
$tpl->assign('content', $content);
$tpl->display_one_col_template();

@ -1001,6 +1001,8 @@ class ExtraField extends Model
$jquery_ready_content = null;
$assetRepo = Container::getAssetRepository();
$extraFieldRepo = Container::getExtraFieldRepository();
if (!empty($extra)) {
$newOrder = [];
if (!empty($orderFields)) {
@ -1062,11 +1064,16 @@ class ExtraField extends Model
$freezeElement = 0 == $field_details['visible_to_self'] || 0 == $field_details['changeable'];
}
$translatedDisplayText = get_lang($field_details['display_text']);
//$translatedDisplayText = $field_details['display_text'];
/** @var \Chamilo\CoreBundle\Entity\ExtraField $extraField */
$extraField = $extraFieldRepo->find($field_details['id']);
$translatedDisplayText = $extraField->getDisplayText();
$translatedDisplayHelpText = '';
if ($help) {
$translatedDisplayHelpText .= get_lang($field_details['display_text'].'Help');
}
if (!empty($translatedDisplayText)) {
if (!empty($translatedDisplayHelpText)) {
// In this case, exceptionally, display_text is an array
@ -2271,8 +2278,7 @@ class ExtraField extends Model
$form->addElement('header', $header);
if ('edit' === $action) {
$translateUrl = api_get_path(WEB_CODE_PATH).'extrafield/translate.php?'
.http_build_query(['extra_field' => $id]);
$translateUrl = api_get_path(WEB_CODE_PATH).'extrafield/translate.php?'.http_build_query(['id' => $id]);
$translateButton = Display::toolbarButton(get_lang('Translate this term'), $translateUrl, 'language', 'link');
$form->addText(

@ -1,9 +1,4 @@
{% autoescape false %}{{ form }}{% endautoescape %}
<script>
$(function () {
$('select[name="sub_language"]').on('change', function () {
location.href += '&sub_language=' + this.value;
});
});
</script>
{% autoescape false %}
{{ form }}
{% endautoescape %}

@ -71,10 +71,17 @@ class ExtraField
protected ?string $description;
/**
* @Gedmo\Translatable
* @ORM\Column(name="display_text", type="string", length=255, nullable=true, unique=false)
*/
#[Assert\NotBlank]
protected ?string $displayText = null;
/**
* @Gedmo\Locale
*/
protected ?string $locale = null;
/**
* @ORM\Column(name="helper_text", type="text", nullable=true, unique=false)
*/
@ -138,6 +145,7 @@ class ExtraField
$this->visibleToOthers = false;
$this->visibleToSelf = false;
$this->changeable = false;
$this->filter = false;
}
/**
@ -362,4 +370,16 @@ class ExtraField
return $this;
}
public function setTranslatableLocale($locale)
{
$this->locale = $locale;
return $this;
}
public function getTranslatableLocale()
{
return $this->locale;
}
}

@ -13,6 +13,7 @@ use Chamilo\CoreBundle\Repository\CareerRepository;
use Chamilo\CoreBundle\Repository\CourseCategoryRepository;
use Chamilo\CoreBundle\Repository\ExtraFieldRepository;
use Chamilo\CoreBundle\Repository\GradeBookCategoryRepository;
use Chamilo\CoreBundle\Repository\LanguageRepository;
use Chamilo\CoreBundle\Repository\MessageRepository;
use Chamilo\CoreBundle\Repository\Node\AccessUrlRepository;
use Chamilo\CoreBundle\Repository\Node\CourseRepository;
@ -402,6 +403,11 @@ class Container
return self::$container->get(CQuizQuestionCategoryRepository::class);
}
public static function getLanguageRepository(): LanguageRepository
{
return self::$container->get(LanguageRepository::class);
}
public static function getLinkRepository(): CLinkRepository
{
return self::$container->get(CLinkRepository::class);

@ -370,6 +370,8 @@ class Version20 extends AbstractMigrationChamilo
$this->addSql('ALTER TABLE templates ADD CONSTRAINT FK_6F287D8EA76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
}
$this->addSql('CREATE TABLE IF NOT EXISTS ext_translations (id INT AUTO_INCREMENT NOT NULL, locale VARCHAR(8) NOT NULL, object_class VARCHAR(191) NOT NULL, field VARCHAR(32) NOT NULL, foreign_key VARCHAR(64) NOT NULL, content LONGTEXT DEFAULT NULL, INDEX translations_lookup_idx (locale, object_class, foreign_key), UNIQUE INDEX lookup_unique_idx (locale, object_class, field, foreign_key), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
// Drop unused columns
$dropColumnsAndIndex = [
'track_e_uploads' => [

@ -11,6 +11,7 @@ use Chamilo\CoreBundle\Entity\ExtraFieldSavedSearch;
use Chamilo\CoreBundle\Repository\ExtraFieldRepository;
use Chamilo\Tests\AbstractApiTest;
use Chamilo\Tests\ChamiloTestTrait;
use Gedmo\Translatable\Entity\Translation;
class ExtraFieldRepositoryTest extends AbstractApiTest
{
@ -19,26 +20,115 @@ class ExtraFieldRepositoryTest extends AbstractApiTest
public function testCreate(): void
{
$em = $this->getEntityManager();
$repo = self::getContainer()->get(ExtraFieldRepository::class);
$repo = static::getContainer()->get(ExtraFieldRepository::class);
$defaultCount = $repo->count([]);
$item = (new ExtraField())
$extraField = (new ExtraField())
->setDisplayText('test')
->setVariable('test')
->setDescription('desc')
->setHelperText('help')
->setExtraFieldType(ExtraField::USER_FIELD_TYPE)
->setFieldType(\ExtraField::FIELD_TYPE_TEXT)
->setDefaultValue('')
->setFieldOrder(1)
;
$this->assertHasNoEntityViolations($item);
$em->persist($item);
$this->assertHasNoEntityViolations($extraField);
$em->persist($extraField);
$em->flush();
$this->assertSame($defaultCount + 1, $repo->count([]));
$this->assertSame(ExtraField::USER_FIELD_TYPE, $extraField->getExtraFieldType());
$this->assertSame('', $extraField->getDefaultValue());
$this->assertSame('desc', $extraField->getDescription());
$this->assertSame('text', $extraField->getTypeToString());
$this->assertSame('help', $extraField->getHelperText());
$this->assertSame(1, $extraField->getFieldOrder());
$this->assertNotNull($extraField->getId());
$this->assertFalse($extraField->isChangeable());
$this->assertFalse($extraField->isFilter());
$this->assertFalse($extraField->isVisibleToSelf());
$this->assertFalse($extraField->isVisibleToOthers());
$this->assertFalse($extraField->hasTag('tag'));
$this->assertNotNull($extraField->getId());
$this->assertSame($defaultCount + 1, $repo->count([]));
}
public function testCreateWithTranslation(): void
{
$em = $this->getEntityManager();
//$extraFieldRepo = static::getContainer()->get(ExtraFieldRepository::class);
$extraFieldRepo = $em->getRepository(ExtraField::class);
$translator = static::getContainer()->get('translator');
$defaultLocale = $translator->getLocale();
$this->assertSame('en_US', $defaultLocale);
$defaultCount = $extraFieldRepo->count([]);
$extraField = (new ExtraField())
->setDisplayText('test in ENGLISH')
->setVariable('test in en')
->setExtraFieldType(ExtraField::USER_FIELD_TYPE)
->setFieldType(\ExtraField::FIELD_TYPE_TEXT)
;
$this->assertHasNoEntityViolations($extraField);
$em->persist($extraField);
$em->flush();
$this->assertSame($defaultCount + 1, $extraFieldRepo->count([]));
/** @var ExtraField $extraField */
$extraField = $extraFieldRepo->find($extraField->getId());
$extraField
->setTranslatableLocale('fr_FR')
->setDisplayText('test in FRENCH')
;
$em->persist($extraField);
$em->flush();
/** @var ExtraField $extraField */
$extraField = $extraFieldRepo->find($extraField->getId());
$extraField
->setTranslatableLocale('it')
->setDisplayText('test in ITALIAN')
;
$em->persist($extraField);
$em->flush();
$em->clear();
$this->assertSame($defaultCount + 1, $extraFieldRepo->count([]));
/** @var ExtraField $extraField */
$extraField = $extraFieldRepo->find($extraField->getId());
$repository = $em->getRepository(Translation::class);
$translations = $repository->findTranslations($extraField);
$this->assertCount(2, $translations);
$expected = [
'fr_FR' => [
'displayText' => 'test in FRENCH',
],
'it' => [
'displayText' => 'test in ITALIAN',
],
];
$this->assertSame($expected, $translations);
/** @var ExtraField $extraField */
$extraField = $extraFieldRepo->find($extraField->getId());
$this->assertSame('test in ENGLISH', $extraField->getDisplayText());
}
public function testGetExtraFields(): void
{
$repo = self::getContainer()->get(ExtraFieldRepository::class);
$repo = static::getContainer()->get(ExtraFieldRepository::class);
$this->assertNotNull($repo->getExtraFields(ExtraField::USER_FIELD_TYPE));
}
@ -58,7 +148,6 @@ class ExtraFieldRepositoryTest extends AbstractApiTest
$em->persist($item);
$value = '2020-11-24';
$extraFieldSavedSearch = (new ExtraFieldSavedSearch())
->setField($item)
->setUser($student)

Loading…
Cancel
Save