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

/backend/modules/settings/actions/index.php

http://github.com/forkcms/forkcms
PHP | 300 lines | 151 code | 54 blank | 95 comment | 24 complexity | 02f3d978649e341be4ec8ad8780a10ea MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, MIT, AGPL-3.0, LGPL-2.1, BSD-3-Clause
  1. <?php
  2. /*
  3. * This file is part of Fork CMS.
  4. *
  5. * For the full copyright and license information, please view the license
  6. * file that was distributed with this source code.
  7. */
  8. /**
  9. * This is the index-action (default), it will display the setting-overview
  10. *
  11. * @author Tijs Verkoyen <tijs@sumocoders.be>
  12. * @author Davy Hellemans <davy.hellemans@netlash.com>
  13. */
  14. class BackendSettingsIndex extends BackendBaseActionIndex
  15. {
  16. /**
  17. * The form instance
  18. *
  19. * @var BackendForm
  20. */
  21. private $frm;
  22. /**
  23. * Should we show boxes for their API keys
  24. *
  25. * @var bool
  26. */
  27. private $needsAkismet, $needsGoogleMaps;
  28. /**
  29. * Execute the action
  30. */
  31. public function execute()
  32. {
  33. parent::execute();
  34. // get some data
  35. $modulesThatRequireAkismet = BackendExtensionsModel::getModulesThatRequireAkismet();
  36. $modulesThatRequireGoogleMaps = BackendExtensionsModel::getModulesThatRequireGoogleMaps();
  37. // set properties
  38. $this->needsAkismet = (!empty($modulesThatRequireAkismet));
  39. $this->needsGoogleMaps = (!empty($modulesThatRequireGoogleMaps));
  40. $this->loadForm();
  41. $this->validateForm();
  42. $this->parse();
  43. $this->display();
  44. }
  45. /**
  46. * Load the form
  47. */
  48. private function loadForm()
  49. {
  50. // list of default domains
  51. $defaultDomains = array(str_replace(array('http://', 'www.', 'https://'), '', SITE_URL));
  52. // create form
  53. $this->frm = new BackendForm('settingsIndex');
  54. // general settings
  55. $this->frm->addText('site_title', BackendModel::getModuleSetting('core', 'site_title_' . BL::getWorkingLanguage(), SITE_DEFAULT_TITLE));
  56. $this->frm->addTextarea('site_html_header', BackendModel::getModuleSetting('core', 'site_html_header', null), 'textarea code', 'textareaError code', true);
  57. $this->frm->addTextarea('site_html_footer', BackendModel::getModuleSetting('core', 'site_html_footer', null), 'textarea code', 'textareaError code', true);
  58. $this->frm->addTextarea('site_domains', implode("\n", (array) BackendModel::getModuleSetting('core', 'site_domains', $defaultDomains)), 'textarea code', 'textareaError code');
  59. // facebook settings
  60. $this->frm->addText('facebook_admin_ids', BackendModel::getModuleSetting('core', 'facebook_admin_ids', null));
  61. $this->frm->addText('facebook_application_id', BackendModel::getModuleSetting('core', 'facebook_app_id', null));
  62. $this->frm->addText('facebook_application_secret', BackendModel::getModuleSetting('core', 'facebook_app_secret', null));
  63. // ckfinder
  64. $this->frm->addText('ckfinder_license_name', BackendModel::getModuleSetting('core', 'ckfinder_license_name', null));
  65. $this->frm->addText('ckfinder_license_key', BackendModel::getModuleSetting('core', 'ckfinder_license_key', null));
  66. $this->frm->addText('ckfinder_image_max_width', BackendModel::getModuleSetting('core', 'ckfinder_image_max_width', 1600));
  67. $this->frm->addText('ckfinder_image_max_height', BackendModel::getModuleSetting('core', 'ckfinder_image_max_height', 1200));
  68. // api keys
  69. $this->frm->addText('fork_api_public_key', BackendModel::getModuleSetting('core', 'fork_api_public_key', null));
  70. $this->frm->addText('fork_api_private_key', BackendModel::getModuleSetting('core', 'fork_api_private_key', null));
  71. // date & time formats
  72. $this->frm->addDropdown('time_format', BackendModel::getTimeFormats(), BackendModel::getModuleSetting('core', 'time_format'));
  73. $this->frm->addDropdown('date_format_short', BackendModel::getDateFormatsShort(), BackendModel::getModuleSetting('core', 'date_format_short'));
  74. $this->frm->addDropdown('date_format_long', BackendModel::getDateFormatsLong(), BackendModel::getModuleSetting('core', 'date_format_long'));
  75. // number formats
  76. $this->frm->addDropdown('number_format', BackendModel::getNumberFormats(), BackendModel::getModuleSetting('core', 'number_format'));
  77. // create a list of the languages
  78. foreach(BackendModel::getModuleSetting('core', 'languages', array('en')) as $abbreviation)
  79. {
  80. // is this the default language
  81. $defaultLanguage = ($abbreviation == SITE_DEFAULT_LANGUAGE) ? true : false;
  82. // attributes
  83. $activeAttributes = array();
  84. $activeAttributes['id'] = 'active_language_' . $abbreviation;
  85. $redirectAttributes = array();
  86. $redirectAttributes['id'] = 'redirect_language_' . $abbreviation;
  87. // fetch label
  88. $label = BL::msg(mb_strtoupper($abbreviation), 'core');
  89. // default may not be unselected
  90. if($defaultLanguage)
  91. {
  92. // add to attributes
  93. $activeAttributes['disabled'] = 'disabled';
  94. $redirectAttributes['disabled'] = 'disabled';
  95. // overrule in $_POST
  96. if(!isset($_POST['active_languages']) || !is_array($_POST['active_languages'])) $_POST['active_languages'] = array(SITE_DEFAULT_LANGUAGE);
  97. elseif(!in_array($abbreviation, $_POST['active_languages'])) $_POST['active_languages'][] = $abbreviation;
  98. if(!isset($_POST['redirect_languages']) || !is_array($_POST['redirect_languages'])) $_POST['redirect_languages'] = array(SITE_DEFAULT_LANGUAGE);
  99. elseif(!in_array($abbreviation, $_POST['redirect_languages'])) $_POST['redirect_languages'][] = $abbreviation;
  100. }
  101. // add to the list
  102. $activeLanguages[] = array('label' => $label, 'value' => $abbreviation, 'attributes' => $activeAttributes, 'variables' => array('default' => $defaultLanguage));
  103. $redirectLanguages[] = array('label' => $label, 'value' => $abbreviation, 'attributes' => $redirectAttributes, 'variables' => array('default' => $defaultLanguage));
  104. }
  105. // create multilanguage checkbox
  106. $this->frm->addMultiCheckbox('active_languages', $activeLanguages, BackendModel::getModuleSetting('core', 'active_languages', array(SITE_MULTILANGUAGE)));
  107. $this->frm->addMultiCheckbox('redirect_languages', $redirectLanguages, BackendModel::getModuleSetting('core', 'redirect_languages', array(SITE_MULTILANGUAGE)));
  108. // api keys are not required for every module
  109. if($this->needsAkismet) $this->frm->addText('akismet_key', BackendModel::getModuleSetting('core', 'akismet_key', null));
  110. if($this->needsGoogleMaps) $this->frm->addText('google_maps_key', BackendModel::getModuleSetting('core', 'google_maps_key', null));
  111. }
  112. /**
  113. * Parse the form
  114. */
  115. protected function parse()
  116. {
  117. parent::parse();
  118. // show options
  119. if($this->needsAkismet) $this->tpl->assign('needsAkismet', true);
  120. if($this->needsGoogleMaps) $this->tpl->assign('needsGoogleMaps', true);
  121. // parse the form
  122. $this->frm->parse($this->tpl);
  123. // parse the warnings
  124. $this->parseWarnings();
  125. }
  126. /**
  127. * Show the warnings based on the active modules & configured settings
  128. */
  129. private function parseWarnings()
  130. {
  131. // get warnings
  132. $warnings = BackendSettingsModel::getWarnings();
  133. // assign warnings
  134. $this->tpl->assign('warnings', $warnings);
  135. }
  136. /**
  137. * Validates the form
  138. */
  139. private function validateForm()
  140. {
  141. // is the form submitted?
  142. if($this->frm->isSubmitted())
  143. {
  144. // validate required fields
  145. $this->frm->getField('site_title')->isFilled(BL::err('FieldIsRequired'));
  146. // date & time
  147. $this->frm->getField('time_format')->isFilled(BL::err('FieldIsRequired'));
  148. $this->frm->getField('date_format_short')->isFilled(BL::err('FieldIsRequired'));
  149. $this->frm->getField('date_format_long')->isFilled(BL::err('FieldIsRequired'));
  150. // number
  151. $this->frm->getField('number_format')->isFilled(BL::err('FieldIsRequired'));
  152. // akismet key may be filled in
  153. if($this->needsAkismet && $this->frm->getField('akismet_key')->isFilled())
  154. {
  155. // key has changed
  156. if($this->frm->getField('akismet_key')->getValue() != BackendModel::getModuleSetting('core', 'akismet_key', null))
  157. {
  158. // load akismet
  159. require_once PATH_LIBRARY . '/external/akismet.php';
  160. // create instance
  161. $akismet = new Akismet($this->frm->getField('akismet_key')->getValue(), SITE_URL);
  162. // invalid key
  163. if(!$akismet->verifyKey()) $this->frm->getField('akismet_key')->setError(BL::err('InvalidAPIKey'));
  164. }
  165. }
  166. // domains filled in
  167. if($this->frm->getField('site_domains')->isFilled())
  168. {
  169. // split on newlines
  170. $domains = explode("\n", trim($this->frm->getField('site_domains')->getValue()));
  171. // loop domains
  172. foreach($domains as $domain)
  173. {
  174. // strip funky stuff
  175. $domain = trim(str_replace(array('www.', 'http://', 'https://'), '', $domain));
  176. // invalid URL
  177. if(!SpoonFilter::isURL('http://' . $domain))
  178. {
  179. // set error
  180. $this->frm->getField('site_domains')->setError(BL::err('InvalidDomain'));
  181. // stop looping domains
  182. break;
  183. }
  184. }
  185. }
  186. if($this->frm->getField('ckfinder_image_max_width')->isFilled()) $this->frm->getField('ckfinder_image_max_width')->isInteger(BL::err('InvalidInteger'));
  187. if($this->frm->getField('ckfinder_image_max_height')->isFilled()) $this->frm->getField('ckfinder_image_max_height')->isInteger(BL::err('InvalidInteger'));
  188. // no errors ?
  189. if($this->frm->isCorrect())
  190. {
  191. // general settings
  192. BackendModel::setModuleSetting('core', 'site_title_' . BL::getWorkingLanguage(), $this->frm->getField('site_title')->getValue());
  193. BackendModel::setModuleSetting('core', 'site_html_header', $this->frm->getField('site_html_header')->getValue());
  194. BackendModel::setModuleSetting('core', 'site_html_footer', $this->frm->getField('site_html_footer')->getValue());
  195. // facebook settings
  196. BackendModel::setModuleSetting('core', 'facebook_admin_ids', ($this->frm->getField('facebook_admin_ids')->isFilled()) ? $this->frm->getField('facebook_admin_ids')->getValue() : null);
  197. BackendModel::setModuleSetting('core', 'facebook_app_id', ($this->frm->getField('facebook_application_id')->isFilled()) ? $this->frm->getField('facebook_application_id')->getValue() : null);
  198. BackendModel::setModuleSetting('core', 'facebook_app_secret', ($this->frm->getField('facebook_application_secret')->isFilled()) ? $this->frm->getField('facebook_application_secret')->getValue() : null);
  199. // ckfinder settings
  200. BackendModel::setModuleSetting('core', 'ckfinder_license_name', ($this->frm->getField('ckfinder_license_name')->isFilled()) ? $this->frm->getField('ckfinder_license_name')->getValue() : null);
  201. BackendModel::setModuleSetting('core', 'ckfinder_license_key', ($this->frm->getField('ckfinder_license_key')->isFilled()) ? $this->frm->getField('ckfinder_license_key')->getValue() : null);
  202. BackendModel::setModuleSetting('core', 'ckfinder_image_max_width', ($this->frm->getField('ckfinder_image_max_width')->isFilled()) ? $this->frm->getField('ckfinder_image_max_width')->getValue() : 1600);
  203. BackendModel::setModuleSetting('core', 'ckfinder_image_max_height', ($this->frm->getField('ckfinder_image_max_height')->isFilled()) ? $this->frm->getField('ckfinder_image_max_height')->getValue() : 1200);
  204. // api keys
  205. BackendModel::setModuleSetting('core', 'fork_api_public_key', $this->frm->getField('fork_api_public_key')->getValue());
  206. BackendModel::setModuleSetting('core', 'fork_api_private_key', $this->frm->getField('fork_api_private_key')->getValue());
  207. if($this->needsAkismet) BackendModel::setModuleSetting('core', 'akismet_key', $this->frm->getField('akismet_key')->getValue());
  208. if($this->needsGoogleMaps) BackendModel::setModuleSetting('core', 'google_maps_key', $this->frm->getField('google_maps_key')->getValue());
  209. // date & time formats
  210. BackendModel::setModuleSetting('core', 'time_format', $this->frm->getField('time_format')->getValue());
  211. BackendModel::setModuleSetting('core', 'date_format_short', $this->frm->getField('date_format_short')->getValue());
  212. BackendModel::setModuleSetting('core', 'date_format_long', $this->frm->getField('date_format_long')->getValue());
  213. // date & time formats
  214. BackendModel::setModuleSetting('core', 'number_format', $this->frm->getField('number_format')->getValue());
  215. // before we save the languages, we need to ensure that each language actually exists and may be chosen.
  216. $languages = array(SITE_DEFAULT_LANGUAGE);
  217. $activeLanguages = array_unique(array_merge($languages, $this->frm->getField('active_languages')->getValue()));
  218. $redirectLanguages = array_unique(array_merge($languages, $this->frm->getField('redirect_languages')->getValue()));
  219. // cleanup redirect-languages, by removing the values that aren't present in the active languages
  220. $redirectLanguages = array_intersect($redirectLanguages, $activeLanguages);
  221. // save active languages
  222. BackendModel::setModuleSetting('core', 'active_languages', $activeLanguages);
  223. BackendModel::setModuleSetting('core', 'redirect_languages', $redirectLanguages);
  224. // domains may not contain www, http or https. Therefor we must loop and create the list of domains.
  225. $siteDomains = array();
  226. // domains filled in
  227. if($this->frm->getField('site_domains')->isFilled())
  228. {
  229. // split on newlines
  230. $domains = explode("\n", trim($this->frm->getField('site_domains')->getValue()));
  231. // loop domains
  232. foreach($domains as $domain)
  233. {
  234. // strip funky stuff
  235. $siteDomains[] = trim(str_replace(array('www.', 'http://', 'https://'), '', $domain));
  236. }
  237. }
  238. // save domains
  239. BackendModel::setModuleSetting('core', 'site_domains', $siteDomains);
  240. // assign report
  241. $this->tpl->assign('report', true);
  242. $this->tpl->assign('reportMessage', BL::msg('Saved'));
  243. }
  244. }
  245. }
  246. }