Problém se Zenify/DoctrineBehaviors Translantable

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Eagle
Člen | 5
+
0
-

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
+
0
-

Nezapomínáš před $em->flush() volat $entity->mergeNewTranslations() ?

Eagle
Člen | 5
+
0
-

Ahoj Lexi,
díky za tip, ne na to jsem nezapomněl. Ještě ten kód doplním, co mám ve fasádě.

Lexi napsal(a):

Nezapomínáš před $em->flush() volat $entity->mergeNewTranslations() ?

Eagle
Člen | 5
+
0
-

Divné ale je, že se to ani nenačte z db, když tam ten záznam vložím ručně. locale se má používat ve tvaru ‚cs‘ anebo ‚cs_CZ‘?

Jan Mikeš
Člen | 771
+
0
-

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á

Jan Mikeš
Člen | 771
+
0
-

Akorát čeho jsem si všiml, že u entity ProductTranslation ti chybí use Identifier;

Eagle
Člen | 5
+
0
-

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š 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á

Jan Mikeš
Člen | 771
+
0
-

@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č :-)