Completed
Push — master ( a3b87b...c9d36f )
by Andreas
14:59
created

datamanager::handle_save()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 19
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 5

Importance

Changes 0
Metric Value
cc 5
eloc 13
nc 5
nop 0
dl 0
loc 19
ccs 14
cts 14
cp 1
crap 5
rs 9.5222
c 0
b 0
f 0
1
<?php
2
/**
3
 * @package midcom.workflow
4
 * @author CONTENT CONTROL http://www.contentcontrol-berlin.de/
5
 * @copyright CONTENT CONTROL http://www.contentcontrol-berlin.de/
6
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License
7
 */
8
9
namespace midcom\workflow;
10
11
use Symfony\Component\OptionsResolver\OptionsResolver;
12
use midcom_core_context;
13
use midcom;
14
use midcom\datamanager\controller;
15
use Symfony\Component\HttpFoundation\Request;
16
use Symfony\Component\HttpFoundation\Response;
17
use Symfony\Component\HttpKernel\KernelEvents;
18
19
/**
20
 * @package midcom.workflow
21
 */
22
class datamanager extends dialog
23
{
24
    /**
25
     *
26
     * @var \midcom\datamanager\controller
27
     */
28
    protected $controller;
29
30
    /**
31
     *
32
     * @var callable
33
     */
34
    protected $save_callback;
35
36
    /**
37
     * Disable relocate after execute
38
     *
39
     * Returns the uimessage as JSON instead
40
     *
41
     * @var boolean
42
     */
43
    protected $relocate;
44
45
    /**
46
     * {@inheritdoc}
47
     */
48 210
    public function configure(OptionsResolver $resolver)
49
    {
50
        $resolver
51 210
            ->setDefaults([
52 210
                'controller' => null,
53
                'save_callback' => null,
54
                'relocate' => true
55
            ])
56 210
            ->setAllowedTypes('controller', ['null', '\midcom\datamanager\controller']);
57 210
    }
58
59 146
    public function get_button_config() : array
60
    {
61
        return [
62 146
            MIDCOM_TOOLBAR_LABEL => midcom::get()->i18n->get_l10n('midcom')->get('edit'),
63 146
            MIDCOM_TOOLBAR_GLYPHICON => 'pencil',
64 146
            MIDCOM_TOOLBAR_OPTIONS => [
65 146
                'data-dialog' => 'dialog',
66 146
                'data-dialog-cancel-label' => midcom::get()->i18n->get_l10n('midcom')->get('cancel')
67
            ]
68
        ];
69
    }
70
71 70
    public function run(Request $request) : Response
72
    {
73 70
        $this->state = $this->controller->handle($request);
74
75 70
        if ($this->state == controller::SAVE) {
76 12
            $script = $this->handle_save();
77 12
            midcom::get()->head->add_jsfile(MIDCOM_STATIC_URL . '/midcom.workflow/dialog.js');
78 12
            midcom::get()->head->add_jscript($script);
79 12
            midcom::get()->dispatcher->addListener(KernelEvents::RESPONSE, [midcom::get()->head, 'inject_head_elements']);
80 12
            $content = '<!DOCTYPE html><html><head>' . \midcom_helper_head::TOOLBAR_PLACEHOLDER . '</head><body></body></html>';
81 12
            return new Response($content);
82
        }
83 70
        $context = midcom_core_context::get();
84 70
        $context->set_key(MIDCOM_CONTEXT_SHOWCALLBACK, [$this->controller, 'display_form']);
85 70
        return self::response($context);
86
    }
87
88 11
    protected function handle_save() : string
89
    {
90 11
        if ($this->relocate) {
91 9
            $url = '';
92 9
            if (is_callable($this->save_callback)) {
93 8
                $url = call_user_func($this->save_callback, $this->controller);
94 8
                if ($url !== null) {
95 4
                    $url = $this->prepare_url($url);
96
                }
97
            }
98 9
            return 'refresh_opener(' . $url . ');';
99
        }
100 2
        $dm = $this->controller->get_datamanager();
101 2
        $data = $dm->get_content_html();
102 2
        $object = $dm->get_storage()->get_value();
103 2
        if ($object instanceof \midcom_core_dbaobject) {
104 2
            $data['guid'] = $object->guid;
105
        }
106 2
        return 'close(' . json_encode($data) . ');';
107
    }
108
109 3
    public function add_post_button($url, $label, array $args)
110
    {
111 3
        self::add_dialog_js();
112 3
        midcom::get()->head->add_jscript('add_post_button(' . $this->prepare_url($url) . ', "' . $label . '", ' . json_encode($args) . ');');
113 3
    }
114
115 5
    public function add_dialog_button(dialog $dialog, $url)
116
    {
117 5
        $config = $dialog->get_button_config();
118 5
        self::add_dialog_js();
119 5
        midcom::get()->head->add_jscript('add_dialog_button(' . $this->prepare_url($url) . ', "' . $config[MIDCOM_TOOLBAR_LABEL] . '", ' . json_encode($config[MIDCOM_TOOLBAR_OPTIONS]) . ');');
120 5
    }
121
122 12
    private function prepare_url($url) : string
123
    {
124 12
        if (   substr($url, 0, 1) != '/'
125 12
            && ! preg_match('|^https?://|', $url)) {
126 3
            $url = midcom_core_context::get()->get_key(MIDCOM_CONTEXT_ANCHORPREFIX) . $url;
0 ignored issues
show
Bug introduced by
Are you sure midcom_core_context::get...M_CONTEXT_ANCHORPREFIX) of type false|mixed can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

126
            $url = /** @scrutinizer ignore-type */ midcom_core_context::get()->get_key(MIDCOM_CONTEXT_ANCHORPREFIX) . $url;
Loading history...
127
        }
128 12
        return '"' . $url . '"';
129
    }
130
}
131