Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

YOrm: Rückgabe-Klasse von getRelatedDataset() und getRelatedCollection() definieren können. #1251

Closed
alxndr-w opened this issue Mar 7, 2022 · 5 comments
Milestone

Comments

@alxndr-w
Copy link
Contributor

alxndr-w commented Mar 7, 2022

Ich habe ein Addon, welches rex_yform_manager_dataset erweitert

<?php
class event_category extends \rex_yform_manager_dataset
{
}
<?php
class event_date extends \rex_yform_manager_dataset
{
    public function getCategories()
    {
        $this->categories = $this->getRelatedCollection('event_category_id');
        return $this->categories;
    }
}

und darauf aufbauend ein weiteres Addon

<?php

class msg_event_category extends event_category
{
// Eigene Methoden
}
<?php

class msg_event_date extends event_date
{
    public function getCategories()
    {
        $this->categories = $this->getRelatedCollection('event_category_id');
        return $this->categories;
    }
}

Wenn ich im Objekt von msg_event_date die Methode getRelatedCollection() aufrufe, erhalte ich ein event_category-Objekt zurück und kein msg_event_category-Objekt.

Wie kann ich definieren, nach welcher dataset-Klasse sich getRelatedCollection() oder getRelatedDataset() richten soll?

@dergel
Copy link
Member

dergel commented Apr 9, 2022

Das lehnt sich hier an .. #1252
Im Moment ist das nicht vorgesehen. Ich schaue mir das aber noch mal an. Vielleicht gibt ja andere Wege.

@alxndr-w
Copy link
Contributor Author

In yakamara/ycom#477 habe ich mir einen alternativen Ansatz überlegt - nämlich selbst festlegen zu können, ob überhaupt das Addon die Model Class definiert - oder ob ich ggf. eine eigene Klasse definieren kann, die auf der Standard-Klasse aufbaut.

@DanielWeitenauer
Copy link
Contributor

DanielWeitenauer commented Mar 1, 2024

@alxndr-w Das scheint mir eher ein YForm-Problem zu sein. Es wird ja immer die Klasse benutzt, die du gerade per setModelClass auf die Tabelle gemappt hast. Evtl. gibt es die Mögilichkeit, deine getCategories-Methoden so zu anzupassen, dass du vor dem Aufruf dein Mapping setzt und danach das ursprüngliche wieder zurückschreibst.

Etwa so (ungetestet):

class msg_event_date extends event_date
{
    public function getCategories()
    {
        $original = rex_yform_manager_dataset::getModelClass('original_tabelle); // Tabelle merken
        rex_yform_manager_dataset::setModelClass('msg_event_category); // Eigene Tabelle setzen
        $this->categories = $this->getRelatedCollection('event_category_id');
        rex_yform_manager_dataset::setModelClass($original); // Tabelle zurückschreiben
        
        return $this->categories;
    }
}

@alxndr-w
Copy link
Contributor Author

alxndr-w commented Mar 2, 2024

Auf die Idee bin ich nicht gekommen, ich probiere das Mal aus. @DanielWeitenauer danke!

@alxndr-w
Copy link
Contributor Author

alxndr-w commented Mar 2, 2024

Mir war gar nicht klar, dass man das zur Laufzeit ändern kann. Das löst mein Anliegen.

$original = rex_yform_manager_dataset::getModelClass('rex_event_date');

rex_yform_manager_dataset::setModelClass(
    'rex_event_date',
    custom_event_date::class
);

$category = event_category::get(1);
$dates = $category->getRelatedCollection('date_id');

// stuff

rex_yform_manager_dataset::setModelClass(    
    'rex_event_date',
    $original
);

@alxndr-w alxndr-w closed this as completed Mar 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants