Doctrine – nefunguje cascade update
- exquis
- Člen | 82
Ahoj, netušíte proč nefunguje u ukládání překladů cascade update?
Používám:
extensions:
translation: Kdyby\Translation\DI\TranslationExtension
translatable: Zenify\DoctrineBehaviors\DI\TranslatableExtension
translation:
default: cs
debugger: false
fallback: [cs, en]
translatable:
currentLocaleCallable: [@translation.default, getLocale]
Category.php
<?PHP
namespace App\Model\Entity\Category;
use App\Model\Contract\Entity\Slug\SlugInterface;
use App\Model\Entity\Slug\AbstractSlug;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Kdyby\Doctrine\Entities\Attributes\Identifier;
use Knp\DoctrineBehaviors\Model\SoftDeletable\SoftDeletable;
use Knp\DoctrineBehaviors\Model\Timestampable\Timestampable;
use Knp\DoctrineBehaviors\Model\Translatable\Translatable as KnpTranslatable;
use Nette\Utils\Strings;
use Zenify\DoctrineBehaviors\Entities\Attributes\Translatable as ZenifyTranslatable;
/**
* @Gedmo\Tree(type="nested")
* @ORM\Table(name="category", indexes={
* @ORM\Index(name="lft_index", columns={"lft"}),
* @ORM\Index(name="is_active_index", columns={"is_active"}),
* @ORM\Index(name="lvl_index", columns={"lvl"}),
* @ORM\Index(name="premier_id_index", columns={"premier_id"})
* })
* @ORM\Entity
*/
class Category implements SlugInterface
{
use Identifier;
use KnpTranslatable;
use SoftDeletable;
use Timestampable;
use ZenifyTranslatable;
...
CategoryTranslation.php
<?PHP
namespace App\Model\Entity\Category;
use App\Model\Entity\Core\Metadata;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model\Translatable\Translation;
/**
* @ORM\Entity
* @ORM\Table(name="category_translation", indexes={
* @ORM\Index(name="name_index", columns={"name"})
* })
*/
class CategoryTranslation
{
use Translation;
...
a pak to používám:
/**
* {@inheritdoc}
*/
protected function processRow($entity)
{
$id = $entity['sortiment'];
if (in_array($id, self::SKIP_IDS)) {
$this->logInfo('Skipping category import: ' . $id);
return;
}
if ($entity['nadraz'] instanceof SimpleXMLElement) {
$parentEntity = $this->rootCategory;
} else {
$parentEntity = $this->categoryRepository->findOneBy(['premierId' => $entity['nadraz']]);
}
$category = $this->categoryRepository->findOneBy(['premierId' => $id]);
if ( ! $category) {
$metadata = new Metadata($entity['nazev'], $entity['nazev']);
$translation = new CategoryTranslation($entity['nazev'], self::LOCALE, $metadata);
$category = new Category;
$category->addTranslation($translation);
$category->setActive(TRUE);
}
$this->handleData($category, $parentEntity, $entity);
}
/**
* @param Category $category
* @param Category $parentEntity
* @param array $entity
*/
private function handleData(
Category $category,
Category $parentEntity,
$entity
) {
$id = $entity['sortiment'];
$name = $entity['nazev'];
$nameLowered = Strings::firstUpper(Strings::lower($name));
$category->setParent($parentEntity);
$category->setPremierId($id);
$category->setName($nameLowered);
$category->setNameInMenu($nameLowered);
$metadata = $category->getMetadata();
$metadata->setTitle($nameLowered);
$metadata->setDescription($nameLowered);
if ($this->isImport) {
$slug = $id . '-' . Strings::webalize($nameLowered);
$category->addSlug(new CategorySlug($slug));
}
$this->categoryRepository->save($category);
// v category repository save() je:
// $this->entityManager->persist($entity);
// $this->entityManager->flush($entity);
}
Vytvoreni prvniho zaznamu je v pohode, ale jakmile jde o update, tak se nic nestane. Kdyz si dumpnu metadata ci translation tesne pred ->save() tak vyhodi spravna data, ale pres save uz se do DB nedostanou.
EDIT:
Jak už to tak bývá, jakmile se zeptáte, tak na to musíte přijít 2 minuty poté – problém byl v $this->entityManager->flush($entity), jakmile nechám jen $this->entityManager->flush() bez parametru, tak vše běhá :)
Editoval exquis (29. 9. 2017 17:53)