Completed
Push — master ( ce2dd0...10a6ac )
by Nicolaas
04:02
created

code/cms/dev/EcommerceDatabaseAdmin.php (3 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
4
/**
5
 * One stop shop for massaging e-commerce related data
6
 * AND running tests.
7
 *
8
 * You can customise this menu by "decorating" this class
9
 * and adding the method: "updateEcommerceDevMenu".
10
 *
11
 * Here is an example:
12
13
 <code php>
14
 <?php
15
16
 ####################### in mysite/code/tasks/MyMigration.php
17
18
 class MyMigration extends BuildTask {
19
20
 protected $title = "Mysite Database Fixes";
21
22
 protected $description = "General DB fixes";
23
24
 function run(SS_HTTPRequest $request) {
25
 DB::query("TRUNCATE TABLE MyUselessTable;");
26
 }
27
28
 }
29
30
 class MyMigration_EXT extends Extension {
31
32
 private static $allowed_actions = array(
33
 "mymigration" => true
34
 );
35
36
 //NOTE THAT updateEcommerceDevMenuConfig adds to Config options
37
 //but you can als have: updateEcommerceDevMenuDebugActions, or updateEcommerceDevMenuMaintenanceActions
38
 function updateEcommerceDevMenuConfig($buildTasks){
39
 $buildTasks[] = "mymigration";
40
 return $buildTasks;
41
 }
42
43
 function mymigration(SS_HTTPRequest $request){
44
 $this->owner->runTask("MyMigration", $request);
45
 }
46
47
 }
48
49
50
 ####################### in mysite/_config.php:
51
52
 Object::add_extension("EcommerceDatabaseAdmin", "MyMigration_EXT");
53
54
55
 </code>
56
57
 *
58
 * SECTIONS
59
 *
60
 * 0. check settings
61
 * 1. ecommerce setup (default records)
62
 * 2. data review
63
 * 3. regular maintance
64
 * 4. debug
65
 * 5. migration
66
 * 6. reset
67
 * 7. tests
68
 *
69
 * @todo: work out a standard "silent" option and a display option the "display" options shows all output when running it from ecommerce/dev/
70
 * We also have to work out an easy way to extend this.
71
 *
72
 * @authors: Nicolaas [at] Sunny Side Up .co.nz
73
 * @package: ecommerce
74
 * @sub-package: cms
75
 * @inspiration: Silverstripe Ltd, Jeremy
76
 **/
77
class EcommerceDatabaseAdmin extends TaskRunner
78
{
79
80
81
    //##############################
82
    // BASIC FUNCTIONS
83
    //##############################
84
85
    public function index()
86
    {
87
        if (Director::is_cli()) {
88
            echo "SILVERSTRIPE ECOMMERCE TOOLS: Tasks\n--------------------------\n\n";
89
            foreach ($tasks as $task) {
90
                echo " * $task[title]: sake dev/tasks/".$task['class']."\n";
91
            }
92
        } else {
93
            $renderer = new DebugView_EcommerceDatabaseAdmin();
94
            $renderer->writeHeader();
95
            $renderer->writeInfo('SilverStripe Ecommerce Tools', Director::absoluteBaseURL());
96
            $renderer->writeContent($this);
97
            $renderer->writeFooter();
98
        }
99
    }
100
101
    /**
102
     * standard, required method.
103
     *
104
     * @param string $action
0 ignored issues
show
Should the type for parameter $action not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
105
     *
106
     * @return string link for the "Controller"
107
     */
108
    public function Link($action = null)
109
    {
110
        return Controller::join_links(
111
            Director::BaseURL(),
112
            'dev/ecommerce/',
113
            $action
114
        );
115
    }
116
117
    //##############################
118
    // 0. OVERALL CONFIG
119
    //##############################
120
121
    /**
122
     * List of overall configuration BuildTasks.
123
     *
124
     * @var array
125
     */
126
    protected $overallconfig = array(
127
        'ecommercetaskcheckconfiguration',
128
        'ecommercetaskapiandmore',
129
    );
130
131
    /**
132
     * list of config tasks.
133
     *
134
     * @return ArrayList
135
     */
136
    public function OverallConfig()
137
    {
138
        return $this->createMenuDOSFromArray($this->overallconfig, $type = 'Config');
139
    }
140
141
    //##############################
142
    // 1. ECOMMERCE SETUP (DEFAULT RECORDS)
143
    //##############################
144
145
    /**
146
     * List of setup BuildTasks.
147
     *
148
     * @var array
149
     */
150
    protected $ecommerceSetup = array(
151
        'ecommercetasksetorderidstartingnumber',
152
        'ecommercetaskcreatemembergroups',
153
        'ecommercetaskdefaultrecords',
154
        'ecommercetaskcountryandregion',
155
        'ecommercetaskcountryandregion_disallowallcountries',
156
        'ecommercetaskcountryandregion_allowallcountries',
157
        'ecommercetaskadddefaultproducts',
158
        'ecommercetasklinkproductwithimages',
159
    );
160
161
    /**
162
     * list of data setup tasks.
163
     *
164
     * @return ArrayList
165
     */
166
    public function EcommerceSetup()
167
    {
168
        return $this->createMenuDOSFromArray($this->ecommerceSetup, $type = 'EcommerceSetup');
169
    }
170
171
    //##############################
172
    // 2. DATA REVIEW MAINTENANCE
173
    //##############################
174
175
    /**
176
     * List of regular maintenance BuildTasks.
177
     *
178
     * @var array
179
     */
180
    protected $dataReview = array(
181
        'ecommercetaskreviewreports',
182
        'ecommercetaskreviewsearches',
183
        'ecommercetaskorderitemspercustomer'
184
    );
185
186
    /**
187
     * regular data cleanup tasks.
188
     *
189
     * @return ArrayList
190
     */
191
    public function DataReview()
192
    {
193
        return $this->createMenuDOSFromArray($this->dataReview, $type = 'DataReview');
194
    }
195
196
    //##############################
197
    // 3. REGULAR MAINTENANCE
198
    //##############################
199
200
    /**
201
     * List of regular maintenance BuildTasks.
202
     *
203
     * @var array
204
     */
205
    protected $regularMaintenance = array(
206
        'ecommercetaskcartcleanup',
207
        'ecommercetaskaddcustomerstocustomergroups',
208
        'ecommercetaskfixbrokenordersubmissiondata',
209
        'ecommercetaskcleanupproductfullsitetreesorting',
210
        'ecommercetaskproductvariationsfixes',
211
        'ecommercetaskproductimagereset',
212
        'ecommercetasktrytofinaliseorders',
213
        'ecommercetaskprocessorderqueue',
214
        'ecommercetaskarchiveallsubmittedorders',
215
        'ecommercetasklinkorderaddressesatbothends',
216
        'EcommerceTaskCleanupProducts'
217
    );
218
219
    /**
220
     * regular data cleanup tasks.
221
     *
222
     * @return ArrayList
223
     */
224
    public function RegularMaintenance()
225
    {
226
        return $this->createMenuDOSFromArray($this->regularMaintenance, $type = 'RegularMaintenance');
227
    }
228
229
    //##############################
230
    // 4. DEBUG ACTIONS
231
    //##############################
232
233
    /**
234
     * List of debug actions BuildTasks.
235
     *
236
     * @var array
237
     */
238
    protected $debugActions = array(
239
        'ecommercetasktemplatetest',
240
        'ecommercetaskcartmanipulation_current',
241
        'ecommercetaskcartmanipulation_debug',
242
        'ecommercetaskbuilding_model',
243
        'ecommercetaskbuilding_extending',
244
    );
245
246
    /**
247
     * list of data debug actions.
248
     *
249
     * @return ArrayList
250
     */
251
    public function DebugActions()
252
    {
253
        return $this->createMenuDOSFromArray($this->debugActions, $type = 'DebugActions');
254
    }
255
256
    //##############################
257
    // 5. MIGRATIONS
258
    //##############################
259
260
    /**
261
     * List of migration BuildTasks.
262
     *
263
     * @var array
264
     */
265
    protected $migrations = array(
266
        'ecommercetaskmigration',
267
        'ecommercetaskcheckconfiguration',
268
        'ecommercetasksetdefaultproductgroupvalues',
269
    );
270
271
    /**
272
     * list of migration tasks.
273
     *
274
     * @return ArrayList
275
     */
276
    public function Migrations()
277
    {
278
        return $this->createMenuDOSFromArray($this->migrations, $type = 'Migrations');
279
    }
280
281
    //##############################
282
    // 6. CRAZY SHIT
283
    //##############################
284
285
    /**
286
     * List of crazy shit BuildTasks.
287
     *
288
     * @var array
289
     */
290
    protected $crazyshit = array(
291
        'ecommercetaskdeleteallorders',
292
        'ecommercetaskdeleteproducts',
293
        'ecommercetaskarchiveallorderswithitems',
294
    );
295
296
    /**
297
     * list of crazy actions tasks.
298
     *
299
     * @return ArrayList
300
     */
301
    public function CrazyShit()
302
    {
303
        return $this->createMenuDOSFromArray($this->crazyshit, $type = 'CrazyShit');
304
    }
305
306
    //##############################
307
    // 7. TESTS
308
    //##############################
309
310
    /**
311
     * List of tests.
312
     *
313
     * @var array
314
     */
315
    protected $tests = array(
316
        //'ShoppingCartTest' => 'Shopping Cart'
317
    );
318
319
    public function Tests()
320
    {
321
        $arrayList = new ArrayList();
322
        foreach ($this->tests as $class => $name) {
323
            $arrayList->push(
324
                new ArrayData(
325
                    array(
326
                        'Name' => $name,
327
                        'Class' => $class,
328
                    )
329
                )
330
            );
331
        }
332
333
        return $arrayList;
334
    }
335
336
    /**
337
     * @return array ????
0 ignored issues
show
Should the return type not be string?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
338
     */
339
    public function AllTests()
340
    {
341
        return implode(',', array_keys($this->tests));
342
    }
343
344
    //##############################
345
    // INTERNAL FUNCTIONS
346
    //##############################
347
348
    /**
349
     * @param array  $buildTasksArray array of build tasks
350
     * @param string $type
351
     *
352
     * @return ArrayList(ArrayData(Link, Title, Description))
0 ignored issues
show
The doc-type ArrayList(ArrayData(Link, could not be parsed: Expected "|" or "end of type", but got "(" at position 9. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
353
     */
354
    protected function createMenuDOSFromArray(array $buildTasksArray, $type = '')
355
    {
356
        $extendedArray = $this->extend('updateEcommerceDevMenu'.$type, $buildTasksArray);
357
        if ($extendedArray !== null && is_array($extendedArray) && count($extendedArray)) {
358
            foreach ($extendedArray as $extendedBuildTasks) {
359
                $buildTasksArray = array_merge($buildTasksArray, $extendedBuildTasks);
360
            }
361
        }
362
        $buildTasksArray = array_unique($buildTasksArray);
363
        $arrayList = new ArrayList();
364
        foreach ($buildTasksArray as $buildTask) {
365
            $obj = new $buildTask();
366
            $do = new ArrayData(
367
                array(
368
                    'Link' => $this->Link($buildTask),
369
                    'Title' => $obj->getTitle(),
370
                    'Description' => $obj->getDescription(),
371
                )
372
            );
373
            $arrayList->push($do);
374
        }
375
376
        return $arrayList;
377
    }
378
379
    public function runTask($request)
380
    {
381
        $taskName = $request->param('TaskName');
382
        $renderer = new DebugView_EcommerceDatabaseAdmin();
383
        $renderer->writeHeader();
384
        $renderer->writeInfo('SilverStripe Ecommerce Tools', Director::absoluteBaseURL());
385
        $renderer->writePreOutcome();
386
        if (class_exists($taskName) && is_subclass_of($taskName, 'BuildTask')) {
387
            $title = singleton($taskName)->getTitle();
388
            if (Director::is_cli()) {
389
                echo "Running task '$title'...\n\n";
390
            } elseif (!Director::is_ajax()) {
391
                echo "<h1>Running task '$title'...</h1>\n";
392
            }
393
394
            $task = new $taskName();
395
            if ($task->isEnabled()) {
396
                $task->verbose = true;
397
                $task->run($request);
398
            } else {
399
                echo "<p>{$title} is disabled</p>";
400
            }
401
        } else {
402
            echo "Build task '$taskName' not found.";
403
            if (class_exists($taskName)) {
404
                echo "  It isn't a subclass of BuildTask.";
405
            }
406
            echo "\n";
407
        }
408
        $this->displayCompletionMessage($task);
409
        $renderer->writePostOutcome();
410
        $renderer->writeContent($this);
411
        $renderer->writeFooter();
412
    }
413
414
    /**
415
     * shows a "Task Completed Message" on the screen.
416
     *
417
     * @param BuildTask $buildTask
418
     * @param string    $extraMessage
419
     */
420
    protected function displayCompletionMessage(BuildTask $buildTask, $extraMessage = '')
421
    {
422
        DB::alteration_message('
423
424
            ------------------------------------------------------- <br />
425
            COMPLETED THE FOLLOWING TASK:<br />
426
            <strong>'.$buildTask->getTitle().'</strong><br />
427
            '.$buildTask->getDescription()." <br />
428
            ------------------------------------------------------- <br />
429
            $extraMessage
430
        ");
431
    }
432
}
433
434
class DebugView_EcommerceDatabaseAdmin extends DebugView
435
{
436
    public function writePreOutcome()
437
    {
438
        echo "<div id='TaskHolder' style=\"background-color: #e8e8e8; border-radius: 15px; margin: 20px; padding: 20px\">";
439
    }
440
441
    public function writePostOutcome()
442
    {
443
        echo '</div>';
444
    }
445
446
    public function writeContent(Controller $controller)
447
    {
448
        echo $controller->RenderWith($controller->class);
449
    }
450
}
451