Example #1
0
 /**
  * @param CM_Model_User|string|null $recipient
  * @param array|null                $tplParams
  * @param CM_Site_Abstract|null     $site
  * @throws CM_Exception_Invalid
  */
 public function __construct($recipient = null, array $tplParams = null, CM_Site_Abstract $site = null)
 {
     if ($this->hasTemplate()) {
         $this->setRenderLayout(true);
     }
     if ($tplParams) {
         foreach ($tplParams as $key => $value) {
             $this->setTplParam($key, $value);
         }
     }
     if (!is_null($recipient)) {
         if (is_string($recipient)) {
             $this->addTo($recipient);
         } elseif ($recipient instanceof CM_Model_User) {
             $this->_recipient = $recipient;
             $this->addTo($this->_recipient->getEmail());
             $this->setTplParam('recipient', $recipient);
         } else {
             throw new CM_Exception_Invalid('Invalid Recipient defined.');
         }
     }
     if (!$site && $this->_recipient) {
         $site = $this->_recipient->getSite();
     }
     if (!$site) {
         $site = CM_Site_Abstract::factory();
     }
     $this->_site = $site;
     $this->setTplParam('siteName', $this->_site->getName());
     $this->setSender($this->_site->getEmailAddress(), $this->_site->getName());
 }
Example #2
0
 /**
  * @param string           $pattern
  * @param CM_Site_Abstract $site
  * @return string[]
  */
 public static function rglobLibraries($pattern, CM_Site_Abstract $site)
 {
     $paths = array();
     foreach ($site->getModules() as $moduleName) {
         $libraryPath = CM_Util::getModulePath($moduleName) . 'library/' . $moduleName . '/';
         $paths = array_merge($paths, CM_Util::rglob($pattern, $libraryPath));
     }
     return $paths;
 }
Example #3
0
 /**
  * @param CM_Site_Abstract $site
  * @return string
  * @throws CM_Exception_Invalid
  */
 private function _getAppClassName(CM_Site_Abstract $site)
 {
     foreach ($site->getModules() as $moduleName) {
         $file = new CM_File(DIR_ROOT . CM_Bootloader::getInstance()->getModulePath($moduleName) . 'library/' . $moduleName . '/App.js');
         if ($file->exists()) {
             return $moduleName . '_App';
         }
     }
     throw new CM_Exception_Invalid('No App class found');
 }
Example #4
0
 public function __construct(CM_Site_Abstract $site)
 {
     $content = '';
     foreach (array_reverse($site->getModules()) as $moduleName) {
         $libraryPath = DIR_ROOT . CM_Bootloader::getInstance()->getModulePath($moduleName) . 'client-vendor/after-body/';
         foreach (CM_Util::rglob('*.js', $libraryPath) as $path) {
             $content .= (new CM_File($path))->read() . ';' . PHP_EOL;
         }
     }
     $this->_content = $content;
 }
Example #5
0
 protected function _getEmoticonImg($emoticonCode, $height = null)
 {
     $emoticon = CM_Emoticon::findByCode($emoticonCode);
     if (!$emoticon) {
         throw new CM_Exception_Invalid('Cannot find emoticon for code `' . $emoticonCode . '`.');
     }
     $urlCdn = $this->_mockSite->getUrlCdn();
     $siteType = $this->_mockSite->getId();
     $deployVersion = CM_App::getInstance()->getDeployVersion();
     $heightAttribute = $height ? ' height="' . $height . '"' : '';
     return '<img src="' . $urlCdn . '/layout/' . $siteType . '/' . $deployVersion . '/img/emoticon/' . $emoticon->getFileName() . '" class="emoticon emoticon-' . $emoticon->getName() . '" title="' . $emoticon->getDefaultCode() . '"' . $heightAttribute . ' />';
 }
Example #6
0
 /**
  * @param CM_Site_Abstract $site
  * @param string           $zoneName
  * @return mixed
  * @throws CM_Exception_Invalid
  */
 protected function _getZone(CM_Site_Abstract $site, $zoneName)
 {
     $cacheKey = CM_CacheConst::AdproviderZones . '_siteId:' . $site->getId();
     $cache = CM_Cache_Local::getInstance();
     if (false === ($zones = $cache->get($cacheKey))) {
         $zones = CM_Config::get()->CM_Adprovider->zones;
         if (isset($site->getConfig()->CM_Adprovider->zones)) {
             $zones = array_merge($zones, $site->getConfig()->CM_Adprovider->zones);
         }
         $cache->set($cacheKey, $zones);
     }
     if (!array_key_exists($zoneName, $zones)) {
         throw new CM_Exception_Invalid('Zone `' . $zoneName . '` not configured.');
     }
     return $zones[$zoneName];
 }
Example #7
0
 /**
  * @param CM_Site_Abstract $site
  * @param string           $zoneName
  * @return array
  * @throws CM_Exception_Invalid
  */
 protected function _getZoneData(CM_Site_Abstract $site, $zoneName)
 {
     $cacheKey = CM_CacheConst::AdproviderZones . '_siteId:' . $site->getId();
     $cache = CM_Cache_Local::getInstance();
     if (false === ($zones = $cache->get($cacheKey))) {
         $zones = CM_Config::get()->CM_Adprovider->zones;
         if (isset($site->getConfig()->CM_Adprovider->zones)) {
             $zones = array_merge($zones, $site->getConfig()->CM_Adprovider->zones);
         }
         $cache->set($cacheKey, $zones);
     }
     if (!array_key_exists($zoneName, $zones)) {
         return null;
     }
     return $zones[$zoneName];
 }
Example #8
0
 public function __construct(CM_Http_Request_Abstract $request, CM_Service_Manager $serviceManager)
 {
     $this->_request = clone $request;
     $this->_site = CM_Site_Abstract::findByRequest($this->_request);
     $this->_request->popPathLanguage();
     $this->setServiceManager($serviceManager);
 }
Example #9
0
    public function testTrackPageView()
    {
        $viewer = CMTest_TH::createUser();
        $environment = new CM_Frontend_Environment(CM_Site_Abstract::factory(), $viewer);
        $client = new CMService_AdWords_Client();
        $pushConversion = new ReflectionMethod($client, '_pushConversion');
        $pushConversion->setAccessible(true);
        $pushConversion->invoke($client, $viewer, CMService_AdWords_Conversion::fromJson('{"google_conversion_id":123456,"google_conversion_language":"en","google_conversion_format":"1","google_conversion_color":"666666","google_conversion_label":"label","google_remarketing_only":true,"google_conversion_value":123,"google_conversion_currency":"USD","google_custom_params":{"a":1,"b":2}}'));
        $pushConversion->invoke($client, $viewer, CMService_AdWords_Conversion::fromJson('{"google_conversion_id":789}'));
        $this->assertSame('', $client->getJs());
        $this->assertSame(<<<EOD
<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion_async.js" charset="utf-8"></script>
EOD
, $client->getHtml($environment));
        $client->trackPageView($environment, '/');
        $this->assertSame(<<<EOD
window.google_trackConversion({"google_conversion_id":123456,"google_conversion_language":"en","google_conversion_format":"1","google_conversion_color":"666666","google_conversion_label":"label","google_remarketing_only":true,"google_conversion_value":123,"google_conversion_currency":"USD","google_custom_params":{"a":1,"b":2}});window.google_trackConversion({"google_conversion_id":789});
EOD
, $client->getJs());
        $this->assertSame(<<<EOD
<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion_async.js" charset="utf-8"></script><script type="text/javascript">
/* <![CDATA[ */
window.google_trackConversion({"google_conversion_id":123456,"google_conversion_language":"en","google_conversion_format":"1","google_conversion_color":"666666","google_conversion_label":"label","google_remarketing_only":true,"google_conversion_value":123,"google_conversion_currency":"USD","google_custom_params":{"a":1,"b":2}});window.google_trackConversion({"google_conversion_id":789});
//]]>
</script>
EOD
, $client->getHtml($environment));
    }
Example #10
0
 public function fillCaches()
 {
     /** @var CM_Asset_Javascript_Abstract[] $assetList */
     $assetList = array();
     $debug = CM_Bootloader::getInstance()->isDebug();
     $siteList = CM_Site_Abstract::getAll();
     $languageList = new CM_Paging_Language_Enabled();
     foreach ($siteList as $site) {
         $render = new CM_Frontend_Render(new CM_Frontend_Environment($site));
         $assetList[] = new CM_Asset_Javascript_Internal($site, $debug);
         $assetList[] = new CM_Asset_Javascript_Library($site, $debug);
         $assetList[] = new CM_Asset_Javascript_Vendor_BeforeBody($site, $debug);
         $assetList[] = new CM_Asset_Javascript_Vendor_AfterBody($site, $debug);
         $assetList[] = new CM_Asset_Css_Vendor($render, $debug);
         $assetList[] = new CM_Asset_Css_Library($render, $debug);
         /** @var CM_Model_Language $language */
         foreach ($languageList as $language) {
             $assetList[] = new CM_Asset_Javascript_Translations($site, $debug, $language);
         }
     }
     /** @var CM_Model_Language $language */
     foreach ($languageList as $language) {
         $language->getTranslations()->getItemsRaw();
         $language->getTranslations(true)->getItemsRaw();
     }
     foreach ($assetList as $asset) {
         $asset->get();
     }
     CM_Bootloader::getInstance()->getModules();
 }
Example #11
0
 public function testProcessTranslationsEnableKey()
 {
     $language = CMTest_TH::createLanguage('test');
     $languageKey = CM_Model_LanguageKey::create('Hello World');
     $this->assertSame(false, $languageKey->getJavascript());
     $site = CM_Site_Abstract::factory();
     $render = new CM_Frontend_Render(new CM_Frontend_Environment(null, null, $language));
     // Check that key is *not* included in the JS translations list
     $versionJavascript = CM_Model_Language::getVersionJavascript();
     $request = new CM_Http_Request_Get($render->getUrlResource('library-js', "translations/{$versionJavascript}.js"));
     $response = CM_Http_Response_Resource_Javascript_Library::createFromRequest($request, $site, $this->getServiceManager());
     $response->process();
     $this->assertNotContains('Hello World', $response->getContent());
     // Request JS-enabling of language key via RPC call
     $body = CM_Params::jsonEncode(['method' => 'CM_Model_Language.requestTranslationJs', 'params' => ['Hello World']]);
     $request = new CM_Http_Request_Post('/rpc', null, null, $body);
     $response = CM_Http_Response_RPC::createFromRequest($request, $site, $this->getServiceManager());
     $response->process();
     CMTest_TH::reinstantiateModel($languageKey);
     $this->assertSame(true, $languageKey->getJavascript());
     // Check that key *is* included in the JS translations list
     $versionJavascript = CM_Model_Language::getVersionJavascript();
     $request = new CM_Http_Request_Get($render->getUrlResource('library-js', "translations/{$versionJavascript}.js"));
     $response = CM_Http_Response_Resource_Javascript_Library::createFromRequest($request, $site, $this->getServiceManager());
     $response->process();
     $this->assertContains('Hello World', $response->getContent());
 }
Example #12
0
 /**
  * @return CM_Site_Abstract
  */
 public function getSite()
 {
     $site = $this->_site;
     if (null === $site) {
         $site = CM_Site_Abstract::factory();
     }
     return $site;
 }
Example #13
0
 public function testProcessingInvalidMethod()
 {
     $body = CM_Params::jsonEncode(['method' => 'foo']);
     $request = new CM_Http_Request_Post('/rpc/' . CM_Site_Abstract::factory()->getType(), null, null, $body);
     $response = new CM_Http_Response_RPC($request, $this->getServiceManager());
     $response->process();
     $responseData = CM_Params::jsonDecode($response->getContent());
     $this->assertSame(['error' => ['type' => 'CM_Exception_InvalidParam', 'msg' => 'Internal server error', 'isPublic' => false]], $responseData);
 }
Example #14
0
 public function testFactory()
 {
     try {
         CM_Site_Abstract::factory(9999);
         $this->fail('Factory returned non-configured site');
     } catch (CM_Class_Exception_TypeNotConfiguredException $ex) {
         $this->assertContains('Site with type `9999` not configured', $ex->getMessage());
     }
 }
Example #15
0
 public function testFactory()
 {
     try {
         CM_Site_Abstract::factory(9999);
         $this->fail('Factory returned non-configured site');
     } catch (CM_Class_Exception_TypeNotConfiguredException $ex) {
         $this->assertSame('Site with given type is not configured', $ex->getMessage());
         $this->assertSame(['siteType' => 9999], $ex->getMetaInfo());
     }
 }
Example #16
0
 public function testProcessHostRedirect()
 {
     $site = CM_Site_Abstract::factory();
     $response = CMTest_TH::createResponsePageEmbed('/mock7', array('host' => $site->getHost()));
     $response->process();
     $this->assertNull($response->getRedirectUrl());
     $response = CMTest_TH::createResponsePageEmbed('/mock7', array('host' => 'incorrect-host.org'));
     $response->process();
     $this->assertSame($site->getUrl() . '/mock7', $response->getRedirectUrl());
 }
Example #17
0
 public function testProcessHostRedirect_parameter()
 {
     $site = CM_Site_Abstract::factory();
     $location = CMTest_TH::createLocation();
     $locationEncoded = CM_Params::encode($location, true);
     $query = http_build_query(['location' => $locationEncoded]);
     $response = CMTest_TH::createResponsePage('/mock5?' . $query, array('host' => 'incorrect-host.org'));
     $response->process();
     $siteUrl = 'http://' . $site->getHost();
     $this->assertContains('Location: ' . $siteUrl . '/mock5?' . $query, $response->getHeaders());
 }
Example #18
0
 public function testProcess()
 {
     $site = CM_Site_Abstract::factory();
     $render = new CM_Frontend_Render(new CM_Frontend_Environment());
     $request = new CM_Http_Request_Get($render->getUrlResource('library-css', 'all.css'));
     $response = CM_Http_Response_Resource_Css_Library::createFromRequest($request, $site, $this->getServiceManager());
     $response->process();
     $this->assertContains('Cache-Control: max-age=31536000', $response->getHeaders());
     $this->assertContains('Expires: ' . gmdate('D, d M Y H:i:s \\G\\M\\T', time() + 31536000), $response->getHeaders());
     $this->assertContains('body{', $response->getContent());
 }
Example #19
0
 public function testSetNull()
 {
     $environment = new CM_Frontend_Environment();
     $this->assertEquals(CM_Site_Abstract::factory(), $environment->getSite());
     $this->assertNull($environment->getViewer());
     $this->assertNull($environment->getLanguage());
     $this->assertSame('en', $environment->getLocale());
     $this->assertEquals(CM_Bootloader::getInstance()->getTimeZone(), $environment->getTimeZone());
     $this->assertSame(CM_Bootloader::getInstance()->isDebug(), $environment->isDebug());
     $this->assertNull($environment->getLocation());
 }
Example #20
0
 public function testProcessMissingParameter()
 {
     $site = CM_Site_Abstract::factory();
     $request = new CM_Http_Request_Get('/emailtracking', ['host' => $site->getHost()]);
     $response = CM_Http_Response_EmailTracking::createFromRequest($request, $site, $this->getServiceManager());
     try {
         $response->process();
         $this->fail('Expected exception not thrown');
     } catch (CM_Exception_InvalidParam $e) {
         $this->assertSame(CM_Exception::WARN, $e->getSeverity());
     }
 }
Example #21
0
 public function testLoadPageRedirectLanguage()
 {
     $site = CM_Site_Abstract::factory();
     CMTest_TH::createLanguage('en');
     $viewer = CMTest_TH::createUser();
     $environment = new CM_Frontend_Environment(null, $viewer);
     $component = new CM_Page_View_Ajax_Test_Mock();
     $response = $this->getResponseAjax($component, 'loadPage', ['path' => '/en' . CM_Page_View_Ajax_Test_Mock::getPath()], $environment);
     $this->assertViewResponseSuccess($response);
     $responseDecoded = CM_Params::jsonDecode($response->getContent());
     $this->assertSame($site->getUrl() . CM_Page_View_Ajax_Test_Mock::getPath(), $responseDecoded['success']['data']['url']);
 }
Example #22
0
 public function testSetSite()
 {
     $siteDefault = CM_Site_Abstract::factory();
     $user = CMTest_TH::createUser();
     $this->assertEquals($siteDefault, $user->getSite());
     $type = $siteDefault->getType() + 1;
     $site = $this->getMockBuilder('CM_Site_Abstract')->setMethods(array('getType'))->getMock();
     $site->expects($this->any())->method('getType')->will($this->returnValue($type));
     CM_Config::get()->CM_Site_Abstract->types[$type] = get_class($site);
     $user->setSite($site);
     $this->assertEquals($site, $user->getSite());
 }
Example #23
0
 public function testProcessAfterBody()
 {
     $site = CM_Site_Abstract::factory();
     $render = new CM_Frontend_Render(new CM_Frontend_Environment());
     $request = new CM_Http_Request_Get($render->getUrlResource('vendor-js', 'after-body.js'));
     $response = CM_Http_Response_Resource_Javascript_Vendor::createFromRequest($request, $site, $this->getServiceManager());
     $response->process();
     $this->assertContains('Cache-Control: max-age=31536000', $response->getHeaders());
     $this->assertContains('Expires: ' . gmdate('D, d M Y H:i:s \\G\\M\\T', time() + 31536000), $response->getHeaders());
     $this->assertContains('function()', $response->getContent());
     $this->assertContains('jQuery', $response->getContent());
 }
Example #24
0
 /**
  * @param string[] $sourceMainPaths
  * @param bool     $generateSourceMaps
  * @throws CM_Exception
  */
 protected function _appendSourceMainBrowserify($sourceMainPaths, $generateSourceMaps)
 {
     if ($generateSourceMaps && !$this->_js->isEmpty()) {
         throw new CM_Exception('Cannot generate source maps when output container already contains code.');
     }
     $sourcePaths = [];
     foreach (array_reverse($this->_site->getModules()) as $moduleName) {
         $sourcePaths[] = $this->_getPathInModule($moduleName, 'client-vendor/source');
     }
     $content = $this->_browserify($sourceMainPaths, $sourcePaths, $generateSourceMaps);
     $this->_js->append($content);
 }
Example #25
0
 public function testSetNull()
 {
     $defaultCurrency = CM_Model_Currency::create('840', 'USD');
     $environment = new CM_Frontend_Environment();
     $this->assertEquals(CM_Site_Abstract::factory(), $environment->getSite());
     $this->assertNull($environment->getViewer());
     $this->assertNull($environment->getLanguage());
     $this->assertSame('en', $environment->getLocale());
     $this->assertEquals(CM_Bootloader::getInstance()->getTimeZone(), $environment->getTimeZone());
     $this->assertSame(CM_Bootloader::getInstance()->isDebug(), $environment->isDebug());
     $this->assertNull($environment->getLocation());
     $this->assertEquals($defaultCurrency, $environment->getCurrency());
     $this->assertNull($environment->getClientDevice());
 }
Example #26
0
 public function testNonexistentAjaxMethodException()
 {
     /** @var CM_View_Abstract|PHPUnit_Framework_MockObject_MockObject $view */
     $view = $this->getMockForAbstractClass('CM_View_Abstract');
     $site = CM_Site_Abstract::factory();
     $request = $this->createRequestAjax($view, 'someReallyBadMethod', ['params' => 'foo']);
     $response = CM_Http_Response_View_Ajax::createFromRequest($request, $site, $this->getServiceManager());
     $exception = $this->catchException(function () use($response) {
         $response->process();
     });
     $this->assertInstanceOf('CM_Exception_Invalid', $exception);
     /** @var CM_Exception_Invalid $exception */
     $this->assertSame('Method not found', $exception->getMessage());
     $this->assertSame(['method' => 'ajax_someReallyBadMethod'], $exception->getMetaInfo());
 }
Example #27
0
 /**
  * @param CM_Site_Abstract[]|null $siteList
  */
 public function __construct(array $siteList = null)
 {
     if (null === $siteList) {
         $siteList = CM_Site_Abstract::getAll();
     }
     usort($siteList, function (CM_Site_Abstract $site1, CM_Site_Abstract $site2) {
         $length1 = mb_strlen($site1->getUrl());
         $length2 = mb_strlen($site2->getUrl());
         if ($length1 == $length2) {
             return 0;
         }
         return $length1 > $length2 ? -1 : 1;
     });
     $this->_siteList = $siteList;
 }
Example #28
0
 public function testProcessEmoticon()
 {
     $deployVersion = CM_App::getInstance()->getDeployVersion();
     $siteType = CM_Site_Abstract::factory()->getType();
     $usertext = new CM_Usertext_Usertext(new CM_Frontend_Render());
     $expectedValuePlain = "<img src=\"http://cdn.default.dev/layout/" . $siteType . "/" . $deployVersion . "/img/emoticon/cold_sweat.png\" class=\"emoticon emoticon-cold_sweat\" title=\":cold_sweat:\" />";
     $expectedValueMarkdown = "<p><img src=\"http://cdn.default.dev/layout/" . $siteType . "/" . $deployVersion . "/img/emoticon/cold_sweat.png\" class=\"emoticon emoticon-cold_sweat\" title=\":cold_sweat:\" /></p>";
     $usertext->setMode('escape');
     $this->assertSame('&lt;3', $usertext->transform('<3'));
     $usertext->setMode('oneline');
     $this->assertSame($expectedValuePlain, $usertext->transform(':-\\\\'));
     $usertext->setMode('simple');
     $this->assertSame($expectedValuePlain, $usertext->transform(':-\\\\'));
     $usertext->setMode('markdown');
     $this->assertSame($expectedValueMarkdown, $usertext->transform(':-\\\\'));
     $usertext->setMode('markdownPlain');
     $this->assertContains($expectedValuePlain, $usertext->transform(':-\\\\'));
 }
Example #29
0
 public function generateFavicon()
 {
     $faviconConfigList = $this->_getFaviconConfigList();
     $this->_getStreamOutput()->writeln('Generating favicons');
     $themeDirStructList = Functional\map(CM_Site_Abstract::getAll(), function (CM_Site_Abstract $site) {
         $render = new CM_Frontend_Render(new CM_Frontend_Environment($site));
         return ['render' => $render, 'themeDir' => new CM_File($render->getThemeDir(true))];
     });
     $themeDirStructList = Functional\unique($themeDirStructList, function (array $themeDirStruct) {
         /** @var CM_File $themeDir */
         $themeDir = $themeDirStruct['themeDir'];
         return $themeDir->getPath();
     });
     //filter site aliases
     foreach ($themeDirStructList as $themeDirStruct) {
         /** @var CM_Frontend_Render $render */
         $render = $themeDirStruct['render'];
         /** @var CM_File $themeDir */
         $themeDir = $themeDirStruct['themeDir'];
         $svgFile = $themeDir->joinPath('resource', 'img', self::FAVICON_SVG_FILENAME);
         if ($svgFile->exists()) {
             foreach ($faviconConfigList as $outputFilename => $config) {
                 $backgroundWidth = (int) $config['width'];
                 $backgroundHeight = (int) $config['height'];
                 $backgroundColor = false === $config['transparent'] ? $render->getLessVariable(self::FAVICON_BACKGROUND_LESS_VARIABLE) : 'transparent';
                 $background = new Imagick();
                 $background->newPseudoImage($backgroundWidth, $backgroundHeight, 'canvas:' . $backgroundColor);
                 $backgroundImage = new CM_Image_Image($background);
                 $iconSize = (int) (min($backgroundWidth, $backgroundHeight) * (double) $config['iconSize']);
                 $iconImage = CM_Image_Image::createFromSVGWithSize($svgFile->read(), $iconSize, $iconSize);
                 $backgroundImage->compositeImage($iconImage, ($backgroundWidth - $iconSize) / 2, ($backgroundHeight - $iconSize) / 2);
                 $backgroundImage->setFormat(CM_Image_Image::FORMAT_PNG);
                 $targetFile = $themeDir->joinPath('resource', 'img', 'meta', $outputFilename);
                 $targetFile->ensureParentDirectory();
                 $targetFile->write($backgroundImage->getBlob());
                 $this->_getStreamOutput()->writeln('Generated ' . $targetFile->getPath());
             }
         }
     }
 }
Example #30
0
 public function fillCaches()
 {
     /** @var CM_Asset_Javascript_Abstract[] $assetList */
     $assetList = array();
     $languageList = new CM_Paging_Language_Enabled();
     foreach (CM_Site_Abstract::getAll() as $site) {
         $assetList[] = new CM_Asset_Javascript_Internal($site);
         $assetList[] = new CM_Asset_Javascript_Library($site);
         $assetList[] = new CM_Asset_Javascript_VendorAfterBody($site);
         $assetList[] = new CM_Asset_Javascript_VendorBeforeBody($site);
         foreach ($languageList as $language) {
             $render = new CM_Frontend_Render(new CM_Frontend_Environment($site, null, $language));
             $assetList[] = new CM_Asset_Css_Vendor($render);
             $assetList[] = new CM_Asset_Css_Library($render);
         }
     }
     foreach ($languageList as $language) {
         $assetList[] = new CM_Asset_Javascript_Translations($language);
     }
     foreach ($assetList as $asset) {
         $asset->get(true);
     }
     CM_Bootloader::getInstance()->getModules();
 }