Сайдбар в форме представляет из себя вынесенный в бок secondaryTabs из вашего fields.yaml
Поэтому, чтобы там отображались элементы формы, у вас должен быть указаны поля в secondaryTabs

Приступим к реализации.

Первое что вам нужно сделать, это добавить переменную в ваш контроллер.
public $bodyClass = 'compact-container';

Пример:

namespace OctoClub\Tutorial\Controllers;

use BackendMenu;
use Backend\Classes\Controller;

class Shops extends Controller
{
    public $bodyClass = 'compact-container';
    
    // [...]
}

Следуя из названия этой переменной, вы добавляете к body класс compact-container. Этот класс уберет отступы у вашей формы, и сайдбар не будет висеть "в воздухе".

Следующий шаг, это добавление в view шаблоны вашего контроллера добавить сам сайдбар и указать что в него выводить.

Открываем первый view файл create.htm в папке вашего контроллера, там мы увидим дефолтный шаблон верстки, который создает нам октябрь, когда мы создаем контроллер через artisan или builder.
Имеет он такой вид:

<?php Block::put('breadcrumb') ?>
    <ul>
        <li><a href="<?= Backend::url('octoclub/tutorials/shops') ?>">Shops</a></li>
        <li><?= e($this->pageTitle) ?></li>
    </ul>
<?php Block::endPut() ?>

<?php if (!$this->fatalError): ?>

    <?= Form::open(['class' => 'layout']) ?>

        <div class="layout-row">
            <?= $this->formRender() ?>
        </div>

        <div class="form-buttons">
            <div class="loading-indicator-container">
                <button
                    type="submit"
                    data-request="onSave"
                    data-hotkey="ctrl+s, cmd+s"
                    data-load-indicator="Creating Shop..."
                    class="btn btn-primary">
                    Create
                </button>
                <button
                    type="button"
                    data-request="onSave"
                    data-request-data="close:1"
                    data-hotkey="ctrl+enter, cmd+enter"
                    data-load-indicator="Creating Shop..."
                    class="btn btn-default">
                    Create and Close
                </button>
                <span class="btn-text">
                    or <a href="<?= Backend::url('octoclub/tutorials/shops') ?>">Cancel</a>
                </span>
            </div>
        </div>

    <?= Form::close() ?>

<?php else: ?>

    <p class="flash-message static error"><?= e($this->fatalError) ?></p>
    <p><a href="<?= Backend::url('octoclub/tutorials/shops') ?>" class="btn btn-default">Return to shops list</a></p>

<?php endif ?>

Первое что мы делаем, это заменяем способ вывода полей. Как мы видим, сейчас просто вызывается функция внутри формы:

// [..]
<?= Form::open(['class' => 'layout']) ?>

    <div class="layout-row">
        <?= $this->formRender() ?>
    </div>
    
    // [..]
<?= Form::close() ?>

// [..]

Функция $this->formRender() выводит все обычные поля, вкладки, вторичные вкладки друг за другом.
Нам это не нужно. Заменяем это на:

<?php Block::put('form-contents') ?>

    <div class="layout-row">
        <?= $this->formRenderOutsideFields() ?>
        <?= $this->formRenderPrimaryTabs() ?>
    </div>
    
    // [..]
    
<?php Block::endPut() ?>

// [..]

Здесь мы пока не создаем форму, мы создаем фрагмент form-contents содержащий в себе обычные поля и вкладки, которые мы позже вставим в шаблон.

Сразу под этим блоком мы добавляем наш сайдбар.

<?php Block::put('form-sidebar') ?>
    <div class="hide-tabs"><?= $this->formRenderSecondaryTabs() ?></div>
<?php Block::endPut() ?>

И теперь нам нужно вызвать шаблон формы с сайдбаром.

<?php Block::put('body') ?>
    <?= Form::open(['class'=>'layout stretch']) ?>
        <?= $this->makeLayout('form-with-sidebar') ?>
    <?= Form::close() ?>
<?php Block::endPut() ?>

Финальный вид файла create.htm:

<?php Block::put('breadcrumb') ?>
    <ul>
        <li><a href="<?= Backend::url('octoclub/tutorials/shops') ?>">Shops</a></li>
        <li><?= e($this->pageTitle) ?></li>
    </ul>
<?php Block::endPut() ?>

<?php if (!$this->fatalError): ?>

    <?php Block::put('form-contents') ?>

        <div class="layout-row">
            <?= $this->formRenderOutsideFields() ?>
            <?= $this->formRenderPrimaryTabs() ?>
        </div>

        <div class="form-buttons">
            <div class="loading-indicator-container">
                <button
                    type="submit"
                    data-request="onSave"
                    data-hotkey="ctrl+s, cmd+s"
                    data-load-indicator="Creating Shop..."
                    class="btn btn-primary">
                    Create
                </button>
                <button
                    type="button"
                    data-request="onSave"
                    data-request-data="close:1"
                    data-hotkey="ctrl+enter, cmd+enter"
                    data-load-indicator="Creating Shop..."
                    class="btn btn-default">
                    Create and Close
                </button>
                <span class="btn-text">
                    or <a href="<?= Backend::url('octoclub/tutorials/shops') ?>">Cancel</a>
                </span>
            </div>
        </div>

    <?php Block::endPut() ?>

    <?php Block::put('form-sidebar') ?>
        <div class="hide-tabs"><?= $this->formRenderSecondaryTabs() ?></div>
    <?php Block::endPut() ?>

    <?php Block::put('body') ?>
        <?= Form::open(['class'=>'layout stretch']) ?>
            <?= $this->makeLayout('form-with-sidebar') ?>
        <?= Form::close() ?>
    <?php Block::endPut() ?>


<?php else: ?>

    <p class="flash-message static error"><?= e($this->fatalError) ?></p>
    <p><a href="<?= Backend::url('octoclub/tutorials/shops') ?>" class="btn btn-default">Return to shops list</a></p>

<?php endif ?>

Все. Теперь если вы попробуете создать новую запись в вашей модели через Backend ваши SecondaryTabs будут отображаться в сайдбаре.

Точно так-же надо выполнить замену кода в файле update.htm, чтобы при редактировании записи отображался сайдбар.

Я не буду расписывать что заменять. Я просто покажу вариант до и после. Чтобы вы могли свериться.

До:

<?php Block::put('breadcrumb') ?>
    <ul>
        <li><a href="<?= Backend::url('octoclub/tutorials/shops') ?>">Shops</a></li>
        <li><?= e($this->pageTitle) ?></li>
    </ul>
<?php Block::endPut() ?>

<?php if (!$this->fatalError): ?>

    <?= Form::open(['class' => 'layout']) ?>

        <div class="layout-row">
            <?= $this->formRender() ?>
        </div>

        <div class="form-buttons">
            <div class="loading-indicator-container">
                <button
                    type="submit"
                    data-request="onSave"
                    data-request-data="redirect:0"
                    data-hotkey="ctrl+s, cmd+s"
                    data-load-indicator="Saving Shop..."
                    class="btn btn-primary">
                    <u>S</u>ave
                </button>
                <button
                    type="button"
                    data-request="onSave"
                    data-request-data="close:1"
                    data-hotkey="ctrl+enter, cmd+enter"
                    data-load-indicator="Saving Shop..."
                    class="btn btn-default">
                    Save and Close
                </button>
                <button
                    type="button"
                    class="oc-icon-trash-o btn-icon danger pull-right"
                    data-request="onDelete"
                    data-load-indicator="Deleting Shop..."
                    data-request-confirm="Delete this Shop?">
                </button>
                <span class="btn-text">
                    or <a href="<?= Backend::url('octoclub/tutorials/shops') ?>">Cancel</a>
                </span>
            </div>
        </div>

    <?= Form::close() ?>

<?php else: ?>

    <p class="flash-message static error"><?= e($this->fatalError) ?></p>
    <p><a href="<?= Backend::url('octoclub/tutorials/shops') ?>" class="btn btn-default">Return to shops list</a></p>

<?php endif ?>

После:

<?php Block::put('breadcrumb') ?>
    <ul>
        <li><a href="<?= Backend::url('octoclub/tutorials/shops') ?>">Shops</a></li>
        <li><?= e($this->pageTitle) ?></li>
    </ul>
<?php Block::endPut() ?>

<?php if (!$this->fatalError): ?>

    <?php Block::put('form-contents') ?>
        <div class="layout-row">
            <?= $this->formRenderOutsideFields() ?>
            <?= $this->formRenderPrimaryTabs() ?>
        </div>
        <div class="form-buttons">
            <div class="loading-indicator-container">
                <button
                    type="submit"
                    data-request="onSave"
                    data-request-data="redirect:0"
                    data-hotkey="ctrl+s, cmd+s"
                    data-load-indicator="Saving Shop..."
                    class="btn btn-primary">
                    <u>S</u>ave
                </button>
                <button
                    type="button"
                    data-request="onSave"
                    data-request-data="close:1"
                    data-hotkey="ctrl+enter, cmd+enter"
                    data-load-indicator="Saving Shop..."
                    class="btn btn-default">
                    Save and Close
                </button>
                <button
                    type="button"
                    class="oc-icon-trash-o btn-icon danger pull-right"
                    data-request="onDelete"
                    data-load-indicator="Deleting Shop..."
                    data-request-confirm="Delete this shop?">
                </button>
                <span class="btn-text">
                    or <a href="<?= Backend::url('octoclub/tutorials/shops') ?>">Cancel</a>
                </span>
            </div>
        </div>
    <?php Block::endPut() ?>

    <?php Block::put('form-sidebar') ?>
        <div class="hide-tabs"><?= $this->formRenderSecondaryTabs() ?></div>
    <?php Block::endPut() ?>

    <?php Block::put('body') ?>
        <?= Form::open(['class'=>'layout stretch']) ?>
            <?= $this->makeLayout('form-with-sidebar') ?>
        <?= Form::close() ?>
    <?php Block::endPut() ?>


<?php else: ?>

    <p class="flash-message static error"><?= e($this->fatalError) ?></p>
    <p><a href="<?= Backend::url('octoclub/tutorials/shops) ?>" class="btn btn-default">Return to shops list</a></p>

<?php endif ?>

Решение возникших проблем

Если вы следовали инструкции, то проблем быть не должно. В любом случае если что будет не так, вы можете написать сюда, и я постараюсь вам помочь.

месяц спустя

Спасибо! Всё получилось.
Вынес настройки в этот сайтбар - теперь стало удобно. Круть!

год спустя

Всем привет. Спасибо огромное за подробный мануал. В October я новичек, но это только пока)

<?php Block::put('body') ?>
<?= Form::open(['class'=>'layout stretch']) ?>
<?= $this->makeLayout('form-with-sidebar') ?>
<?= Form::close() ?>
<?php Block::endPut() ?>

В шаблонах контролеров мы используем layout form-with-sidebar который размещен
/modules/backend/layouts/form-with-sidebar.htm

В layout'e не подходит разметка, а именно класс padded-container

<div class="padded-container layout">
...
</div<

Показываю на скриншоте по ссылке

Вопрос как убрать не нужный класс, в предложенном кейсе?

  • reazzon ответили на это сообщение.

    Не понимая архитектуры, я просто скопировал layout в папке modules/backend/layouts и указал его в вызове

    <?= $this->makeLayout('form-with-sidebar') ?>

    DetaliDigital Вы забыли в свой контроллер добавить следующее свойство:

    public $bodyClass = 'compact-container';

    Именно оно уберет не нужный отступ.

      reazzon DetaliDigital Вы забыли в свой контроллер добавить следующее свойство:

      Очень странно, в контроллере я задал данную переменную. Я завтра напишу более подробно об этом кейсе.

      reazzon Именно оно уберет не нужный отступ.

      Я проверил у меня указан данный класс. Показываю на скриншоте в структуру.

      Я посмотрел шаблон, я бы перенес папку, но не понимаю как это сделать. В документации не могу найти информацию(