TranslationController::checkAction()   A
last analyzed

Complexity

Conditions 4
Paths 6

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 1
Metric Value
c 3
b 0
f 1
dl 0
loc 11
rs 9.2
cc 4
eloc 7
nc 6
nop 1
1
<?php
2
3
namespace Sleepness\UberTranslationAdminBundle\Controller;
4
5
use Sleepness\UberTranslationAdminBundle\Form\Model\TranslationModel;
6
use Sleepness\UberTranslationAdminBundle\Form\Type\TranslationMessageType;
7
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
8
use Symfony\Component\HttpFoundation\JsonResponse;
9
use Symfony\Component\HttpFoundation\Request;
10
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
11
12
/**
13
 * Controller responsive for managing translations
14
 *
15
 * @author Viktor Novikov <[email protected]>
16
 * @author Alexandr Zhulev <[email protected]>
17
 */
18
class TranslationController extends Controller
19
{
20
    /**
21
     * Output all translations
22
     *
23
     * @param Request $request
24
     * @return \Symfony\Component\HttpFoundation\Response
25
     */
26
    public function indexAction(Request $request)
27
    {
28
        $messagesFrontend = $this->get('memcached.messages.frontend.catalogue');
29
30
        $locale = $request->query->get('locale'); // get parameters for filtering
31
        $domain = $request->query->get('domain');
32
        $key    = $request->query->get('key');
33
        $text   = $request->query->get('text');
34
35
        $messages = $messagesFrontend->getAll();
36
37
        if (null !== $locale) {
38
            $messages = $messagesFrontend->buildByLocale($locale);
39
        }
40
41
        if (null !== $key) {
42
            $messages = $messagesFrontend->buildByKey($key);
43
        }
44
45
        if (null !== $domain) {
46
            $messages = $messagesFrontend->buildByDomain($domain);
47
        }
48
49
        if (null !== $text) {
50
            $messages = $messagesFrontend->buildByText($text);
51
        }
52
53
        $paginator = $this->get('knp_paginator'); // paginating results
54
        $messages = $paginator->paginate($messages, $request->query->get('page', 1), 15);
55
        $locales = $this->container->getParameter('sleepness_uber_translation.supported_locales');
56
57
        return $this->render('SleepnessUberTranslationAdminBundle:Translation:index.html.twig', array(
58
            'locales'  => $locales,
59
            'messages' => $messages,
60
        ));
61
    }
62
63
    /**
64
     * Edit translation
65
     *
66
     * @param Request $request
67
     * @param $localeKey
68
     * @param $_domain
69
     * @param $_key
70
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
71
     * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
72
     */
73
    public function editAction(Request $request, $localeKey, $_domain, $_key)
74
    {
75
        $mem = $this->get('uber.memcached');
76
        $translations = $mem->getItem($localeKey);
77
        $message = $translations[$_domain][$_key];
78
        if ($message === null) {
79
            throw new NotFoundHttpException('You try to edit non existing translation!');
80
        }
81
        $model = new TranslationModel($localeKey, $_domain, $_key, $message);
82
        $form = $this->createForm(new TranslationMessageType(), $model);
83
        $form->handleRequest($request);
84
        if ($form->isValid()) {
85
            $formLocale = $model->getLocale();
86
            $formDomain = $model->getDomain();
87
            $formMessage = $model->getTranslation();
88
            $messagesFrontend = $this->get('memcached.messages.frontend.catalogue');
89
            $messagesFrontend->replace($_key, $localeKey, $_domain, $formLocale, $formDomain, $formMessage);
90
            $this->get('session')->getFlashBag()->add('translation_edited', 'edit_success');
91
92
            return $this->redirect($this->generateUrl('sleepness_translation_dashboard'));
93
        }
94
95
        return $this->render('SleepnessUberTranslationAdminBundle:Translation:edit.html.twig', array(
96
            'key'     => $_key,
97
            'locale'  => $localeKey,
98
            'domain'  => $_domain,
99
            'message' => $message,
100
            'form'    => $form->createView()
101
        ));
102
    }
103
104
    /**
105
     * Delete translation from memcache
106
     *
107
     * @param $localeKey
108
     * @param $_domain
109
     * @param $_key
110
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
111
     * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
112
     */
113
    public function deleteAction($localeKey, $_domain, $_key)
114
    {
115
        $mem = $this->get('uber.memcached');
116
        $translations = $mem->getItem($localeKey);
117
        if ($translations[$_domain][$_key] === null) {
118
            throw new NotFoundHttpException('You try to delete non existing translation!');
119
        }
120
        unset($translations[$_domain][$_key]);
121
        $mem->addItem($localeKey, $translations);
122
        $this->get('session')->getFlashBag()->add('translation_deleted', 'delete_success');
123
124
        return $this->redirect($this->generateUrl('sleepness_translation_dashboard'));
125
    }
126
127
    /**
128
     * Render form for creating new translations
129
     *
130
     * @param Request $request
131
     * @return \Symfony\Component\HttpFoundation\Response
132
     */
133
    public function createAction(Request $request)
134
    {
135
        $model = new TranslationModel();
136
        $form = $this->createForm(new TranslationMessageType(), $model);
137
        $form->handleRequest($request);
138
        if ($form->isValid()) {
139
            $cache = $this->get('uber.memcached');
140
            $translations = $cache->getItem($model->getLocale());
141
            if (null === $translations) {
142
                $cache->addItem($model->getLocale(), array(
143
                    $model->getDomain() => array(
144
                        $model->getKey() => $model->getTranslation(),
145
                    ),
146
                ));
147
            } else {
148
                if (!isset($translations[$model->getDomain()][$model->getKey()])) {
149
                    $translations[$model->getDomain()][$model->getKey()] = $model->getTranslation();
150
                } else {
151
                    $this->get('session')->getFlashBag()->add('translation_not_created', 'creation_failed');
152
153
                    return $this->redirect($this->generateUrl('sleepness_translation_create'));
154
                }
155
                $cache->addItem($model->getLocale(), $translations);
156
            }
157
158
            return $this->redirect($this->generateUrl('sleepness_translation_dashboard'));
159
        }
160
161
        return $this->render('SleepnessUberTranslationAdminBundle:Translation:create.html.twig', array('form' => $form->createView()));
162
    }
163
164
    /**
165
     * Check translation existence in Memcached
166
     *
167
     * @param Request $request
168
     * @return \Symfony\Component\HttpFoundation\JsonResponse
169
     */
170
    public function checkAction(Request $request)
171
    {
172
        $key    = $request->query->get('key');
173
        $domain = $request->query->get('domain');
174
        $locale = $request->query->get('locale');
175
176
        $translations = $this->get('uber.memcached')->getItem($locale);
177
        $exists = ($translations && array_key_exists($domain, $translations) && array_key_exists($key, $translations[$domain])) ? true : false;
178
179
        return new JsonResponse(array('isExists' => $exists));
180
    }
181
}
182