ORIENT/plugins/rainlab/pages/widgets/PageList.php

169 lines
4.0 KiB
PHP

<?php namespace RainLab\Pages\Widgets;
use Str;
use Lang;
use Input;
use Request;
use Response;
use Backend\Classes\WidgetBase;
use RainLab\Pages\Classes\PageList as StaticPageList;
use Cms\Classes\Theme;
/**
* Static page list widget.
*
* @package rainlab\pages
* @author Alexey Bobkov, Samuel Georges
*/
class PageList extends WidgetBase
{
use \Backend\Traits\SearchableWidget;
use \Backend\Traits\CollapsableWidget;
use \Backend\Traits\SelectableWidget;
protected $theme;
protected $dataIdPrefix;
/**
* @var string Message to display when the Delete button is clicked.
*/
public $deleteConfirmation = 'rainlab.pages::lang.page.delete_confirmation';
public $noRecordsMessage = 'rainlab.pages::lang.page.no_records';
public $addSubpageLabel = 'rainlab.pages::lang.page.add_subpage';
public function __construct($controller, $alias)
{
$this->alias = $alias;
$this->theme = Theme::getEditTheme();
$this->dataIdPrefix = 'page-'.$this->theme->getDirName();
parent::__construct($controller, []);
$this->bindToController();
}
/**
* Renders the widget.
* @return string
*/
public function render()
{
return $this->makePartial('body', [
'data' => $this->getData()
]);
}
/*
* Event handlers
*/
public function onReorder()
{
$structure = json_decode(Input::get('structure'), true);
if (!$structure) {
throw new SystemException('Invalid structure data posted.');
}
$pageList = new StaticPageList($this->theme);
$pageList->updateStructure($structure);
}
public function onUpdate()
{
$this->extendSelection();
return $this->updateList();
}
public function onSearch()
{
$this->setSearchTerm(Input::get('search'));
$this->extendSelection();
return $this->updateList();
}
/*
* Methods for internal use
*/
protected function getData()
{
$pageList = new StaticPageList($this->theme);
$pages = $pageList->getPageTree(true);
$searchTerm = Str::lower($this->getSearchTerm());
if (strlen($searchTerm)) {
$words = explode(' ', $searchTerm);
$iterator = function($pages) use (&$iterator, $words) {
$result = [];
foreach ($pages as $page) {
if ($this->textMatchesSearch($words, $this->subtreeToText($page))) {
$result[] = (object) [
'page' => $page->page,
'subpages' => $iterator($page->subpages)
];
}
}
return $result;
};
$pages = $iterator($pages);
}
return $pages;
}
protected function getThemeSessionKey($prefix)
{
return $prefix.$this->theme->getDirName();
}
protected function updateList()
{
return ['#'.$this->getId('page-list') => $this->makePartial('items', ['items' => $this->getData()])];
}
protected function subtreeToText($page)
{
$result = $this->pageToText($page->page);
$iterator = function($pages) use (&$iterator, &$result) {
foreach ($pages as $page) {
$result .= ' '.$this->pageToText($page->page);
$iterator($page->subpages);
}
};
$iterator($page->subpages);
return $result;
}
protected function pageToText($page)
{
$viewBag = $page->getViewBag();
return $page->getViewBag()->property('title').' '.$page->getViewBag()->property('url');
}
protected function getSession($key = null, $default = null)
{
$key = strlen($key) ? $this->getThemeSessionKey($key) : $key;
return parent::getSession($key, $default);
}
protected function putSession($key, $value)
{
return parent::putSession($this->getThemeSessionKey($key), $value);
}
}