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šcs
nebocs_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 consolephp index.php orm:validate
Nic 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č :-)