Completed
Pull Request — master (#119)
by David
02:13
created

translationFieldFilter()   B

Complexity

Conditions 6
Paths 9

Size

Total Lines 36
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 36
rs 8.439
cc 6
eloc 20
nc 9
nop 4
1
<?php
2
3
/*
4
 * This file is part of the Sonata Project package.
5
 *
6
 * (c) Thomas Rabaix <[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 Sonata\TranslationBundle\Admin\Extension\Gedmo;
13
14
use Gedmo\Translatable\TranslatableListener;
15
use Sonata\AdminBundle\Admin\AdminInterface;
16
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
17
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery;
18
use Sonata\TranslationBundle\Admin\Extension\AbstractTranslatableAdminExtension;
19
use Sonata\TranslationBundle\Checker\TranslatableChecker;
20
21
/**
22
 * @author Nicolas Bastien <[email protected]>
23
 */
24
class TranslatableAdminExtension extends AbstractTranslatableAdminExtension
25
{
26
    /**
27
     * @var TranslatableListener
28
     */
29
    protected $translatableListener;
30
31
    public function __construct(TranslatableChecker $translatableChecker, TranslatableListener $translatableListener = null)
32
    {
33
        parent::__construct($translatableChecker);
34
        $this->translatableListener = $translatableListener;
35
    }
36
37
    /**
38
     * {@inheritdoc}
39
     */
40
    public function alterObject(AdminInterface $admin, $object)
41
    {
42
        if ($this->getTranslatableChecker()->isTranslatable($object)) {
43
            $translatableListener = $this->getTranslatableListener($admin);
44
            $translatableListener->setTranslatableLocale($this->getTranslatableLocale($admin));
45
            $translatableListener->setTranslationFallback(false);
46
47
            $this->getContainer($admin)->get('doctrine')->getManager()->refresh($object);
48
            $object->setLocale($this->getTranslatableLocale($admin));
49
        }
50
    }
51
52
    /**
53
     * {@inheritdoc}
54
     */
55
    public function configureQuery(AdminInterface $admin, ProxyQueryInterface $query, $context = 'list')
56
    {
57
        $this->getTranslatableListener($admin)->setTranslatableLocale($this->getTranslatableLocale($admin));
58
        $this->getTranslatableListener($admin)->setTranslationFallback(false);
59
    }
60
61
    /**
62
     * Search on normal field and on translated field, use with a
63
     * doctrine_orm_callback filter type.
64
     *
65
     * @param ProxyQuery $queryBuilder
66
     * @param string     $alias
67
     * @param string     $field
68
     * @param string     $value
69
     *
70
     * @return bool|null
71
     */
72
    public static function translationFieldFilter(ProxyQuery $queryBuilder, $alias, $field, $value)
73
    {
74
        if (!$value['value']) {
75
            return;
76
        }
77
78
        // verify if the join is not already done
79
        $aliasAlreadyExists = false;
80
        $joinDqlParts = $queryBuilder->getDQLParts()['join'];
81
        foreach ($joinDqlParts as $joins) {
82
            foreach ($joins as $join) {
83
                if ($join->getAlias() === 't') {
84
                    $aliasAlreadyExists = true;
85
                    break 2;
86
                }
87
            }
88
        }
89
90
        if (!$aliasAlreadyExists) {
91
            $queryBuilder->leftJoin($alias.'.translations', 't');
92
        }
93
94
        // search on translation OR on normal field
95
        $queryBuilder->andWhere($queryBuilder->expr()->orX(
96
            $queryBuilder->expr()->andX(
97
                $queryBuilder->expr()->eq('t.field', $queryBuilder->expr()->literal($field)),
98
                $queryBuilder->expr()->like('t.content', $queryBuilder->expr()->literal('%'.$value['value'].'%'))
99
            ),
100
            $queryBuilder->expr()->like(
101
                sprintf('%s.%s', $alias, $field),
102
                $queryBuilder->expr()->literal('%'.$value['value'].'%')
103
            )
104
        ));
105
106
        return true;
107
    }
108
109
    /**
110
     * @param AdminInterface $admin Deprecated, set TranslatableListener in the constructor instead.
111
     *
112
     * @return TranslatableListener
113
     */
114
    protected function getTranslatableListener(AdminInterface $admin)
115
    {
116
        if (null === $this->translatableListener) {
117
            $this->translatableListener = $this->getContainer($admin)->get(
118
                'stof_doctrine_extensions.listener.translatable'
119
            );
120
        }
121
122
        return $this->translatableListener;
123
    }
124
}
125