~xibo-maintainers/xibo/tempel

« back to all changes in this revision

Viewing changes to lib/Controller/MediaManager.php

  • Committer: Dan Garner
  • Date: 2015-08-11 09:29:02 UTC
  • mto: This revision was merged to the branch mainline in revision 453.
  • Revision ID: git-v1:a86fb4369b7395c13367577d23b14c0ab4528c1a
Transitions fixes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 * along with Xibo.  If not, see <http://www.gnu.org/licenses/>.
20
20
 */
21
21
namespace Xibo\Controller;
 
22
 
 
23
use DOMDocument;
 
24
use DOMXPath;
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;
28
 
 
29
 
/**
30
 
 * Class MediaManager
31
 
 * @package Xibo\Controller
32
 
 */
 
26
use Xibo\Helper\ApplicationState;
 
27
use Xibo\Helper\Log;
 
28
use Xibo\Helper\Sanitize;
 
29
use Xibo\Helper\Theme;
 
30
 
 
31
 
33
32
class MediaManager extends Base
34
33
{
35
 
    /**
36
 
     * @var ModuleFactory
37
 
     */
38
 
    private $moduleFactory;
39
 
 
40
 
    /**
41
 
     * @var LayoutFactory
42
 
     */
43
 
    private $layoutFactory;
44
 
 
45
 
    /**
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
56
 
     */
57
 
    public function __construct($log, $sanitizerService, $state, $user, $help, $date, $config, $moduleFactory, $layoutFactory)
58
 
    {
59
 
        $this->setCommonDependencies($log, $sanitizerService, $state, $user, $help, $date, $config);
60
 
        $this->moduleFactory = $moduleFactory;
61
 
        $this->layoutFactory = $layoutFactory;
62
 
    }
63
34
 
64
35
    public function displayPage()
65
36
    {
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])
70
 
        ]);
71
 
    }
72
 
 
73
 
    public function grid()
74
 
    {
75
 
        $this->getState()->template = 'grid';
76
 
 
77
 
        $filterLayout = $this->getSanitizer()->getString('layout');
78
 
        $filterRegion = $this->getSanitizer()->getString('region');
79
 
        $filterMedia = $this->getSanitizer()->getString('media');
80
 
        $filterType = $this->getSanitizer()->getString('type');
 
37
        // Default options
 
38
        if (\Kit::IsFilterPinned('mediamanager', 'Filter')) {
 
39
            $filter_pinned = 1;
 
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');
 
44
        } else {
 
45
            $filter_pinned = 0;
 
46
            $filter_layout_name = NULL;
 
47
            $filter_region_name = NULL;
 
48
            $filter_media_name = NULL;
 
49
            $filter_type = 0;
 
50
        }
 
51
 
 
52
        $id = uniqid();
 
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">');
 
57
 
 
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');
 
62
 
 
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'));
 
65
 
 
66
        $formFields[] = Form::AddCombo(
 
67
            'filter_type',
 
68
            __('Type'),
 
69
            $filter_type,
 
70
            $types,
 
71
            'moduleid',
 
72
            'module',
 
73
            NULL,
 
74
            't');
 
75
 
 
76
        $formFields[] = Form::AddCheckbox('XiboFilterPinned', __('Keep Open'),
 
77
            $filter_pinned, NULL,
 
78
            'k');
 
79
 
 
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');
 
84
    }
 
85
 
 
86
    function actionMenu()
 
87
    {
 
88
 
 
89
        return array(
 
90
            array('title' => __('Filter'),
 
91
                'class' => '',
 
92
                'selected' => false,
 
93
                'link' => '#',
 
94
                'help' => __('Open the filter form'),
 
95
                'onclick' => 'ToggleFilterView(\'Filter\')'
 
96
            )
 
97
        );
 
98
    }
 
99
 
 
100
    public function MediaManagerGrid()
 
101
    {
 
102
 
 
103
        $user = $this->getUser();
 
104
        $response = $this->getState();
 
105
 
 
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');
 
110
 
 
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'));
 
116
 
 
117
        // Lookup the module name
 
118
        if ($filterMediaType != 0) {
 
119
 
 
120
            $module = $this->getUser()->ModuleList(NULL, array('id' => $filterMediaType));
 
121
            if (count($module) > 0) {
 
122
                $filterMediaType = $module[0]['Name'];
 
123
 
 
124
                Log::notice('Matched module type ' . $filterMediaType, get_class(), __FUNCTION__);
 
125
            }
 
126
        }
 
127
 
 
128
        $cols = array(
 
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')),
 
134
        );
 
135
        Theme::Set('table_cols', $cols);
81
136
 
82
137
        $rows = array();
83
138
 
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'])
88
142
                continue;
89
143
 
90
 
            // Load the layout
91
 
            $layout->load();
 
144
            // Every layout this user has access to.. get the regions
 
145
            $layoutXml = new DOMDocument();
 
146
            $layoutXml->loadXML($layout['xml']);
 
147
 
 
148
            // Get ever region
 
149
            $regionNodeList = $layoutXml->getElementsByTagName('region');
 
150
            $regionNodeSequence = 0;
92
151
 
93
152
            //get the regions
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');
 
156
 
 
157
                $regionAuth = $user->RegionAssignmentAuth($ownerId, $layout['layoutid'], $regionId, true);
96
158
 
97
159
                // Do we have permission to edit?
98
 
                if (!$this->getUser()->checkEditable($region))
99
 
                    continue;
100
 
 
101
 
                if ($filterRegion != '' && !stristr($region->name, $filterRegion))
102
 
                    continue;
103
 
 
104
 
                // Playlists
105
 
                foreach($region->playlists as $playlist) {
106
 
                    /* @var \Xibo\Entity\Playlist $playlist */
107
 
                    if (!$this->getUser()->checkEditable($playlist))
108
 
                        continue;
109
 
 
110
 
                    // Get all the widgets in the playlist
111
 
                    foreach ($playlist->widgets as $widget) {
112
 
                        /* @var \Xibo\Entity\Widget $widget */
113
 
 
114
 
                        // Check we've not filtered this out
115
 
                        if ($filterMedia != '' && !stristr($widget->getOptionValue('name', $widget->type), $filterMedia))
116
 
                            continue;
117
 
 
118
 
                        if ($filterType != '' && $widget->type != strtolower($filterType))
119
 
                            continue;
120
 
 
121
 
                        // Check editable
122
 
                        if (!$this->getUser()->checkEditable($widget))
123
 
                            continue;
124
 
 
125
 
                        // Create a module
126
 
                        $module = $this->moduleFactory->createWithWidget($widget);
127
 
 
128
 
                        // We are good to go
129
 
                        $rows[] = [
130
 
                            'layout' => $layout,
131
 
                            'region' => $region->name,
132
 
                            'playlist' => $playlist->name,
133
 
                            'widget' => $module->getName(),
134
 
                            'type' => $module->getModuleName(),
135
 
                            'displayOrder' => $widget->displayOrder,
136
 
                            'buttons' => [
137
 
                                [
138
 
                                    'id' => 'WidgetEditForm',
139
 
                                    'url' => $this->urlFor('module.widget.edit.form', ['id' => $widget->widgetId]),
140
 
                                    'text' => __('Edit')
141
 
                                ]
142
 
                            ]
143
 
                        ];
144
 
                    }
 
160
                if (!$regionAuth->edit)
 
161
                    continue;
 
162
 
 
163
                $regionNodeSequence++;
 
164
                $regionName = ($region->getAttribute('name') == '') ? 'Region ' . $regionNodeSequence : $region->getAttribute('name');
 
165
 
 
166
                if ($filterRegion != '' && !stristr($regionName, $filterRegion))
 
167
                    continue;
 
168
 
 
169
                // Media
 
170
                $xpath = new DOMXPath($layoutXml);
 
171
                $mediaNodes = $xpath->query("//region[@id='$regionId']/media");
 
172
                $mediaNodeSequence = 0;
 
173
 
 
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');
 
179
 
 
180
                    // Permissions
 
181
                    $auth = $user->MediaAssignmentAuth($mediaOwnerId, $layout['layoutid'], $regionId, $mediaId, true);
 
182
 
 
183
                    if (!$auth->edit)
 
184
                        continue;
 
185
 
 
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();
 
190
 
 
191
                    if ($filterMediaName != '' && !stristr($mediaName, $filterMediaName))
 
192
                        continue;
 
193
 
 
194
                    if ($filterMediaType != '' && $mediaType != strtolower($filterMediaType))
 
195
                        continue;
 
196
 
 
197
                    $mediaNodeSequence++;
 
198
 
 
199
                    $layout['region'] = $regionName;
 
200
                    $layout['media'] = $mediaName;
 
201
                    $layout['mediatype'] = $mediaType;
 
202
                    $layout['seq'] = $mediaNodeSequence;
 
203
                    $layout['buttons'] = array();
 
204
 
 
205
                    // Edit
 
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'] . '&regionid=' . $regionId . '&mediaid=' . $mediaId . '&lkid=' . $lkId,
 
209
                        'text' => __('Edit')
 
210
                    );
 
211
 
 
212
                    $rows[] = $layout;
145
213
                }
146
214
            }
147
215
        }
148
216
 
149
 
        $this->getState()->setData($rows);
 
217
        Theme::Set('table_rows', $rows);
 
218
 
 
219
        $output = Theme::RenderReturn('table_render');
 
220
 
 
221
        $response->SetGridResponse($output);
 
222
 
150
223
    }
151
224
}
 
225
 
 
226
?>