1

@Gedmo\Translatableフォームをレンダリングするときやエンティティ値を表示するときなど、エンティティ フィールドにプロパティが設定されているかどうかを知るためのショートカットはありますか?

たとえば、次のフィールドがあるとします。

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 * @Gedmo\Translatable
 */
private $name;

エンティティを表示している間、フィールドが翻訳可能かどうかを知りたいのですが、次のようなことを行います (小枝テンプレートでどのように見えるか、またはどのように見えるかの擬似コードのアイデア)

{% entity.title in entity.translatable.fields %}

注 :この背後にある実際のアイデアは、翻訳可能なフォーム フィールドにマーカーを自動的に表示することです。

4

3 に答える 3

2

Twig 拡張機能を作成できます。

class TranslatableTypeExtension extends AbstractTypeExtension
{
/**
 * @var ObjectManager
 */
private $om;

/**
 * @var TranslatableListener
 */
private $listener;

/**
 * @param ObjectManager $om
 */
public function __construct(ObjectManager $om, TranslatableListener $listener )
{
    $this->om = $om;
    $this->listener = $listener;
}

private function isTranslatableField($object, $name)
{
    $config = $this->listener->getConfiguration($this->om, get_class($object));

    if (isset($config['fields']) && in_array($name, $config['fields']) ) 
        return true;
    return false;
}

public function buildView(FormView $view, FormInterface $form, array $options)
{
    if ( $form->getParent() == null )
        return;

    if ( is_object($form->getParent()->getData())) {
        if ( $this->isTranslatableField($form->getParent()->getData(),    $form->getName()) )
            $view->vars['field_translatable'] = true;
    }
}

/**
 * Returns the name of the type being extended.
 *
 * @return string The name of the type being extended
 */
public function getExtendedType()
{
    return 'field';
}
}

この拡張機能を次のようにロードします。

my_extension.translatable_type_extension:
    class: Acme\DemoBundle\Form\Extension\TranslatableTypeExtension
    arguments: ["@doctrine.orm.entity_manager", "@gedmo.listener.translatable"]
    tags:
        - { name: form.type_extension, alias: field }

小枝テンプレートでは、次のようなものを使用できます。

{% if field_translatable is defined and field_translatable %} Translatable field {% endif %}
于 2013-02-18T19:45:21.263 に答える
1

エンティティ リポジトリで、TranslationRepository を拡張すると仮定すると、翻訳のあるフィールドを取得するカスタム関数を作成できます。次の行に沿って、リポジトリにカスタムメソッドを作成できます

use use Doctrine\ORM\Query;
use Gedmo\Translatable\Entity\Repository\TranslationRepository;

class MyEntityRepository extends TranslationRepository 
{

     public function getTranslatableFieldsByClass($className)
     {
            $translationMeta = $this->getClassMetadata();

            $qb = $this->_em->createQueryBuilder();
            $qb->select('trans.field')
                ->from($translationMeta->rootEntityName, 'trans')
                ->where('trans.objectClass = :entityClass')
                ->groupBy('trans.field');

            $q = $qb->getQuery();

            $data = $q->execute(
                array('entityClass' => $className),
                Query::HYDRATE_ARRAY
            );

            return (array) $data;
     }
}

次に、結果をテンプレートにロードし、上記と同様の「in」句を使用します。

$translatableFields = $this->getDoctrine()->getRepository('MyBundle:MyTranslatableEntity')->getTranslatableFieldsByClass(get_class($myTranslatableEntity));
于 2013-01-09T20:27:25.970 に答える