ORO CRM datagrid refresh after inline edit failed by missing parameter

332 views Asked by At

I have a datagrid:

datagrids:
  gates-under-location-grid:
    inline_editing:
      enable: true
    extended_entity_name: Entity\Gate
    source:
      type: orm
      query:
        select:
          - g
          - l
          - ancestor.id as ancestorId
          - ancestor.name as ancestorName
        from:
          - { table: Entity\Gate, alias: g }
        join:
          left:
            - { join: g.locations, alias: l }
          inner:
            - { join: Entity\LocationClosure, alias: lc, conditionType: WITH, condition: 'l.id=lc.descendant' }
            - { join: Entity\Location, alias: ancestor, conditionType: WITH, condition: 'ancestor=:rootLocation'}
        where:
          and:
            - lc.ancestor=:rootLocation
      bind_parameters:
        rootLocation: ~
      hints:
        - HINT_TRANSLATABLE
    columns:
      name:
        label:            'gate.datagrid.field.name'
        align:            left
      locations:
        label:            'gate.datagrid.field.locations'
        align:            left
        data_name:        locations
        data:             locations
        type:             twig
        template:         Partials/Datagrid/Gate:locations_cell_in_gate_under_location_grid.html.twig
        frontend_type:    html
        inline_editing:
          behaviour: enable_selected
          editor:
            view: oroform/js/app/views/editor/related-id-select-editor-view
            view_options:
              value_field_name: locations.name
              placeholder: 'placeholder'
          autocomplete_api_accessor:
            class: oroentity/js/tools/entity-select-search-api-accessor
            entity_name: Entity\Location
            search_handler_name: locations
            value_field_name: id
            field_name: name
            label_field_name: name
    properties:
      id: ~
      view_link:
        type: url
        route: gate_view
        params: [ id ]
      update_link:
        type: url
        route: gate_update
        params: [ id ]
    sorters:
      columns:
        name:             { data_name: g.name }
      default:
        name:  ASC
    filters:
      columns:
        name:
          type: string
          data_name: g.name
    actions:
      view:
        type:         navigate
        label:        'common.grid.details'
        link:         view_link
        icon:         eye
      update:
        type:         navigate
        label:        'common.grid.edit'
        icon:         edit
        link:         update_link
    options:
      entityHint: 'gate.datagrid.entityhint'
      export: true
      entity_pagination: true
      routerEnabled: false

The location cell editor template is in the locations_cell_in_gate_under_location_grid.html file:

{% import 'OroUIBundle::macros.html.twig' as UI %}
<span class="inline-actions-element">
    {% for location in value %}
        <span class="tags-container">
            <a href="#" title="{{ location.name }}" class="tags-container__tag-entry">
                <span>
                    {{ location.name }}
                </span>
            </a>
        </span>
    {% endfor %}
    <span class="inline-actions-element_actions inline-actions-element_wrapper" data-role="container">
        {{ UI.clientButton({
            'dataUrl': path('gate_locations_update',
                            {
                                'gateId': record.rootEntity.id,
                                'locationId': record.getValue('ancestorId')
                            }),
            'aCss': 'inline-actions-btn inline-actions-btn--size-s',
            'iCss': 'fa-pencil',
            'dataId': record.rootEntity.id,
            'title' : 'Edit'|trans,
            'label' : 'Edit'|trans,
            'widget' : {
                'type' : 'dialog',
                'multiple' : false,
                'reload-grid-name' : 'gates-under-location-grid',
                'options' : {
                    'alias': 'gate_locations_update_dialog',
                    'stateEnabled': false,
                    'dialogOptions' : {
                        'title' : 'gate.datagrid.under_location.locations_edit_widget.title'|trans,
                        'allowMaximize': false,
                        'allowMinimize': false,
                        'width': 600,
                        'modal': true,
                    },
                },
            },
        }) }}
    </span>

Controller action is the following:



    /**
     * Shows editForm, or updates Gate with given ID
     *
     * @Route("/locations-edit/gate/{gateId}/location/{locationId}", name="gate_locations_update", requirements={"gateId"="\d+","locationId"="\d+"})
     * @Template("Gate:locations_update.html.twig")
     * @ParamConverter("gate", class="Entity\Gate", options={"id" = "gateId"})
     * @ParamConverter("location", class="Entity\Location", options={"id" = "locationId"})
     *
     * @param Request $request
     * @param Gate $gate
     * @param Location $location
     *
     * @return array|RedirectResponse
     */
    public function updateLocationsAction(Request $request, Gate $gate, Location $location)
    {
        $form = $this->get('form.factory')
                    ->create(GateLocationsType::class, $gate, ['attr' => ['rootLocation' => $location]]);
        return $this->get('oro_form.update_handler')
            ->update(
                $gate,
                $form,
                $this->get('translator')->trans('common.processes.successful_saved'),
                $request
            );
    }

I wanted to refresh the cell after inline edit, but since i didn't find any chance, it would be good to refresh whole datagrid. The problem is with this solution, after cell data stored, i got the Data loading failed, try reloading the page. If the issue appears again please contact your administrator. message, and it's logged in the log file:

request.CRITICAL: Uncaught PHP Exception Oro\Bundle\DataGridBundle\Exception\InvalidArgumentException: "Cannot bind datasource parameter "rootLocation", there is no datagrid parameter with path "rootLocation"." at vendor/oro/platform/src/Oro/Bundle/DataGridBundle/Datasource/Orm/ParameterBinder.php line 164 {"exception":"[object] (Oro\\Bundle\\DataGridBundle\\Exception\\InvalidArgumentException(code: 0): Cannot bind datasource parameter \"rootLocation\", there is no datagrid parameter with path \"rootLocation\". at app/vendor/oro/platform/src/Oro/Bundle/DataGridBundle/Datasource/Orm/ParameterBinder.php:164, Symfony\\Component\\PropertyAccess\\Exception\\NoSuchPropertyException(code: 0): The key \"rootLocation\" does exist in an array. at app/vendor/oro/platform/src/Oro/Component/PropertyAccess/PropertyAccessor.php:435)"} []

I tried to add the parameters, but these efforts didn't affected on the error.

Could somebody help, how to pass the rootLocation parameter for the refresh? Thanks in advance!

1

There are 1 answers

0
Andrey Yatsenko On

A custom controller is not a recommended way to handle the inline editing in the datagrid.

Please follow the official documentation on Creating editable data grid cells in OroPlatform applications.

Also, there is a general reference on inline editing in the OroPlatform datagrids, where you can find the documentation about all the existing inline editor options. You can use one of them, instead of implementing the custom one, or you can use it as a base for creating your own editor.