扩展后端列表对象

时间:2018-01-19 13:20:41

标签: octobercms octobercms-plugins octobercms-backend

如何扩展后端显示的列表项?

我正在尝试使用此功能:

listExtendRecords($records)

问题是我需要重新创建相同的对象$ records,但我想将自定义数据添加到它。例如,我的记录是来自JK Shop插件的订单。我需要的是从这些订单中取出所有产品,并将每个产品作为不同的列表项。

我可以在这个函数中做这些更改,只返回$记录,但是我怎样才能在这里创建一个新的项目对象?我尝试使用:

$new = new Production();
return $new;

但我明白了:

  

调用未定义的方法October \ Rain \ Database \ QueryBuilder :: currentPage()

如何创建一个可以返回到后端列表的新工作对象?

1 个答案:

答案 0 :(得分:1)

嗯,从您的问题中,您想要显示related items订单产品under the订单记录`它自己,

  

似乎不可能使用扩展,或者如果我们使用那个东西可能会变得更加困难/复杂

我们可以使用small trick

对于该特定列表,override partial我们list,为此,我们可以使用其config_list.yaml

使用order列表配置添加此附加选项

....
toolbar:
buttons: list_toolbar
search:
    prompt: 'backend::lang.list.search_prompt'
recordUrl: 'hardiksatasiya/demotest/demo/update/:id'
// add customViewPath
customViewPath: $/hardiksatasiya/demotest/controllers/demo/list_override

现在我们覆盖2个部分(我已经从modules\backend\widgets\lists\partials复制了它们)

_list_body_rows.htm
_list_body_row.htm

我在那里修改内容

  

<强> _list_body_rows.htm

<?php foreach ($records as $record): ?>
    <?= $this->makePartial('list_body_row', [
        'record' => $record, 
        'treeLevel' => $treeLevel, 
        'custom' => isset($custom) ? true : false]) 
?>
<?php endforeach ?>
  

<强> _list_body_row.htm

<?php
    $expanded = $showTree ? $this->isTreeNodeExpanded($record) : null;
    $childRecords = $showTree ? $record->getChildren() : null;
    $treeLevelClass = $showTree ? 'list-tree-level-'.$treeLevel : '';
?>
<tr class="<?= $treeLevelClass ?> <?= $this->getRowClass($record) ?>">
    <!-- we are using that custom variable here we dont want to show check box for our products-->
    <?php if ($showCheckboxes && $custom == false): ?>
        <?= $this->makePartial('list_body_checkbox', ['record' => $record]) ?>
    <?php endif ?>

    <?php if ($showTree): ?>
        <?= $this->makePartial('list_body_tree', [
            'record' => $record,
            'expanded' => $expanded,
            'childCount' => $record->getChildCount()
        ]) ?>
    <?php endif ?>

    <!-- we are using that custom variable here 
        and make our row seperatly as we need
        for all item/product record this partial executed so
        we code it for single row it will be repeated through all product items automatically-->
    <?php if($custom): ?>
        <td> <!-- checkbox column we make it blank--> </td>
        <!-- 
            colspan based on requirement 
            you can fully customize your td tags from here
        -->
        <td colspan="<?= count($columns) ?>"> <a href="/backend/products/edit/<?= $record->id ?>"> <?= $record->name ?> </a></td>

    <?php else: ?>

        <?php $index = $url = 0; foreach ($columns as $key => $column): ?>
            <?php $index++; ?>
            <td class="list-cell-index-<?= $index ?> list-cell-name-<?= $column->getName() ?> list-cell-type-<?= $column->type ?> <?= $column->clickable ? '' : 'nolink' ?> <?= $column->cssClass ?>">
                <?php if ($column->clickable && !$url && ($url = $this->getRecordUrl($record))): ?>
                    <a <?= $this->getRecordOnClick($record) ?> href="<?= $url ?>">
                        <?= $this->getColumnValue($record, $column) ?>
                    </a>
                <?php else: ?>
                    <?= $this->getColumnValue($record, $column) ?>
                <?php endif ?>
            </td>
        <?php endforeach ?>

    <?php endif; ?>

    <?php if ($showSetup): ?>
        <td class="list-setup">&nbsp;</td>
    <?php endif ?>
</tr>

<?php if ($showTree && $expanded): ?>
    <?= $this->makePartial('list_body_rows', ['records' => $childRecords, 'treeLevel' => $treeLevel+1]) ?>
<?php endif ?>

<!-- you can customise this condition basde on your order have items or not
i used simple relation condition here -->
<?php if ($record->relation): ?>

    <?php $childRecords = is_array($record->relation) ? $record->relation : [$record->relation]; ?>
    <?php
        // currently as $childRecords i used relation but you can create your own model array
        // and pass here it will be received in next iteration
        // notice we are passing $custom variable and we also override
        // _list_body_rows.htm and it will loop through all records and pass
        // $custom  variable and it will be true based on its existance
        // if we pass custom variable it will pass it also with true other wise
        // it will pass it false
    ?>

    <?= $this->makePartial('list_body_rows', ['records' => $childRecords, 'treeLevel' => $treeLevel+1, 'custom' => true]) ?>
<?php endif ?>
  

它会为您提供这样的输出

enter image description here

我还added comments new paritals如果您需要mroe信息,请如何使用它们,请发表评论。