PageRenderTime 126ms CodeModel.GetById 49ms RepoModel.GetById 2ms app.codeStats 0ms

/vendor/venne/cms-module/CmsModule/Components/PanelControl.php

https://bitbucket.org/iiic/iszp
PHP | 351 lines | 246 code | 86 blank | 19 comment | 48 complexity | 6d0e687a98d8f8fe7208f6ba743d8a4d MD5 | raw file
  1. <?php
  2. /**
  3. * This file is part of the Venne:CMS (https://github.com/Venne)
  4. *
  5. * Copyright (c) 2011, 2012 Josef Kříž (http://www.josef-kriz.cz)
  6. *
  7. * For the full copyright and license information, please view
  8. * the file license.txt that was distributed with this source code.
  9. */
  10. namespace CmsModule\Components;
  11. use Venne;
  12. use Venne\Application\UI\Control;
  13. use CmsModule\Content\ContentManager;
  14. use CmsModule\Content\Entities\PageEntity;
  15. /**
  16. * @author Josef Kříž <pepakriz@gmail.com>
  17. */
  18. class PanelControl extends Control
  19. {
  20. /** @var \Nette\Http\SessionSection */
  21. protected $session;
  22. /** @var Venne\Module\TemplateManager */
  23. protected $templateManager;
  24. /** @var ContentManager */
  25. protected $contentManager;
  26. /**
  27. * @param \Venne\Module\TemplateManager $templateManager
  28. * @param \Nette\Http\SessionSection $session
  29. * @param \CmsModule\Content\ContentManager $contentManager
  30. */
  31. public function __construct(Venne\Module\TemplateManager $templateManager, \Nette\Http\SessionSection $session, ContentManager $contentManager)
  32. {
  33. parent::__construct();
  34. $this->templateManager = $templateManager;
  35. $this->session = $session;
  36. $this->contentManager = $contentManager;
  37. }
  38. public function render()
  39. {
  40. $this->template->render();
  41. }
  42. public function getTab()
  43. {
  44. return (int)$this->session->tab;
  45. }
  46. public function setTab($tab)
  47. {
  48. $this->session->tab = (int)$tab;
  49. }
  50. public function setState($id, $state)
  51. {
  52. if (!isset($this->session->state)) {
  53. $this->session->state = array();
  54. }
  55. if (!isset($this->session->state[$this->getTab()])) {
  56. $this->session->state[$this->getTab()] = array();
  57. }
  58. $this->session->state[$this->getTab()][$id] = $state;
  59. }
  60. public function getState($id)
  61. {
  62. return isset($this->session->state[$this->getTab()][$id]) ? $this->session->state[$this->getTab()][$id] : FALSE;
  63. }
  64. public function handleTab($tab)
  65. {
  66. $this->presenter->validateControl('content');
  67. $this->invalidateControl('content');
  68. $this->invalidateControl('tabs');
  69. $this->tab = $tab;
  70. $this->presenter->payload->url = $this->link('this');
  71. }
  72. protected function createComponentBrowser()
  73. {
  74. $nullLinkParams = \Venne\Application\UI\Helpers::nullLinkParams($this);
  75. unset($nullLinkParams['lang']);
  76. if ($this->tab == 0) {
  77. $browser = new \CmsModule\Components\BrowserControl(callback($this, "getPages"), callback($this, "setPageParent"));
  78. $browser->setOnActivateLink($this->getPresenter()->link(':Cms:Admin:Content:edit', array('key' => 'this') + $nullLinkParams));
  79. $browser->onExpand[] = $this->pageExpand;
  80. } else if ($this->tab == 2) {
  81. $browser = new \CmsModule\Components\BrowserControl(callback($this, "getFiles"), callback($this, "setFileParent"));
  82. $browser->setOnActivateLink($this->getPresenter()->link(':Cms:Admin:Files:', array('key' => 'this') + $nullLinkParams));
  83. $browser->onExpand[] = $this->fileExpand;
  84. } else if ($this->tab == 3) {
  85. $browser = new \CmsModule\Components\BrowserControl(callback($this, "getLayouts"), callback($this, "setLayoutParent"));
  86. $browser->setOnActivateLink($this->getPresenter()->link(':Cms:Admin:Layouts:', array('key' => 'this') + $nullLinkParams));
  87. $browser->onExpand[] = $this->layoutExpand;
  88. } else if ($this->tab == 4) {
  89. $browser = new \CmsModule\Components\BrowserControl(callback($this, "getTemplates"), callback($this, "setTemplateParent"));
  90. $browser->setOnActivateLink($this->getPresenter()->link(':Cms:Admin:Templates:edit', array('key' => 'this') + $nullLinkParams));
  91. $browser->onExpand[] = $this->templateExpand;
  92. }
  93. $browser->setTemplateConfigurator($this->templateConfigurator);
  94. return $browser;
  95. }
  96. public function templateExpand($key, $open)
  97. {
  98. $this->setState($key, $open);
  99. }
  100. public function layoutExpand($key, $open)
  101. {
  102. $this->setState($key, $open);
  103. }
  104. public function getLayouts($parent = NULL)
  105. {
  106. $this->setState($parent, TRUE);
  107. $data = array();
  108. $repository = $this->getPresenter()->getContext()->cms->layoutRepository;
  109. foreach ($repository->findAll() as $entity) {
  110. $item = array('title' => $entity->name, 'key' => $entity->id);
  111. $data[] = $item;
  112. }
  113. return $data;
  114. }
  115. public function getTemplates()
  116. {
  117. $data = array();
  118. foreach ($this->presenter->context->parameters['modules'] as $moduleName => $val) {
  119. if (!count($this->templateManager->getLayoutsByModule($moduleName))) {
  120. continue;
  121. }
  122. $item = array('title' => $moduleName, 'key' => $moduleName, 'isFolder' => TRUE, 'isLazy' => TRUE);
  123. if ($this->getState($moduleName)) {
  124. $item['expand'] = TRUE;
  125. }
  126. $data2 = array();
  127. foreach ($this->templateManager->getLayoutsByModule($moduleName) as $name => $key) {
  128. $s = array('title' => '@' . $name . ' <small class="muted">' . $this->template->translate('layout') . '</small>', 'key' => $key);
  129. foreach ($this->templateManager->getTemplatesByModule($moduleName, $name) as $name => $key) {
  130. $item2 = array('title' => $name . ' <small class="muted">' . $this->template->translate('template') . '</small>', 'key' => $key);
  131. $s['children'][] = $item2;
  132. }
  133. if ($this->getState($key)) {
  134. $s['expand'] = TRUE;
  135. }
  136. $data2[] = $s;
  137. }
  138. foreach ($this->templateManager->getTemplatesByModule($moduleName) as $name => $key) {
  139. $data2[] = array('title' => $name . ' <small class="muted">' . $this->template->translate('template') . '</small>', 'key' => $key);
  140. }
  141. $item['children'] = $data2;
  142. $data[] = $item;
  143. }
  144. return $data;
  145. }
  146. public function pageExpand($key, $open)
  147. {
  148. $this->setState((int)$key, $open);
  149. }
  150. public function getPages($parent = NULL)
  151. {
  152. $this->setState((int)$parent, TRUE);
  153. $repository = $this->getPresenter()->getContext()->cms->pageRepository;
  154. $data = array();
  155. $dql = $repository->createQueryBuilder('a');
  156. if ($parent) {
  157. $dql = $dql->andWhere('a.parent = ?1 AND a.tag IS NULL')->setParameter(1, $parent);
  158. } else {
  159. $dql = $dql->andWhere('(a.parent IS NULL OR a.tag IS NOT NULL) AND a.virtualParent IS NULL');
  160. }
  161. $dql
  162. ->andWhere('a.translationFor IS NULL')
  163. ->orderBy('a.position');
  164. $types = $this->contentManager->getContentTypes();
  165. foreach ($dql->getQuery()->getResult() as $page) {
  166. $type = $this->presenter->template->translate($types[get_class($page)]);
  167. $item = array("title" => $page->name . ' <small class="muted">' . $type . '</small>', 'key' => $page->id);
  168. if (count($page->children) > 0) {
  169. $item['isLazy'] = TRUE;
  170. }
  171. if (!$page->parent || $this->getState((int)$page->id)) {
  172. $item['expand'] = TRUE;
  173. $item['children'] = $this->getPages($page->id);
  174. }
  175. $data[] = $item;
  176. }
  177. return $data;
  178. }
  179. public function fileExpand($key, $open)
  180. {
  181. $key = $key ? substr($key, 2) : NULL;
  182. $this->setState((int)$key, $open);
  183. }
  184. public function getFiles($parent = NULL)
  185. {
  186. $parent = $parent ? substr($parent, 2) : NULL;
  187. $this->setState((int)$parent, TRUE);
  188. $dirRepository = $this->getPresenter()->getContext()->cms->dirRepository;
  189. $fileRepository = $this->getPresenter()->getContext()->cms->fileRepository;
  190. $data = array();
  191. $dql = $dirRepository->createQueryBuilder('a');
  192. if ($parent) {
  193. $dql = $dql->andWhere('a.parent = ?1')->setParameter(1, $parent);
  194. } else {
  195. $dql = $dql->andWhere('a.parent IS NULL');
  196. }
  197. $dql = $dql->andWhere('a.invisible = :invisible')->setParameter('invisible', FALSE);
  198. foreach ($dql->getQuery()->getResult() as $page) {
  199. $item = array("title" => $page->name, 'key' => 'd:' . $page->id);
  200. $item["isFolder"] = TRUE;
  201. if (count($page->children) > 0 || count($page->files) > 0) {
  202. $item['isLazy'] = TRUE;
  203. }
  204. if ($this->getState($page->id)) {
  205. $item['expand'] = TRUE;
  206. $item['children'] = $this->getFiles('d:' . $page->id);
  207. }
  208. $data[] = $item;
  209. }
  210. $dql = $fileRepository->createQueryBuilder('a');
  211. if ($parent) {
  212. $dql = $dql->andWhere('a.parent = ?1')->setParameter(1, $parent);
  213. } else {
  214. $dql = $dql->andWhere('a.parent IS NULL');
  215. }
  216. foreach ($dql->getQuery()->getResult() as $page) {
  217. $item = array('title' => $page->name, 'key' => 'f:' . $page->id);
  218. $data[] = $item;
  219. }
  220. return $data;
  221. }
  222. public function setPageParent($from, $to, $dropmode)
  223. {
  224. $repository = $this->getPresenter()->getContext()->cms->pageRepository;
  225. $entity = $repository->find($from);
  226. $target = $repository->find($to);
  227. if ($target->parent === NULL && ($dropmode == 'before' || $dropmode == 'after')) {
  228. $entity->setAsRoot();
  229. $repository->save($target);
  230. } else {
  231. if ($dropmode == 'before' || $dropmode == 'after') {
  232. $entity->setParent(
  233. $target->parent ? : NULL,
  234. TRUE,
  235. $dropmode == 'after' ? $target : $target->previous
  236. );
  237. } else {
  238. $entity->setParent($target);
  239. }
  240. $repository->save($entity);
  241. }
  242. $this->presenter['panel']->invalidateControl('content');
  243. }
  244. public function setFileParent($from, $to, $dropmode)
  245. {
  246. $dirRepository = $this->getPresenter()->getContext()->cms->dirRepository;
  247. $fileRepository = $this->getPresenter()->getContext()->cms->fileRepository;
  248. $fromType = substr($from, 0, 1);
  249. $from = substr($from, 2);
  250. $toType = substr($to, 0, 1);
  251. $to = substr($to, 2);
  252. $entity = $fromType == 'd' ? $dirRepository->find($from) : $fileRepository->find($from);
  253. $target = $toType == 'd' ? $dirRepository->find($to) : $fileRepository->find($to);
  254. if ($dropmode == "before" || $dropmode == "after") {
  255. $entity->setParent(
  256. $target->parent ? : NULL,
  257. TRUE,
  258. $dropmode == "after" ? $target : $target->previous
  259. );
  260. } else {
  261. $entity->setParent($target);
  262. }
  263. $this->presenter->context->entityManager->flush();
  264. }
  265. }