ProfilerController::syncAllAction()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 0
cts 8
cp 0
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 2
crap 6
1
<?php
2
3
namespace Happyr\TranslationBundle\Controller;
4
5
use Happyr\TranslationBundle\Model\Message;
6
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
7
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
8
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
9
use Symfony\Component\HttpFoundation\Request;
10
use Symfony\Component\HttpFoundation\Response;
11
use Symfony\Component\Translation\DataCollectorTranslator;
12
use Symfony\Component\VarDumper\Cloner\Data;
13
14
/**
15
 * @author Tobias Nyholm
16
 */
17
class ProfilerController extends Controller
18
{
19
    /**
20
     * @param Request $request
21
     * @param string  $token
22
     *
23
     * @Route("/{token}/translation/edit", name="_profiler_translations_edit")
24
     *
25
     * @return Response
26
     */
27
    public function editAction(Request $request, $token)
28
    {
29
        if (!$this->getParameter('translation.toolbar.allow_edit')) {
30
            return new Response('You are not allowed to edit the translations.');
31
        }
32
33
        if (!$request->isXmlHttpRequest()) {
34
            return $this->redirectToRoute('_profiler', ['token' => $token]);
35
        }
36
37
        $message = $this->getMessage($request, $token);
38
        $trans = $this->get('happyr.translation');
39
40
        if ($request->isMethod('GET')) {
41
            $trans->fetchTranslation($message);
42
43
            return $this->render('HappyrTranslationBundle:Profiler:edit.html.twig', [
44
                'message' => $message,
45
                'key' => $request->query->get('message_id'),
46
            ]);
47
        }
48
49
        //Assert: This is a POST request
50
        $message->setTranslation($request->request->get('translation'));
51
        $trans->updateTranslation($message);
52
53
        return new Response($message->getTranslation());
54
    }
55
56
    /**
57
     * @param Request $request
58
     * @param string  $token
59
     *
60
     * @Route("/{token}/translation/flag", name="_profiler_translations_flag")
61
     * @Method("POST")
62
     *
63
     * @return Response
64
     */
65
    public function flagAction(Request $request, $token)
66
    {
67
        if (!$request->isXmlHttpRequest()) {
68
            return $this->redirectToRoute('_profiler', ['token' => $token]);
69
        }
70
71
        $message = $this->getMessage($request, $token);
72
73
        $saved = $this->get('happyr.translation')->flagTranslation($message);
74
75
        return new Response($saved ? 'OK' : 'ERROR');
76
    }
77
78
    /**
79
     * @param Request $request
80
     * @param string  $token
81
     *
82
     * @Route("/{token}/translation/sync", name="_profiler_translations_sync")
83
     * @Method("POST")
84
     *
85
     * @return Response
86
     */
87
    public function syncAction(Request $request, $token)
88
    {
89
        if (!$request->isXmlHttpRequest()) {
90
            return $this->redirectToRoute('_profiler', ['token' => $token]);
91
        }
92
93
        $message = $this->getMessage($request, $token);
94
        $translation = $this->get('happyr.translation')->fetchTranslation($message, true);
95
96
        if ($translation !== null) {
97
            return new Response($translation);
98
        }
99
100
        return new Response('Asset not found', 404);
101
    }
102
103
    /**
104
     * @param Request $request
105
     * @param         $token
106
     *
107
     * @Route("/{token}/translation/sync-all", name="_profiler_translations_sync_all")
108
     *
109
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
110
     */
111
    public function syncAllAction(Request $request, $token)
112
    {
113
        if (!$request->isXmlHttpRequest()) {
114
            return $this->redirectToRoute('_profiler', ['token' => $token]);
115
        }
116
117
        $this->get('happyr.translation')->synchronizeAllTranslations();
118
119
        return new Response('Started synchronization of all translations');
120
    }
121
122
    /**
123
     * Save the selected translation to resources.
124
     *
125
     * @author Damien Alexandre (damienalexandre)
126
     *
127
     * @param Request $request
128
     * @param string  $token
129
     *
130
     * @Route("/{token}/translation/create-asset", name="_profiler_translations_create_assets")
131
     * @Method("POST")
132
     *
133
     * @return Response
134
     */
135
    public function createAssetsAction(Request $request, $token)
136
    {
137
        if (!$request->isXmlHttpRequest()) {
138
            return $this->redirectToRoute('_profiler', ['token' => $token]);
139
        }
140
141
        $messages = $this->getSelectedMessages($request, $token);
142
143
        if ($messages instanceof Data) {
144
            $messages = $messages->getValue(true);
145
        }
146
147
        if (empty($messages)) {
148
            return new Response('No translations selected.');
149
        }
150
151
        $uploaded = array();
152
        $trans = $this->get('happyr.translation');
153
        foreach ($messages as $message) {
154
            if ($trans->createAsset($message)) {
155
                $uploaded[] = $message;
156
            }
157
        }
158
159
        $saved = count($uploaded);
160
        if ($saved > 0) {
161
            $this->get('happyr.translation.filesystem')->updateMessageCatalog($uploaded);
162
        }
163
164
        return new Response(sprintf('%s new assets created!', $saved));
165
    }
166
167
    /**
168
     * @param Request $request
169
     * @param string  $token
170
     *
171
     * @return Message
172
     */
173
    protected function getMessage(Request $request, $token)
174
    {
175
        $profiler = $this->get('profiler');
176
        $profiler->disable();
177
178
        $messageId = $request->request->get('message_id', $request->query->get('message_id'));
179
180
        $profile = $profiler->loadProfile($token);
181
        $messages = $profile->getCollector('translation')->getMessages();
182
        if (!isset($messages[$messageId])) {
183
            throw $this->createNotFoundException(sprintf('No message with key "%s" was found.', $messageId));
184
        }
185
        $message = new Message($messages[$messageId]);
186
187
        if ($message->getState() === DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK) {
188
            $message->setLocale($profile->getCollector('request')->getLocale())
189
                ->setTranslation(sprintf('[%s]', $message->getTranslation()));
190
        }
191
192
        return $message;
193
    }
194
195
    /**
196
     * @param Request $request
197
     * @param string  $token
198
     *
199
     * @return array
200
     */
201
    protected function getSelectedMessages(Request $request, $token)
202
    {
203
        $profiler = $this->get('profiler');
204
        $profiler->disable();
205
206
        $selected = $request->request->get('selected');
207
        if (!$selected || count($selected) == 0) {
208
            return array();
209
        }
210
211
        $profile = $profiler->loadProfile($token);
212
        $dataCollector = $profile->getCollector('translation');
213
        $messages = $dataCollector->getMessages();
214
215
        if ($messages instanceof Data) {
216
            $messages = $messages->getValue(true);
217
        }
218
219
        $toSave = array_intersect_key($messages, array_flip($selected));
220
221
        $messages = array();
222
        foreach ($toSave as $data) {
223
            //We do not want do add the placeholder to Loco. That messes up the stats.
224
            $data['translation'] = '';
225
226
            $messages[] = new Message($data);
227
        }
228
229
        return $messages;
230
    }
231
}
232