PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/www/app/AdminModule/presenters/AdminPagesPresenter.php

https://github.com/bazo/Mokuji
PHP | 454 lines | 400 code | 43 blank | 11 comment | 47 complexity | b0311a67b3133b5deb2bf0d7f7b07cf9 MD5 | raw file
Possible License(s): BSD-3-Clause, MIT
  1. <?php
  2. class Admin_PagesPresenter extends Admin_SecurePresenter
  3. {
  4. protected $item, $html;
  5. private $categories, $new = false, $edit = false;
  6. public function actionDefault()
  7. {
  8. $this->view = 'pages';
  9. $this->template->new = $this->new;
  10. $this->template->edit = $this->edit;
  11. $this->template->link = $this->createComponentLink();
  12. }
  13. public function createComponentLink()
  14. {
  15. $link = Html::el('a')->href($this->link('newPage!'))->class('ajax')->add(Html::el('div')->id('create-new-link')->add(Html::el('div')->id('icon'))->add(Html::el('span')->add('Create new')));
  16. return $link;
  17. }
  18. //GRID
  19. public function createComponentPagesGrid($name)
  20. {
  21. $grid = new DataGrid($this, $name);
  22. $grid->rememberState = TRUE; // povolí ukládání stavů komponenty do session
  23. $grid->timeout = '+ 7 days';
  24. $ds = $this->model('Pages')->getDs();
  25. $grid->bindDataTable($ds);
  26. $grid->keyName = 'title';
  27. $grid->addColumn('homepage', '');
  28. $grid['homepage']->getHeaderPrototype()->class('homepage-column');
  29. $grid['homepage']->getCellPrototype()->class('homepage-column');;
  30. $grid['homepage']->formatCallback[] = array($this, 'homepageCallback');
  31. //$grid['creditLimit']->getCellPrototype()->style('text-align: center');
  32. $grid->addColumn('title', 'Title')->addFilter();
  33. $categories = $this->model('categories')->getPairs();
  34. $grid->addColumn('category', 'Category')->addSelectboxFilter($categories);
  35. $this->categories = array('0' => 'none') + $categories;
  36. $grid['category']->formatCallback[] = array($this, 'gridCategoryCallback');
  37. $grid['title']->formatCallback[] = array($this, 'createLink');
  38. $grid->addColumn('template', 'Template')->addSelectboxFilter();
  39. $grid['template']->getCellPrototype()->style('text-align: center');
  40. $grid['template']->formatCallback[] = array($this, 'templateFormatCallback');
  41. $grid->addColumn('published', 'Published')->addSelectboxFilter(array('0' => "No", '1' => "Yes"), TRUE);
  42. $grid['published']->getCellPrototype()->style('text-align: center');
  43. $grid['published']->formatCallback[] = array($this, 'publishFormatCallback');
  44. $grid->addDateColumn('publish_time', 'Publish time', '%d.%m.%Y %H:%M:%S');
  45. $grid['publish_time']->getHeaderPrototype()->style('text-align: center');
  46. $grid['publish_time']->getCellPrototype()->style('text-align: center');
  47. $grid->addActionColumn('Actions');
  48. $grid->addAction('Edit', 'editPage!', Html::el('span')->class('icon icon-edit'), $useAjax = TRUE);
  49. $grid->addAction('Delete', 'confirmForm:confirmDelete!', Html::el('span')->class('icon icon-delete'), $useAjax = TRUE);
  50. $renderer = $grid->getRenderer();
  51. $renderer->paginatorFormat = '%input%';
  52. $grid->setRenderer($renderer);
  53. return $grid;
  54. }
  55. public function templateFormatCallback($value, DibiRow $data)
  56. {
  57. $templates = $this->model('contentTemplates')->get('page');
  58. $select = Html::el('select')->class('template-change')->{'data-id'}($data->id);
  59. foreach($templates as $template)
  60. {
  61. if($value == $template)
  62. $select->create('option')->value($template)->setText($template)->selected('selected');
  63. else $select->create('option')->value($template)->setText($template);
  64. }
  65. return $select;
  66. }
  67. public function homepageCallback($value, DibiRow $data) {
  68. if($value == 1) return Html::el('span')->class('icon icon-homepage')->title('Homepage');//->add('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
  69. if($value == 0) return Html::el('a')->add(Html::el('span')->class('icon icon-makehomepage')->title('Make homepage'))->href($this->link('makeHomepage!').'&title='.$data->title)->class('datagrid-ajax');
  70. }
  71. public function publishFormatCallback($value, DibiRow $data)
  72. {
  73. $checkbox = Html::el('input')->type('checkbox')->class('chboxPublished')->{'data-id'}($data->id);
  74. if ($value) $checkbox->checked = TRUE;
  75. return (string) $checkbox;
  76. }
  77. public function gridCategoryCallback($value, DibiRow $data)
  78. {
  79. $selected_cat = (int)$value;
  80. $select = Html::el('select')->class('category-change')->{'data-id'}($data->id);
  81. foreach($this->categories as $key => $category)
  82. {
  83. if($selected_cat == (int)$key)
  84. $select->create('option')->value($key)->setText($category)->selected('selected');
  85. else $select->create('option')->value($key)->setText($category);
  86. }
  87. return $select;
  88. }
  89. public function handleChangeCategory($page, $new_cat)
  90. {
  91. $id = (int)$page;
  92. $new_cat = $new_cat;
  93. fd($page, $new_cat);
  94. try{
  95. $this->model('pages')->update(array('id'=>$id, 'category'=>$new_cat));
  96. $this->flash('Category updated!');
  97. }
  98. catch(DibiDriverException $e)
  99. {
  100. $this->flash($e->getMessage());
  101. }
  102. $this->sendPayload();
  103. }
  104. public function handleChangeTemplate($page, $template)
  105. {
  106. $id = (int)$page;
  107. try{
  108. $this->model('pages')->update(array('id'=>$id, 'template'=>$template));
  109. $this->flash('Template updated!');
  110. }
  111. catch(DibiDriverException $e)
  112. {
  113. $this->flash($e->getMessage());
  114. }
  115. $this->sendPayload();
  116. }
  117. public function handleChangePublished()
  118. {
  119. $data = $this->getRequest()->getPost();
  120. $id = (int)$data['page'];
  121. $published = ($data['published'] == 'true') ? 1 : 0;
  122. $this->model('pages')->update(array('id'=>$id, 'published'=>$published));
  123. if($published == 1) $this->flash('Page published!');
  124. if($published == 0) $this->flash('Page set as draft!');
  125. $this->sendPayload();
  126. }
  127. public function handleNewPage()
  128. {
  129. $this->template->new = true;
  130. $this->invalidateControl('form');
  131. $this->flashCmd('openForm');
  132. }
  133. public function handleMakeHomepage($title)
  134. {
  135. $this->model('pages')->makeHomepage($title);
  136. $this->invalidateControl('grid');
  137. }
  138. public function createLink($value, DibiRow $data)
  139. {
  140. return Html::el('a',$value)->href($this->link('editPage!',array('title' => $data['title'])))->class('inline-edit ajax');
  141. }
  142. function createComponentConfirmForm()
  143. {
  144. $form = new ConfirmationDialog();
  145. $form->addConfirmer(
  146. 'delete', // název signálu bude 'confirmDelete!'
  147. array($this, 'deletePage'), // callback na funkci při kliku na YES
  148. array($this, 'questionDelete') // otázka (může být i callback vracející string)
  149. );
  150. return $form;
  151. }
  152. public function questionDelete($dialog, $params)
  153. {
  154. return 'Really delete Page '.$params['title'].'?';
  155. }
  156. public function deletePage($params, $dialog)
  157. {
  158. $title = $params;
  159. $webalized_title = String::webalize($title);
  160. try{
  161. $this->model('pages')->delete($title);
  162. $this->model('menuItems')->deleteRelated($webalized_title);
  163. $this['page']->redraw('Pages');
  164. $this->flash('Page '.$title.' deleted!');
  165. if(!$this->isAjax()) {$this->redirect('Pages:');}
  166. }
  167. catch(DibiDriverException $e)
  168. {
  169. $this->flash($e->getMessage());
  170. }
  171. }
  172. public function handleEditPage()
  173. {
  174. $session = Environment::getSession('params');
  175. $session->params = $this->getRequest()->getParams();
  176. $this->template->edit = true;
  177. $this->invalidateControl('form');
  178. $this->flashCmd('openForm');
  179. }
  180. //END GRID
  181. //Form New Page
  182. public function createComponentFormNewPage($name)
  183. {
  184. $form = new LiveForm($this, $name);
  185. $form = $this->formNewEditFields($form);
  186. $form->addSubmit('btnSaveAsDraft', 'Save as draft')->onClick[] = array($this, 'formNewPageSave');
  187. $form->addSubmit('btnPublish', 'Publish')->onClick[] = array($this, 'formNewPageSave');
  188. $form['btnSaveAsDraft']->getControlPrototype()->class('ajax');
  189. $form['btnPublish']->getControlPrototype()->class('ajax');
  190. return $form;
  191. }
  192. public function createComponentFormEditPage($name)
  193. {
  194. $session = Environment::getSession('params');
  195. $title = ($this->getParam('title') == '') ? $session->params['title'] : $this->getParam('title');
  196. if($title == '')
  197. {
  198. return 'Please select a page to edit.';
  199. }
  200. else{
  201. $form = new LiveForm($this, $name);
  202. $data = array();
  203. if($this->isAjax())$data = $this->model('pages')->getByTitle($title);
  204. $form = $this->formNewEditFields($form);
  205. $form->addHidden('id', $data->id);
  206. $form->addSubmit('btnSaveAsDraft', 'Save as draft')->onClick[] = array($this, 'formEditSubmitted');
  207. $form->addSubmit('btnPublish', 'Save')->onClick[] = array($this, 'formEditSubmitted');
  208. $form['btnSaveAsDraft']->getControlPrototype()->class('ajax');
  209. $form['btnPublish']->getControlPrototype()->class('ajax');
  210. $form->setDefaults( (array)$data);
  211. return $form;
  212. }
  213. }
  214. private function formNewEditFields(AppForm $form)
  215. {
  216. $form->addGroup('Content')->setOption('container', Html::el('fieldset')->id('contents'));
  217. $form->addText('title','Title')->addRule(Form::FILLED, 'Fill title');
  218. $form->addTextarea('content', 'Text');
  219. $templates = $this->model('contentTemplates')->get('page');
  220. $form->addGroup('Properties')->setOption('container', Html::el('fieldset')->id('properties'));
  221. $categories = $this->model('categories')->getPairs();
  222. $categories = array('0' => 'none') + $categories;
  223. $form->addSelect('category', 'Category', $categories);
  224. $form->addCheckBox('homepage', 'Set as homepage?');
  225. $form->addSelect('template', 'Template', $templates);
  226. $form->addCheckBox('has_widgets', 'Has widgets');
  227. $form->addText('publish_time', 'Publish time');
  228. //$form->addText('time', '');
  229. $form->addText('keywords', 'keywords');
  230. $form->addTextarea('description', 'description');
  231. $form->addHidden('content_type')->setValue('page');
  232. if($form->name == 'formNewPage')
  233. {
  234. //$form->addGroup('Link')->setOption('container', Html::el('fieldset')->id('link'));
  235. $menus = $this->model('menu')->getPairs();
  236. $menus = array(0 => 'none') + $menus;
  237. $form->addSelect('link','Link in menu', $menus);
  238. }
  239. $form->addTextArea('css_files', 'Css files')->getControlPrototype()->{'data-ext'} = 'css';
  240. $form->addTextArea('js_files', 'Js files')->getControlPrototype()->{'data-ext'} = 'js';
  241. $form->addGroup('')->setOption('container', Html::el('fieldset')->id('buttons'));
  242. $form->addButton('btnClose', 'Close');
  243. $form->addSubmit('btnPreview', 'Preview')->onClick[] = array($this, 'formNewPagePreview');
  244. $form['btnPreview']->getControlPrototype()->class('ajax');
  245. return $form;
  246. }
  247. public function formNewPagePreview(Button $button)
  248. {
  249. $form = $button->getForm();
  250. $values = $form->getValues();
  251. try{
  252. //$request = new PresenterRequest('Front:Preview', 'POST', array('action' => 'preview'), array('values' => $values));
  253. //$presenter = new Front_PreviewPresenter();
  254. $request = new PresenterRequest('Front:Page', 'POST', array('action' => 'preview'), array('values' => $values));
  255. $presenter = new Front_PagePresenter();
  256. $response = $presenter->run($request); //ak by bolo $this, zmeni sa aktualny presenter a cele to prestane fungovat
  257. //$response = $presenter->run($request);
  258. ob_start();
  259. $response->send();
  260. $html = ob_get_clean();
  261. $html = preg_replace('~(\<a.*href\=")(?:.*)(".*\>)~iU', '$1#$2', $html);
  262. $session = Environment::getSession('preview');
  263. $session->html = $html;
  264. $this->template->response = $html;
  265. $this->view = 'preview_wrap';
  266. $this->refreshConfig(); //preview changes theme, could be fixed by using admin_theme, front_theme
  267. if(!$this->isAjax())
  268. {
  269. }
  270. else
  271. {
  272. $this->invalidateControl('preview');
  273. $this->flashCmd('preview');
  274. }
  275. }
  276. catch(DibiDriverException $e)
  277. {
  278. $this->flash($e->getMessage());
  279. }
  280. }
  281. public function formClose(Button $button)
  282. {
  283. $this->invalidateControl('form');
  284. }
  285. public function handlePreview()
  286. {
  287. $session = Environment::getSession('preview');
  288. $html = $session->html;
  289. $session->remove();
  290. $this->view = 'preview';
  291. $files = $this->formatTemplateFiles($this->getName(), $this->view);
  292. foreach ($files as $file)
  293. {
  294. if (is_file($file)) {
  295. $this->template->setFile($file);
  296. break;
  297. }
  298. }
  299. $this->template->response = $html;
  300. $this->getTemplate()->render();
  301. $this->terminate();
  302. }
  303. public function createComponentFormPreviewToolbar($name)
  304. {
  305. $form = new LiveForm($this, $name);
  306. $renderer = $form->getRenderer();
  307. $renderer->wrappers['controls']['container'] = null;;
  308. $renderer->wrappers['pair']['container'] = NULL;
  309. $renderer->wrappers['label']['container'] = null;
  310. $renderer->wrappers['control']['container'] = null;
  311. $form->addButton('btnClose', 'Close');
  312. $form->addSubmit('btnUpdate', 'Update')->onClick[] = array($this, 'formPreviewToolbarUpdate');
  313. $form['btnUpdate']->getControlPrototype()->class('ajax');
  314. return $form;
  315. }
  316. public function formPreviewToolbarCancel(Button $button)
  317. {
  318. $this->flashCmd('closePreview');
  319. $this->sendPayload();
  320. }
  321. public function formPreviewToolbarUpdate(Button $button)
  322. {
  323. $this->flashCmd('copyToEditor');
  324. $this->flashCmd('closePreview');
  325. $this->sendPayload();
  326. }
  327. public function formNewPageSave(Button $button)
  328. {
  329. $form = $button->getForm();
  330. $values = $form->getValues();
  331. unset($values['btnClose']);
  332. if($form['btnPublish']->isSubmittedBy()) $values['published'] = 1;
  333. if($form['btnSaveAsDraft']->isSubmittedBy()) $values['published'] = 0;
  334. try{
  335. $this->model('pages')->save($values);
  336. $this->flash('Page created');
  337. if(!$this->isAjax())$this->redirect('Pages:');
  338. else
  339. {
  340. $this->invalidateControl('form');
  341. $this->invalidateControl('grid');
  342. }
  343. }
  344. catch(DibiDriverException $e)
  345. {
  346. $this->flash($e->getMessage());
  347. }
  348. }
  349. //END Form New Page
  350. public function formEditSubmitted(Button $button)
  351. {
  352. $session = Environment::getSession('params')->remove();
  353. $form = $button->getForm();
  354. if ($form->isValid()) {
  355. $values = $form->getValues();
  356. unset($values['btnClose']);
  357. try{
  358. $this->model('pages')->update($values);
  359. $this->flash('Page updated');
  360. if(!$this->isAjax())$this->redirect('Pages:');
  361. else
  362. {
  363. $this->invalidateControl('form');
  364. $this->invalidateControl('grid');
  365. }
  366. }
  367. catch(DibiDriverException $e)
  368. {
  369. $this->flash($e->getMessage());
  370. }
  371. }
  372. }
  373. //hodilo by sa refaktorovat
  374. public function handleBrowseFiles($dir,$ext)
  375. {
  376. $cache = Environment::getCache($this->getName());
  377. $ckey = __FUNCTION__.$dir.$ext;
  378. fd(Environment::getVariables());
  379. if(!isset($cache[$ckey]))
  380. {
  381. $root = WWW_DIR.'/';
  382. $response = '';
  383. if( file_exists($root . $dir) )
  384. {
  385. $files = scandir($root . $dir);
  386. natcasesort($files);
  387. if( count($files) > 2 ) {
  388. $response .= "<ul class=\"jqueryFileTree\" style=\"display: none;\">";
  389. foreach( $files as $file ) {
  390. if( file_exists($root . $dir . $file) && $file != '.' && $file != '..' && is_dir($root . $dir . $file)) {
  391. $response .= "<li class=\"directory collapsed\"><a href=\"#\" rel=\"" . htmlentities($dir . $file) . "/\">" . htmlentities($file) . "</a></li>";
  392. }
  393. }
  394. foreach( $files as $file ) {
  395. $file_info = pathinfo($file);
  396. if( file_exists($root . $dir . $file) && $file != '.' && $file != '..' && !is_dir($root . $dir . $file) && $file_info['extension'] == $ext ) {
  397. $ext = preg_replace('/^.*\./', '', $file);
  398. $response .= "<li class=\"file ext_$ext\"><a href=\"#\" rel=\"" . htmlentities($dir . $file) . "\">" . htmlentities($file) . "</a></li>";
  399. }
  400. }
  401. $response .= "</ul>";
  402. }
  403. }
  404. $cache->save($ckey, $response, array(
  405. 'expire' => time() + 60 * 10));
  406. }
  407. echo $cache[$ckey];
  408. $this->terminate();
  409. }
  410. }
  411. ?>