Zitat von
zonky
also komplett auf "Start"
Noe. .)
Aber nun mach ich es mal etwas exzessiver.
PHP-Code:
<?php
// Den service container kann man erhalten, wenn man ihn aus dem globalen scope holt,
// oder aber indem man auf das Event \MetaModelsEvents::SUBSYSTEM_BOOT
// (oder eines der konkretisierten events fuer Backend/Frontend) horcht.
/** @var \MetaModels\IMetaModelsServiceContainer $container */
$container = $GLOBALS['container']['metamodels-service-container'];
$factory = $container->getFactory();
// Referenz auf das Metamodel holen (wenn nur die id vom MetaModel bekannt ist).
$metaModel = $factory->getMetaModel($factory->translateIdToMetaModelName($TableId));
// alternativ und besser, wenn der name vom MetaModel bekannt ist:
$metaModel = $factory->getMetaModel('mm_something');
// Sprache setzen DE.
$GLOBALS['TL_LANGUAGE'] = 'de';
// Neues Item Objekt erstellen
$item = new \MetaModels\Item($metaModel, array());
// Befüllen mit Attribut text
$item->set('textfeld', $metaModel->getAttribute('textfeld')->widgetToValue('Dies ist nicht ybersetzt.', $item->get('id')));
// Befüllen mit Attribut translatedtext
$item->set('translatedtextfeld', $metaModel->getAttribute('translatedtextfeld')->widgetToValue('Dies ist deutscher text.', $item->get('id')));
// Befüllen mit Attribut url
$item->set('urlfeld', $metaModel->getAttribute('urlfeld')->widgetToValue('http://contao.org/de/', $item->get('id')));
// Speichern
$item->save();
// Sprache setzen EN.
$GLOBALS['TL_LANGUAGE'] = 'en';
// Denselben Eintrag in nun anderer Sprache abfragen.
$item = $metaModel->findById($item->get('id'));
// Wir holen uns das Item einfach nochmal neu aus der DB damit wir die aktuellen Sprachdaten fyr EN haben.
$item = $metaModel->findById($item->get('id'));
// Befüllen mit Attribut text koennen wir uns hier sparen, ist ja nicht ybersetzt.
// $item->set('textfeld', $metaModel->getAttribute('textfeld')->widgetToValue('Dies ist nicht ybersetzt.', $item->get('id')));
// Befüllen mit Attribut translatedtext
$item->set('translatedtextfeld', $metaModel->getAttribute('translatedtextfeld')->widgetToValue('This is English text.', $item->get('id')));
// Befüllen mit Attribut url wir uns hier sparen, ist ja nicht ybersetzt.
// $item->set('urlfeld', $metaModel->getAttribute('urlfeld')->widgetToValue('http://contao.org/de/', $item->get('id')));
// Speichern
$item->save();
Hintergrund bzw. wichtigste Aenderung ist, dass wir uns die Methode widgetToValue() zunutze machen, welche die Daten von einem "leicht lesbaren" Format welches auch im Backend in ein widget eingegeben werden kann (also meistens ein Text oder einfaches Array wenn tags) ins interne MetaModel Attribut Format ybersetzt.
Man muss also nicht wissen wie ein RAW Value von URL, Tags, select usw. aufgebaut ist sondern reicht einfach nur den Wert rein.
Ebenso muss man nicht ybersetzte Daten in einer anderen Sprache nicht erneut setzen, sondern es reicht aus wenn man die "veraenderten" Werte setzt.
Ebenso hole ich die Werte in einer anderen Sprache aus MetaModels raus, da ja durchaus ein Attribut aus der einen Sprache was in einer anderen aendern koennte und/oder in der neuen Sprache andere Werte erwarten koennte (Bsp. deutscher Alias bei Tags != englischer Alias) und somit das Item in dieser Sprache so nicht speicherbar waere.
Evtl. wird es so ein wenig klarer.
Lesezeichen