etalon_backend/plugins/rainlab/pages/formwidgets/MenuItemSearch.php

106 lines
2.5 KiB
PHP

<?php namespace RainLab\Pages\FormWidgets;
use Str;
use Lang;
use Input;
use Request;
use Response;
use Backend\Classes\FormWidgetBase;
use Cms\Classes\Theme;
use RainLab\Pages\Classes\MenuItem;
/**
* Menu item reference search.
*
* @package october\backend
* @author Alexey Bobkov, Samuel Georges
*/
class MenuItemSearch extends FormWidgetBase
{
use \Backend\Traits\SearchableWidget;
public $searchPlaceholderMessage = 'rainlab.pages::lang.menuitem.search_placeholder';
/**
* Renders the widget.
* @return string
*/
public function render()
{
return $this->makePartial('body');
}
/*
* Event handlers
*/
public function onSearch()
{
$this->setSearchTerm(Input::get('term'));
return $this->getData();
}
/*
* Methods for internal use
*/
protected function getData()
{
return [
'results' => $this->getMatches()
];
}
protected function getMatches()
{
$searchTerm = Str::lower($this->getSearchTerm());
if (!strlen($searchTerm)) {
return [];
}
$words = explode(' ', $searchTerm);
$iterator = function ($type, $references) use (&$iterator, $words) {
$typeMatches = [];
foreach ($references as $key => $referenceInfo) {
$title = (is_array($referenceInfo))
? $referenceInfo['title']
: $referenceInfo;
if ($this->textMatchesSearch($words, $title)) {
$typeMatches[] = [
'id' => "$type::$key",
'text' => $title
];
}
if (isset($referenceInfo['items']) && count($referenceInfo['items'])) {
$typeMatches = array_merge($typeMatches, $iterator($type, $referenceInfo['items']));
}
}
return $typeMatches;
};
$types = [];
$item = new MenuItem();
foreach ($item->getTypeOptions() as $type => $typeTitle) {
$typeInfo = MenuItem::getTypeInfo($type);
if (empty($typeInfo['references'])) {
continue;
}
$typeMatches = $iterator($type, $typeInfo['references']);
if (!empty($typeMatches)) {
$types[] = [
'text' => trans($typeTitle),
'children' => $typeMatches
];
}
}
return $types;
}
}