PageRenderTime 27ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/appagebuilder/controllers/admin/AdminApPageBuilderPositions.php

https://gitlab.com/ptisky/API_prestashop
PHP | 398 lines | 349 code | 24 blank | 25 comment | 31 complexity | 173179a9ef601555b5270e57a6e6664c MD5 | raw file
  1. <?php
  2. /**
  3. * 2007-2015 Apollotheme
  4. *
  5. * NOTICE OF LICENSE
  6. *
  7. * ApPageBuilder is module help you can build content for your shop
  8. *
  9. * DISCLAIMER
  10. *
  11. * @Module Name: AP Page Builder
  12. * @author Apollotheme <apollotheme@gmail.com>
  13. * @copyright 2007-2015 Apollotheme
  14. * @license http://apollotheme.com - prestashop template provider
  15. */
  16. require_once(_PS_MODULE_DIR_.'appagebuilder/classes/ApPageBuilderPositionsModel.php');
  17. class AdminApPageBuilderPositionsController extends ModuleAdminControllerCore
  18. {
  19. public $position_js_folder = '';
  20. public $position_css_folder = '';
  21. public $module_name = 'appagebuilder';
  22. public $explicit_select;
  23. public $order_by;
  24. public $order_way;
  25. public $theme_dir;
  26. public function __construct()
  27. {
  28. $this->bootstrap = true;
  29. $this->table = 'appagebuilder_positions';
  30. $this->className = 'ApPageBuilderPositionsModel';
  31. $this->lang = false;
  32. $this->explicit_select = true;
  33. $this->allow_export = true;
  34. $this->context = Context::getContext();
  35. $this->order_by = 'position';
  36. $this->order_way = 'DESC';
  37. $this->_join = '
  38. INNER JOIN `'._DB_PREFIX_.'appagebuilder_positions_shop` ps ON (ps.`id_appagebuilder_positions` = a.`id_appagebuilder_positions`)';
  39. $this->fields_list = array(
  40. 'id_appagebuilder_positions' => array(
  41. 'title' => $this->l('ID'),
  42. 'align' => 'center',
  43. 'width' => 50,
  44. 'class' => 'fixed-width-xs'
  45. ),
  46. 'position' => array(
  47. 'title' => $this->l('Position'),
  48. 'width' => 140,
  49. 'type' => 'text',
  50. 'filter_key' => 'a!position',
  51. 'remove_onclick' => true
  52. ),
  53. 'name' => array(
  54. 'title' => $this->l('Name'),
  55. 'width' => 140,
  56. 'type' => 'text',
  57. 'filter_key' => 'a!name',
  58. 'remove_onclick' => true
  59. ),
  60. 'position_key' => array(
  61. 'title' => $this->l('Key'),
  62. 'filter_key' => 'a!position_key',
  63. 'type' => 'text',
  64. 'width' => 140,
  65. 'remove_onclick' => true
  66. )
  67. );
  68. $this->list_no_link = 'no';
  69. $this->bulk_actions = array(
  70. 'delete' => array(
  71. 'text' => $this->l('Delete selected'),
  72. 'confirm' => $this->l('Delete selected items?'),
  73. 'icon' => 'icon-trash'
  74. ),
  75. 'correctlink' => array(
  76. 'text' => $this->l('Correct Image Link'),
  77. 'confirm' => $this->l('Are you sure you want to change image url from old theme to new theme?'),
  78. 'icon' => 'icon-edit'
  79. ),
  80. 'insertLang' => array(
  81. 'text' => $this->l('Auto Input Data for New Lang'),
  82. 'confirm' => $this->l('Auto insert data for new language?'),
  83. 'icon' => 'icon-edit'
  84. )
  85. );
  86. parent::__construct();
  87. $this->_where = ' AND ps.id_shop='.(int)$this->context->shop->id;
  88. $this->theme_dir = _PS_ROOT_DIR_.'/themes/'.Context::getContext()->shop->getTheme().'/';
  89. $this->position_css_folder = $this->theme_dir.'css/modules/'.$this->module_name.'/positions/';
  90. $this->position_js_folder = $this->theme_dir.'js/modules/'.$this->module_name.'/positions/';
  91. if (!is_dir($this->position_css_folder))
  92. {
  93. if (!is_dir($this->theme_dir.'css/modules/'.$this->module_name))
  94. mkdir($this->theme_dir.'css/modules/'.$this->module_name, 0755);
  95. mkdir($this->position_css_folder, 0755);
  96. }
  97. if (!is_dir($this->position_js_folder))
  98. {
  99. if (!is_dir($this->theme_dir.'js/modules/'.$this->module_name))
  100. mkdir($this->theme_dir.'js/modules/'.$this->module_name, 0755);
  101. mkdir($this->position_js_folder, 0755);
  102. }
  103. }
  104. public function processDelete()
  105. {
  106. $object = $this->loadObject();
  107. // Check using other profile
  108. $result = ApPageBuilderPositionsModel::getProfileUsingPosition($object->id);
  109. if (!$result)
  110. {
  111. $object = parent::processDelete();
  112. if ($object->position_key)
  113. {
  114. Tools::deleteFile($this->position_css_folder.$object->position.$object->position_key.'.css');
  115. Tools::deleteFile($this->position_js_folder.$object->position.$object->position_key.'.js');
  116. }
  117. }
  118. else
  119. {
  120. $name_profile = '';
  121. $sep = '';
  122. foreach ($result as $item)
  123. {
  124. $name_profile .= $sep.$item['name'];
  125. $sep = ', ';
  126. }
  127. $this->errors[] = Tools::displayError("Can not delete default this Positions. It is using by Profile: [$name_profile]");
  128. }
  129. return $object;
  130. }
  131. public function renderView()
  132. {
  133. $object = $this->loadObject();
  134. if ($object->page == 'product_detail')
  135. $this->redirect_after = Context::getContext()->link->getAdminLink('AdminApPageBuilderProductDetail');
  136. else
  137. $this->redirect_after = Context::getContext()->link->getAdminLink('AdminApPageBuilderHome');
  138. $this->redirect_after .= '&id_appagebuilder_positions='.$object->id;
  139. $this->redirect();
  140. }
  141. public function processStatus()
  142. {
  143. if (Validate::isLoadedObject($object = $this->loadObject()))
  144. {
  145. if ($object->toggleStatus())
  146. {
  147. $matches = array();
  148. if (preg_match('/[\?|&]controller=([^&]*)/', (string)$_SERVER['HTTP_REFERER'], $matches) !== false
  149. && Tools::strtolower($matches[1]) != Tools::strtolower(preg_replace('/controller/i', '', get_class($this))))
  150. $this->redirect_after = preg_replace('/[\?|&]conf=([^&]*)/i', '', (string)$_SERVER['HTTP_REFERER']);
  151. else
  152. $this->redirect_after = self::$currentIndex.'&token='.$this->token;
  153. $id_category = (($id_category = (int)Tools::getValue('id_category'))
  154. && Tools::getValue('id_product')) ? '&id_category='.$id_category : '';
  155. $this->redirect_after .= '&conf=5'.$id_category;
  156. }
  157. else
  158. $this->errors[] = Tools::displayError('You can not disable default profile, Please select other profile as default');
  159. }
  160. else
  161. $this->errors[] = Tools::displayError('An error occurred while updating the status for an object.')
  162. .' <b>'.$this->table.'</b> '.Tools::displayError('(cannot load object)');
  163. return $object;
  164. }
  165. public function postProcess()
  166. {
  167. parent::postProcess();
  168. if (Tools::getIsset('duplicateappagebuilder_positions'))
  169. {
  170. $id = Tools::getValue('id_appagebuilder_positions');
  171. $this->duplicatePosition($id, '');
  172. }
  173. }
  174. public function duplicatePosition($id, $type = '', $name = '')
  175. {
  176. $id = (int)$id;
  177. $object = ApPageBuilderPositionsModel::getPositionById($id);
  178. if ($object)
  179. {
  180. $key = ApPageSetting::getRandomNumber();
  181. $old_key = $object->position_key;
  182. $name = $name ? $name : $this->l('Duplicate ').$key;
  183. $data = array('name' => $name, 'position' => $object['position'], 'position_key' => 'duplicate_'.$key);
  184. $model = new ApPageBuilderPositionsModel();
  185. $duplicate_id = $model->addAuto($data);
  186. AdminApPageBuilderShortcodesController::duplcateDataPosition($id, $duplicate_id);
  187. if ($duplicate_id)
  188. {
  189. //duplicate shortCode
  190. ApPageSetting::writeFile($this->position_js_folder, $data['position'].$data['position_key'].'.js',
  191. Tools::file_get_contents($this->position_js_folder.$data['position'].$old_key.'.js'));
  192. ApPageSetting::writeFile($this->position_css_folder, $data['position'].$data['position_key'].'.css',
  193. Tools::file_get_contents($this->position_css_folder.$data['position'].$old_key.'.css'));
  194. if ($type != 'ajax')
  195. {
  196. $this->redirect_after = self::$currentIndex.'&token='.$this->token;
  197. $this->redirect();
  198. }
  199. else
  200. return $duplicate_id;
  201. }
  202. else
  203. {
  204. if ($type != 'ajax')
  205. Tools::displayError('Can not duplicate Position');
  206. else
  207. return 0;
  208. }
  209. }
  210. else
  211. if ($type != 'ajax')
  212. Tools::displayError('Can not duplicate Position');
  213. else
  214. return 0;
  215. }
  216. public function renderList()
  217. {
  218. $this->initToolbar();
  219. $this->addRowAction('view');
  220. $this->addRowAction('edit');
  221. $this->addRowAction('duplicate');
  222. $this->addRowAction('delete');
  223. return parent::renderList();
  224. }
  225. public function renderForm()
  226. {
  227. $this->initToolbar();
  228. $this->context->controller->addJqueryUI('ui.sortable');
  229. $this->fields_form = array(
  230. 'legend' => array(
  231. 'title' => $this->l('Ap Position Manage'),
  232. 'icon' => 'icon-folder-close'
  233. ),
  234. 'input' => array(
  235. array(
  236. 'type' => 'text',
  237. 'label' => $this->l('Name'),
  238. 'name' => 'name',
  239. 'required' => true,
  240. 'hint' => $this->l('Invalid characters:').' &lt;&gt;;=#{}'
  241. ),
  242. array(
  243. 'type' => 'text',
  244. 'label' => $this->l('Position Key'),
  245. 'name' => 'position_key',
  246. 'required' => true,
  247. 'desc' => $this->l('Use it to save as file name of css and js of Position'),
  248. 'hint' => $this->l('Invalid characters:').' &lt;&gt;;=#{}'
  249. ),
  250. array(
  251. 'type' => 'select',
  252. 'label' => $this->l('Type'),
  253. 'name' => 'position',
  254. 'options' => array(
  255. 'query' => array(
  256. array(
  257. 'id' => 'header',
  258. 'name' => $this->l('Header'),
  259. ),
  260. array(
  261. 'id' => 'content',
  262. 'name' => $this->l('Content'),
  263. ),
  264. array(
  265. 'id' => 'footer',
  266. 'name' => $this->l('Footer'),
  267. ),
  268. array(
  269. 'id' => 'product',
  270. 'name' => $this->l('Product'),
  271. )
  272. ),
  273. 'id' => 'id',
  274. 'name' => 'name'
  275. ),
  276. ),
  277. array(
  278. 'type' => 'textarea',
  279. 'label' => $this->l('Custom Css'),
  280. 'name' => 'css',
  281. 'desc' => sprintf($this->l('Please set write Permission for folder %s'), $this->position_css_folder),
  282. ),
  283. array(
  284. 'type' => 'textarea',
  285. 'label' => $this->l('Custom Js'),
  286. 'name' => 'js',
  287. 'desc' => sprintf($this->l('Please set write Permission for folder %s'), $this->position_js_folder),
  288. )
  289. ),
  290. 'submit' => array(
  291. 'title' => $this->l('Save'),
  292. ),
  293. 'buttons' => array(
  294. 'save-and-stay' => array(
  295. 'title' => $this->l('Save and Stay'),
  296. 'name' => 'submitAdd'.$this->table.'AndStay',
  297. 'type' => 'submit',
  298. 'class' => 'btn btn-default pull-right',
  299. 'icon' => 'process-icon-save'
  300. ))
  301. );
  302. return parent::renderForm();
  303. }
  304. public function getFieldsValue($obj)
  305. {
  306. $file_value = parent::getFieldsValue($obj);
  307. if ($obj->id && $obj->position_key)
  308. {
  309. $file_value['css'] = Tools::file_get_contents($this->position_css_folder.$obj->position.$obj->position_key.'.css');
  310. $file_value['js'] = Tools::file_get_contents($this->position_js_folder.$obj->position.$obj->position_key.'.js');
  311. }
  312. else
  313. $file_value['position_key'] = 'position'.ApPageSetting::getRandomNumber();
  314. return $file_value;
  315. }
  316. public function processAdd()
  317. {
  318. if ($obj = parent::processAdd())
  319. $this->saveCustomJsAndCss($obj->position.$obj->position_key, '');
  320. }
  321. public function processUpdate()
  322. {
  323. // Check ifchange position => need delete current file css/js before update
  324. $old_object = parent::loadObject();
  325. if ($obj = parent::processUpdate())
  326. $this->saveCustomJsAndCss($obj->position.$obj->position_key, $old_object->position.$obj->position_key);
  327. }
  328. public function saveCustomJsAndCss($key, $old_key = '')
  329. {
  330. // Delete old file
  331. if ($old_key)
  332. {
  333. Tools::deleteFile($this->position_css_folder.$old_key.'.css');
  334. Tools::deleteFile($this->position_js_folder.$old_key.'.js');
  335. }
  336. ApPageSetting::writeFile($this->position_js_folder, $key.'.js', Tools::getValue('js'));
  337. ApPageSetting::writeFile($this->position_css_folder, $key.'.css', Tools::getValue('css'));
  338. }
  339. /**
  340. * Auto create a position for page build profile editing/creating
  341. * @param type $obj
  342. */
  343. public function autoCreatePosition($obj)
  344. {
  345. $model = new ApPageBuilderPositionsModel();
  346. $id = $model->addAuto($obj);
  347. if ($id)
  348. $this->saveCustomJsAndCss($obj['position'].$obj['position_key'], '');
  349. return $id;
  350. }
  351. public function updateName($id, $name)
  352. {
  353. return ApPageBuilderPositionsModel::updateName($id, $name);
  354. }
  355. public function processBulkDelete()
  356. {
  357. // Remove resouce and update table profiles
  358. $arr = $this->boxes;
  359. if (!$arr)
  360. return;
  361. foreach ($arr as $item)
  362. {
  363. //$data = ApPageBuilderPositionsModel::getAllPosition();
  364. $object = ApPageBuilderPositionsModel::getPositionById($item);
  365. if ($object['position_key'])
  366. {
  367. Tools::deleteFile($this->position_css_folder.$object['position'].$object['position_key'].'.css');
  368. Tools::deleteFile($this->position_js_folder.$object['position'].$object['position_key'].'.js');
  369. }
  370. ApPageBuilderPositionsModel::deletePositionById($item, $object['position']);
  371. }
  372. //parent::processBulkDelete();
  373. }
  374. }