1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* @license MIT, http://opensource.org/licenses/MIT |
5
|
|
|
* @copyright Aimeos (aimeos.org), 2014-2016 |
6
|
|
|
* @package symfony |
7
|
|
|
* @subpackage Controller |
8
|
|
|
*/ |
9
|
|
|
|
10
|
|
|
|
11
|
|
|
namespace Aimeos\ShopBundle\Controller; |
12
|
|
|
|
13
|
|
|
use Symfony\Component\HttpFoundation\Request; |
14
|
|
|
use Symfony\Component\HttpFoundation\Response; |
15
|
|
|
use Symfony\Component\Security\Csrf\CsrfToken; |
16
|
|
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
17
|
|
|
|
18
|
|
|
|
19
|
|
|
/** |
20
|
|
|
* Controller providing the administration interface. |
21
|
|
|
* |
22
|
|
|
* @package symfony |
23
|
|
|
* @subpackage Controller |
24
|
|
|
*/ |
25
|
|
|
class ExtadmController extends Controller |
26
|
|
|
{ |
27
|
|
|
/** |
28
|
|
|
* Returns the initial HTML view for the admin interface. |
29
|
|
|
* |
30
|
|
|
* @param Request $request Symfony request object |
31
|
|
|
* @return Response Generated output for the admin interface |
32
|
|
|
*/ |
33
|
|
|
public function indexAction( Request $request ) |
34
|
|
|
{ |
35
|
|
|
$site = $request->attributes->get( 'site', $request->query->get( 'site', 'default' ) ); |
36
|
|
|
$lang = $request->attributes->get( 'lang', $request->query->get( 'lang', 'en' ) ); |
37
|
|
|
$tab = $request->attributes->get( 'tab', $request->query->get( 'tab', 0 ) ); |
38
|
|
|
|
39
|
|
|
$context = $this->get( 'aimeos_context' )->get( false, 'backend' ); |
40
|
|
|
$context->setLocale( $this->get( 'aimeos_locale' )->getBackend( $context, $site ) ); |
41
|
|
|
|
42
|
|
|
$aimeos = $this->get( 'aimeos' ); |
43
|
|
|
$bootstrap = $aimeos->get(); |
44
|
|
|
|
45
|
|
|
$cntlPaths = $bootstrap->getCustomPaths( 'controller/extjs' ); |
46
|
|
|
$controller = new \Aimeos\Controller\ExtJS\JsonRpc( $context, $cntlPaths ); |
47
|
|
|
$cssFiles = array(); |
48
|
|
|
|
49
|
|
|
foreach( $bootstrap->getCustomPaths( 'admin/extjs' ) as $base => $paths ) |
50
|
|
|
{ |
51
|
|
|
foreach( $paths as $path ) |
52
|
|
|
{ |
53
|
|
|
$jsbAbsPath = $base . '/' . $path; |
54
|
|
|
|
55
|
|
|
if( !is_file( $jsbAbsPath ) ) { |
56
|
|
|
throw new \Exception( sprintf( 'JSB2 file "%1$s" not found', $jsbAbsPath ) ); |
57
|
|
|
} |
58
|
|
|
|
59
|
|
|
$jsb2 = new \Aimeos\MW\Jsb2\Standard( $jsbAbsPath, dirname( $path ) ); |
60
|
|
|
$cssFiles = array_merge( $cssFiles, $jsb2->getUrls( 'css' ) ); |
61
|
|
|
} |
62
|
|
|
} |
63
|
|
|
|
64
|
|
|
$params = array( 'site' => '{site}', 'lang' => '{lang}', 'tab' => '{tab}' ); |
65
|
|
|
$adminUrl = $this->generateUrl( 'aimeos_shop_extadm', $params ); |
66
|
|
|
|
67
|
|
|
$token = $this->get( 'security.csrf.token_manager' )->getToken( 'aimeos_admin_token' )->getValue(); |
68
|
|
|
$jsonUrl = $this->generateUrl( 'aimeos_shop_extadm_json', array( '_token' => $token, 'site' => $site ) ); |
69
|
|
|
|
70
|
|
|
$jqadmUrl = $this->generateUrl( 'aimeos_shop_jqadm_search', array( 'site' => $site, 'resource' => 'product' ) ); |
71
|
|
|
|
72
|
|
|
$vars = array( |
73
|
|
|
'lang' => $lang, |
74
|
|
|
'cssFiles' => $cssFiles, |
75
|
|
|
'languages' => $this->getJsonLanguages(), |
76
|
|
|
'config' => $this->getJsonClientConfig( $context ), |
77
|
|
|
'site' => $this->getJsonSiteItem( $context, $site ), |
78
|
|
|
'i18nContent' => $this->getJsonClientI18n( $bootstrap->getI18nPaths(), $lang ), |
79
|
|
|
'searchSchemas' => $controller->getJsonSearchSchemas(), |
80
|
|
|
'itemSchemas' => $controller->getJsonItemSchemas(), |
81
|
|
|
'smd' => $controller->getJsonSmd( $jsonUrl ), |
82
|
|
|
'urlTemplate' => urldecode( $adminUrl ), |
83
|
|
|
'uploaddir' => $this->container->getParameter( 'aimeos_shop.uploaddir' ), |
84
|
|
|
'extensions' => implode( ',', $bootstrap->getExtensions() ), |
85
|
|
|
'version' => $aimeos->getVersion(), |
86
|
|
|
'jqadmurl' => $jqadmUrl, |
87
|
|
|
'activeTab' => $tab, |
88
|
|
|
); |
89
|
|
|
|
90
|
|
|
return $this->render( 'AimeosShopBundle:Extadm:index.html.twig', $vars ); |
91
|
|
|
} |
92
|
|
|
|
93
|
|
|
|
94
|
|
|
/** |
95
|
|
|
* Single entry point for all JSON admin requests. |
96
|
|
|
* |
97
|
|
|
* @param Request $request Symfony request object |
98
|
|
|
* @return Response JSON RPC message response |
99
|
|
|
*/ |
100
|
|
|
public function doAction( Request $request ) |
101
|
|
|
{ |
102
|
|
|
$csrfProvider = $this->get('security.csrf.token_manager'); |
103
|
|
|
|
104
|
|
|
if( $csrfProvider->isTokenValid( new CsrfToken( 'aimeos_admin_token', $request->query->get( '_token' ) ) ) !== true ) { |
105
|
|
|
throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException( 'CSRF token is invalid' ); |
106
|
|
|
} |
107
|
|
|
|
108
|
|
|
$cntlPaths = $this->get( 'aimeos' )->get()->getCustomPaths( 'controller/extjs' ); |
109
|
|
|
$context = $this->get( 'aimeos_context' )->get( false, 'backend' ); |
110
|
|
|
$context->setView( $this->get( 'aimeos_view' )->create( $context, array() ) ); |
111
|
|
|
$context->setLocale( $this->get( 'aimeos_locale' )->getBackend( $context, 'default' ) ); |
112
|
|
|
|
113
|
|
|
$controller = new \Aimeos\Controller\ExtJS\JsonRpc( $context, $cntlPaths ); |
114
|
|
|
|
115
|
|
|
$response = $controller->process( $request->request->all(), $request->getContent() ); |
|
|
|
|
116
|
|
|
return $this->render( 'AimeosShopBundle:Extadm:do.html.twig', array( 'output' => $response ) ); |
117
|
|
|
} |
118
|
|
|
|
119
|
|
|
|
120
|
|
|
/** |
121
|
|
|
* Returns the JS file content |
122
|
|
|
* |
123
|
|
|
* @return Response Response object |
124
|
|
|
*/ |
125
|
|
|
public function fileAction() |
126
|
|
|
{ |
127
|
|
|
$contents = ''; |
128
|
|
|
$jsFiles = array(); |
129
|
|
|
$aimeos = $this->get( 'aimeos' )->get(); |
130
|
|
|
|
131
|
|
|
foreach( $aimeos->getCustomPaths( 'admin/extjs' ) as $base => $paths ) |
132
|
|
|
{ |
133
|
|
|
foreach( $paths as $path ) |
134
|
|
|
{ |
135
|
|
|
$jsbAbsPath = $base . '/' . $path; |
136
|
|
|
$jsb2 = new \Aimeos\MW\Jsb2\Standard( $jsbAbsPath, dirname( $jsbAbsPath ) ); |
137
|
|
|
$jsFiles = array_merge( $jsFiles, $jsb2->getFiles( 'js' ) ); |
138
|
|
|
} |
139
|
|
|
} |
140
|
|
|
|
141
|
|
|
foreach( $jsFiles as $file ) |
142
|
|
|
{ |
143
|
|
|
if( ( $content = file_get_contents( $file ) ) !== false ) { |
144
|
|
|
$contents .= $content; |
145
|
|
|
} |
146
|
|
|
} |
147
|
|
|
|
148
|
|
|
$response = new Response( $contents ); |
149
|
|
|
$response->headers->set( 'Content-Type', 'application/javascript' ); |
150
|
|
|
|
151
|
|
|
return $response; |
152
|
|
|
} |
153
|
|
|
|
154
|
|
|
|
155
|
|
|
/** |
156
|
|
|
* Creates a list of all available translations. |
157
|
|
|
* |
158
|
|
|
* @return array List of language IDs with labels |
159
|
|
|
*/ |
160
|
|
|
protected function getJsonLanguages() |
161
|
|
|
{ |
162
|
|
|
$result = array(); |
163
|
|
|
|
164
|
|
|
foreach( $this->get( 'aimeos' )->get()->getI18nList( 'admin' ) as $id ) { |
165
|
|
|
$result[] = array( 'id' => $id, 'label' => $id ); |
166
|
|
|
} |
167
|
|
|
|
168
|
|
|
return json_encode( $result ); |
169
|
|
|
} |
170
|
|
|
|
171
|
|
|
|
172
|
|
|
/** |
173
|
|
|
* Returns the JSON encoded configuration for the ExtJS client. |
174
|
|
|
* |
175
|
|
|
* @param \Aimeos\MShop\Context\Item\Iface $context Context item object |
176
|
|
|
* @return string JSON encoded configuration object |
177
|
|
|
*/ |
178
|
|
|
protected function getJsonClientConfig( \Aimeos\MShop\Context\Item\Iface $context ) |
179
|
|
|
{ |
180
|
|
|
$config = $context->getConfig()->get( 'admin/extjs', array() ); |
181
|
|
|
return json_encode( array( 'admin' => array( 'extjs' => $config ) ), JSON_FORCE_OBJECT ); |
182
|
|
|
} |
183
|
|
|
|
184
|
|
|
|
185
|
|
|
/** |
186
|
|
|
* Returns the JSON encoded translations for the ExtJS client. |
187
|
|
|
* |
188
|
|
|
* @param array $i18nPaths List of file system paths which contain the translation files |
189
|
|
|
* @param string $lang ISO language code like "en" or "en_GB" |
190
|
|
|
* @return string JSON encoded translation object |
191
|
|
|
*/ |
192
|
|
|
protected function getJsonClientI18n( array $i18nPaths, $lang ) |
193
|
|
|
{ |
194
|
|
|
$i18n = new \Aimeos\MW\Translation\Gettext( $i18nPaths, $lang ); |
195
|
|
|
|
196
|
|
|
$content = array( |
197
|
|
|
'admin' => $i18n->getAll( 'admin' ), |
198
|
|
|
'admin/ext' => $i18n->getAll( 'admin/ext' ), |
199
|
|
|
); |
200
|
|
|
|
201
|
|
|
return json_encode( $content, JSON_FORCE_OBJECT ); |
202
|
|
|
} |
203
|
|
|
|
204
|
|
|
|
205
|
|
|
/** |
206
|
|
|
* Returns the JSON encoded site item. |
207
|
|
|
* |
208
|
|
|
* @param \Aimeos\MShop\Context\Item\Iface $context Context item object |
209
|
|
|
* @param string $site Unique site code |
210
|
|
|
* @return string JSON encoded site item object |
211
|
|
|
* @throws Exception If no site item was found for the code |
212
|
|
|
*/ |
213
|
|
|
protected function getJsonSiteItem( \Aimeos\MShop\Context\Item\Iface $context, $site ) |
214
|
|
|
{ |
215
|
|
|
$manager = \Aimeos\MShop\Factory::createManager( $context, 'locale/site' ); |
216
|
|
|
|
217
|
|
|
$criteria = $manager->createSearch(); |
218
|
|
|
$criteria->setConditions( $criteria->compare( '==', 'locale.site.code', $site ) ); |
219
|
|
|
$items = $manager->searchItems( $criteria ); |
220
|
|
|
|
221
|
|
|
if( ( $item = reset( $items ) ) === false ) { |
222
|
|
|
throw new \Exception( sprintf( 'No site found for code "%1$s"', $site ) ); |
223
|
|
|
} |
224
|
|
|
|
225
|
|
|
return json_encode( $item->toArray() ); |
226
|
|
|
} |
227
|
|
|
} |
228
|
|
|
|
This check looks at variables that are passed out again to other methods.
If the outgoing method call has stricter type requirements than the method itself, an issue is raised.
An additional type check may prevent trouble.