Я использую админку сонаты с Symfony 3.4 и knplabs. Все работает нормально, кроме одного.
Я создал тестовый класс и список сонат с CRUD. У этого класса есть переводимый заголовок, когда я нахожусь в режиме редактирования одного на моем тестовом объекте, я могу щелкнуть флаг для редактирования заголовка на многих языках.
Но когда я нахожусь в моем представлении списка, отображается флаг, но когда я нажимаю на него, список всегда отображает заголовок на английском языке (язык по умолчанию).
Я отлаживаю и обнаруживаю, что в режиме редактирования методы setLocale и getLocal используются для изменения языков, но в режиме списка они не вызываются.
Как я могу перевести свои объекты в моем списке?
Здесь мой тестовый класс, тестовый класс перевода и мой testAdmin.
Test.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
use Sonata\TranslationBundle\Model\TranslatableInterface;
/**
* @ORM\Entity(repositoryClass = "App\Repository\TestRepository")
*/
class Test implements TranslatableInterface
{
use ORMBehaviors\Translatable\Translatable;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type = "integer")
*/
private $id;
/**
* @ORM\Column(type = "boolean")
*/
private $is_enable;
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->translate(null, false)->getTitle();
}
public function setTitle(string $title): self
{
$this->translate(null, false)->setTitle($title);
return $this;
}
public function getIsEnable(): ?bool
{
return $this->is_enable;
}
public function setIsEnable(bool $is_enable): self
{
$this->is_enable = $is_enable;
return $this;
}
/**
* @param string $locale
*/
public function setLocale($locale)
{
$this->setCurrentLocale($locale);
return $this;
}
/**
* @return string
*/
public function getLocale()
{
return $this->getCurrentLocale();
}
/**
* @return string
*
* Set this to have a correct name display on BO (sonata translation add some weird id key after the name)
*/
public function __toString()
{
if (empty($this->getTitle())){
return '';
}
else{
return $this->getTitle();
}
}
}
TestTranslation.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
/**
* @ORM\Table(name = "test_translation")
* @ORM\Entity
*/
class TestTranslation
{
use ORMBehaviors\Translatable\Translation;
/**
* @var string
*
* @ORM\Column(type = "string", length=255)
*/
private $title;
/**
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @param string $title
*
* @return TestTranslation
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
}
TestAdmin.php
<?php
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
class TestAdmin extends AbstractAdmin
{
protected $baseRoutePattern = 'test';
protected $baseRouteName = 'test';
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('title', TextType::class)
->add('is_enable', TextType::class)
;
}
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('id')
->add('title')
->add('is_enable')
->add('_action', 'actions', array(
'actions' => array(
'edit' => array(),
'delete' => array(),
)
))
;
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper->add('id');
$datagridMapper->add('translations.title', null, array('label' => 'Title'));
$datagridMapper->add('is_enable');
}
}




return (string)$this->getTranslations()->get($locale);
используйте приведенный выше код в методе __toString Test.php
__tostring вызывается в виде списка, вы писали его в классе сущности?
это был всего лишь намек на то, что вы должны использовать его так, как хотите, это работает над двумя моими проектами.
Я думаю, что это не так, я добавляю точку останова, а она игнорируется, я умираю (); внутри, и в списке ничего не произошло. Я могу убрать его, если хочешь. И да, я добавляю в свой тестовый класс
не могли бы вы вернуть постоянную строку, чтобы проверить это? вроде return "проверьте, что я здесь"; внутри __toString?
Он возвращает заголовок объекта из БД в моем представлении списка, но в моей форме редактирования хлебные крошки возвращают «проверьте, я здесь». Вот почему я думаю, что это не вызов в списке
На самом деле моя проблема в том, что языковой стандарт не меняется, когда я нажимаю на флаг в представлении списка, поэтому он всегда возвращает язык по умолчанию. Если я заставлю изменить язык вручную, отобразится правильный язык.
Это не моя проблема, __toString не вызывается в представлении списка, и ваш код делает ошибку в моей форме добавления и редактирования