~xibo-maintainers/xibo/tempel

« back to all changes in this revision

Viewing changes to lib/Controller/DataSet.php

  • Committer: Dan Garner
  • Date: 2015-03-26 14:08:33 UTC
  • Revision ID: git-v1:70d14044444f8dc5d602b99890d59dea46d9470c
Moved web servable files to web folder

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
<?php
2
2
/*
3
3
 * Xibo - Digital Signage - http://www.xibo.org.uk
4
 
 * Copyright (C) 2011-2017 Spring Signage Ltd
5
 
 * contributions by LukyLuke aka Lukas Zurschmiede - https://github.com/LukyLuke
 
4
 * Copyright (C) 2011-2013 Daniel Garner
6
5
 *
7
6
 * This file is part of Xibo.
8
7
 *
20
19
 * along with Xibo.  If not, see <http://www.gnu.org/licenses/>.
21
20
 */
22
21
namespace Xibo\Controller;
23
 
 
24
 
use Xibo\Exception\AccessDeniedException;
25
 
use Xibo\Exception\InvalidArgumentException;
26
 
use Xibo\Exception\NotFoundException;
27
 
use Xibo\Exception\XiboException;
28
 
use Xibo\Factory\DataSetColumnFactory;
29
 
use Xibo\Factory\DataSetFactory;
30
 
use Xibo\Helper\DataSetUploadHandler;
31
 
use Xibo\Service\ConfigServiceInterface;
32
 
use Xibo\Service\DateServiceInterface;
33
 
use Xibo\Service\LogServiceInterface;
34
 
use Xibo\Service\SanitizerServiceInterface;
35
 
 
36
 
/**
37
 
 * Class DataSet
38
 
 * @package Xibo\Controller
39
 
 */
 
22
use baseDAO;
 
23
use Config;
 
24
use DataSetColumn;
 
25
use DataSetData;
 
26
use DataSetGroupSecurity;
 
27
use FormManager;
 
28
use Xibo\Helper\ApplicationState;
 
29
use Xibo\Helper\Help;
 
30
use Xibo\Helper\Log;
 
31
use Xibo\Helper\Theme;
 
32
 
 
33
defined('XIBO') or die('Sorry, you are not allowed to directly access this page.<br /> Please press the back button in your browser.');
 
34
 
 
35
 
40
36
class DataSet extends Base
41
37
{
42
 
    /** @var  DataSetFactory */
43
 
    private $dataSetFactory;
44
 
 
45
 
    /** @var  DataSetColumnFactory */
46
 
    private $dataSetColumnFactory;
47
 
 
48
 
    /**
49
 
     * Set common dependencies.
50
 
     * @param LogServiceInterface $log
51
 
     * @param SanitizerServiceInterface $sanitizerService
52
 
     * @param \Xibo\Helper\ApplicationState $state
53
 
     * @param \Xibo\Entity\User $user
54
 
     * @param \Xibo\Service\HelpServiceInterface $help
55
 
     * @param DateServiceInterface $date
56
 
     * @param ConfigServiceInterface $config
57
 
     * @param DataSetFactory $dataSetFactory
58
 
     * @param DataSetColumnFactory $dataSetColumnFactory
59
 
     */
60
 
    public function __construct($log, $sanitizerService, $state, $user, $help, $date, $config, $dataSetFactory, $dataSetColumnFactory)
61
 
    {
62
 
        $this->setCommonDependencies($log, $sanitizerService, $state, $user, $help, $date, $config);
63
 
 
64
 
        $this->dataSetFactory = $dataSetFactory;
65
 
        $this->dataSetColumnFactory = $dataSetColumnFactory;
66
 
    }
67
 
 
68
 
    /**
69
 
     * @return SanitizerServiceInterface
70
 
     */
71
 
    public function getSanitizer()
72
 
    {
73
 
        return parent::getSanitizer();
74
 
    }
75
 
 
76
 
    /**
77
 
     * @return DataSetFactory
78
 
     */
79
 
    public function getDataSetFactory()
80
 
    {
81
 
        return $this->dataSetFactory;
82
 
    }
83
 
 
84
 
    /**
85
 
     * View Route
86
 
     */
87
38
    public function displayPage()
88
39
    {
89
 
        $this->getState()->template = 'dataset-page';
90
 
    }
91
 
 
92
 
    /**
93
 
     * Search Data
94
 
     * @throws \Xibo\Exception\NotFoundException
95
 
     *
96
 
     * @SWG\Get(
97
 
     *  path="/dataset",
98
 
     *  operationId="dataSetSearch",
99
 
     *  tags={"dataset"},
100
 
     *  summary="DataSet Search",
101
 
     *  description="Search this users DataSets",
102
 
     *  @SWG\Parameter(
103
 
     *      name="dataSetId",
104
 
     *      in="formData",
105
 
     *      description="Filter by DataSet Id",
106
 
     *      type="integer",
107
 
     *      required=false
108
 
     *   ),
109
 
     *  @SWG\Parameter(
110
 
     *      name="dataSet",
111
 
     *      in="formData",
112
 
     *      description="Filter by DataSet Name",
113
 
     *      type="string",
114
 
     *      required=false
115
 
     *   ),
116
 
     *  @SWG\Parameter(
117
 
     *      name="code",
118
 
     *      in="formData",
119
 
     *      description="Filter by DataSet Code",
120
 
     *      type="string",
121
 
     *      required=false
122
 
     *   ),
123
 
     *  @SWG\Parameter(
124
 
     *      name="embed",
125
 
     *      in="formData",
126
 
     *      description="Embed related data such as columns",
127
 
     *      type="string",
128
 
     *      required=false
129
 
     *   ),
130
 
     *  @SWG\Response(
131
 
     *      response=200,
132
 
     *      description="successful operation",
133
 
     *      @SWG\Schema(
134
 
     *          type="array",
135
 
     *          @SWG\Items(ref="#/definitions/DataSet")
136
 
     *      )
137
 
     *  )
138
 
     * )
139
 
     */
140
 
    public function grid()
141
 
    {
 
40
        $subpage = \Kit::GetParam('sp', _GET, _WORD, '');
 
41
 
 
42
        // Configure the theme
 
43
        $id = uniqid();
 
44
 
 
45
        // Different pages for data entry and admin
 
46
        if ($subpage == 'DataEntry') {
 
47
            Theme::Set('id', 'DataEntryGrid');
 
48
            $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
49
            $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
50
 
 
51
            Theme::Set('form_meta', '<input type="hidden" name="p" value="dataset"><input type="hidden" name="q" value="DataSetDataForm"><input type="hidden" name="datasetid" value="' . $dataSetId . '"><input type="hidden" name="dataset" value="' . $dataSet . '">');
 
52
 
 
53
            // Call to render the template
 
54
            Theme::Set('header_text', $dataSet);
 
55
            Theme::Set('form_fields', array());
 
56
            $this->getState()->html .= Theme::RenderReturn('grid_render');
 
57
        } else {
 
58
            $id = uniqid();
 
59
            Theme::Set('id', $id);
 
60
            Theme::Set('form_meta', '<input type="hidden" name="p" value="dataset"><input type="hidden" name="q" value="DataSetGrid">');
 
61
            Theme::Set('pager', ApplicationState::Pager($id));
 
62
 
 
63
            // Call to render the template
 
64
            Theme::Set('header_text', __('DataSets'));
 
65
            Theme::Set('form_fields', array());
 
66
            $this->getState()->html .= Theme::RenderReturn('grid_render');
 
67
        }
 
68
    }
 
69
 
 
70
    function actionMenu()
 
71
    {
 
72
 
 
73
        if (\Kit::GetParam('sp', _GET, _WORD, 'view') == 'view') {
 
74
            return array(
 
75
                array('title' => __('Add DataSet'),
 
76
                    'class' => 'XiboFormButton',
 
77
                    'selected' => false,
 
78
                    'link' => 'index.php?p=dataset&q=AddDataSetForm',
 
79
                    'help' => __('Add a new DataSet'),
 
80
                    'onclick' => ''
 
81
                )
 
82
            );
 
83
        } else if (\Kit::GetParam('sp', _GET, _WORD, 'view') == 'DataEntry') {
 
84
            return array(
 
85
                array('title' => __('More Rows'),
 
86
                    'class' => '',
 
87
                    'selected' => false,
 
88
                    'link' => '#',
 
89
                    'help' => __('Add more rows to the end of this DataSet'),
 
90
                    'onclick' => 'XiboGridRender(\'DataEntryGrid\')'
 
91
                )
 
92
            );
 
93
        } else
 
94
            return NULL;
 
95
    }
 
96
 
 
97
    public function DataSetGrid()
 
98
    {
 
99
 
142
100
        $user = $this->getUser();
143
 
        
144
 
        // Embed?
145
 
        $embed = ($this->getSanitizer()->getString('embed') != null) ? explode(',', $this->getSanitizer()->getString('embed')) : [];
146
 
        
147
 
        $filter = [
148
 
            'dataSetId' => $this->getSanitizer()->getInt('dataSetId'),
149
 
            'dataSet' => $this->getSanitizer()->getString('dataSet'),
150
 
            'code' => $this->getSanitizer()->getString('code'),
151
 
        ];
152
 
 
153
 
        $dataSets = $this->dataSetFactory->query($this->gridRenderSort(), $this->gridRenderFilter($filter));
154
 
 
155
 
        foreach ($dataSets as $dataSet) {
156
 
            /* @var \Xibo\Entity\DataSet $dataSet */
157
 
            if (in_array('columns', $embed)) {
158
 
                $dataSet->load();
159
 
            }
160
 
            if ($this->isApi())
161
 
                break;
162
 
 
163
 
            $dataSet->includeProperty('buttons');
164
 
            $dataSet->buttons = [];
165
 
 
166
 
            // Load the dataSet to get the columns
167
 
            $dataSet->load();
168
 
 
169
 
            if ($user->checkEditable($dataSet)) {
 
101
        $response = $this->getState();
 
102
 
 
103
        $cols = array(
 
104
            array('name' => 'dataset', 'title' => __('Name')),
 
105
            array('name' => 'description', 'title' => __('Description')),
 
106
            array('name' => 'owner', 'title' => __('Owner')),
 
107
            array('name' => 'groups', 'title' => __('Permissions'))
 
108
        );
 
109
        Theme::Set('table_cols', $cols);
 
110
 
 
111
        $rows = array();
 
112
 
 
113
        foreach ($this->user->DataSetList() as $dataSet) {
 
114
            // Add some additional info
 
115
            $dataSet['owner'] = $user->getNameFromID($dataSet['ownerid']);
 
116
            $dataSet['groups'] = $this->GroupsForDataSet($dataSet['datasetid']);
 
117
            $dataSet['buttons'] = array();
 
118
 
 
119
            if ($dataSet['edit']) {
170
120
 
171
121
                // View Data
172
 
                $dataSet->buttons[] = array(
 
122
                $dataSet['buttons'][] = array(
173
123
                    'id' => 'dataset_button_viewdata',
174
124
                    'class' => 'XiboRedirectButton',
175
 
                    'url' => $this->urlFor('dataSet.view.data', ['id' => $dataSet->dataSetId]),
 
125
                    'url' => 'index.php?p=dataset&sp=DataEntry&datasetid=' . $dataSet['datasetid'] . '&dataset=' . $dataSet['dataset'],
176
126
                    'text' => __('View Data')
177
127
                );
178
128
 
179
129
                // View Columns
180
 
                $dataSet->buttons[] = array(
 
130
                $dataSet['buttons'][] = array(
181
131
                    'id' => 'dataset_button_viewcolumns',
182
 
                    'url' => $this->urlFor('dataSet.column.view', ['id' => $dataSet->dataSetId]),
183
 
                    'class' => 'XiboRedirectButton',
 
132
                    'url' => 'index.php?p=dataset&q=DataSetColumnsForm&datasetid=' . $dataSet['datasetid'] . '&dataset=' . $dataSet['dataset'],
184
133
                    'text' => __('View Columns')
185
134
                );
186
135
 
187
 
                // Divider
188
 
                $dataSet->buttons[] = ['divider' => true];
189
 
 
190
 
                // Import DataSet
191
 
                if ($dataSet->isRemote !== 1) {
192
 
                    $dataSet->buttons[] = array(
193
 
                        'id' => 'dataset_button_import',
194
 
                        'class' => 'dataSetImportForm',
195
 
                        'url' => $this->urlFor('dataSet.import.form', ['id' => $dataSet->dataSetId]),
196
 
                        'text' => __('Import CSV')
197
 
                    );
198
 
                }
199
 
 
200
 
                // Copy
201
 
                $dataSet->buttons[] = array(
202
 
                    'id' => 'dataset_button_copy',
203
 
                    'url' => $this->urlFor('dataSet.copy.form', ['id' => $dataSet->dataSetId]),
204
 
                    'text' => __('Copy')
205
 
                );
206
 
 
207
 
                // Divider
208
 
                $dataSet->buttons[] = ['divider' => true];
209
 
 
210
136
                // Edit DataSet
211
 
                $dataSet->buttons[] = array(
 
137
                $dataSet['buttons'][] = array(
212
138
                    'id' => 'dataset_button_edit',
213
 
                    'url' => $this->urlFor('dataSet.edit.form', ['id' => $dataSet->dataSetId]),
 
139
                    'url' => 'index.php?p=dataset&q=EditDataSetForm&datasetid=' . $dataSet['datasetid'] . '&dataset=' . $dataSet['dataset'],
214
140
                    'text' => __('Edit')
215
141
                );
 
142
 
 
143
                // Edit DataSet
 
144
                $dataSet['buttons'][] = array(
 
145
                    'id' => 'dataset_button_import',
 
146
                    'url' => 'index.php?p=dataset&q=ImportCsvForm&datasetid=' . $dataSet['datasetid'] . '&dataset=' . $dataSet['dataset'],
 
147
                    'text' => __('Import CSV')
 
148
                );
216
149
            }
217
150
 
218
 
            if ($user->checkDeleteable($dataSet) && $dataSet->isLookup == 0) {
 
151
            if ($dataSet['del']) {
 
152
 
219
153
                // Delete DataSet
220
 
                $dataSet->buttons[] = array(
 
154
                $dataSet['buttons'][] = array(
221
155
                    'id' => 'dataset_button_delete',
222
 
                    'url' => $this->urlFor('dataSet.delete.form', ['id' => $dataSet->dataSetId]),
 
156
                    'url' => 'index.php?p=dataset&q=DeleteDataSetForm&datasetid=' . $dataSet['datasetid'] . '&dataset=' . $dataSet['dataset'],
223
157
                    'text' => __('Delete')
224
158
                );
225
159
            }
226
160
 
227
 
            // Divider
228
 
            $dataSet->buttons[] = ['divider' => true];
 
161
            if ($dataSet['modifyPermissions']) {
229
162
 
230
 
            if ($user->checkPermissionsModifyable($dataSet)) {
231
163
                // Edit Permissions
232
 
                $dataSet->buttons[] = array(
233
 
                    'id' => 'dataset_button_permissions',
234
 
                    'url' => $this->urlFor('user.permissions.form', ['entity' => 'DataSet', 'id' => $dataSet->dataSetId]),
 
164
                $dataSet['buttons'][] = array(
 
165
                    'id' => 'dataset_button_delete',
 
166
                    'url' => 'index.php?p=dataset&q=PermissionsForm&datasetid=' . $dataSet['datasetid'] . '&dataset=' . $dataSet['dataset'],
235
167
                    'text' => __('Permissions')
236
168
                );
237
169
            }
238
 
        }
239
 
 
240
 
        $this->getState()->template = 'grid';
241
 
        $this->getState()->recordsTotal = $this->dataSetFactory->countLast();
242
 
        $this->getState()->setData($dataSets);
243
 
    }
244
 
 
245
 
    /**
246
 
     * Add DataSet Form
247
 
     */
248
 
    public function addForm()
249
 
    {
250
 
        $this->getState()->template = 'dataset-form-add';
251
 
        $this->getState()->setData([
252
 
            'dataSets' => $this->dataSetFactory->query(),
253
 
            'help' => $this->getHelp()->link('DataSet', 'Add')
254
 
        ]);
255
 
    }
256
 
 
257
 
    /**
258
 
     * Add dataSet
259
 
     *
260
 
     * @SWG\Post(
261
 
     *  path="/dataset",
262
 
     *  operationId="dataSetAdd",
263
 
     *  tags={"dataset"},
264
 
     *  summary="Add DataSet",
265
 
     *  description="Add a DataSet",
266
 
     *  @SWG\Parameter(
267
 
     *      name="dataSet",
268
 
     *      in="formData",
269
 
     *      description="The DataSet Name",
270
 
     *      type="string",
271
 
     *      required=true
272
 
     *   ),
273
 
     *  @SWG\Parameter(
274
 
     *      name="description",
275
 
     *      in="formData",
276
 
     *      description="A description of this DataSet",
277
 
     *      type="string",
278
 
     *      required=false
279
 
     *   ),
280
 
     *  @SWG\Parameter(
281
 
     *      name="code",
282
 
     *      in="formData",
283
 
     *      description="A code for this DataSet",
284
 
     *      type="string",
285
 
     *      required=false
286
 
     *   ),
287
 
     *  @SWG\Parameter(
288
 
     *      name="isRemote",
289
 
     *      in="formData",
290
 
     *      description="Is this a remote DataSet?",
291
 
     *      type="integer",
292
 
     *      required=true
293
 
     *   ),
294
 
     *  @SWG\Parameter(
295
 
     *      name="method",
296
 
     *      in="formData",
297
 
     *      description="The Request Method GET or POST",
298
 
     *      type="string",
299
 
     *      required=false
300
 
     *   ),
301
 
     *  @SWG\Parameter(
302
 
     *      name="uri",
303
 
     *      in="formData",
304
 
     *      description="The URI, without query parameters",
305
 
     *      type="string",
306
 
     *      required=false
307
 
     *   ),
308
 
     *  @SWG\Parameter(
309
 
     *      name="postData",
310
 
     *      in="formData",
311
 
     *      description="query parameter encoded data to add to the request",
312
 
     *      type="string",
313
 
     *      required=false
314
 
     *   ),
315
 
     *  @SWG\Parameter(
316
 
     *      name="authentication",
317
 
     *      in="formData",
318
 
     *      description="HTTP Authentication method None|Basic|Digest",
319
 
     *      type="string",
320
 
     *      required=false
321
 
     *   ),
322
 
     *  @SWG\Parameter(
323
 
     *      name="username",
324
 
     *      in="formData",
325
 
     *      description="HTTP Authentication User Name",
326
 
     *      type="string",
327
 
     *      required=false
328
 
     *   ),
329
 
     *  @SWG\Parameter(
330
 
     *      name="password",
331
 
     *      in="formData",
332
 
     *      description="HTTP Authentication Password",
333
 
     *      type="string",
334
 
     *      required=false
335
 
     *   ),
336
 
     *  @SWG\Parameter(
337
 
     *      name="refreshRate",
338
 
     *      in="formData",
339
 
     *      description="How often in seconds should this remote DataSet be refreshed",
340
 
     *      type="integer",
341
 
     *      required=false
342
 
     *   ),
343
 
     *  @SWG\Parameter(
344
 
     *      name="clearRate",
345
 
     *      in="formData",
346
 
     *      description="How often in seconds should this remote DataSet be truncated",
347
 
     *      type="integer",
348
 
     *      required=false
349
 
     *   ),
350
 
     *  @SWG\Parameter(
351
 
     *      name="runsAfter",
352
 
     *      in="formData",
353
 
     *      description="An optional dataSetId which should be run before this Remote DataSet",
354
 
     *      type="integer",
355
 
     *      required=false
356
 
     *   ),
357
 
     *  @SWG\Parameter(
358
 
     *      name="dataRoot",
359
 
     *      in="formData",
360
 
     *      description="The root of the data in the Remote source which is used as the base for all remote columns",
361
 
     *      type="string",
362
 
     *      required=false
363
 
     *   ),
364
 
     *  @SWG\Parameter(
365
 
     *      name="summarize",
366
 
     *      in="formData",
367
 
     *      description="Should the data be aggregated? None|Summarize|Count",
368
 
     *      type="string",
369
 
     *      required=false
370
 
     *   ),
371
 
     *  @SWG\Parameter(
372
 
     *      name="summarizeField",
373
 
     *      in="formData",
374
 
     *      description="Which field should be used to summarize",
375
 
     *      type="string",
376
 
     *      required=false
377
 
     *   ),
378
 
     *  @SWG\Response(
379
 
     *      response=201,
380
 
     *      description="successful operation",
381
 
     *      @SWG\Schema(ref="#/definitions/DataSet"),
382
 
     *      @SWG\Header(
383
 
     *          header="Location",
384
 
     *          description="Location of the new record",
385
 
     *          type="string"
386
 
     *      )
387
 
     *  )
388
 
     * )
389
 
     *
390
 
     * @throws XiboException
391
 
     */
392
 
    public function add()
393
 
    {
394
 
        $dataSet = $this->dataSetFactory->createEmpty();
395
 
        $dataSet->dataSet = $this->getSanitizer()->getString('dataSet');
396
 
        $dataSet->description = $this->getSanitizer()->getString('description');
397
 
        $dataSet->code = $this->getSanitizer()->getString('code');
398
 
        $dataSet->isRemote = $this->getSanitizer()->getCheckbox('isRemote');
399
 
        $dataSet->userId = $this->getUser()->userId;
400
 
 
401
 
        // Fields for remote
402
 
        if ($dataSet->isRemote === 1) {
403
 
            $dataSet->method = $this->getSanitizer()->getString('method');
404
 
            $dataSet->uri = $this->getSanitizer()->getString('uri');
405
 
            $dataSet->postData = trim($this->getSanitizer()->getString('postData'));
406
 
            $dataSet->authentication = $this->getSanitizer()->getString('authentication');
407
 
            $dataSet->username = $this->getSanitizer()->getString('username');
408
 
            $dataSet->password = $this->getSanitizer()->getString('password');
409
 
            $dataSet->refreshRate = $this->getSanitizer()->getInt('refreshRate');
410
 
            $dataSet->clearRate = $this->getSanitizer()->getInt('clearRate');
411
 
            $dataSet->runsAfter = $this->getSanitizer()->getInt('runsAfter');
412
 
            $dataSet->dataRoot = $this->getSanitizer()->getString('dataRoot');
413
 
            $dataSet->summarize = $this->getSanitizer()->getString('summarize');
414
 
            $dataSet->summarizeField = $this->getSanitizer()->getString('summarizeField');
415
 
        }
 
170
 
 
171
            $rows[] = $dataSet;
 
172
        }
 
173
 
 
174
        Theme::Set('table_rows', $rows);
 
175
 
 
176
        $output = Theme::RenderReturn('table_render');
 
177
 
 
178
        $response->SetGridResponse($output);
 
179
 
 
180
    }
 
181
 
 
182
    public function AddDataSetForm()
 
183
    {
 
184
 
 
185
        $user = $this->getUser();
 
186
        $response = $this->getState();
 
187
 
 
188
        // Set some information about the form
 
189
        Theme::Set('form_id', 'AddDataSetForm');
 
190
        Theme::Set('form_action', 'index.php?p=dataset&q=AddDataSet');
 
191
 
 
192
        $formFields = array();
 
193
        $formFields[] = FormManager::AddText('dataset', __('Name'), NULL,
 
194
            __('A name for this DataSet'), 'n', 'required');
 
195
 
 
196
        $formFields[] = FormManager::AddText('description', __('Description'), NULL,
 
197
            __('An optional description'), 'd', 'maxlength="250"');
 
198
 
 
199
        Theme::Set('form_fields', $formFields);
 
200
 
 
201
        $response->SetFormRequestResponse(NULL, __('Add DataSet'), '350px', '275px');
 
202
        $response->AddButton(__('Help'), 'XiboHelpRender("' . Help::Link('DataSet', 'Add') . '")');
 
203
        $response->AddButton(__('Cancel'), 'XiboDialogClose()');
 
204
        $response->AddButton(__('Add'), '$("#AddDataSetForm").submit()');
 
205
 
 
206
    }
 
207
 
 
208
    /**
 
209
     * Add a dataset
 
210
     */
 
211
    public function AddDataSet()
 
212
    {
 
213
 
 
214
 
 
215
 
 
216
        $user = $this->getUser();
 
217
        $response = $this->getState();
 
218
 
 
219
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
220
        $description = \Xibo\Helper\Sanitize::getString('description');
 
221
 
 
222
        $dataSetObject = new DataSet($db);
 
223
        if (!$dataSetId = $dataSetObject->Add($dataSet, $description, $this->user->userId))
 
224
            trigger_error($dataSetObject->GetErrorMessage(), E_USER_ERROR);
416
225
 
417
226
        // Also add one column
418
 
        $dataSetColumn = $this->dataSetColumnFactory->createEmpty();
419
 
        $dataSetColumn->columnOrder = 1;
420
 
        $dataSetColumn->heading = 'Col1';
421
 
        $dataSetColumn->dataSetColumnTypeId = 1;
422
 
        $dataSetColumn->dataTypeId = 1;
423
 
 
424
 
        // Add Column
425
 
        // only when we are not routing through the API
426
 
        if (!$this->isApi())
427
 
            $dataSet->assignColumn($dataSetColumn);
428
 
 
429
 
        // Save
430
 
        $dataSet->save();
431
 
 
432
 
        // Return
433
 
        $this->getState()->hydrate([
434
 
            'httpStatus' => 201,
435
 
            'message' => sprintf(__('Added %s'), $dataSet->dataSet),
436
 
            'id' => $dataSet->dataSetId,
437
 
            'data' => $dataSet
438
 
        ]);
439
 
    }
440
 
 
441
 
    /**
442
 
     * Edit DataSet Form
443
 
     * @param int $dataSetId
444
 
     * @throws \Xibo\Exception\NotFoundException
445
 
     */
446
 
    public function editForm($dataSetId)
447
 
    {
448
 
        $dataSet = $this->dataSetFactory->getById($dataSetId);
449
 
 
450
 
        if (!$this->getUser()->checkEditable($dataSet))
451
 
            throw new AccessDeniedException();
452
 
 
453
 
        // Set the form
454
 
        $this->getState()->template = 'dataset-form-edit';
455
 
        $this->getState()->setData([
456
 
            'dataSet' => $dataSet,
457
 
            'dataSets' => $this->dataSetFactory->query(),
458
 
            'help' => $this->getHelp()->link('DataSet', 'Edit')
459
 
        ]);
460
 
    }
461
 
 
462
 
    /**
463
 
     * Edit DataSet
464
 
     * @param int $dataSetId
465
 
     *
466
 
     * @SWG\Put(
467
 
     *  path="/dataset/{dataSetId}",
468
 
     *  operationId="dataSetEdit",
469
 
     *  tags={"dataset"},
470
 
     *  summary="Edit DataSet",
471
 
     *  description="Edit a DataSet",
472
 
     *  @SWG\Parameter(
473
 
     *      name="dataSetId",
474
 
     *      in="path",
475
 
     *      description="The DataSet ID",
476
 
     *      type="integer",
477
 
     *      required=true
478
 
     *   ),
479
 
     *  @SWG\Parameter(
480
 
     *      name="dataSet",
481
 
     *      in="formData",
482
 
     *      description="The DataSet Name",
483
 
     *      type="string",
484
 
     *      required=true
485
 
     *   ),
486
 
     *  @SWG\Parameter(
487
 
     *      name="description",
488
 
     *      in="formData",
489
 
     *      description="A description of this DataSet",
490
 
     *      type="string",
491
 
     *      required=false
492
 
     *   ),
493
 
     *  @SWG\Parameter(
494
 
     *      name="code",
495
 
     *      in="formData",
496
 
     *      description="A code for this DataSet",
497
 
     *      type="string",
498
 
     *      required=false
499
 
     *   ),
500
 
     *  @SWG\Parameter(
501
 
     *      name="isRemote",
502
 
     *      in="formData",
503
 
     *      description="Is this a remote DataSet?",
504
 
     *      type="integer",
505
 
     *      required=true
506
 
     *   ),
507
 
     *  @SWG\Parameter(
508
 
     *      name="method",
509
 
     *      in="formData",
510
 
     *      description="The Request Method GET or POST",
511
 
     *      type="string",
512
 
     *      required=false
513
 
     *   ),
514
 
     *  @SWG\Parameter(
515
 
     *      name="uri",
516
 
     *      in="formData",
517
 
     *      description="The URI, without query parameters",
518
 
     *      type="string",
519
 
     *      required=false
520
 
     *   ),
521
 
     *  @SWG\Parameter(
522
 
     *      name="postData",
523
 
     *      in="formData",
524
 
     *      description="query parameter encoded data to add to the request",
525
 
     *      type="string",
526
 
     *      required=false
527
 
     *   ),
528
 
     *  @SWG\Parameter(
529
 
     *      name="authentication",
530
 
     *      in="formData",
531
 
     *      description="HTTP Authentication method None|Basic|Digest",
532
 
     *      type="string",
533
 
     *      required=false
534
 
     *   ),
535
 
     *  @SWG\Parameter(
536
 
     *      name="username",
537
 
     *      in="formData",
538
 
     *      description="HTTP Authentication User Name",
539
 
     *      type="string",
540
 
     *      required=false
541
 
     *   ),
542
 
     *  @SWG\Parameter(
543
 
     *      name="password",
544
 
     *      in="formData",
545
 
     *      description="HTTP Authentication Password",
546
 
     *      type="string",
547
 
     *      required=false
548
 
     *   ),
549
 
     *  @SWG\Parameter(
550
 
     *      name="refreshRate",
551
 
     *      in="formData",
552
 
     *      description="How often in seconds should this remote DataSet be refreshed",
553
 
     *      type="integer",
554
 
     *      required=false
555
 
     *   ),
556
 
     *  @SWG\Parameter(
557
 
     *      name="clearRate",
558
 
     *      in="formData",
559
 
     *      description="How often in seconds should this remote DataSet be truncated",
560
 
     *      type="integer",
561
 
     *      required=false
562
 
     *   ),
563
 
     *  @SWG\Parameter(
564
 
     *      name="runsAfter",
565
 
     *      in="formData",
566
 
     *      description="An optional dataSetId which should be run before this Remote DataSet",
567
 
     *      type="integer",
568
 
     *      required=false
569
 
     *   ),
570
 
     *  @SWG\Parameter(
571
 
     *      name="dataRoot",
572
 
     *      in="formData",
573
 
     *      description="The root of the data in the Remote source which is used as the base for all remote columns",
574
 
     *      type="string",
575
 
     *      required=false
576
 
     *   ),
577
 
     *  @SWG\Parameter(
578
 
     *      name="summarize",
579
 
     *      in="formData",
580
 
     *      description="Should the data be aggregated? None|Summarize|Count",
581
 
     *      type="string",
582
 
     *      required=false
583
 
     *   ),
584
 
     *  @SWG\Parameter(
585
 
     *      name="summarizeField",
586
 
     *      in="formData",
587
 
     *      description="Which field should be used to summarize",
588
 
     *      type="string",
589
 
     *      required=false
590
 
     *   ),
591
 
     *  @SWG\Response(
592
 
     *      response=200,
593
 
     *      description="successful operation",
594
 
     *      @SWG\Schema(ref="#/definitions/DataSet")
595
 
     *  )
596
 
     * )
597
 
     *
598
 
     * @throws XiboException
599
 
     */
600
 
    public function edit($dataSetId)
601
 
    {
602
 
        $dataSet = $this->dataSetFactory->getById($dataSetId);
603
 
 
604
 
        if (!$this->getUser()->checkEditable($dataSet))
605
 
            throw new AccessDeniedException();
606
 
 
607
 
        $dataSet->dataSet = $this->getSanitizer()->getString('dataSet');
608
 
        $dataSet->description = $this->getSanitizer()->getString('description');
609
 
        $dataSet->code = $this->getSanitizer()->getString('code');
610
 
        $dataSet->isRemote = $this->getSanitizer()->getCheckbox('isRemote');
611
 
 
612
 
        if ($dataSet->isRemote === 1) {
613
 
            $dataSet->method = $this->getSanitizer()->getString('method');
614
 
            $dataSet->uri = $this->getSanitizer()->getString('uri');
615
 
            $dataSet->postData = trim($this->getSanitizer()->getString('postData'));
616
 
            $dataSet->authentication = $this->getSanitizer()->getString('authentication');
617
 
            $dataSet->username = $this->getSanitizer()->getString('username');
618
 
            $dataSet->password = $this->getSanitizer()->getString('password');
619
 
            $dataSet->refreshRate = $this->getSanitizer()->getInt('refreshRate');
620
 
            $dataSet->clearRate = $this->getSanitizer()->getInt('clearRate');
621
 
            $dataSet->runsAfter = $this->getSanitizer()->getInt('runsAfter');
622
 
            $dataSet->dataRoot = $this->getSanitizer()->getString('dataRoot');
623
 
            $dataSet->summarize = $this->getSanitizer()->getString('summarize');
624
 
            $dataSet->summarizeField = $this->getSanitizer()->getString('summarizeField');
625
 
        }
626
 
 
627
 
        $dataSet->save();
628
 
 
629
 
        // Return
630
 
        $this->getState()->hydrate([
631
 
            'message' => sprintf(__('Edited %s'), $dataSet->dataSet),
632
 
            'id' => $dataSet->dataSetId,
633
 
            'data' => $dataSet
634
 
        ]);
635
 
    }
636
 
 
637
 
    /**
638
 
     * DataSet Delete
639
 
     * @param int $dataSetId
640
 
     * @throws XiboException
641
 
     */
642
 
    public function deleteForm($dataSetId)
643
 
    {
644
 
        $dataSet = $this->dataSetFactory->getById($dataSetId);
645
 
 
646
 
        if (!$this->getUser()->checkDeleteable($dataSet))
647
 
            throw new AccessDeniedException();
648
 
 
649
 
        if ($dataSet->isLookup)
650
 
            throw new \InvalidArgumentException(__('Lookup Tables cannot be deleted'));
651
 
 
652
 
        // Set the form
653
 
        $this->getState()->template = 'dataset-form-delete';
654
 
        $this->getState()->setData([
655
 
            'dataSet' => $dataSet,
656
 
            'help' => $this->getHelp()->link('DataSet', 'Delete')
657
 
        ]);
658
 
    }
659
 
 
660
 
    /**
661
 
     * DataSet Delete
662
 
     * @param int $dataSetId
663
 
     *
664
 
     * @SWG\Delete(
665
 
     *  path="/dataset/{dataSetId}",
666
 
     *  operationId="dataSetDelete",
667
 
     *  tags={"dataset"},
668
 
     *  summary="Delete DataSet",
669
 
     *  description="Delete a DataSet",
670
 
     *  @SWG\Parameter(
671
 
     *      name="dataSetId",
672
 
     *      in="path",
673
 
     *      description="The DataSet ID",
674
 
     *      type="integer",
675
 
     *      required=true
676
 
     *   ),
677
 
     *  @SWG\Response(
678
 
     *      response=204,
679
 
     *      description="successful operation"
680
 
     *  )
681
 
     * )
682
 
     *
683
 
     * @throws XiboException
684
 
     */
685
 
    public function delete($dataSetId)
686
 
    {
687
 
        $dataSet = $this->dataSetFactory->getById($dataSetId);
688
 
 
689
 
        if (!$this->getUser()->checkDeleteable($dataSet))
690
 
            throw new AccessDeniedException();
691
 
 
692
 
        // Is there existing data?
693
 
        if ($this->getSanitizer()->getCheckbox('deleteData') == 0 && $dataSet->hasData())
694
 
            throw new InvalidArgumentException(__('There is data assigned to this data set, cannot delete.'), 'dataSetId');
695
 
 
696
 
        // Otherwise delete
697
 
        $dataSet->delete();
698
 
 
699
 
        // Return
700
 
        $this->getState()->hydrate([
701
 
            'httpStatus' => 204,
702
 
            'message' => sprintf(__('Deleted %s'), $dataSet->dataSet)
703
 
        ]);
704
 
    }
705
 
 
706
 
    /**
707
 
     * Copy DataSet Form
708
 
     * @param int $dataSetId
709
 
     * @throws \Xibo\Exception\NotFoundException
710
 
     */
711
 
    public function copyForm($dataSetId)
712
 
    {
713
 
        $dataSet = $this->dataSetFactory->getById($dataSetId);
714
 
 
715
 
        if (!$this->getUser()->checkEditable($dataSet))
716
 
            throw new AccessDeniedException();
717
 
 
718
 
        // Set the form
719
 
        $this->getState()->template = 'dataset-form-copy';
720
 
        $this->getState()->setData([
721
 
            'dataSet' => $dataSet,
722
 
            'help' => $this->getHelp()->link('DataSet', 'Edit')
723
 
        ]);
724
 
    }
725
 
 
726
 
    /**
727
 
     * Copy DataSet
728
 
     * @param int $dataSetId
729
 
     *
730
 
     * @SWG\Post(
731
 
     *  path="/dataset/copy/{dataSetId}",
732
 
     *  operationId="dataSetCopy",
733
 
     *  tags={"dataset"},
734
 
     *  summary="Copy DataSet",
735
 
     *  description="Copy a DataSet",
736
 
     *  @SWG\Parameter(
737
 
     *      name="dataSetId",
738
 
     *      in="path",
739
 
     *      description="The DataSet ID",
740
 
     *      type="integer",
741
 
     *      required=true
742
 
     *   ),
743
 
     *  @SWG\Parameter(
744
 
     *      name="dataSet",
745
 
     *      in="formData",
746
 
     *      description="The DataSet Name",
747
 
     *      type="string",
748
 
     *      required=true
749
 
     *   ),
750
 
     *  @SWG\Parameter(
751
 
     *      name="description",
752
 
     *      in="formData",
753
 
     *      description="A description of this DataSet",
754
 
     *      type="string",
755
 
     *      required=false
756
 
     *   ),
757
 
     *  @SWG\Parameter(
758
 
     *      name="code",
759
 
     *      in="formData",
760
 
     *      description="A code for this DataSet",
761
 
     *      type="string",
762
 
     *      required=false
763
 
     *   ),
764
 
     *  @SWG\Response(
765
 
     *      response=200,
766
 
     *      description="successful operation",
767
 
     *      @SWG\Schema(ref="#/definitions/DataSet")
768
 
     *  )
769
 
     * )
770
 
     *
771
 
     * @throws XiboException
772
 
     */
773
 
    public function copy($dataSetId)
774
 
    {
775
 
        $dataSet = $this->dataSetFactory->getById($dataSetId);
776
 
 
777
 
        if (!$this->getUser()->checkEditable($dataSet))
778
 
            throw new AccessDeniedException();
779
 
 
780
 
        // Load for the Copy
781
 
        $dataSet->load();
782
 
        $oldName = $dataSet->dataSet;
783
 
 
784
 
        // Clone and reset parameters
785
 
        $dataSet = clone $dataSet;
786
 
        $dataSet->dataSet = $this->getSanitizer()->getString('dataSet');
787
 
        $dataSet->description = $this->getSanitizer()->getString('description');
788
 
        $dataSet->code = $this->getSanitizer()->getString('code');
789
 
        $dataSet->save();
790
 
 
791
 
        // Return
792
 
        $this->getState()->hydrate([
793
 
            'message' => sprintf(__('Copied %s as %s'), $oldName, $dataSet->dataSet),
794
 
            'id' => $dataSet->dataSetId,
795
 
            'data' => $dataSet
796
 
        ]);
797
 
    }
798
 
 
799
 
    /**
800
 
     * Import CSV
801
 
     * @param int $dataSetId
802
 
     *
803
 
     * @SWG\Post(
804
 
     *  path="/dataset/import/{dataSetId}",
805
 
     *  operationId="dataSetImport",
806
 
     *  tags={"dataset"},
807
 
     *  summary="Import CSV",
808
 
     *  description="Import a CSV into a DataSet",
809
 
     *  @SWG\Parameter(
810
 
     *      name="dataSetId",
811
 
     *      in="path",
812
 
     *      description="The DataSet ID to import into.",
813
 
     *      type="integer",
814
 
     *      required=true
815
 
     *   ),
816
 
     *  @SWG\Parameter(
817
 
     *      name="files",
818
 
     *      in="formData",
819
 
     *      description="The file",
820
 
     *      type="file",
821
 
     *      required=true
822
 
     *   ),
823
 
     *  @SWG\Parameter(
824
 
     *      name="csvImport_{dataSetColumnId}",
825
 
     *      in="formData",
826
 
     *      description="You need to provide dataSetColumnId after csvImport_, to know your dataSet columns Ids, you will need to use the GET /dataset/{dataSetId}/column call first. The value of this parameter is the index of the column in your csv file, where the first column is 1",
827
 
     *      type="integer",
828
 
     *      required=true
829
 
     *   ),
830
 
     *  @SWG\Parameter(
831
 
     *      name="overwrite",
832
 
     *      in="formData",
833
 
     *      description="flag (0,1) Set to 1 to erase all content in the dataSet and overwrite it with new content in this import",
834
 
     *      type="integer",
835
 
     *      required=false
836
 
     *   ),
837
 
     *  @SWG\Parameter(
838
 
     *      name="ignorefirstrow",
839
 
     *      in="formData",
840
 
     *      description="flag (0,1), Set to 1 to Ignore first row, useful if the CSV file has headings",
841
 
     *      type="integer",
842
 
     *      required=false
843
 
     *   ),
844
 
     *  @SWG\Response(
845
 
     *      response=200,
846
 
     *      description="successful operation"
847
 
     *  )
848
 
     * )
849
 
     *
850
 
     * @throws XiboException
851
 
     * @throws \Exception
852
 
     */
853
 
    public function import($dataSetId)
854
 
    {
855
 
        $this->getLog()->debug('Import DataSet');
856
 
 
857
 
        $libraryFolder = $this->getConfig()->GetSetting('LIBRARY_LOCATION');
858
 
 
859
 
        // Make sure the library exists
860
 
        Library::ensureLibraryExists($this->getConfig()->GetSetting('LIBRARY_LOCATION'));
861
 
 
862
 
        $options = array(
863
 
            'userId' => $this->getUser()->userId,
864
 
            'dataSetId' => $dataSetId,
865
 
            'controller' => $this,
866
 
            'upload_dir' => $libraryFolder . 'temp/',
867
 
            'download_via_php' => true,
868
 
            'script_url' => $this->urlFor('dataSet.import'),
869
 
            'upload_url' => $this->urlFor('dataSet.import'),
870
 
            'image_versions' => array(),
871
 
            'accept_file_types' => '/\.csv/i'
872
 
        );
873
 
 
874
 
        try {
875
 
            // Hand off to the Upload Handler provided by jquery-file-upload
876
 
            new DataSetUploadHandler($options);
877
 
 
878
 
        } catch (\Exception $e) {
879
 
            // We must not issue an error, the file upload return should have the error object already
880
 
            $this->getApp()->commit = false;
881
 
        }
882
 
 
883
 
        $this->setNoOutput(true);
884
 
    }
885
 
 
886
 
    /**
887
 
     * Import JSON
888
 
     * @param int $dataSetId
889
 
     * @throws \Exception
890
 
     *
891
 
     * @SWG\Post(
892
 
     *  path="/dataset/importjson/{dataSetId}",
893
 
     *  operationId="dataSetImportJson",
894
 
     *  tags={"dataset"},
895
 
     *  summary="Import JSON",
896
 
     *  description="Import JSON into a DataSet",
897
 
     *  @SWG\Parameter(
898
 
     *      name="dataSetId",
899
 
     *      in="path",
900
 
     *      description="The DataSet ID to import into.",
901
 
     *      type="integer",
902
 
     *      required=true
903
 
     *   ),
904
 
     *  @SWG\Parameter(
905
 
     *      name="data",
906
 
     *      in="body",
907
 
     *      schema="json",
908
 
     *      description="The row data, field name vs field data format. e.g. { uniqueKeys: [col1], rows: [{col1: value1}]}",
909
 
     *      type="string",
910
 
     *      required=true
911
 
     *   ),
912
 
     *  @SWG\Response(
913
 
     *      response=200,
914
 
     *      description="successful operation"
915
 
     *  )
916
 
     * )
917
 
     */
918
 
    public function importJson($dataSetId)
919
 
    {
920
 
        $dataSet = $this->dataSetFactory->getById($dataSetId);
921
 
 
922
 
        if (!$this->getUser()->checkEditable($dataSet))
923
 
            throw new AccessDeniedException();
924
 
 
925
 
        $body = $this->getApp()->request()->getBody();
926
 
 
927
 
        if (empty($body))
928
 
            throw new \InvalidArgumentException(__('Missing JSON Body'));
929
 
 
930
 
        // Expect 2 parameters
931
 
        $data = json_decode($body, true);
932
 
 
933
 
        if (!isset($data['rows']) || !isset($data['uniqueKeys']))
934
 
            throw new \InvalidArgumentException(__('Malformed JSON body, rows and uniqueKeys are required'));
935
 
 
936
 
        $this->getLog()->debug('Import JSON into DataSet with ' . count($data['rows']) . ' and unique keys ' . json_encode($data['uniqueKeys']));
937
 
 
938
 
        // Should we truncate?
939
 
        if (isset($data['truncate']) && $data['truncate']) {
940
 
            $dataSet->deleteData();
941
 
        }
942
 
 
943
 
        // Get the columns for this dataset
944
 
        $columns = [];
945
 
        foreach ($dataSet->getColumn() as $column) {
946
 
            /* @var \Xibo\Entity\DataSetColumn $column */
947
 
            if ($column->dataSetColumnTypeId == 1) {
948
 
                $columns[$column->heading] = $column->dataTypeId;
 
227
        $dataSetColumn = new DataSetColumn($db);
 
228
        $dataSetColumn->Add($dataSetId, 'Col1', 1, null, 1);
 
229
 
 
230
        $response->SetFormSubmitResponse(__('DataSet Added'));
 
231
 
 
232
    }
 
233
 
 
234
    public function EditDataSetForm()
 
235
    {
 
236
 
 
237
        $user = $this->getUser();
 
238
        $response = $this->getState();
 
239
 
 
240
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
241
 
 
242
        $auth = $user->DataSetAuth($dataSetId, true);
 
243
        if (!$auth->edit)
 
244
            trigger_error(__('Access Denied'));
 
245
 
 
246
        // Get the information we already know
 
247
        $SQL = sprintf("SELECT DataSet, Description FROM dataset WHERE DataSetID = %d", $dataSetId);
 
248
 
 
249
        if (!$row = $db->GetSingleRow($SQL))
 
250
            trigger_error(__('Unable to get DataSet information'));
 
251
 
 
252
        // Set some information about the form
 
253
        Theme::Set('form_id', 'EditDataSetForm');
 
254
        Theme::Set('form_action', 'index.php?p=dataset&q=EditDataSet');
 
255
        Theme::Set('form_meta', '<input type="hidden" name="datasetid" value="' . $dataSetId . '" />');
 
256
 
 
257
        $formFields = array();
 
258
        $formFields[] = FormManager::AddText('dataset', __('Name'), \Xibo\Helper\Sanitize::string($row['DataSet']),
 
259
            __('A name for this DataSet'), 'n', 'required');
 
260
 
 
261
        $formFields[] = FormManager::AddText('description', __('Description'), \Xibo\Helper\Sanitize::string($row['Description']),
 
262
            __('An optional description'), 'd', 'maxlength="250"');
 
263
 
 
264
        Theme::Set('form_fields', $formFields);
 
265
 
 
266
        $response->SetFormRequestResponse(NULL, __('Edit DataSet'), '350px', '275px');
 
267
        $response->AddButton(__('Help'), 'XiboHelpRender("' . Help::Link('DataSet', 'Edit') . '")');
 
268
        $response->AddButton(__('Cancel'), 'XiboDialogClose()');
 
269
        $response->AddButton(__('Save'), '$("#EditDataSetForm").submit()');
 
270
 
 
271
    }
 
272
 
 
273
    public function EditDataSet()
 
274
    {
 
275
 
 
276
 
 
277
 
 
278
        $user = $this->getUser();
 
279
        $response = $this->getState();
 
280
 
 
281
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
282
 
 
283
        $auth = $user->DataSetAuth($dataSetId, true);
 
284
        if (!$auth->edit)
 
285
            trigger_error(__('Access Denied'));
 
286
 
 
287
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
288
        $description = \Xibo\Helper\Sanitize::getString('description');
 
289
 
 
290
        $dataSetObject = new DataSet($db);
 
291
        if (!$dataSetObject->Edit($dataSetId, $dataSet, $description))
 
292
            trigger_error($dataSetObject->GetErrorMessage(), E_USER_ERROR);
 
293
 
 
294
        $response->SetFormSubmitResponse(__('DataSet Edited'));
 
295
 
 
296
    }
 
297
 
 
298
    /**
 
299
     * Return the Delete Form as HTML
 
300
     * @return
 
301
     */
 
302
    public function DeleteDataSetForm()
 
303
    {
 
304
 
 
305
        $response = $this->getState();
 
306
 
 
307
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
308
 
 
309
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
310
        if (!$auth->del)
 
311
            trigger_error(__('Access Denied'));
 
312
 
 
313
        // Set some information about the form
 
314
        Theme::Set('form_id', 'DataSetDeleteForm');
 
315
        Theme::Set('form_action', 'index.php?p=dataset&q=DeleteDataSet');
 
316
        Theme::Set('form_meta', '<input type="hidden" name="datasetid" value="' . $dataSetId . '" />');
 
317
 
 
318
        $formFields = array();
 
319
        $formFields[] = FormManager::AddMessage(__('Are you sure you want to delete?'));
 
320
        $formFields[] = FormManager::AddCheckbox('deleteData', __('Delete any associated data?'), NULL,
 
321
            __('Please tick the box if you would like to delete all the Data contained in this DataSet'), 'c');
 
322
 
 
323
        Theme::Set('form_fields', $formFields);
 
324
 
 
325
        $response->SetFormRequestResponse(NULL, __('Delete this DataSet?'), '350px', '200px');
 
326
        $response->AddButton(__('Help'), 'XiboHelpRender("' . Help::Link('DataSet', 'Delete') . '")');
 
327
        $response->AddButton(__('Cancel'), 'XiboDialogClose()');
 
328
        $response->AddButton(__('Delete'), '$("#DataSetDeleteForm").submit()');
 
329
 
 
330
    }
 
331
 
 
332
    public function DeleteDataSet()
 
333
    {
 
334
 
 
335
 
 
336
 
 
337
        $user = $this->getUser();
 
338
        $response = $this->getState();
 
339
 
 
340
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
341
 
 
342
        $auth = $user->DataSetAuth($dataSetId, true);
 
343
        if (!$auth->del)
 
344
            trigger_error(__('Access Denied'));
 
345
 
 
346
        $dataSetObject = new DataSet($db);
 
347
 
 
348
        if ($dataSetObject->hasData($dataSetId) && \Kit::GetParam('deleteData', _POST, _CHECKBOX) == 0)
 
349
            trigger_error(__('There is data assigned to this data set, cannot delete.'), E_USER_ERROR);
 
350
 
 
351
        // Proceed with the delete
 
352
        if (!$dataSetObject->Delete($dataSetId))
 
353
            trigger_error($dataSetObject->GetErrorMessage(), E_USER_ERROR);
 
354
 
 
355
        $response->SetFormSubmitResponse(__('DataSet Deleted'));
 
356
 
 
357
    }
 
358
 
 
359
    public function DataSetColumnsForm()
 
360
    {
 
361
 
 
362
        $response = $this->getState();
 
363
        $helpManager = new Help($db, $this->user);
 
364
 
 
365
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
366
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
367
 
 
368
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
369
        if (!$auth->edit)
 
370
            trigger_error(__('Access Denied'));
 
371
 
 
372
        $SQL = "";
 
373
        $SQL .= "SELECT DataSetColumnID, Heading, datatype.DataType, datasetcolumntype.DataSetColumnType, ListContent, ColumnOrder ";
 
374
        $SQL .= "  FROM datasetcolumn ";
 
375
        $SQL .= "   INNER JOIN `datatype` ";
 
376
        $SQL .= "   ON datatype.DataTypeID = datasetcolumn.DataTypeID ";
 
377
        $SQL .= "   INNER JOIN `datasetcolumntype` ";
 
378
        $SQL .= "   ON datasetcolumntype.DataSetColumnTypeID = datasetcolumn.DataSetColumnTypeID ";
 
379
        $SQL .= sprintf(" WHERE DataSetID = %d ", $dataSetId);
 
380
        $SQL .= "ORDER BY ColumnOrder ";
 
381
 
 
382
 
 
383
        $dataSetColumnObject = new DataSetColumn($db);
 
384
 
 
385
        // Load results into an array
 
386
        if (!$dataSetColumns = $dataSetColumnObject->GetColumns($dataSetId))
 
387
            trigger_error($dataSetColumnObject->GetErrorMessage(), E_USER_ERROR);
 
388
 
 
389
        $rows = array();
 
390
 
 
391
        foreach ($dataSetColumns as $row) {
 
392
 
 
393
            $row['datatype'] = __($row['datatype']);
 
394
            $row['datasetcolumntype'] = __($row['datasetcolumntype']);
 
395
 
 
396
            // Edit
 
397
            $row['buttons'][] = array(
 
398
                'id' => 'dataset_button_edit',
 
399
                'url' => 'index.php?p=dataset&q=EditDataSetColumnForm&datasetid=' . $dataSetId . '&datasetcolumnid=' . $row['datasetcolumnid'] . '&dataset=' . $dataSet,
 
400
                'text' => __('Edit')
 
401
            );
 
402
 
 
403
            if ($auth->del) {
 
404
                // Delete
 
405
                $row['buttons'][] = array(
 
406
                    'id' => 'dataset_button_delete',
 
407
                    'url' => 'index.php?p=dataset&q=DeleteDataSetColumnForm&datasetid=' . $dataSetId . '&datasetcolumnid=' . $row['datasetcolumnid'] . '&dataset=' . $dataSet,
 
408
                    'text' => __('Delete')
 
409
                );
949
410
            }
950
 
        }
951
 
 
952
 
        $takenSomeAction = false;
953
 
 
954
 
        // Parse and validate each data row we've been provided
955
 
        foreach ($data['rows'] as $row) {
956
 
            // Parse each property
957
 
            $sanitizedRow = null;
958
 
            foreach ($row as $key => $value) {
959
 
                // Does the property in the provided row exist as a column?
960
 
                if (isset($columns[$key])) {
961
 
                    // Sanitize accordingly
962
 
                    if ($columns[$key] == 2) {
963
 
                        // Number
964
 
                        $value = $this->getSanitizer()->double($value);
965
 
                    }
966
 
                    else if ($columns[$key] == 3) {
967
 
                        // Date
968
 
                        $value = $this->getDate()->getLocalDate($this->getDate()->parse($value));
969
 
                    }
970
 
                    else if ($columns[$key] == 5) {
971
 
                        // Media Id
972
 
                        $value = $this->getSanitizer()->int($value);
973
 
                    }
974
 
                    else {
975
 
                        // String
976
 
                        $value = $this->getSanitizer()->string($value);
977
 
                    }
978
 
 
979
 
                    // Data is sanitized, add to the sanitized row
980
 
                    $sanitizedRow[$key] = $value;
 
411
 
 
412
            $rows[] = $row;
 
413
        }
 
414
 
 
415
        Theme::Set('table_rows', $rows);
 
416
 
 
417
        $form = Theme::RenderReturn('dataset_form_column_grid');
 
418
 
 
419
        $response->SetFormRequestResponse($form, sprintf(__('Columns for %s'), $dataSet), '550px', '400px');
 
420
        $response->AddButton(__('Help'), 'XiboHelpRender("' . $helpManager->Link('DataSet', 'ViewColumns') . '")');
 
421
        $response->AddButton(__('Close'), 'XiboDialogClose()');
 
422
        $response->AddButton(__('Add Column'), 'XiboFormRender("index.php?p=dataset&q=AddDataSetColumnForm&datasetid=' . $dataSetId . '&dataset=' . $dataSet . '")');
 
423
 
 
424
    }
 
425
 
 
426
    public function AddDataSetColumnForm()
 
427
    {
 
428
 
 
429
        $response = $this->getState();
 
430
        $helpManager = new Help($db, $this->user);
 
431
 
 
432
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
433
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
434
 
 
435
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
436
        if (!$auth->edit)
 
437
            trigger_error(__('Access Denied'));
 
438
 
 
439
        // Set some information about the form
 
440
        Theme::Set('form_id', 'DataSetColumnAddForm');
 
441
        Theme::Set('form_action', 'index.php?p=dataset&q=AddDataSetColumn');
 
442
        Theme::Set('form_meta', '<input type="hidden" name="dataset" value="' . $dataSet . '" /><input type="hidden" name="datasetid" value="' . $dataSetId . '" />');
 
443
 
 
444
        $formFields = array();
 
445
        $formFields[] = FormManager::AddText('heading', __('Heading'), NULL, __('The heading for this Column'), 'h', 'required');
 
446
        $formFields[] = FormManager::AddCombo(
 
447
            'datasetcolumntypeid',
 
448
            __('Column Type'),
 
449
            NULL,
 
450
            $db->GetArray('SELECT datasetcolumntypeid, datasetcolumntype FROM datasetcolumntype'),
 
451
            'datasetcolumntypeid',
 
452
            'datasetcolumntype',
 
453
            __('Whether this column is a value or a formula'),
 
454
            't');
 
455
        $formFields[] = FormManager::AddCombo(
 
456
            'datatypeid',
 
457
            __('Data Type'),
 
458
            NULL,
 
459
            $db->GetArray('SELECT datatypeid, datatype FROM datatype'),
 
460
            'datatypeid',
 
461
            'datatype',
 
462
            __('The DataType of the Intended Data'),
 
463
            'd');
 
464
        $formFields[] = FormManager::AddText('listcontent', __('List Content'), NULL, __('A comma separated list of items to present in a combo box'), 'l', '');
 
465
        $formFields[] = FormManager::AddNumber('columnorder', __('Column Order'), NULL, __('The order this column should be displayed in when entering data'), 'o', '');
 
466
        $formFields[] = FormManager::AddText('formula', __('Formula'), NULL, __('A formula to use as a calculation for formula column types'), 'f', '');
 
467
 
 
468
        Theme::Set('form_fields', $formFields);
 
469
 
 
470
        $response->SetFormRequestResponse(NULL, __('Add Column'), '350px', '200px');
 
471
        $response->AddButton(__('Help'), 'XiboHelpRender("' . $helpManager->Link('DataSet', 'AddColumn') . '")');
 
472
        $response->AddButton(__('Cancel'), 'XiboFormRender("index.php?p=dataset&q=DataSetColumnsForm&datasetid=' . $dataSetId . '&dataset=' . $dataSet . '")');
 
473
        $response->AddButton(__('Save'), '$("#DataSetColumnAddForm").submit()');
 
474
 
 
475
    }
 
476
 
 
477
    public function AddDataSetColumn()
 
478
    {
 
479
 
 
480
 
 
481
 
 
482
        $user = $this->getUser();
 
483
        $response = $this->getState();
 
484
 
 
485
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
486
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
487
 
 
488
        $auth = $user->DataSetAuth($dataSetId, true);
 
489
        if (!$auth->edit)
 
490
            trigger_error(__('Access Denied'));
 
491
 
 
492
        $heading = \Xibo\Helper\Sanitize::getString('heading');
 
493
        $listContent = \Xibo\Helper\Sanitize::getString('listcontent');
 
494
        $columnOrder = \Xibo\Helper\Sanitize::getInt('columnorder');
 
495
        $dataTypeId = \Xibo\Helper\Sanitize::getInt('datatypeid');
 
496
        $dataSetColumnTypeId = \Xibo\Helper\Sanitize::getInt('datasetcolumntypeid');
 
497
        $formula = \Xibo\Helper\Sanitize::getString('formula');
 
498
 
 
499
        $dataSetObject = new DataSetColumn($db);
 
500
        if (!$dataSetObject->Add($dataSetId, $heading, $dataTypeId, $listContent, $columnOrder, $dataSetColumnTypeId, $formula))
 
501
            trigger_error($dataSetObject->GetErrorMessage(), E_USER_ERROR);
 
502
 
 
503
        $response->SetFormSubmitResponse(__('Column Added'));
 
504
        $response->hideMessage = true;
 
505
        $response->loadForm = true;
 
506
        $response->loadFormUri = 'index.php?p=dataset&q=DataSetColumnsForm&datasetid=' . $dataSetId . '&dataset=' . $dataSet;
 
507
 
 
508
    }
 
509
 
 
510
    public function EditDataSetColumnForm()
 
511
    {
 
512
 
 
513
        $response = $this->getState();
 
514
        $helpManager = new Help($db, $this->user);
 
515
 
 
516
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
517
        $dataSetColumnId = \Xibo\Helper\Sanitize::getInt('datasetcolumnid');
 
518
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
519
 
 
520
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
521
        if (!$auth->edit)
 
522
            trigger_error(__('Access Denied'));
 
523
 
 
524
        // Set some information about the form
 
525
        Theme::Set('form_id', 'DataSetColumnEditForm');
 
526
        Theme::Set('form_action', 'index.php?p=dataset&q=EditDataSetColumn');
 
527
        Theme::Set('form_meta', '<input type="hidden" name="dataset" value="' . $dataSet . '" /><input type="hidden" name="datasetid" value="' . $dataSetId . '" /><input type="hidden" name="datasetcolumnid" value="' . $dataSetColumnId . '" />');
 
528
 
 
529
        // Get some information about this data set column
 
530
        $SQL = sprintf("SELECT Heading, ListContent, ColumnOrder, DataTypeID, DataSetColumnTypeID, Formula FROM datasetcolumn WHERE DataSetColumnID = %d", $dataSetColumnId);
 
531
 
 
532
        if (!$row = $db->GetSingleRow($SQL))
 
533
            trigger_error(__('Unabled to get Data Column information'), E_USER_ERROR);
 
534
 
 
535
        // Dropdown list for DataType and DataColumnType
 
536
        Theme::Set('datatype_field_list', $db->GetArray('SELECT datatypeid, datatype FROM datatype'));
 
537
        Theme::Set('datasetcolumntype_field_list', $db->GetArray('SELECT datasetcolumntypeid, datasetcolumntype FROM datasetcolumntype'));
 
538
 
 
539
        $formFields = array();
 
540
        $formFields[] = FormManager::AddText('heading', __('Heading'), \Xibo\Helper\Sanitize::string($row['Heading']),
 
541
            __('The heading for this Column'), 'h', 'required');
 
542
 
 
543
        $formFields[] = FormManager::AddCombo(
 
544
            'datasetcolumntypeid',
 
545
            __('Column Type'),
 
546
            \Xibo\Helper\Sanitize::int($row['DataSetColumnTypeID']),
 
547
            $db->GetArray('SELECT datasetcolumntypeid, datasetcolumntype FROM datasetcolumntype'),
 
548
            'datasetcolumntypeid',
 
549
            'datasetcolumntype',
 
550
            __('Whether this column is a value or a formula'),
 
551
            't');
 
552
 
 
553
        $formFields[] = FormManager::AddCombo(
 
554
            'datatypeid',
 
555
            __('Data Type'),
 
556
            \Xibo\Helper\Sanitize::int($row['DataTypeID']),
 
557
            $db->GetArray('SELECT datatypeid, datatype FROM datatype'),
 
558
            'datatypeid',
 
559
            'datatype',
 
560
            __('The DataType of the Intended Data'),
 
561
            'd');
 
562
 
 
563
        $formFields[] = FormManager::AddText('listcontent', __('List Content'), \Xibo\Helper\Sanitize::string($row['ListContent']),
 
564
            __('A comma separated list of items to present in a combo box'), 'l', '');
 
565
 
 
566
        $formFields[] = FormManager::AddNumber('columnorder', __('Column Order'), \Xibo\Helper\Sanitize::int($row['ColumnOrder']),
 
567
            __('The order this column should be displayed in when entering data'), 'o', '');
 
568
 
 
569
        $formFields[] = FormManager::AddText('formula', __('Formula'), \Xibo\Helper\Sanitize::string($row['Formula']),
 
570
            __('A formula to use as a calculation for formula column types'), 'f', '');
 
571
 
 
572
        Theme::Set('form_fields', $formFields);
 
573
 
 
574
        $response->SetFormRequestResponse(NULL, __('Edit Column'), '350px', '200px');
 
575
        $response->AddButton(__('Help'), 'XiboHelpRender("' . $helpManager->Link('DataSet', 'EditColumn') . '")');
 
576
        $response->AddButton(__('Cancel'), 'XiboFormRender("index.php?p=dataset&q=DataSetColumnsForm&datasetid=' . $dataSetId . '&dataset=' . $dataSet . '")');
 
577
        $response->AddButton(__('Save'), '$("#DataSetColumnEditForm").submit()');
 
578
 
 
579
    }
 
580
 
 
581
    public function EditDataSetColumn()
 
582
    {
 
583
 
 
584
 
 
585
 
 
586
        $user = $this->getUser();
 
587
        $response = $this->getState();
 
588
 
 
589
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
590
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
591
 
 
592
        $auth = $user->DataSetAuth($dataSetId, true);
 
593
        if (!$auth->edit)
 
594
            trigger_error(__('Access Denied'));
 
595
 
 
596
        $dataSetColumnId = \Xibo\Helper\Sanitize::getInt('datasetcolumnid');
 
597
        $heading = \Xibo\Helper\Sanitize::getString('heading');
 
598
        $listContent = \Xibo\Helper\Sanitize::getString('listcontent');
 
599
        $columnOrder = \Xibo\Helper\Sanitize::getInt('columnorder');
 
600
        $dataTypeId = \Xibo\Helper\Sanitize::getInt('datatypeid');
 
601
        $dataSetColumnTypeId = \Xibo\Helper\Sanitize::getInt('datasetcolumntypeid');
 
602
        $formula = \Xibo\Helper\Sanitize::getString('formula');
 
603
 
 
604
        $dataSetObject = new DataSetColumn($db);
 
605
        if (!$dataSetObject->Edit($dataSetColumnId, $heading, $dataTypeId, $listContent, $columnOrder, $dataSetColumnTypeId, $formula))
 
606
            trigger_error($dataSetObject->GetErrorMessage(), E_USER_ERROR);
 
607
 
 
608
        $response->SetFormSubmitResponse(__('Column Edited'));
 
609
        $response->hideMessage = true;
 
610
        $response->loadForm = true;
 
611
        $response->loadFormUri = 'index.php?p=dataset&q=DataSetColumnsForm&datasetid=' . $dataSetId . '&dataset=' . $dataSet;
 
612
 
 
613
    }
 
614
 
 
615
    public function DeleteDataSetColumnForm()
 
616
    {
 
617
 
 
618
        $response = $this->getState();
 
619
        $helpManager = new Help($db, $this->user);
 
620
 
 
621
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
622
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
623
 
 
624
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
625
        if (!$auth->edit)
 
626
            trigger_error(__('Access Denied'));
 
627
 
 
628
        $dataSetColumnId = \Xibo\Helper\Sanitize::getInt('datasetcolumnid');
 
629
 
 
630
        // Set some information about the form
 
631
        Theme::Set('form_id', 'DataSetColumnDeleteForm');
 
632
        Theme::Set('form_action', 'index.php?p=dataset&q=DeleteDataSetColumn');
 
633
        Theme::Set('form_meta', '<input type="hidden" name="dataset" value="' . $dataSet . '" /><input type="hidden" name="datasetid" value="' . $dataSetId . '" /><input type="hidden" name="datasetcolumnid" value="' . $dataSetColumnId . '" />');
 
634
 
 
635
        Theme::Set('form_fields', array(FormManager::AddMessage(__('Are you sure you want to delete?'))));
 
636
 
 
637
        $response->SetFormRequestResponse(NULL, __('Delete this Column?'), '350px', '200px');
 
638
        $response->AddButton(__('Help'), 'XiboHelpRender("' . $helpManager->Link('DataSet', 'DeleteColumn') . '")');
 
639
        $response->AddButton(__('Cancel'), 'XiboFormRender("index.php?p=dataset&q=DataSetColumnsForm&datasetid=' . $dataSetId . '&dataset=' . $dataSet . '")');
 
640
        $response->AddButton(__('Delete'), '$("#DataSetColumnDeleteForm").submit()');
 
641
 
 
642
    }
 
643
 
 
644
    public function DeleteDataSetColumn()
 
645
    {
 
646
 
 
647
 
 
648
 
 
649
        $user = $this->getUser();
 
650
        $response = $this->getState();
 
651
 
 
652
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
653
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
654
 
 
655
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
656
        if (!$auth->edit)
 
657
            trigger_error(__('Access Denied'));
 
658
 
 
659
        $dataSetColumnId = \Xibo\Helper\Sanitize::getInt('datasetcolumnid');
 
660
 
 
661
        $dataSetObject = new DataSetColumn($db);
 
662
        if (!$dataSetObject->Delete($dataSetColumnId))
 
663
            trigger_error($dataSetObject->GetErrorMessage(), E_USER_ERROR);
 
664
 
 
665
        $response->SetFormSubmitResponse(__('Column Deleted'));
 
666
        $response->hideMessage = true;
 
667
        $response->loadForm = true;
 
668
        $response->loadFormUri = 'index.php?p=dataset&q=DataSetColumnsForm&datasetid=' . $dataSetId . '&dataset=' . $dataSet;
 
669
 
 
670
    }
 
671
 
 
672
    public function DataSetDataForm()
 
673
    {
 
674
 
 
675
        $response = $this->getState();
 
676
 
 
677
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
678
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
679
 
 
680
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
681
        if (!$auth->edit)
 
682
            trigger_error(__('Access Denied'), E_USER_ERROR);
 
683
 
 
684
        // Get the max number of rows
 
685
        $SQL = "";
 
686
        $SQL .= "SELECT MAX(RowNumber) AS RowNumber, COUNT(DISTINCT datasetcolumn.DataSetColumnID) AS ColNumber ";
 
687
        $SQL .= "  FROM datasetdata ";
 
688
        $SQL .= "   RIGHT OUTER JOIN datasetcolumn ";
 
689
        $SQL .= "   ON datasetcolumn.DataSetColumnID = datasetdata.DataSetColumnID ";
 
690
        $SQL .= sprintf("WHERE datasetcolumn.DataSetID = %d  AND datasetcolumn.DataSetColumnTypeID = 1 ", $dataSetId);
 
691
 
 
692
        Log::notice($SQL, 'dataset', 'DataSetDataForm');
 
693
 
 
694
        if (!$maxResult = $db->GetSingleRow($SQL)) {
 
695
            trigger_error($db->error());
 
696
            trigger_error(__('Unable to find the number of data points'), E_USER_ERROR);
 
697
        }
 
698
 
 
699
        $maxRows = $maxResult['RowNumber'];
 
700
        $maxCols = $maxResult['ColNumber'];
 
701
 
 
702
        // Get some information about the columns in this dataset
 
703
        $SQL = "SELECT Heading, DataSetColumnID, ListContent, ColumnOrder, DataTypeID FROM datasetcolumn WHERE DataSetID = %d  AND DataSetColumnTypeID = 1 ";
 
704
        $SQL .= "ORDER BY ColumnOrder ";
 
705
 
 
706
        if (!$results = $db->query(sprintf($SQL, $dataSetId))) {
 
707
            trigger_error($db->error());
 
708
            trigger_error(__('Unable to find the column headings'), E_USER_ERROR);
 
709
        }
 
710
 
 
711
        $columnDefinition = array();
 
712
 
 
713
        $form = '<table class="table table-bordered">';
 
714
        $form .= '   <tr>';
 
715
        $form .= '      <th>#</th>';
 
716
 
 
717
        while ($row = $db->get_assoc_row($results)) {
 
718
            $columnDefinition[] = $row;
 
719
            $heading = $row['Heading'];
 
720
 
 
721
            $form .= ' <th>' . $heading . '</th>';
 
722
        }
 
723
 
 
724
        $form .= '</tr>';
 
725
 
 
726
        // Loop through the max rows
 
727
        for ($row = 1; $row <= $maxRows + 2; $row++) {
 
728
            $form .= '<tr>';
 
729
            $form .= '  <td>' . $row . '</td>';
 
730
 
 
731
            // $row is the current row
 
732
            for ($col = 0; $col < $maxCols; $col++) {
 
733
                $dataSetColumnId = $columnDefinition[$col]['DataSetColumnID'];
 
734
                $listContent = $columnDefinition[$col]['ListContent'];
 
735
                $columnOrder = $columnDefinition[$col]['ColumnOrder'];
 
736
                $dataTypeId = $columnDefinition[$col]['DataTypeID'];
 
737
 
 
738
                // Value for this Col/Row
 
739
                $value = '';
 
740
 
 
741
                if ($row <= $maxRows) {
 
742
                    // This is intended to be a blank row
 
743
                    $SQL = "";
 
744
                    $SQL .= "SELECT Value ";
 
745
                    $SQL .= "  FROM datasetdata ";
 
746
                    $SQL .= "WHERE datasetdata.RowNumber = %d ";
 
747
                    $SQL .= "   AND datasetdata.DataSetColumnID = %d ";
 
748
                    $SQL = sprintf($SQL, $row, $dataSetColumnId);
 
749
 
 
750
                    Log::notice($SQL, 'dataset');
 
751
 
 
752
                    if (!$results = $db->query($SQL)) {
 
753
                        trigger_error($db->error());
 
754
                        trigger_error(__('Can not get the data row/column'), E_USER_ERROR);
 
755
                    }
 
756
 
 
757
                    if ($db->num_rows($results) == 0) {
 
758
                        $value = '';
 
759
                    } else {
 
760
                        $valueRow = $db->get_assoc_row($results);
 
761
                        $value = $valueRow['Value'];
 
762
                    }
981
763
                }
982
 
            }
983
 
 
984
 
            if (count($sanitizedRow) > 0) {
985
 
                $takenSomeAction = true;
986
 
 
987
 
                // Check unique keys to see if this is an update
988
 
                if (!empty($data['uniqueKeys']) && is_array($data['uniqueKeys'])) {
989
 
 
990
 
                    // Build a filter to select existing records
991
 
                    $filter = '';
992
 
                    foreach ($data['uniqueKeys'] as $uniqueKey) {
993
 
                        if (isset($sanitizedRow[$uniqueKey])) {
994
 
                            $filter .= 'AND `' . $uniqueKey . '` = \'' . $sanitizedRow[$uniqueKey] . '\' ';
995
 
                        }
996
 
                    }
997
 
                    $filter = trim($filter, 'AND');
998
 
 
999
 
                    // Use the unique keys to look up this row and see if it exists
1000
 
                    $existingRows = $dataSet->getData(['filter' => $filter], ['includeFormulaColumns' => false, 'requireTotal' => false]);
1001
 
 
1002
 
                    if (count($existingRows) > 0) {
1003
 
                        foreach ($existingRows as $existingRow) {
1004
 
                            $dataSet->editRow($existingRow['id'], array_merge($existingRow, $sanitizedRow));
1005
 
                        }
1006
 
                    }
1007
 
                    else {
1008
 
                        $dataSet->addRow($sanitizedRow);
1009
 
                    }
1010
 
 
 
764
 
 
765
                // Do we need a select list?
 
766
                if ($listContent != '') {
 
767
                    $listItems = explode(',', $listContent);
 
768
                    $selected = ($value == '') ? ' selected' : '';
 
769
                    $select = '<select class="form-control" name="value">';
 
770
                    $select .= '     <option value="" ' . $selected . '></option>';
 
771
 
 
772
                    for ($i = 0; $i < count($listItems); $i++) {
 
773
                        $selected = ($listItems[$i] == $value) ? ' selected' : '';
 
774
 
 
775
                        $select .= '<option value="' . $listItems[$i] . '" ' . $selected . '>' . $listItems[$i] . '</option>';
 
776
                    }
 
777
 
 
778
                    $select .= '</select>';
1011
779
                } else {
1012
 
                    $dataSet->addRow($sanitizedRow);
 
780
                    // Numbers are always small
 
781
                    $size = ($dataTypeId == 2) ? ' class="form-control col-sm-3"' : '';
 
782
 
 
783
                    if ($dataTypeId == 1) {
 
784
                        // Strings should be based on something - not sure what.
 
785
                    }
 
786
 
 
787
                    $select = '<input type="text" class="form-control ' . $size . '" name="value" value="' . $value . '">';
1013
788
                }
1014
 
            }
 
789
 
 
790
                $action = ($value == '') ? 'AddDataSetData' : 'EditDataSetData';
 
791
                $fieldId = uniqid();
 
792
 
 
793
                $form .= <<<END
 
794
                <td>
 
795
                    <form id="$fieldId" class="XiboDataSetDataForm form-inline" action="index.php?p=dataset&q=$action">
 
796
                        <input type="hidden" name="fieldid" value="$fieldId">
 
797
                        <input type="hidden" name="datasetid" value="$dataSetId">
 
798
                        <input type="hidden" name="datasetcolumnid" value="$dataSetColumnId">
 
799
                        <input type="hidden" name="rownumber" value="$row">
 
800
                        $select
 
801
                    </form>
 
802
                </td>
 
803
END;
 
804
            } //cols loop
 
805
 
 
806
            $form .= '</tr>';
 
807
        } //rows loop
 
808
 
 
809
        $form .= '</table>';
 
810
 
 
811
        $response->SetGridResponse($form);
 
812
        $response->callBack = 'dataSetData';
 
813
 
 
814
    }
 
815
 
 
816
    public function AddDataSetData()
 
817
    {
 
818
 
 
819
        $user = $this->getUser();
 
820
        $response = $this->getState();
 
821
 
 
822
        $response->uniqueReference = \Xibo\Helper\Sanitize::getString('fieldid');
 
823
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
824
        $dataSetColumnId = \Xibo\Helper\Sanitize::getInt('datasetcolumnid');
 
825
        $rowNumber = \Xibo\Helper\Sanitize::getInt('rownumber');
 
826
        $value = \Xibo\Helper\Sanitize::getString('value');
 
827
 
 
828
        $auth = $user->DataSetAuth($dataSetId, true);
 
829
        if (!$auth->edit)
 
830
            trigger_error(__('Access Denied'));
 
831
 
 
832
        $dataSetObject = new DataSetData($db);
 
833
        if (!$dataSetObject->Add($dataSetColumnId, $rowNumber, $value))
 
834
            trigger_error($dataSetObject->GetErrorMessage(), E_USER_ERROR);
 
835
 
 
836
        $response->SetFormSubmitResponse(__('Data Added'));
 
837
        $response->loadFormUri = 'index.php?p=dataset&q=EditDataSetData';
 
838
        $response->hideMessage = true;
 
839
        $response->keepOpen = true;
 
840
 
 
841
    }
 
842
 
 
843
    public function EditDataSetData()
 
844
    {
 
845
 
 
846
        $user = $this->getUser();
 
847
        $response = $this->getState();
 
848
 
 
849
        $response->uniqueReference = \Xibo\Helper\Sanitize::getString('fieldid');
 
850
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
851
        $dataSetColumnId = \Xibo\Helper\Sanitize::getInt('datasetcolumnid');
 
852
        $rowNumber = \Xibo\Helper\Sanitize::getInt('rownumber');
 
853
        $value = \Xibo\Helper\Sanitize::getString('value');
 
854
 
 
855
        $auth = $user->DataSetAuth($dataSetId, true);
 
856
        if (!$auth->edit)
 
857
            trigger_error(__('Access Denied'));
 
858
 
 
859
        if ($value == '') {
 
860
            $dataSetObject = new DataSetData($db);
 
861
            if (!$dataSetObject->Delete($dataSetColumnId, $rowNumber))
 
862
                trigger_error($dataSetObject->GetErrorMessage(), E_USER_ERROR);
 
863
 
 
864
            $response->SetFormSubmitResponse(__('Data Deleted'));
 
865
            $response->loadFormUri = 'index.php?p=dataset&q=AddDataSetData';
 
866
        } else {
 
867
            $dataSetObject = new DataSetData($db);
 
868
            if (!$dataSetObject->Edit($dataSetColumnId, $rowNumber, $value))
 
869
                trigger_error($dataSetObject->GetErrorMessage(), E_USER_ERROR);
 
870
 
 
871
            $response->SetFormSubmitResponse(__('Data Edited'));
 
872
            $response->loadFormUri = 'index.php?p=dataset&q=EditDataSetData';
1015
873
        }
1016
874
 
1017
 
        if (!$takenSomeAction)
1018
 
            throw new NotFoundException(__('No data found in request body'));
 
875
        $response->hideMessage = true;
 
876
        $response->keepOpen = true;
1019
877
 
1020
 
        $this->getState()->hydrate([
1021
 
            'httpStatus' => 204,
1022
 
            'message' => sprintf(__('Imported JSON into %s'), $dataSet->dataSet)
1023
 
        ]);
1024
878
    }
1025
879
 
1026
880
    /**
1027
 
     * Sends out a Test Request and returns the Data as JSON to the Client so it can be shown in the Dialog
1028
 
     * @throws XiboException
 
881
     * Get a list of group names for a layout
 
882
     * @param <type> $layoutId
 
883
     * @return <type>
1029
884
     */
1030
 
    public function testRemoteRequest()
1031
 
    {
1032
 
        $testDataSetId = $this->getSanitizer()->getInt('testDataSetId');
1033
 
 
1034
 
        if ($testDataSetId !== null) {
1035
 
            $dataSet = $this->dataSetFactory->getById($testDataSetId);
1036
 
        } else {
1037
 
            $dataSet = $this->dataSetFactory->createEmpty();
1038
 
        }
1039
 
        $dataSet->dataSet = $this->getSanitizer()->getString('dataSet');
1040
 
        $dataSet->method = $this->getSanitizer()->getString('method');
1041
 
        $dataSet->uri = $this->getSanitizer()->getString('uri');
1042
 
        $dataSet->postData = $this->getSanitizer()->getString('postData');
1043
 
        $dataSet->authentication = $this->getSanitizer()->getString('authentication');
1044
 
        $dataSet->username = $this->getSanitizer()->getString('username');
1045
 
        $dataSet->password = $this->getSanitizer()->getString('password');
1046
 
        $dataSet->dataRoot = $this->getSanitizer()->getString('dataRoot');
1047
 
 
1048
 
        // Call the remote service requested
1049
 
        $data = $this->dataSetFactory->callRemoteService($dataSet, null, false);
1050
 
 
1051
 
        if ($data->number > 0) {
1052
 
            // Process the results, but don't record them
1053
 
            $this->dataSetFactory->processResults($dataSet, $data, false);
1054
 
        }
1055
 
 
1056
 
        $this->getLog()->debug('Results: ' . var_export($data, true));
1057
 
 
1058
 
        // Return
1059
 
        $this->getState()->hydrate([
1060
 
            'message' => __('Run Test-Request for %s', $dataSet->dataSet),
1061
 
            'id' => $dataSet->dataSetId,
1062
 
            'data' => $data
1063
 
        ]);
 
885
    private function GroupsForDataSet($dataSetId)
 
886
    {
 
887
 
 
888
 
 
889
        $SQL = '';
 
890
        $SQL .= 'SELECT `group`.Group ';
 
891
        $SQL .= '  FROM `group` ';
 
892
        $SQL .= '   INNER JOIN lkdatasetgroup ';
 
893
        $SQL .= '   ON `group`.GroupID = lkdatasetgroup.GroupID ';
 
894
        $SQL .= ' WHERE lkdatasetgroup.DataSetID = %d ';
 
895
 
 
896
        $SQL = sprintf($SQL, $dataSetId);
 
897
 
 
898
        if (!$results = $db->query($SQL)) {
 
899
            trigger_error($db->error());
 
900
            trigger_error(__('Unable to get group information for dataset'), E_USER_ERROR);
 
901
        }
 
902
 
 
903
        $groups = '';
 
904
 
 
905
        while ($row = $db->get_assoc_row($results)) {
 
906
            $groups .= $row['Group'] . ', ';
 
907
        }
 
908
 
 
909
        $groups = trim($groups);
 
910
        $groups = trim($groups, ',');
 
911
 
 
912
        return $groups;
 
913
    }
 
914
 
 
915
    public function PermissionsForm()
 
916
    {
 
917
 
 
918
        $user = $this->getUser();
 
919
        $response = $this->getState();
 
920
        $helpManager = new Help($db, $user);
 
921
 
 
922
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
923
 
 
924
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
925
 
 
926
        if (!$auth->modifyPermissions)
 
927
            trigger_error(__('You do not have permissions to edit this dataset'), E_USER_ERROR);
 
928
 
 
929
        // Set some information about the form
 
930
        Theme::Set('form_id', 'DataSetPermissionsForm');
 
931
        Theme::Set('form_action', 'index.php?p=dataset&q=Permissions');
 
932
        Theme::Set('form_meta', '<input type="hidden" name="datasetid" value="' . $dataSetId . '" />');
 
933
 
 
934
        // List of all Groups with a view/edit/delete checkbox
 
935
 
 
936
        $security = new DataSetGroupSecurity($this->db);
 
937
 
 
938
        if (!$results = $security->ListSecurity($dataSetId, $user->getGroupFromId($user->userid, true))) {
 
939
            trigger_error(__('Unable to get permissions for this dataset'), E_USER_ERROR);
 
940
        }
 
941
 
 
942
        $checkboxes = array();
 
943
 
 
944
        foreach ($results as $row) {
 
945
            $groupId = $row['groupid'];
 
946
            $rowClass = ($row['isuserspecific'] == 0) ? 'strong_text' : '';
 
947
 
 
948
            $checkbox = array(
 
949
                'id' => $groupId,
 
950
                'name' => \Xibo\Helper\Sanitize::string($row['group']),
 
951
                'class' => $rowClass,
 
952
                'value_view' => $groupId . '_view',
 
953
                'value_view_checked' => (($row['view'] == 1) ? 'checked' : ''),
 
954
                'value_edit' => $groupId . '_edit',
 
955
                'value_edit_checked' => (($row['edit'] == 1) ? 'checked' : ''),
 
956
                'value_del' => $groupId . '_del',
 
957
                'value_del_checked' => (($row['del'] == 1) ? 'checked' : ''),
 
958
            );
 
959
 
 
960
            $checkboxes[] = $checkbox;
 
961
        }
 
962
 
 
963
        $formFields = array();
 
964
        $formFields[] = FormManager::AddPermissions('groupids[]', $checkboxes);
 
965
 
 
966
        Theme::Set('form_fields', $formFields);
 
967
 
 
968
        $response->SetFormRequestResponse(NULL, __('Permissions'), '350px', '500px');
 
969
        $response->AddButton(__('Help'), 'XiboHelpRender("' . $helpManager->Link('DataSet', 'Permissions') . '")');
 
970
        $response->AddButton(__('Cancel'), 'XiboDialogClose()');
 
971
        $response->AddButton(__('Save'), '$("#DataSetPermissionsForm").submit()');
 
972
 
 
973
    }
 
974
 
 
975
    public function Permissions()
 
976
    {
 
977
 
 
978
 
 
979
 
 
980
        $user = $this->getUser();
 
981
        $response = $this->getState();
 
982
 
 
983
 
 
984
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
985
        $groupIds = \Kit::GetParam('groupids', _POST, _ARRAY);
 
986
 
 
987
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
988
 
 
989
        if (!$auth->modifyPermissions)
 
990
            trigger_error(__('You do not have permissions to edit this dataset'), E_USER_ERROR);
 
991
 
 
992
        // Unlink all
 
993
        $security = new DataSetGroupSecurity($db);
 
994
        if (!$security->UnlinkAll($dataSetId))
 
995
            trigger_error(__('Unable to set permissions'));
 
996
 
 
997
        // Some assignments for the loop
 
998
        $lastGroupId = 0;
 
999
        $first = true;
 
1000
        $view = 0;
 
1001
        $edit = 0;
 
1002
        $del = 0;
 
1003
 
 
1004
        // List of groupIds with view, edit and del assignments
 
1005
        foreach ($groupIds as $groupPermission) {
 
1006
            $groupPermission = explode('_', $groupPermission);
 
1007
            $groupId = $groupPermission[0];
 
1008
 
 
1009
            if ($first) {
 
1010
                // First time through
 
1011
                $first = false;
 
1012
                $lastGroupId = $groupId;
 
1013
            }
 
1014
 
 
1015
            if ($groupId != $lastGroupId) {
 
1016
                // The groupId has changed, so we need to write the current settings to the db.
 
1017
                // Link new permissions
 
1018
                if (!$security->Link($dataSetId, $lastGroupId, $view, $edit, $del))
 
1019
                    trigger_error(__('Unable to set permissions'), E_USER_ERROR);
 
1020
 
 
1021
                // Reset
 
1022
                $lastGroupId = $groupId;
 
1023
                $view = 0;
 
1024
                $edit = 0;
 
1025
                $del = 0;
 
1026
            }
 
1027
 
 
1028
            switch ($groupPermission[1]) {
 
1029
                case 'view':
 
1030
                    $view = 1;
 
1031
                    break;
 
1032
 
 
1033
                case 'edit':
 
1034
                    $edit = 1;
 
1035
                    break;
 
1036
 
 
1037
                case 'del':
 
1038
                    $del = 1;
 
1039
                    break;
 
1040
            }
 
1041
        }
 
1042
 
 
1043
        // Need to do the last one
 
1044
        if (!$first) {
 
1045
            if (!$security->Link($dataSetId, $lastGroupId, $view, $edit, $del))
 
1046
                trigger_error(__('Unable to set permissions'), E_USER_ERROR);
 
1047
        }
 
1048
 
 
1049
        $response->SetFormSubmitResponse(__('Permissions Changed'));
 
1050
 
 
1051
    }
 
1052
 
 
1053
    public function ImportCsvForm()
 
1054
    {
 
1055
        global $session;
 
1056
 
 
1057
        $response = $this->getState();
 
1058
 
 
1059
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
1060
        $dataSet = \Xibo\Helper\Sanitize::getString('dataset');
 
1061
 
 
1062
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
1063
        if (!$auth->edit)
 
1064
            trigger_error(__('Access Denied'), E_USER_ERROR);
 
1065
 
 
1066
        // Set the Session / Security information
 
1067
        $sessionId = session_id();
 
1068
        $securityToken = CreateFormToken();
 
1069
 
 
1070
        $session->setSecurityToken($securityToken);
 
1071
 
 
1072
        // Find the max file size
 
1073
        $maxFileSizeBytes = convertBytes(ini_get('upload_max_filesize'));
 
1074
 
 
1075
        // Set some information about the form
 
1076
        Theme::Set('form_id', 'DataSetImportCsvForm');
 
1077
        Theme::Set('form_action', 'index.php?p=dataset&q=ImportCsv');
 
1078
        Theme::Set('form_meta', '<input type="hidden" name="dataset" value="' . $dataSet . '" /><input type="hidden" name="datasetid" value="' . $dataSetId . '" /><input type="hidden" id="txtFileName" name="txtFileName" readonly="true" /><input type="hidden" name="hidFileID" id="hidFileID" value="" />');
 
1079
 
 
1080
        Theme::Set('form_upload_id', 'file_upload');
 
1081
        Theme::Set('form_upload_action', 'index.php?p=content&q=FileUpload');
 
1082
        Theme::Set('form_upload_meta', '<input type="hidden" id="PHPSESSID" value="' . $sessionId . '" /><input type="hidden" id="SecurityToken" value="' . $securityToken . '" /><input type="hidden" name="MAX_FILE_SIZE" value="' . $maxFileSizeBytes . '" />');
 
1083
 
 
1084
        Theme::Set('prepend', Theme::RenderReturn('form_file_upload_single'));
 
1085
 
 
1086
        $formFields = array();
 
1087
        $formFields[] = FormManager::AddCheckbox('overwrite', __('Overwrite existing data?'),
 
1088
            NULL,
 
1089
            __('Erase all content in this DataSet and overwrite it with the new content in this import.'),
 
1090
            'o');
 
1091
 
 
1092
        $formFields[] = FormManager::AddCheckbox('ignorefirstrow', __('Ignore first row?'),
 
1093
            NULL,
 
1094
            __('Ignore the first row? Useful if the CSV has headings.'),
 
1095
            'i');
 
1096
 
 
1097
        // Enumerate over the columns in the DataSet and offer a column mapping for each one (from the file)
 
1098
        $SQL = "";
 
1099
        $SQL .= "SELECT DataSetColumnID, Heading ";
 
1100
        $SQL .= "  FROM datasetcolumn ";
 
1101
        $SQL .= sprintf(" WHERE DataSetID = %d ", $dataSetId);
 
1102
        $SQL .= "   AND DataSetColumnTypeID = 1 ";
 
1103
        $SQL .= "ORDER BY ColumnOrder ";
 
1104
 
 
1105
        // Load results into an array
 
1106
        $dataSetColumns = $db->GetArray($SQL);
 
1107
 
 
1108
        if (!is_array($dataSetColumns)) {
 
1109
            trigger_error($db->error());
 
1110
            trigger_error(__('Error getting list of dataSetColumns'), E_USER_ERROR);
 
1111
        }
 
1112
 
 
1113
        $i = 0;
 
1114
 
 
1115
        foreach ($dataSetColumns as $row) {
 
1116
            $i++;
 
1117
 
 
1118
            $formFields[] = FormManager::AddNumber('csvImport_' . \Xibo\Helper\Sanitize::int($row['DataSetColumnID']),
 
1119
                \Xibo\Helper\Sanitize::string($row['Heading']), $i, NULL, 'c');
 
1120
        }
 
1121
 
 
1122
        Theme::Set('form_fields', $formFields);
 
1123
 
 
1124
        $response->SetFormRequestResponse(NULL, __('CSV Import'), '350px', '200px');
 
1125
        $response->AddButton(__('Help'), 'XiboHelpRender("' . Help::Link('DataSet', 'ImportCsv') . '")');
 
1126
        $response->AddButton(__('Cancel'), 'XiboDialogClose()');
 
1127
        $response->AddButton(__('Import'), '$("#DataSetImportCsvForm").submit()');
 
1128
 
 
1129
    }
 
1130
 
 
1131
    public function ImportCsv()
 
1132
    {
 
1133
 
 
1134
 
 
1135
        $response = $this->getState();
 
1136
        $dataSetId = \Xibo\Helper\Sanitize::getInt('datasetid');
 
1137
        $overwrite = \Xibo\Helper\Sanitize::getCheckbox('overwrite');
 
1138
        $ignorefirstrow = \Xibo\Helper\Sanitize::getCheckbox('ignorefirstrow');
 
1139
 
 
1140
        $auth = $this->user->DataSetAuth($dataSetId, true);
 
1141
        if (!$auth->edit)
 
1142
            trigger_error(__('Access Denied'), E_USER_ERROR);
 
1143
 
 
1144
        // File data
 
1145
        $tmpName = \Xibo\Helper\Sanitize::getString('hidFileID');
 
1146
 
 
1147
        if ($tmpName == '')
 
1148
            trigger_error(__('Please ensure you have picked a file and it has finished uploading'), E_USER_ERROR);
 
1149
 
 
1150
        // File name and extension (original name)
 
1151
        $fileName = \Xibo\Helper\Sanitize::getString('txtFileName');
 
1152
        $fileName = basename($fileName);
 
1153
        $ext = strtolower(substr(strrchr($fileName, "."), 1));
 
1154
 
 
1155
        // Check it is a CSV file
 
1156
        if ($ext != 'csv')
 
1157
            trigger_error(__('Files with a CSV extension only.'), E_USER_ERROR);
 
1158
 
 
1159
        // File upload directory.. get this from the settings object
 
1160
        $csvFileLocation = Config::GetSetting('LIBRARY_LOCATION') . 'temp/' . $tmpName;
 
1161
 
 
1162
        // Enumerate over the columns in the DataSet and offer a column mapping for each one (from the file)
 
1163
        $SQL = "";
 
1164
        $SQL .= "SELECT DataSetColumnID ";
 
1165
        $SQL .= "  FROM datasetcolumn ";
 
1166
        $SQL .= sprintf(" WHERE DataSetID = %d ", $dataSetId);
 
1167
        $SQL .= "   AND DataSetColumnTypeID = 1 ";
 
1168
        $SQL .= "ORDER BY ColumnOrder ";
 
1169
 
 
1170
        // Load results into an array
 
1171
        $dataSetColumns = $db->GetArray($SQL);
 
1172
 
 
1173
        if (!is_array($dataSetColumns)) {
 
1174
            trigger_error($db->error());
 
1175
            trigger_error(__('Error getting list of dataSetColumns'), E_USER_ERROR);
 
1176
        }
 
1177
 
 
1178
        $spreadSheetMapping = array();
 
1179
 
 
1180
        foreach ($dataSetColumns as $row) {
 
1181
 
 
1182
            $dataSetColumnId = \Xibo\Helper\Sanitize::int($row['DataSetColumnID']);
 
1183
            $spreadSheetColumn = \Kit::GetParam('csvImport_' . $dataSetColumnId, _POST, _INT);
 
1184
 
 
1185
            // If it has been left blank, then skip
 
1186
            if ($spreadSheetColumn != 0)
 
1187
                $spreadSheetMapping[($spreadSheetColumn - 1)] = $dataSetColumnId;
 
1188
        }
 
1189
 
 
1190
        $dataSetObject = new DataSetData($db);
 
1191
 
 
1192
        if (!$dataSetObject->ImportCsv($dataSetId, $csvFileLocation, $spreadSheetMapping, ($overwrite == 1), ($ignorefirstrow == 1)))
 
1193
            trigger_error($dataSetObject->GetErrorMessage(), E_USER_ERROR);
 
1194
 
 
1195
        $response->SetFormSubmitResponse(__('CSV File Imported'));
 
1196
 
1064
1197
    }
1065
1198
}
 
1199
 
 
1200
?>