Zum Inhalt springen

m:n-Relation in List-View einbinden

Erstellt am 11. Februar 2015 · 2 Antworten · letzte Antwort am 13. Februar 2015

Tags: TYPO3 6.x, Frage

jp_dev ·

Hallo,
stehe vor folgendem Problem:
Ich hab eine Kategorie die mit Produkten gefüllt werden kann (Relation 1:n) und dann noch Accessoires in denen der Redakteur verschiedene Kategorien zu einem Accessoire hinzufügen kann (m:n). Da sich die Accessoires regelmäßig ändern, die Produkte jedoch nicht, soll dies auch so bleiben.
aggregateRoot ist die Kategorie.

Die Produkte lassen sich Problemlos auslesen, nur schaffe ich es irgendwie nicht, die Accessoires einzubinden.
Mir ist aufgefallen dass es im TCA der Kategorien keinen Verweis auf Accessoires gibt, wie es bei den Produkten der falls ist (die Extension ist mit Extension Builder angelegt worden).
Was mach ich falsch?

Controller:

class XXXFamilyController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

	/**
	 * xxxFamilyRepository
	 * 
	 * @var \XXXProducts\XXXproducts\Domain\Repository\XXXFamilyRepository
	 * @inject
	 */
	protected $xxxFamilyRepository = NULL;

	/**
	 * action list
	 * 
	 * @return void
	 */
	public function listAction() {
        $getPresetCategory =  $this->settings[family];

        if(!isset($getPresetCategory)) {
            $getPresetCategory = 1;
        }

        $xxxFamilies = $this->xxxFamilyRepository->findThisFam($getPresetCategory);

		$this->view->assign('xxxFamilies', $xxxFamilies);
	}
}

Repository:

class XXXFamilyRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
    /**
     * SELECT *
     *
     * @return mixed
     *
     */
    public function findAll() {
        $query = $this->createQuery();
        $query->getQuerySettings()->setRespectStoragePage(FALSE);
        $result = $query->execute();
        return $result;
    }

    public function findThisFam($fam) {
        $query = $this->createQuery();
        $query->getQuerySettings()->setRespectStoragePage(FALSE);

        $condition = $query->equals('uid', $fam);
        $params1 = $query->logicalAnd($condition);

        $query->matching($params1);
        $query->setLimit(1);
        $result = $query->execute();

        $result['accessory'] = $this->findAccss($fam);
        return $result;
    }
    public function findAccss($fam) {
        $query = $this->createQuery();
        $query->getQuerySettings()->setRespectStoragePage(FALSE);
        $query->statement('
            SELECT ac.option_title,ac.order_no,ac.description,ac.reference
            FROM tx_xxxproducts_domain_model_accessory ac
            JOIN tx_xxxproducts_accessory_xxxfamily_mm mm ON mm.uid_local = ac.uid
            WHERE mm.uid_foreign = '.$fam
        );
        $accessory = $query->execute();

        return $accessory;
    }

    protected $defaultOrderings = array(
        'sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING,
    );
}

Für das Fluid habe ich bereits folgende Schreibweisen ausprobiert:

<f:for each="{xxxFamily[accessory]}" as="accessory">
{accessory.optionTitle}
</f:for>
<f:for each="{xxxFamily.{accessory}}" as="accessory">
{accessory.optionTitle}
</f:for>
<f:for each="{xxxFamily.accessory}" as="accessory">
{accessory.optionTitle}
</f:for>
<f:for each="xxxFamily{accessory}}" as="accessory">
{accessory.optionTitle}
</f:for>
jp_dev ·

Gleiches Problem, neuer Ansatz:
Kann ich vom Kategorie-Model aus die genannte Repository-Anfrage aufrufen und diese über das Accesoir-Model laufen lassen?

Also ganz grob (funktioniert noch nicht):

Model-Kategory:

    public function getXXXAccessory() {
            $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
            $myRepository = $objectManager->create('XXXProducts\XXXproducts\Domain\Repository\XXXFamilyRepository');
            $this->objects = $myRepository->findAccss(5);

            echo 'Test';
            echo '<pre>';
            var_dump($this->objects);
            echo '</pre>';
exit;

            $this->xxxAccessory = $this->objects;
        return $this->xxxAccessory;

Repository-Kategory

    /**
     * Test
     *
     * @param XXXProducts\XXXproducts\Domain\Model\Accessory $accessory The reference post
     * @return XXXProducts\XXXproducts\Domain\Model\Accessory
     *
     */

    public function findAccss(XXXProducts\XXXProducts\Domain\Model\Accessory $accessory) {
        $query = $this->createQuery();
        $query->getQuerySettings()->setRespectStoragePage(FALSE);
        $query->statement('
            SELECT ac.option_title,ac.order_no,ac.description,ac.reference
            FROM tx_xxxproducts_domain_model_accessory ac
            JOIN tx_xxxproducts_accessory_xxxfamily_mm mm ON mm.uid_local = ac.uid
            WHERE mm.uid_foreign = 5'
        );
        $accessory = $query->execute();

        return $accessory;
    }

Edit:
Hier im Forum habe ich einen älteren Beitrag gefunden, der mir etwas weiter geholfen hat:
#117391
Allerdings bekomm ich nur kein Ergebniss zurück bzw. eine leere Seite, egal ob mit oder Model angaben im Repository...

jp_dev ·

Für interessierte:
Da mir keine bessere Lösung eingefallen ist:

Model-Kategorie

          if(is_null($this->objects)){

            $uidString = explode(':',$this);
            if(isset($uidString[1])){
                $uid = $uidString[1];
            }

            $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');

            $Repository = $objectManager->create('XXXProducts\XXXproducts\Domain\Repository\AccessoryRepository');
            $this->xxxAccessory = $Repository->findAccss($uid);
        }
        return $this->xxxAccessory;

Repository:

    public function findAccss(XXXProducts\XXXProducts\Domain\Model\Accessory $accessory) {
    $query = $this->createQuery();
    $query->getQuerySettings()->setRespectStoragePage(FALSE);
    $query->statement('
    SELECT ac.option_title,ac.order_no,ac.description,ac.reference
    FROM tx_xxxproducts_domain_model_accessory ac
    JOIN tx_xxxproducts_accessory_xxxfamily_mm mm ON mm.uid_local = ac.uid
    WHERE mm.uid_foreign = '.$accessory
    );
    $accessory = $query->execute();
     
    return $accessory;
    }

Falls jemand eine schönere Lösung hat...