/Ip/Internal/PageAssets.php

https://gitlab.com/x33n/ImpressPages · PHP · 241 lines · 197 code · 38 blank · 6 comment · 23 complexity · 60fe81d1345540468df0c5c4d6e6ec2b MD5 · raw file

  1. <?php
  2. /**
  3. * @package ImpressPages
  4. */
  5. namespace Ip\Internal;
  6. class PageAssets
  7. {
  8. /** array js variables */
  9. private $javascriptVariables = array();
  10. /** array required javascript files */
  11. private $requiredJavascript = array();
  12. /** array required css files */
  13. private $requiredCss = array();
  14. public function addCss($file, $attributes = array(), $stage = 50, $cacheFix = true)
  15. {
  16. $this->requiredCss[(int)$stage][$file] = array(
  17. 'value' => $file,
  18. 'attributes' => $attributes,
  19. 'cacheFix' => $cacheFix
  20. );
  21. }
  22. public function removeCss($file)
  23. {
  24. foreach ($this->requiredCss as $levelKey => &$level) {
  25. if (isset($this->requiredCss[$levelKey][$file])) {
  26. unset($this->requiredCss[$levelKey][$file]);
  27. }
  28. }
  29. }
  30. public function getCss()
  31. {
  32. ksort($this->requiredCss);
  33. $cssFiles = array();
  34. foreach ($this->requiredCss as $level) {
  35. $cssFiles = array_merge($cssFiles, $level);
  36. }
  37. return $cssFiles;
  38. }
  39. public function addJavascriptContent($key, $javascript, $stage = 50)
  40. {
  41. $this->requiredJavascript[(int)$stage][$key] = array(
  42. 'type' => 'content',
  43. 'value' => $javascript
  44. );
  45. }
  46. public function addJavascript($file, $attributes = array(), $stage = 50, $cacheFix = true)
  47. {
  48. $this->requiredJavascript[(int)$stage][$file] = array(
  49. 'type' => 'file',
  50. 'value' => $file,
  51. 'attributes' => $attributes,
  52. 'cacheFix' => $cacheFix
  53. );
  54. }
  55. public function removeJavascript($file)
  56. {
  57. foreach ($this->requiredJavascript as $levelKey => &$level) {
  58. if (isset($this->requiredJavascript[$levelKey][$file]) && $this->requiredJavascript[$levelKey][$file]['type'] == 'file') {
  59. unset($this->requiredJavascript[$levelKey][$file]);
  60. }
  61. }
  62. }
  63. public function removeJavascriptContent($key)
  64. {
  65. foreach ($this->requiredJavascript as $levelKey => &$level) {
  66. if (isset($this->requiredJavascript[$levelKey][$key]) && $this->requiredJavascript[$levelKey][$key]['type'] == 'content') {
  67. unset($this->requiredJavascript[$levelKey][$key]);
  68. }
  69. }
  70. }
  71. public function getJavascript()
  72. {
  73. ksort($this->requiredJavascript);
  74. return $this->requiredJavascript;
  75. }
  76. public function addJavascriptVariable($name, $value)
  77. {
  78. $this->javascriptVariables[$name] = $value;
  79. }
  80. public function removeJavascriptVariable($name)
  81. {
  82. if (isset($this->javascriptVariables[$name])) {
  83. unset($this->javascriptVariables[$name]);
  84. }
  85. }
  86. public function getJavascriptVariables()
  87. {
  88. return $this->javascriptVariables;
  89. }
  90. public function generateHead()
  91. {
  92. $cacheVersion = $this->getCacheVersion();
  93. $cssFiles = $this->getCss();
  94. $inDesignPreview = false;
  95. $data = ipRequest()->getRequest();
  96. if (!empty($data['ipDesign']['pCfg']) || !empty($data['restoreDefault'])) {
  97. $inDesignPreview = \Ip\Internal\Design\ConfigModel::instance()->isInPreviewState();
  98. }
  99. if ($inDesignPreview) {
  100. $themeAssetsUrl = ipThemeUrl(\Ip\Application::ASSETS_DIR . '/');
  101. $designService = \Ip\Internal\Design\Service::instance();
  102. $theme = ipConfig()->theme();
  103. foreach ($cssFiles as &$file) {
  104. if (strpos($file['value'], $themeAssetsUrl) === 0) {
  105. $pathinfo = pathinfo($file['value']);
  106. if ($pathinfo['extension'] == 'css'
  107. && $themeAssetsUrl . $pathinfo['basename'] == $file['value']
  108. ) {
  109. $themeFile = \Ip\Application::ASSETS_DIR . '/' . $pathinfo['filename'] . '.less';
  110. if (file_exists(ipThemeFile($themeFile))) {
  111. $file['value'] = $designService->getRealTimeUrl($theme, $themeFile);
  112. $file['cacheFix'] = false;
  113. }
  114. }
  115. }
  116. if ($file['cacheFix']) {
  117. $file['value'] .= (strpos($file['value'], '?') !== false ? '&' : '?') . $cacheVersion;
  118. }
  119. }
  120. } else {
  121. foreach ($cssFiles as &$file) {
  122. if ($file['cacheFix']) {
  123. $file['value'] .= (strpos($file['value'], '?') !== false ? '&' : '?') . $cacheVersion;
  124. }
  125. }
  126. }
  127. $cssFiles = ipFilter('ipCss', $cssFiles);
  128. $response = ipResponse();
  129. $data = array(
  130. 'title' => $response->getTitle(),
  131. 'keywords' => $response->getKeywords(),
  132. 'description' => $response->getDescription(),
  133. 'favicon' => $response->getFavicon(),
  134. 'charset' => $response->getCharset(),
  135. 'css' => $cssFiles
  136. );
  137. $head = ipView('Ip/Internal/Config/view/head.php', $data)->render();
  138. $head = ipFilter('ipHead', $head);
  139. return $head;
  140. }
  141. public function generateJavascript()
  142. {
  143. $cacheVersion = $this->getCacheVersion();
  144. $javascriptFiles = $this->getJavascript();
  145. $javascriptFilesSorted = array();
  146. foreach ($javascriptFiles as $level) {
  147. foreach ($level as &$file) {
  148. if ($file['type'] == 'file' && $file['cacheFix']) {
  149. $file['value'] .= (strpos($file['value'], '?') !== false ? '&' : '?') . $cacheVersion;
  150. }
  151. }
  152. $javascriptFilesSorted = array_merge($javascriptFilesSorted, $level);
  153. }
  154. $revision = $this->getCurrentRevision();
  155. $page = ipContent()->getCurrentPage();
  156. $javascriptFilesSorted = ipFilter('ipJs', $javascriptFilesSorted);
  157. $language = ipContent()->getCurrentLanguage();
  158. $data = array(
  159. 'ip' => array(
  160. 'baseUrl' => ipConfig()->baseUrl(),
  161. 'safeMode' => \Ip\Internal\Admin\Service::isSafeMode(),
  162. 'languageId' => $language->getId(),
  163. 'languageUrl' => $language->getLink(),
  164. 'languageCode' => $language->getCode(),
  165. 'languageTextDirection' => $language->getTextDirection(),
  166. 'theme' => ipConfig()->theme(),
  167. 'pageId' => $page ? $page->getId() : null,
  168. 'revisionId' => $revision['revisionId'],
  169. 'securityToken' => \Ip\ServiceLocator::application()->getSecurityToken(),
  170. 'developmentEnvironment' => ipConfig()->isDevelopmentEnvironment(),
  171. 'debugMode' => ipconfig()->isDebugMode(),
  172. 'isManagementState' => ipIsManagementState(),
  173. 'isAdminState' => ipAdminId() ? 1 : 0,
  174. 'isAdminNavbarDisabled' => ipRequest()->getQuery('disableAdminNavbar') ? 1 : 0
  175. ),
  176. 'javascriptVariables' => $this->getJavascriptVariables(),
  177. 'javascript' => $javascriptFilesSorted,
  178. );
  179. $javascript = ipView('Ip/Internal/Config/view/javascript.php', $data)->render();
  180. $javascript = ipFilter('ipJavaScript', $javascript);
  181. return $javascript;
  182. }
  183. protected function getCacheVersion()
  184. {
  185. return \Ip\ServiceLocator::storage()->get('Ip', 'cacheVersion', 1);
  186. }
  187. protected function getCurrentRevision()
  188. {
  189. return \Ip\ServiceLocator::content()->getCurrentRevision();
  190. }
  191. public function removeAllCss()
  192. {
  193. $this->requiredCss = array();
  194. }
  195. public function removeAllJs()
  196. {
  197. $this->requiredJs = array();
  198. }
  199. public function removeAllJsVariables()
  200. {
  201. $this->javascriptVariables = array();
  202. }
  203. }