Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

Data Model Questions /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Ajax form call and save a many_many relation


Go to End


2 Posts   1824 Views

Avatar
m-phil

Community Member, 37 Posts

12 March 2014 at 11:37pm

Edited: 20/03/2014 2:05am

Hey there,
[SS3] I want to refactore my form action method... but got a problem with the $form parameter using ajax.
It works with parameter $data only and then using $db = DB::query('INSERT' or 'UPDATE'); but now I need to update a many_many table ("campaign_campaignphases") and don't want to create all SQL queries manually.

jQuery ajax call:

$('form[data-async] .btn-primary').on('click', function(event) {
        var form = $(this).closest('form');
        // Get the specific action i.e. SaveCampaign
        var action = $(this).attr('name').split('action_')[1];

        $.ajax({
            type: form.attr('method'),
            url: action,
            data: form.serialize(),
            success: function(response, status) {
                   // doing some...
            }
        });

and the action itself in CampaignHolderPage.php should update a Campaign DataObject with

private static $many_many = array(
        'CampaignPhases' => 'CampaignPhase'
 );

public function SaveCampaign($data, $form) {
            // Existing or new entry
            $dbId = CampaignHolderPage::decryptId($data['ID']);
            if ($data['ID'] != '' && $object = DataObject::get_by_id('Campaign', $dbId)) {
                $form->saveInto($object);
                $object->write();

                // Phases
                $selectedElements = $data['CampaignPhases'];
                foreach($selectedElements as $selectedElement => $selectedId) {
                    $reference = DataObject::get_by_id('CampaignPhase', $selectedId);
                    $object->CampaignPhases()->add($reference);
                    unset($reference);
                }
                ...
            } else {
                // Update...
                $object = new Campaign();
                $form->saveInto($object);
                $object->write();
                ...
            }
            ...

Request error:
ERROR [Warning]: Missing argument 2 for CampaignHolderPage_Controller::SaveCampaign()

Thx for any ideas or helping links

Avatar
m-phil

Community Member, 37 Posts

13 March 2014 at 7:36am

My question is: How can I get $form->saveInto() work via ajax?