Извлечение отступов октябрьских страниц в JSON для приложения Vue. js - PullRequest
0 голосов
/ 17 июня 2020

Для создания меню vue в октябре у меня есть плагин, который я хочу извлечь структуру октябрьских страниц в данные JSON, сохраняя отступы страниц и подстраниц.

На основе этого сообщения: Как получить раскрывающееся меню stati c страницы в OctoberCMS с деревом страниц?

Я использовал следующий код:

public function boot() {
  \RainLab\Pages\Classes\Page::extend(function($model) {
      $model->addDynamicMethod('getPageOptions', function() {
          $theme = \Cms\Classes\Theme::getEditTheme();
          $pageList = new \RainLab\Pages\Classes\PageList($theme);
          $treePageList = $pageList->getPageTree(true);
          $pages = [];
          $this->getRecursivePage($pages, $treePageList);
          return $pages;
      });
  });
}

public function getRecursivePage(&$pages, $subpages, $level = 0) {        
    $level++;
    foreach($subpages as $pageArr) {        
        $pages[$pageArr->page->url] = 
               str_repeat('-',$level) . ' ' . $pageArr->page->title;                     
        if(count($pageArr->subpages) > 0) {            
            $this->getRecursivePage($pages, $pageArr->subpages, $level);
        }        
    }    
}

, но возвращенный $ treePageList тоже rich для этой цели, а $ pages сглаживает отступ.

Как я могу манипулировать возвращенной структурой JSON, чтобы упростить ее, используя только page-> url и page-> title и сохраняя отступы страниц и подстраниц ?

Спасибо за помощь

РЕДАКТИРОВАТЬ:

Этот код с уровнем $ дает:

array:9 [▼
  "/content" => "- Content"
  "/content/pages" => "-- Static Pages"
  "/content/content" => "-- Content"
  "/content/models" => "-- Models"
  "/content/urls" => "-- URLs"
  "/content/urls/tesets" => "--- tesets"
  "/test-sp" => "- test-sp"
  "/test-sp/oks" => "-- oks"
  "/test" => "- test"
]

, но я бы хотел JSON данные с такими уровнями (не визуализация сырых данных):

▼ 0 
    page    {title: , url:}
    subpages    []
▼ 1 
    page    {title: , url:}
    subpages    
        ▼ 0 {title: , url:}
        ▼ 1 {title: , url:}
        ▼ 2 {title: , url:}
        ▼ 3 {title: , url:}
        ▼ 4 {title: , url:}
        ▼ 5 {title: , url:}
        ▼ 6 {title: , url:}
        ▼ 7 {title: , url:}
        ▼ 8 {title: , url:}
▼ 2 
    page    {title: , url:}
    subpages    
        ▼ 0 {title: , url:}
        ▼ 1 {title: , url:}
        ▼ 2 {title: , url:}

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Используйте этот код

public function boot() {
  \RainLab\Pages\Classes\Page::extend(function($model) {
      $model->addDynamicMethod('getPageOptions', function() {
          $theme = \Cms\Classes\Theme::getEditTheme();
          $pageList = new \RainLab\Pages\Classes\PageList($theme);
          $treePageList = $pageList->getPageTree(true);
          return $this->getRecursivePage($treePageList);
      });
  });

  $pages = \RainLab\Pages\Classes\Page::getPageOptions();
  header('Content-Type: application/json');
  echo json_encode($pages);
  exit();
}

public function getRecursivePage($pages) {
  $pageDetails = [];
  foreach($pages as $iPage) {
      $detail = [];
      $detail['page'] = ['title' => $iPage->page->title, 'url' => $iPage->page->url];
      $subpages = $this->getRecursivePage($iPage->subpages);
      if(count($subpages) > 0 ) {
        $detail['subpages'] = $subpages;
      }
      $pageDetails[] = $detail;
  }
  return $pageDetails;
}

Вывод

[
  {
    "page": {
      "title": "static-page",
      "url": "/static-page"
    }
  },
  {
    "page": {
      "title": "/parent",
      "url": "/parent"
    },
    "subpages": [
      {
        "page": {
          "title": "child",
          "url": "/parent/child"
        },
        "subpages": [
          {
            "page": {
              "title": "another child",
              "url": "/parent/child/another-child"
            }
          },
          {
            "page": {
              "title": "another next",
              "url": "/parent/child/another-next"
            }
          }
        ]
      }
    ]
  }
]

Если есть сомнения, прокомментируйте.

0 голосов
/ 22 августа 2020

Я решил это, добавив 2 функции и вызвав их последовательно. Один для Pages, другой для Stati c Pages. Функции строят сложный объект с желаемой структурой, который будет использоваться для построения меню. Спасибо

...