Completed
Push — master ( bcebcf...1f9f52 )
by Tobias
06:16
created

SymfonyProfilerController::editAction()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 29
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
dl 0
loc 29
ccs 0
cts 20
cp 0
rs 8.5806
c 0
b 0
f 0
cc 4
eloc 15
nc 4
nop 2
crap 20
1
<?php
2
3
/*
4
 * This file is part of the PHP Translation package.
5
 *
6
 * (c) PHP Translation team <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Translation\Bundle\Controller;
13
14
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
15
use Symfony\Component\HttpFoundation\Request;
16
use Symfony\Component\HttpFoundation\Response;
17
use Symfony\Component\Translation\DataCollectorTranslator;
18
use Translation\Bundle\Model\SfProfilerMessage;
19
use Translation\Bundle\Service\StorageService;
20
use Translation\Common\Model\Message;
21
22
/**
23
 * @author Tobias Nyholm <[email protected]>
24
 */
25
class SymfonyProfilerController extends Controller
26
{
27
    /**
28
     * @param Request $request
29
     * @param string  $token
30
     *
31
     * @return Response
32
     */
33
    public function editAction(Request $request, $token)
34
    {
35
        if (!$this->getParameter('php_translation.toolbar.allow_edit')) {
36
            return new Response('You are not allowed to edit the translations.');
37
        }
38
39
        if (!$request->isXmlHttpRequest()) {
40
            return $this->redirectToRoute('_profiler', ['token' => $token]);
41
        }
42
43
        $message = $this->getMessage($request, $token);
44
        /** @var StorageService $storage */
45
        $storage = $this->get('php_translation.storage');
46
47
        if ($request->isMethod('GET')) {
48
            $translation = $storage->syncAndFetchMessage($message->getLocale(), $message->getDomain(), $message->getKey());
49
50
            return $this->render('TranslationBundle:SymfonyProfiler:edit.html.twig', [
51
                'message' => $translation,
52
                'key' => $message->getLocale().$message->getDomain().$message->getKey(),
53
            ]);
54
        }
55
56
        //Assert: This is a POST request
57
        $message->setTranslation($request->request->get('translation'));
58
        $storage->update($message->convertToMessage());
59
60
        return new Response($message->getTranslation());
61
    }
62
63
    /**
64
     * @param Request $request
65
     * @param string  $token
66
     *
67
     * @return Response
68
     */
69
    public function syncAction(Request $request, $token)
70
    {
71
        if (!$request->isXmlHttpRequest()) {
72
            return $this->redirectToRoute('_profiler', ['token' => $token]);
73
        }
74
75
        /** @var StorageService $storage */
76
        $storage = $this->get('php_translation.storage');
77
        $sfMessage = $this->getMessage($request, $token);
78
        $message = $storage->syncAndFetchMessage($sfMessage->getLocale(), $sfMessage->getDomain(), $sfMessage->getKey());
79
80
        if ($message !== null) {
81
            return new Response($message->getTranslation());
82
        }
83
84
        return new Response('Asset not found', 404);
85
    }
86
87
    /**
88
     * @param Request $request
89
     * @param         $token
90
     *
91
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
92
     */
93
    public function syncAllAction(Request $request, $token)
94
    {
95
        if (!$request->isXmlHttpRequest()) {
96
            return $this->redirectToRoute('_profiler', ['token' => $token]);
97
        }
98
99
        /** @var StorageService $storage */
100
        $storage = $this->get('php_translation.storage');
101
        $storage->sync();
102
103
        return new Response('Started synchronization of all translations');
104
    }
105
106
    /**
107
     * Save the selected translation to resources.
108
     *
109
     * @author Damien Alexandre (damienalexandre)
110
     *
111
     * @param Request $request
112
     * @param string  $token
113
     *
114
     * @return Response
115
     */
116
    public function createAssetsAction(Request $request, $token)
117
    {
118
        if (!$request->isXmlHttpRequest()) {
119
            return $this->redirectToRoute('_profiler', ['token' => $token]);
120
        }
121
122
        $messages = $this->getSelectedMessages($request, $token);
123
        if (empty($messages)) {
124
            return new Response('No translations selected.');
125
        }
126
127
        $uploaded = [];
128
        /** @var StorageService $storage */
129
        $storage = $this->get('php_translation.storage');
130
        foreach ($messages as $message) {
131
            $storage->create($message);
132
            $uploaded[] = $message;
133
        }
134
135
        return new Response(sprintf('%s new assets created!', count($uploaded)));
136
    }
137
138
    /**
139
     * @param Request $request
140
     * @param string  $token
141
     *
142
     * @return SfProfilerMessage
143
     */
144
    private function getMessage(Request $request, $token)
145
    {
146
        $profiler = $this->get('profiler');
147
        $profiler->disable();
148
149
        $messageId = $request->request->get('message_id', $request->query->get('message_id'));
150
151
        $profile = $profiler->loadProfile($token);
152
        $messages = $profile->getCollector('translation')->getMessages();
153
        if (!isset($messages[$messageId])) {
154
            throw $this->createNotFoundException(sprintf('No message with key "%s" was found.', $messageId));
155
        }
156
        $message = SfProfilerMessage::create($messages[$messageId]);
157
158
        if ($message->getState() === DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK) {
159
            $message->setLocale($profile->getCollector('request')->getLocale())
160
                ->setTranslation(sprintf('[%s]', $message->getTranslation()));
161
        }
162
163
        return $message;
164
    }
165
166
    /**
167
     * @param Request $request
168
     * @param string  $token
169
     *
170
     * @return Message[]
171
     */
172
    protected function getSelectedMessages(Request $request, $token)
173
    {
174
        $profiler = $this->get('profiler');
175
        $profiler->disable();
176
177
        $selected = $request->request->get('selected');
178
        if (!$selected || count($selected) == 0) {
179
            return [];
180
        }
181
182
        $profile = $profiler->loadProfile($token);
183
        $dataCollector = $profile->getCollector('translation');
184
        $toSave = array_intersect_key($dataCollector->getMessages(), array_flip($selected));
185
186
        $messages = [];
187
        foreach ($toSave as $data) {
188
            //We do not want do add the placeholder to Loco. That messes up the stats.
189
            $data['translation'] = '';
190
191
            $messages[] = SfProfilerMessage::create($data)->convertToMessage();
192
        }
193
194
        return $messages;
195
    }
196
}
197