ProcessComponent::_process()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 9.6666
c 0
b 0
f 0
cc 1
nc 1
nop 4
1
<?php
2
/**
3
 * CakeCMS Core
4
 *
5
 * This file is part of the of the simple cms based on CakePHP 3.
6
 * For the full copyright and license information, please view the LICENSE
7
 * file that was distributed with this source code.
8
 *
9
 * @package     Core
10
 * @license     MIT
11
 * @copyright   MIT License http://www.opensource.org/licenses/mit-license.php
12
 * @link        https://github.com/CakeCMS/Core".
13
 * @author      Sergey Kalistratov <[email protected]>
14
 */
15
16
namespace Core\Controller\Component;
17
18
use Cake\ORM\Table;
19
use JBZoo\Data\Data;
20
use JBZoo\Data\JSON;
21
use JBZoo\Utils\Arr;
22
use JBZoo\Utils\Str;
23
use Cake\Utility\Hash;
24
use Cake\Utility\Inflector;
25
use Core\Event\EventManager;
26
27
/**
28
 * Class ProcessComponent
29
 *
30
 * @package Core\Controller\Component
31
 * @property FlashComponent $Flash
32
 */
33
class ProcessComponent extends AppComponent
34
{
35
36
    const PRIMARY_KEY = 'id';
37
    const EVENT_NAME_BEFORE = 'Before';
38
    const EVENT_NAME_AFTER = 'After';
39
40
    /**
41
     * Other Components this component uses.
42
     *
43
     * @var array
44
     */
45
    public $components = [
46
        'Core.Flash'
47
    ];
48
49
    /**
50
     * Get actual request vars for process.
51
     *
52
     * @param   string $name
53
     * @param   string $primaryKey
54
     * @return  array
55
     */
56
    public function getRequestVars($name, $primaryKey = self::PRIMARY_KEY)
57
    {
58
        $name       = Str::low(Inflector::singularize($name));
59
        $requestIds = (array) $this->_request->getData($name);
60
        $action     = $this->_request->getData('action');
61
        $ids        = $this->_getIds($requestIds, $primaryKey);
62
63
        return [$action, $ids];
64
    }
65
66
    /**
67
     * Constructor hook method.
68
     *
69
     * @param   array $config
70
     * @return  void
71
     */
72
    public function initialize(array $config)
73
    {
74
        parent::initialize($config);
75
76
        $_config = [
77
            'context'  => __d('core', 'record'),
78
            'redirect' => [
79
                'action'     => 'index',
80
                'prefix'     => $this->_request->getParam('prefix'),
81
                'plugin'     => $this->_request->getParam('plugin'),
82
                'controller' => $this->_request->getParam('controller'),
83
            ],
84
            'messages' => [
85
                'no_action' => __d('core', 'Action not found.'),
86
                'no_choose' => __d('core', 'Please choose only one item.'),
87
            ]
88
        ];
89
90
        $config = Hash::merge($_config, $config);
91
        $this->setConfig($config);
92
    }
93
94
    /**
95
     * Make process.
96
     *
97
     * @param   Table $table
98
     * @param   string $action
99
     * @param   array $ids
100
     * @param   array $options
101
     * @return  \Cake\Http\Response|null
102
     *
103
     * @throws  \Aura\Intl\Exception
104
     */
105
    public function make(Table $table, $action, array $ids = [], array $options = [])
106
    {
107
        $count       = count($ids);
108
        $options     = $this->_getOptions($options, $count);
109
        $redirectUrl = $options['redirect'];
110
        $messages    = new JSON($options['messages']);
111
112
        $event = EventManager::trigger($this->_getEventName($action), $this->_controller, ['ids' => $ids]);
113
        $ids   = (array) $event->getData('ids');
114
        $count = count($ids);
115
116
        if (!$action) {
117
            $this->Flash->error($messages->get('no_action'));
118
            return $this->_controller->redirect($redirectUrl);
119
        }
120
121
        if ($count <= 0) {
122
            $this->Flash->error($messages->get('no_choose'));
123
            return $this->_controller->redirect($redirectUrl);
124
        }
125
126
        $this->_loadBehavior($table);
127
        if ($table->process($action, $ids)) {
0 ignored issues
show
Bug introduced by
The method process() does not exist on Cake\ORM\Table. Did you maybe mean _processDelete()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
128
            return $this->_process($action, $messages, $redirectUrl, $ids);
129
        }
130
131
        $this->Flash->error(__d('core', 'An error has occurred. Please try again.'));
132
        return $this->_controller->redirect($redirectUrl);
133
    }
134
135
    /**
136
     * Setup    default action messages.
137
     *
138
     * @param   int $count
139
     * @return  array
140
     *
141
     * @throws  \Aura\Intl\Exception
142
     */
143
    protected function _getDefaultMessages($count)
144
    {
145
        $context       = $this->_configRead('context');
146
        $contextPlural = Inflector::pluralize($context);
147
        $countString   = sprintf('<strong>%s</strong>', $count);
148
        return [
149
            'delete' => __dn(
150
                'core',
151
                'One ' . $context . ' success removed',
152
                '{0} ' . $contextPlural . ' success removed',
153
                $count,
154
                $countString
155
            ),
156
            'publish' => __dn(
157
                'core',
158
                'One ' . $context . ' success publish',
159
                '{0} ' . $contextPlural . ' success published',
160
                $count,
161
                $countString
162
            ),
163
            'unpublish' => __dn(
164
                'core',
165
                'One ' . $context . ' success unpublish',
166
                '{0} ' . $contextPlural . ' success unpublished',
167
                $count,
168
                $countString
169
            ),
170
        ];
171
    }
172
173
    /**
174
     * Get event name by data.
175
     *
176
     * @param   string $action
177
     * @param   string $event
178
     * @return  string
179
     */
180
    protected function _getEventName($action, $event = self::EVENT_NAME_BEFORE)
181
    {
182
        $details = [];
183
        if ($prefix = $this->_request->getParam('prefix')) {
184
            $details[] = ucfirst($prefix);
185
        }
186
187
        $details = Hash::merge($details, [
188
            'Controller',
189
            $this->_controller->getName(),
190
            $event . Inflector::camelize($action),
191
            'Process',
192
        ]);
193
194
        return implode('.', $details);
195
    }
196
197
    /**
198
     * Get ids by request.
199
     *
200
     * @param   array $ids
201
     * @param   string $primaryKey
202
     * @return  array
203
     */
204
    protected function _getIds(array $ids, $primaryKey = self::PRIMARY_KEY)
205
    {
206
        $return = [];
207
        foreach ($ids as $id => $value) {
208
            if (is_array($value) && is_int($id) && (int) $value[$primaryKey] === 1) {
209
                $return[$id] = $id;
210
            }
211
        }
212
213
        return $return;
214
    }
215
216
    /**
217
     * Create and merge actual process options.
218
     *
219
     * @param   array $options
220
     * @param   int|string $count
221
     * @return  array
222
     *
223
     * @throws  \Aura\Intl\Exception
224
     */
225
    protected function _getOptions(array $options, $count)
226
    {
227
        $options = Hash::merge($this->_config, $options);
228
        return Hash::merge(['messages' => $this->_getDefaultMessages($count)], $options);
229
    }
230
231
    /**
232
     * Load process behavior.
233
     *
234
     * @param   Table $table
235
     */
236
    protected function _loadBehavior(Table $table)
237
    {
238
        $behaviors = $table->behaviors();
239
        if (!Arr::in('Process', $behaviors->loaded())) {
240
            $behaviors->load('Core.Process');
241
        }
242
    }
243
244
    /**
245
     * Controller process.
246
     *
247
     * @param   string $action
248
     * @param   Data $messages
249
     * @param   array $redirect
250
     * @param   array $ids
251
     * @return  \Cake\Http\Response|null
252
     *
253
     * @throws  \Aura\Intl\Exception
254
     */
255
    protected function _process($action, Data $messages, array $redirect, array $ids)
256
    {
257
        $count = count($ids);
258
        $defaultMsg = __dn(
259
            'core',
260
            'One record success processed',
261
            '{0} records processed',
262
            $count,
263
            sprintf('<strong>%s</strong>', $count)
264
        );
265
266
        EventManager::trigger($this->_getEventName($action, self::EVENT_NAME_AFTER), $this->_controller, [
267
            'ids' => $ids
268
        ]);
269
270
        $this->Flash->success($messages->get($action, $defaultMsg));
271
        return $this->_controller->redirect($redirect);
272
    }
273
}
274