19
19
* along with Xibo. If not, see <http://www.gnu.org/licenses/>.
21
21
namespace Xibo\Controller;
22
25
use Xibo\Factory\LayoutFactory;
23
use Xibo\Factory\ModuleFactory;
24
use Xibo\Service\ConfigServiceInterface;
25
use Xibo\Service\DateServiceInterface;
26
use Xibo\Service\LogServiceInterface;
27
use Xibo\Service\SanitizerServiceInterface;
31
* @package Xibo\Controller
26
use Xibo\Helper\ApplicationState;
28
use Xibo\Helper\Sanitize;
29
use Xibo\Helper\Theme;
33
32
class MediaManager extends Base
38
private $moduleFactory;
43
private $layoutFactory;
46
* Set common dependencies.
47
* @param LogServiceInterface $log
48
* @param SanitizerServiceInterface $sanitizerService
49
* @param \Xibo\Helper\ApplicationState $state
50
* @param \Xibo\Entity\User $user
51
* @param \Xibo\Service\HelpServiceInterface $help
52
* @param DateServiceInterface $date
53
* @param ConfigServiceInterface $config
54
* @param ModuleFactory $moduleFactory
55
* @param LayoutFactory $layoutFactory
57
public function __construct($log, $sanitizerService, $state, $user, $help, $date, $config, $moduleFactory, $layoutFactory)
59
$this->setCommonDependencies($log, $sanitizerService, $state, $user, $help, $date, $config);
60
$this->moduleFactory = $moduleFactory;
61
$this->layoutFactory = $layoutFactory;
64
35
public function displayPage()
66
$this->getState()->template .= 'media-manager-page';
67
$this->getState()->setData([
68
// Users we have permission to see
69
'modules' => $this->moduleFactory->query(null, ['assignable' => 1])
73
public function grid()
75
$this->getState()->template = 'grid';
77
$filterLayout = $this->getSanitizer()->getString('layout');
78
$filterRegion = $this->getSanitizer()->getString('region');
79
$filterMedia = $this->getSanitizer()->getString('media');
80
$filterType = $this->getSanitizer()->getString('type');
38
if (\Kit::IsFilterPinned('mediamanager', 'Filter')) {
40
$filter_layout_name = $this->getSession()->get('mediamanager', 'filter_layout_name');
41
$filter_region_name = $this->getSession()->get('mediamanager', 'filter_region_name');
42
$filter_media_name = $this->getSession()->get('mediamanager', 'filter_media_name');
43
$filter_type = $this->getSession()->get('mediamanager', 'filter_type');
46
$filter_layout_name = NULL;
47
$filter_region_name = NULL;
48
$filter_media_name = NULL;
53
Theme::Set('id', $id);
54
Theme::Set('filter_id', 'XiboFilterPinned' . uniqid('filter'));
55
Theme::Set('pager', ApplicationState::Pager($id));
56
Theme::Set('form_meta', '<input type="hidden" name="p" value="mediamanager"><input type="hidden" name="q" value="MediaManagerGrid">');
58
$formFields = array();
59
$formFields[] = Form::AddText('filter_layout_name', __('Layout'), $filter_layout_name, NULL, 'l');
60
$formFields[] = Form::AddText('filter_region_name', __('Region'), $filter_region_name, NULL, 'r');
61
$formFields[] = Form::AddText('filter_media_name', __('Media'), $filter_media_name, NULL, 'm');
63
$types = $db->GetArray("SELECT moduleid AS moduleid, Name AS module FROM `module` WHERE Enabled = 1 ORDER BY 2");
64
array_unshift($types, array('moduleid' => 0, 'module' => 'All'));
66
$formFields[] = Form::AddCombo(
76
$formFields[] = Form::AddCheckbox('XiboFilterPinned', __('Keep Open'),
80
// Call to render the template
81
Theme::Set('header_text', __('Media Manager'));
82
Theme::Set('form_fields', $formFields);
83
$this->getState()->html .= Theme::RenderReturn('grid_render');
90
array('title' => __('Filter'),
94
'help' => __('Open the filter form'),
95
'onclick' => 'ToggleFilterView(\'Filter\')'
100
public function MediaManagerGrid()
103
$user = $this->getUser();
104
$response = $this->getState();
106
$filterLayout = \Xibo\Helper\Sanitize::getString('filter_layout_name');
107
$filterRegion = \Xibo\Helper\Sanitize::getString('filter_region_name');
108
$filterMediaName = \Xibo\Helper\Sanitize::getString('filter_media_name');
109
$filterMediaType = \Xibo\Helper\Sanitize::getInt('filter_type');
111
$this->getSession()->set('mediamanager', 'filter_layout_name', $filterLayout);
112
$this->getSession()->set('mediamanager', 'filter_region_name', $filterRegion);
113
$this->getSession()->set('mediamanager', 'filter_media_name', $filterMediaName);
114
$this->getSession()->set('mediamanager', 'filter_type', $filterMediaType);
115
$this->getSession()->set('mediamanager', 'Filter', Sanitize::getCheckbox('XiboFilterPinned'));
117
// Lookup the module name
118
if ($filterMediaType != 0) {
120
$module = $this->getUser()->ModuleList(NULL, array('id' => $filterMediaType));
121
if (count($module) > 0) {
122
$filterMediaType = $module[0]['Name'];
124
Log::notice('Matched module type ' . $filterMediaType, get_class(), __FUNCTION__);
129
array('name' => 'layout', 'title' => __('Layout'), 'colClass' => 'group-word'),
130
array('name' => 'region', 'title' => __('Region')),
131
array('name' => 'media', 'title' => __('Media')),
132
array('name' => 'mediatype', 'title' => __('Type')),
133
array('name' => 'seq', 'title' => __('Sequence')),
135
Theme::Set('table_cols', $cols);
84
foreach ($this->layoutFactory->query(null, ['layout' => $filterLayout]) as $layout) {
85
/* @var \Xibo\Entity\Layout $layout */
139
foreach (LayoutFactory::query(null, ['layout' => $filterLayout]) as $layout) {
86
140
// We have edit permissions?
87
if (!$this->getUser()->checkEditable($layout))
141
if (!$layout['edit'])
144
// Every layout this user has access to.. get the regions
145
$layoutXml = new DOMDocument();
146
$layoutXml->loadXML($layout['xml']);
149
$regionNodeList = $layoutXml->getElementsByTagName('region');
150
$regionNodeSequence = 0;
94
foreach ($layout->regions as $region) {
95
/* @var \Xibo\Entity\Region $region */
153
foreach ($regionNodeList as $region) {
154
$regionId = $region->getAttribute('id');
155
$ownerId = ($region->getAttribute('userId') == '') ? $layout['ownerid'] : $region->getAttribute('userId');
157
$regionAuth = $user->RegionAssignmentAuth($ownerId, $layout['layoutid'], $regionId, true);
97
159
// Do we have permission to edit?
98
if (!$this->getUser()->checkEditable($region))
101
if ($filterRegion != '' && !stristr($region->name, $filterRegion))
105
foreach($region->playlists as $playlist) {
106
/* @var \Xibo\Entity\Playlist $playlist */
107
if (!$this->getUser()->checkEditable($playlist))
110
// Get all the widgets in the playlist
111
foreach ($playlist->widgets as $widget) {
112
/* @var \Xibo\Entity\Widget $widget */
114
// Check we've not filtered this out
115
if ($filterMedia != '' && !stristr($widget->getOptionValue('name', $widget->type), $filterMedia))
118
if ($filterType != '' && $widget->type != strtolower($filterType))
122
if (!$this->getUser()->checkEditable($widget))
126
$module = $this->moduleFactory->createWithWidget($widget);
131
'region' => $region->name,
132
'playlist' => $playlist->name,
133
'widget' => $module->getName(),
134
'type' => $module->getModuleName(),
135
'displayOrder' => $widget->displayOrder,
138
'id' => 'WidgetEditForm',
139
'url' => $this->urlFor('module.widget.edit.form', ['id' => $widget->widgetId]),
160
if (!$regionAuth->edit)
163
$regionNodeSequence++;
164
$regionName = ($region->getAttribute('name') == '') ? 'Region ' . $regionNodeSequence : $region->getAttribute('name');
166
if ($filterRegion != '' && !stristr($regionName, $filterRegion))
170
$xpath = new DOMXPath($layoutXml);
171
$mediaNodes = $xpath->query("//region[@id='$regionId']/media");
172
$mediaNodeSequence = 0;
174
foreach ($mediaNodes as $mediaNode) {
175
$mediaId = $mediaNode->getAttribute('id');
176
$lkId = $mediaNode->getAttribute('lkid');
177
$mediaOwnerId = ($mediaNode->getAttribute('userId') == '') ? $layout['ownerid'] : $mediaNode->getAttribute('userId');
178
$mediaType = $mediaNode->getAttribute('type');
181
$auth = $user->MediaAssignmentAuth($mediaOwnerId, $layout['layoutid'], $regionId, $mediaId, true);
186
// Create the media object without any region and layout information
187
require_once('modules/' . $mediaType . '.module.php');
188
$tmpModule = new $mediaType($db, $user, $mediaId, $layout['layoutid'], $regionId, $lkId);
189
$mediaName = $tmpModule->GetName();
191
if ($filterMediaName != '' && !stristr($mediaName, $filterMediaName))
194
if ($filterMediaType != '' && $mediaType != strtolower($filterMediaType))
197
$mediaNodeSequence++;
199
$layout['region'] = $regionName;
200
$layout['media'] = $mediaName;
201
$layout['mediatype'] = $mediaType;
202
$layout['seq'] = $mediaNodeSequence;
203
$layout['buttons'] = array();
206
$layout['buttons'][] = array(
207
'id' => 'homepage_mediamanager_edit_button',
208
'url' => 'index.php?p=module&mod=' . $mediaType . '&q=Exec&method=EditForm&showRegionOptions=0&layoutid=' . $layout['layoutid'] . '®ionid=' . $regionId . '&mediaid=' . $mediaId . '&lkid=' . $lkId,
149
$this->getState()->setData($rows);
217
Theme::Set('table_rows', $rows);
219
$output = Theme::RenderReturn('table_render');
221
$response->SetGridResponse($output);