tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Problém s překladem entit

před 4 lety

jakubdvorak
Člen | 7
+
0
-

Zdravím,

prosím o pomoc – pokouším se ve vlastním CMS rozchodit tento návrh překladů entit: https://gist.github.com/Tharos/6266039 . Vše funguje do chvíle, kdy se z jedné TranslatableEntity snažím přistoupit na druhou TranslatableEntitu, která je s původní ve vztahu.

Entita vypadá následovně:

/**
 * @property int $id
 * @property Articles|null $parent m:hasOne(parent)
 * @property Users|null $users m:hasOne(users_id)
 * @property string|null $title m:translatable
 * @property string|null $content m:translatable
 * @property string|null $meta_keyword m:translatable
 * @property string|null $meta_description m:translatable
 * @property bool $public
 * @property bool $showInMenu (show_in_menu)
 * @property \DibiDateTime $last_edit
 * @property Galleries|null $gallery m:hasOne(galleries_id)
 * @property int $menu_position
 */
class Articles extends TranslatableEntity
{

}

Když se nyní pokusím zavolat:

$entity->parent !== NULL ? $entity->parent->id : NULL

Zahlásí LM chybu:

Cannot get value of property 'parent' in entity CMS\Model\Articles due to low-level failure: Argument 3 passed to CMS\Model\Filter\Translator::translate() must be an instance of CMS\Model\Languages, none given

Pochopil jsem, že když se pokusím způsobem $entity->parent->cokoliv přistoupit na další entitu, nepředá se poslední parametr metody CMS\Model\Filter\Translator::translate( Fluent $statement, $table, Lang $lang )

Mám LeanMapper v. 2.2.0 a celé to běží v Nette 2.2.2

Předem díky za jakoukoliv radu! :)

Editoval jakubdvorak (8. 7. 2014 17:25)

před 4 lety

Tharos
Člen | 1039
+
0
-

Podívej se na Mapper v tom ZIP balíčku, je v něm getImplicitFilters, které mi v tom Gistu asi nějak vypadlo…

Důležité je, aby se při traverzování mezi entitami aplikoval filtr translateFromEntity, který má ten třetí parametr volitelný. Pokud není uveden, hledá se jazyk v té entitě, ze které se traverzuje.

U Tebe se při traverzování mezi entitami aplikuje filtr translate, což způsobuje Tebou popsanou chybu.

před 4 lety

jakubdvorak
Člen | 7
+
0
-

Ahoj,

v tvé ukázce je zřejmě chyba v podmínce getImplicitFilters:

if ($caller instanceof Entity) {

Takto funguje:

if ($caller->getInstance() instanceof Entity) {

Ještě bych se zeptal, v metodě translateFromEntity, co doporučuješ dát jako akci v případě, že třída není potomkem TranslatableEntity? Načtení toho defaultního jazyka jak píšeš v todo? V jakých případech to vlastně může nastat, že je translateFromEntity zavoláno tak, že $entity není instancí TranslatableEntity?

Díky moc