maxDubovsky
maxDubovsky

Could you please forward me to a good article about how to use Polymorphic relations? After making a few tries it seems the RelationRender fails to render poly relations if I use <?= $this->relationRender('tags'); ?> for example. I've tried to use in fields definition

tags:
        label: Tags
        type: checkboxlist

and checkboxes are rendered but relation data is not saved.

I'm trying to make a tags for the companies and categories :

Company:

public $morphMany = [
    'tags' => ['Max\PluginName\Models\Tag', 'table' => 'max_taggables', 'name'=>'taggable'],
];

Tag:

public $morphTo  = [
    'companies' => ['Max\PluginName\Models\Company', 'table' => 'max_taggables', 'name'=>'taggable'],
];

I would like to acheeve the same relation form as for the belongsToMany relation which works fine with definition like:

tags:
    label: Tags
    view:
        list: ~/plugins/max/pluginname/models/tag/columns.yaml
        toolbarButtons: add|remove
    manage:
        showSearch: true
        recordsPerPage: 10
        list: ~/plugins/acme/cmmp/models/tag/columns.yaml

Last updated

aaron.humphreys
aaron.humphreys

To make this work, you will need to edit the RelationsController.php file in /modules/backend/behaviors/RelationController.php

You will have to add in the morph cases in several places. Looking at the docs, they do not support Polymorphic relations in the backend https://octobercms.com/docs/backend/relations#relation-display

I don't know why, but this is painful.

maxDubovsky
maxDubovsky

Thanks for suggestion, but I did it via new FormWidget. I passed needed data to it and I work in my widget class to acheeve logics. relationcontroller stays the same in this case.

chris10207
chris10207

Hi Max, any possibility for you to share your code on this widgetform please ? it looks an interesting idea to solve this problem indeed, thanks

maxDubovsky
maxDubovsky

Chris , Like I wrote before the RelationController saves the data from form so the only thing was necessary is to display these in a correct way:

<input type="checkbox" id="checkbox_Form-field-Company-tags_'.$tag->id.'" name="Company[tags]['.$tag->id.']" value="'.$tag->id.'" checked="checked">

This form widget is very simple and I had no time to make it flexible for all fields. I have to remake it in the future.

https://memorialservices.lv/tests/formwidgets.rar

But there was a tutorial video on Vimeo not so long time back about how to extend relationController for deeper then 3 levels, I think the same tutorial can be used for this task as well.

chris10207
chris10207

Hi Max, thanks for your reply. I cant seem to open the rar file, it keep looping while uncompressing it. I am using a Mac, perhaps that is the reason ? I think the video you are referring to is the one demoing the acme.formist plugin, is that right ? It helps well for the creation of a new morph relation model in a modal window. What I dont see is how to display the morph relation model in the first level form so that the user does not need to click on a button to open and see the morph relation model data. Do you see what I mean ?

maxDubovsky
daniel.rojas58117
daniel.rojas58117

maxDubovsky said:

Here is the zip: https://memorialservices.lv/tests/formwidgets.zip

I hope it will help

Hi max, any chance you can reupload the widget again? Thanks.

maxDubovsky
maxDubovsky

daniel.rojas58117 said:

maxDubovsky said:

Here is the zip: https://memorialservices.lv/tests/formwidgets.zip

I hope it will help

Hi max, any chance you can reupload the widget again? Thanks.

Sorry, this was a few years ago. But there should be a doc how to create formwidget (use artisan).

In the formWidget php file I used:

public function render() { $this->prepareVars(); return $this->makePartial('tags'); }

/**
 * Prepares the form widget view data
 */
public function prepareVars()
{
    $this->vars['name'] = $this->formField->getName();
    $this->vars['value'] = $this->getLoadValue();
    $this->vars['model'] = $this->model;
    $this->vars['var'] = 'pased_value';

    $this->vars['model_id'] = $this->model->id;

    if ($company = Company::whereId($this->model->id)->first()){
        $this->vars['alltags'] = $company->tags;
    }else{
        $this->vars['alltags'] = array();
    }
}
daniel.rojas58117
daniel.rojas58117

thanks a lot for the quick answer!

1-10 of 10