首页 文章

如何使用带有OctoberCMS的AJAX更新管理步骤中的数据透视字段?

提问于
浏览
0

在将相关记录链接到主记录之后,我尝试能够从服务器获取枢轴数据的一些值 . 这是输入数据透视数据的一个步骤,其中一些应该生成(手动输入它们没问题,问题是通过AJAX实现):

Related data

这是相关fields.yaml的示例

fields:
    pivot[sort]:
        label: Order
        type: number
        span: auto
    pivot[time_from_start_to_sight]:
        label: Time from start to the sight
        type: number
        span: auto
    pivot[add_route_time]:
        label: Add time
        type: number
        span: auto
    pivot[add_route_price]:
        label: Basic add. price
        type: number
        span: auto
    pivot[stay_time_default]:
        label: Default stay time
        type: number
        span: auto
    pivot[stay_time_min]:
        label: Min. stay time
        type: number
        span: auto
    pivot[stay_price]:
        label: Price per quarter of hour
        type: number
        span: auto
    _gmaps_sync:
        label: You may try to get data from Google Maps API
        type: gmapsroutesightsync
        commentAbove: Make sure you have entered Google Maps API key

如您所见,我添加了一个自定义小部件,以便能够绘制按钮 . 我甚至可以调用窗口小部件的AJAX处理程序并将新值应用于传递的数据,将它们保存到控制器内的数据库中 .

但我没有丝毫想法如何推送更新的部分或用新值更新部分 . 当然,可以通过非有组织的JS代码更新每个领域 - 但我确信这是一种聪明的方式 .

请指出最佳做法 . 谢谢 .

1 回答

  • 1

    您可能需要更新部分表单,将其从更新所有数据并保存的控制器中推送出来 .

    我想对于数据透视数据表单你已经定义了部分,它将呈现“关系”,这样你就可以更新那个部分 .

    当你使用October的ajax框架进行ajax调用时,你可以使用类似的东西

    data-request-update =“relation:'#Form-relationClassesManagePivotForm'

    要么

    如果以编程方式启动请求即可

    $.request('onRefreshTime', {
        update: { relation: '#Form-relationClassesManagePivotForm' }
    })
    

    你可以在这里详细检查api:https://octobercms.com/docs/ajax/update-partials

    这里我的透视关系名称是 "classes" 所以id是这样生成的,但你可以检查元素以获得正确的id,它将在"modal-body"内 .

    现在从控制器你只需要推送更新的部分,它将自动更新 .

    function onRefreshTime()
    {
        return [
            '#Form-relationClassesManagePivotForm' => $this->renderPartial('pivot_form')
            // or 'relation' => $this->renderPartial('pivot_form')
        ];
    }
    

    这里最好在你正在渲染页面的同一个控制器上编写这个方法,因为它已经定义了关系的定义,因此关系小部件已经构建 .

    如有任何疑惑,请在评论中告诉我 .

    更新

    您需要在更新字段的控制器中添加此代码

    return ['#myform' => $this->asExtension('RelationController')->onRelationClickManageListPivot()];
    

    并且您需要从关系管理器添加一个部分覆盖 . you can see i am adding custm id = 'id'=>"myform"

    _relation_pivot_form.htm(从关系管理器复制并粘贴到控制器文件夹中)

    <?php if ($relationManageId): ?>
    
        <?= Form::ajax('onRelationManagePivotUpdate', [
            'data' => ['_relation_field' => $relationField, 'manage_id' => $relationManageId],
            'data-popup-load-indicator' => true,
            'id'=>"myform"
        ]) ?>
    
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="popup">&times;</button>
                <h4 class="modal-title"><?= e(trans('backend::lang.relation.related_data', ['name'=>trans($relationLabel)])) ?></h4>
            </div>
            <div class="modal-body">
                <?= $relationPivotWidget->render(['preview' => $this->readOnly]) ?>
                <button
                    type="button"
                    data-request="onPivotRefresh"
                    class="btn btn-primary">
                    Refresh Partial
                </button>
    
            </div>
            <div class="modal-footer">
                <?php if ($this->readOnly): ?>
                    <button
                        type="button"
                        class="btn btn-default"
                        data-dismiss="popup">
                        <?= e(trans('backend::lang.relation.close')) ?>
                    </button>
                <?php else: ?>
                    <button
                        type="submit"
                        class="btn btn-primary">
                        <?= e(trans('backend::lang.relation.update')) ?>
                    </button>
                    <button
                        type="button"
                        class="btn btn-default"
                        data-dismiss="popup">
                        <?= e(trans('backend::lang.relation.cancel')) ?>
                    </button>
                <?php endif ?>
            </div>
    
        <?= Form::close() ?>
    
    <?php else: ?>
    
        <?= Form::ajax('onRelationManagePivotCreate', [
            'data' => ['_relation_field' => $relationField, 'foreign_id' => $foreignId],
            'data-popup-load-indicator' => true
        ]) ?>
    
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="popup">&times;</button>
                <h4 class="modal-title"><?= e(trans('backend::lang.relation.related_data', ['name'=>trans($relationLabel)])) ?></h4>
            </div>
            <div class="modal-body">
                <?= $relationPivotWidget->render() ?>
            </div>
            <div class="modal-footer">
                <button
                    type="submit"
                    class="btn btn-primary">
                    <?= e(trans('backend::lang.relation.add')) ?>
                </button>
                <button
                    type="button"
                    class="btn btn-default"
                    data-dismiss="popup">
                    <?= e(trans('backend::lang.relation.cancel')) ?>
                </button>
            </div>
    
        <?= Form::close() ?>
    
    <?php endif ?>
    

    我认为它应该做你的工作 . 如果它不工作,那么我需要你的代码;)

相关问题