Problém se Zenify/DoctrineBehaviors Translantable

- Eagle
 - Člen | 5
 
Ahoj, rád bych použil pro Doctrine entity rozšíření Translatable z balíčku Zenify/DoctrineBehaviors. Jako translator požívám Kdyby\Translation – samotné překlady fungují. Zenify/DoctrineBehaviors se také nahraje bez chyby. V db se bez problému vytvoří dvě tabulky: product a product_translation
Ale i když postupuji při definici, ukládání a načítání entity podle tohoto návodu https://github.com/…ineBehaviors#…
tak překlad nelze načíst ani uložit, nevloží se záznam do tabulky
product_translation – ani ručně vložený záznam se nenačte. Máte
nějaký tip, co by mohlo být špatně? Díky předem!
Možná by mohla být chyba v konfiguraci, nejsem si jist nasetováním
tohoto:
currentLocaleCallable: [@translation.default, getLocale]
Moje konfigurace:
extensions:
	...
	translation: Kdyby\Translation\DI\TranslationExtension
	translatable: Zenify\DoctrineBehaviors\DI\TranslatableExtension
translation:
    default: cs
    whitelist: [cs, en, de, it, fr]
    fallback: [cs_CZ, cs]
translatable:
    currentLocaleCallable: [@translation.default, getLocale]
Product entity:
<?php
namespace App\Model\Entity;
use	\Doctrine\ORM\Mapping as ORM;
use \Kdyby\Doctrine\Entities\Attributes\Identifier;
use \Knp\DoctrineBehaviors\Model\Translatable\Translatable as KnpTranslatable;
use \Zenify\DoctrineBehaviors\Entities\Attributes\Translatable as ZenifyTranslatable;
/**
 * Product entity.
 *
 * @ORM\Entity
 */
class Product
{
	/* Using Identifier trait for id column */
	use Identifier;
	use KnpTranslatable;
	use ZenifyTranslatable;
	/**
	 * @ORM\Column(length=32, unique=true)
	 * @var string
	 */
	private $code;
	...
}
?>
Překlad:
<?php
namespace App\Model\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model\Translatable\Translation;
/**
 * Product translation entity.
 *
 * @ORM\Entity
 */
class ProductTranslation
{
	/** Knp Doctrine Behaviours translation trait */
	use Translation;
	/**
	 * @ORM\Column(length=150)
	 * @var string
	 */
	protected $name;
	/**
	 * @param string $name
	 */
	public function setName($name)
	{
		$this->name = $name;
	}
	/**
	 * @return string
	 */
	public function getName()
	{
		return $this->name;
	}
}
?>
Ještě doplňuji ProductFacade:
<?php
namespace App\Model\Facade;
use \App\Model\Entity\Product;
class ProductFacade
{
	...
	public function add($values, $lang)
	{
		try {
			/* @var $product Product */
			$product = new Product;
			$product->translate($lang)->setName($values['name']);
			$product->setCode($values['code']);
			$product->mergeNewTranslations();
			$this->entityManager->persist($product);
			$this->entityManager->flush();
			return $product;
		} catch (\Doctrine\DBAL\DBALException $e) {
			throw new ProductCodeAlreadyUsedException();
		}
	}
}
?>
					Editoval Eagle (13. 10. 2016 14:36)

- Jan Mikeš
 - Člen | 771
 
Zvláštní, porovnal jsem to s mým používáním a na první pohled to
máš vše ok.
Podle mě je jedno jestli použiješ cs nebo cs_CZ
akorát to co použiješ na vstupu pak musíš používat i na výstupu pro
vypsání.
Nevyhazuje to nějakou exception, kterou bys zachytával tou
DBALException?
Podívej se na generované sql inserty a selecty.
Taktéž se ujistit jestli je cache promazána a zkusil bych
i v console php index.php orm:validate
Nic dalšího mě už nenapadá

- Eagle
 - Člen | 5
 
Ahoj Lexi,
znovu jsem se k tomu po čase vrátil a je to pro mě velká záhada, ale
ono se to rozběhlo „samo“. Tímto Ti MOCKRÁT DĚKUJI ZA TVOJE TIPY
I ČAS, který jsi tomu věnoval, nakonec to přece jen pomohlo! Jsem
si téměř úplně jistý, že jsem předtím zkoušel restartovat jak php-fpm,
tak i nginx, mazal jsem cache vč. proxies pro doctrine, ale určitě
nerestartoval celý systém (Ubuntu). Co jsem koukal, selecty i updates se
týkaly předtím jen té jedné tabulky pro entitu, dnes už obou tabulek.
orm:validate jsem zkoušel i dřív, mám to přímo zahrnuto ve skriptu pro
update modelu. Hlásilo mi to „Mapping“ i „Database“ OK. Selecty
U translation entity IMHO (i podle příkladu) být use Identifier nemá,
struktura se vytvořila v DB ok, je to zřejmě zahrnuto v tom use Translation
traitu. Je to záhada, nicméně to už běží, vč. té autodetekce locale,
hurá :-) Díky moc!
Lexi napsal(a):
Zvláštní, porovnal jsem to s mým používáním a na první pohled to máš vše ok.
Podle mě je jedno jestli použiješcsnebocs_CZakorát to co použiješ na vstupu pak musíš používat i na výstupu pro vypsání.Nevyhazuje to nějakou exception, kterou bys zachytával tou
DBALException?
Podívej se na generované sql inserty a selecty.
Taktéž se ujistit jestli je cache promazána a zkusil bych i v consolephp index.php orm:validateNic dalšího mě už nenapadá

- Jan Mikeš
 - Člen | 771
 
@EarlGrey s tím identifierem máš pravdu, porovnával jsem to se svojí implementací a neuvědomil jsem si, že používám vlastní trait, protože defaultní obsahuje autogenerated integer id a já používám Ramsey\Uuid ;) Jsem rád, že již funguje, jen je škoda těchto „wtf“ momentů, kdy něco začne samo fungovat a nikdo neví proč :-)