2016-07-29 18 views
1

Ich habe eine Verlängerung (nennen wir es mystuff) mit einem refference zu einer anderen Nebenstelle (im Modell der mystuff):extbase Repository: Zugang refference Datarecord von defaultLang wenn in anderen lang

/** 
* shoeref 
* 
* @var \My\MyCollection\Domain\Model\MyCollection 
*/ 
protected $shoeref; 

In der Vorlage I einfach darauf zugreifen mit {mystuff.shoeref.image}

Nun ist das Problem, dass MyCollection nicht in allen Sprachen existiert, während Mystuff in allen Sprachen vorhanden ist. Als Beispiel lässt sich sagen, dass wir in der Sprache L=1 sind, in der MyCollection nicht existiert. In diesem Fall ist {mystuff.shoeref} NULL.

Ich möchte auf den MyCollection-Datensatz der Standardsprache zugreifen (unabhängig davon, ob in dieser Sprache ein MyCollection-Datensatz vorhanden ist, der Datensatz der Standardsprache wäre immer in Ordnung). Aber ich habe keine Ahnung, wie ich das machen soll.

Eine Alternative, die arbeitet ist ein Datensatz für das all Langauge (L=-1) zu erstellen. Aber ich mag diese Lösung nicht, da jeder Redakteur diesen Datensatz bearbeiten kann und immer nur eine Kopie des Standardsprachdatensatzes ist.

Antwort

1

Das Problem hierbei ist, dass extbase in der Tat alle untergeordneten Datensätze mit lang uid 1 und ignorieren Sie die Standardeinträge (mit lang uid 0)

Sie $querySettings->setRespectSysLanguage(FALSE); einstellen können versuchen, verwenden holen, aber dann werden Sie alle Datensätze erhalten, bezüglich der Übersetzungseinstellungen.

Dies ist immer noch ein Pittfall in Extbase.

Ich würde meine eigene Abfrage-Anweisung schreiben, um zuerst die übergeordneten Datensätze abzurufen und dann die untergeordneten Datensätze basierend auf dem zu holen, was benötigt wird, und nicht im extbase Magic-Abrufmechanismus.

einige Infos:

https://wiki.typo3.org/Default_Orderings_and_Query_Settings_in_Repository

https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/3-implement-individual-database-queries.html

+0

Sie für die Informationen danken. Hat viel geholfen. An einem anderen Ort habe ich ein ähnliches Problem. In einem Repository versuche ich die Funktion von Ihrem ersten Link: '$ query-> getQuerySettings() -> setSysLanguageUid (0);' Dies führt zu 'Fatal error: Aufruf an undefinierte Methode ... \ Typo3QuerySettings :: setSysLanguageUid()' . Von Ihrem Link sehe ich die Dokumentation ist nur für 'extbase 6.0 - 6.2'. Aber ich habe extbase 7.6. Gibt es eine Chance, dass es eine neuere Version dieser Dokumentation gibt? – nbar

+0

Ok Ich habe die QuerySettingsInterface.php direkt überprüft und herausgefunden, dass die Funktion nun 'setLanguageUid() 'heißt. Bisher keine Dokumentation gefunden. – nbar

0

Eine Möglichkeit, es zu tun, ist eine Art einfach:

1.) erweitern das Modell ein zusätzliches Getter im Modell hinzufügen

public function getParentRecord() { 
    return $this->_localizedUid; 
} 

Dies wird die Benutzer-ID des übergeordneten Datensatz zurückkehren

2.) Erstellen Sie eine zusätzliche View Helfer

Erstellen Sie die Datei typo3conf/ext/<your-ext>/Classes/ViewHelpers/ObjectViewHelper:

<?php 

namespace <YourVendor>\YourExtKey>\ViewHelpers; 

class ObjectViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper { 

    /** 
    * @param int $id 
    * @return mixed 
    */ 
    public function render($id) { 
     $rawRecord = $GLOBALS['TYPO3_DB']->exec_SELECTgetSingleRow('*', '<tx_extkey_domain_model_fo>', 'uid=' . (int)$id); 

     $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager'); 
     /* @var $dataMapper \TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper */ 
     $dataMapper = $objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Mapper\\DataMapper'); 

     $records = $dataMapper->map('YourVendor\YourExtKey\Domain\Model\YourModel', array($rawRecord)); 
     $record = array_shift($records); 

     $this->templateVariableContainer->add('obj', $record); 
     $output = $this->renderChildren(); 
     $this->templateVariableContainer->remove('obj'); 
     return $output; 
    } 
} 

Vergessen Sie nicht, alle Orte der adoptieren Hersteller, der Tabellenname und das Modell!

3.: Nehmen Sie die Ansicht

nun Ihre Vorlage ändern und verwenden die neue Viewhelper

<f:if condition="{model.parentRecord} > 0"> 
    <c:object id="{model.parentRecord}"> 
    <f:debug>{obj}</f:debug> 
    </c:object> 
</f:if> 

Sie werden jetzt den übergeordneten Datensatz erhalten