Completed
Push — master ( d17c20...86172d )
by Aimeos
14:29
created

ExtadmController::getJsonClientI18n()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 6
nc 1
nop 2
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() );
0 ignored issues
show
Bug introduced by
It seems like $request->getContent() targeting Symfony\Component\HttpFo...n\Request::getContent() can also be of type resource; however, Aimeos\Controller\ExtJS\JsonRpc::process() does only seem to accept string, maybe add an additional type check?

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.

Loading history...
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