Здравствуйте, как сделать в админке выпадающий список с выбор созданных страниц из RainLab.StaticPages?
Более конкретно, хочу чтобы в этом выпадающем списке выводились все подстраницы конкретной страницы (или все страницы, которые используют определенный шаблон)

Заранее спасибо)

  • И так, как вывести подстраницы определенной страницы в выпадающем списке:

    Потребуется в корневом каталоге любого вашего плагина добавить папку "formwidgets" и ее наполнить так:

    в Plugin.php регистрируем виджет:

     public function registerFormWidgets()
        {
            return [
                '\{имя автора}\{имя плагина}\FormWidgets\StaticSubMenu' => 'staticsubmenu',
            ];
        }

    Код StaticSubMenu.php:

    <?php namespace {имя автора}\{имя плагина}\FormWidgets;
    
    use Backend\Classes\FormWidgetBase;
    
    
    /**
     * Icon Form Widget
     */
    class StaticSubMenu extends FormWidgetBase
    {
    
        public $page_url = 'index.htm';
    
        public function init()
        {
            $this->fillFromConfig([
                'page_url' //выносим настройки для редактирования
            ]);
        }
    
        public function render()
        {
    
            $page = \RainLab\Pages\Classes\Page::load(\Cms\Classes\Theme::getEditTheme(), $this->page_url);
    
            $this->vars['id'] = $this->getId();
            $this->vars['name'] = $this->getFieldName();
            $this->vars['value'] = $this->getLoadValue();
            $this->vars['placeholder'] = $this->placeholder;
            $this->vars['pages'] = $this->getMenu($page->getChildren());
    
    
            return $this->makePartial('staticsubmenu');
        }
    
    
    
        private function getMenu($page_object, &$page_array = [], $iter = 0){
            foreach($page_object as $k => $page) {
                array_push($page_array, [
                    'id' => $page->id,
                    'title' => str_repeat("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $iter) . $page->title
                ]);
                $sub_pages = $page->getChildren();
                if($sub_pages){
                    $this->getMenu($sub_pages, $page_array, $iter+1);
                }
            }
            return $page_array;
        }
    
    
    
    }

    код _staticsubmenu.htm:

    <select
    <?php if($this->previewMode) echo "readonly"; ?>
    class = "form-control custom-select"
    id="<?= $id; ?>"
    name="<?= $name; ?>"
    >
    <?php if($placeholder): ?>
        <option value=""><?= e(trans($placeholder)) ?></option>
    <?php endif ?>
    
    <?php foreach ($pages as $k => $page): ?>
        <option <? if($value == $page["id"]) echo "selected" ?> value="<?php echo $page["id"] ?>">
        <?php echo $page["title"] ?>
        </option>
    <?php endforeach; ?>
    </select>

    И теперь, если вставить в любое место этот тип поля staticsubmenu и задать в настройках page_url нужную страницу, то выводятся все дочерние ее страницы

    {variable name="statpage" type="staticsubmenu" page_url="uslugi.htm" label="Static Page"}{/variable}

Так, нашел, что для этого есть специальный тип поля "staticpagepicker" у плагина:
{variable name="static-page" type="staticpagepicker" label="Static Page"}{/variable}

cкоро отвечу на свой второй вопрос, это посложнее)

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

    superoleg Я боюсь вам нужно будет делать все через recordfinder или как минимум делать обычный dropdown, который будет брать опции из метода внутри контроллера статик пейдж, который вам нужно будет расширить.

    Я советую вам немного поразмыслить над вашей структурой и подумать нужен-ли вам в этом случае StaticPages плагин как таковой, потому-что он сможет вам поставить большие палки в колеса, из-за которых вы просто можете запутаться во всем)

    И так, как вывести подстраницы определенной страницы в выпадающем списке:

    Потребуется в корневом каталоге любого вашего плагина добавить папку "formwidgets" и ее наполнить так:

    в Plugin.php регистрируем виджет:

     public function registerFormWidgets()
        {
            return [
                '\{имя автора}\{имя плагина}\FormWidgets\StaticSubMenu' => 'staticsubmenu',
            ];
        }

    Код StaticSubMenu.php:

    <?php namespace {имя автора}\{имя плагина}\FormWidgets;
    
    use Backend\Classes\FormWidgetBase;
    
    
    /**
     * Icon Form Widget
     */
    class StaticSubMenu extends FormWidgetBase
    {
    
        public $page_url = 'index.htm';
    
        public function init()
        {
            $this->fillFromConfig([
                'page_url' //выносим настройки для редактирования
            ]);
        }
    
        public function render()
        {
    
            $page = \RainLab\Pages\Classes\Page::load(\Cms\Classes\Theme::getEditTheme(), $this->page_url);
    
            $this->vars['id'] = $this->getId();
            $this->vars['name'] = $this->getFieldName();
            $this->vars['value'] = $this->getLoadValue();
            $this->vars['placeholder'] = $this->placeholder;
            $this->vars['pages'] = $this->getMenu($page->getChildren());
    
    
            return $this->makePartial('staticsubmenu');
        }
    
    
    
        private function getMenu($page_object, &$page_array = [], $iter = 0){
            foreach($page_object as $k => $page) {
                array_push($page_array, [
                    'id' => $page->id,
                    'title' => str_repeat("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $iter) . $page->title
                ]);
                $sub_pages = $page->getChildren();
                if($sub_pages){
                    $this->getMenu($sub_pages, $page_array, $iter+1);
                }
            }
            return $page_array;
        }
    
    
    
    }

    код _staticsubmenu.htm:

    <select
    <?php if($this->previewMode) echo "readonly"; ?>
    class = "form-control custom-select"
    id="<?= $id; ?>"
    name="<?= $name; ?>"
    >
    <?php if($placeholder): ?>
        <option value=""><?= e(trans($placeholder)) ?></option>
    <?php endif ?>
    
    <?php foreach ($pages as $k => $page): ?>
        <option <? if($value == $page["id"]) echo "selected" ?> value="<?php echo $page["id"] ?>">
        <?php echo $page["title"] ?>
        </option>
    <?php endforeach; ?>
    </select>

    И теперь, если вставить в любое место этот тип поля staticsubmenu и задать в настройках page_url нужную страницу, то выводятся все дочерние ее страницы

    {variable name="statpage" type="staticsubmenu" page_url="uslugi.htm" label="Static Page"}{/variable}

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

      superoleg Великолепно! Спасибо за пояснение!