PageRenderTime 72ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/qa-include/pages/admin/admin-default.php

http://github.com/q2a/question2answer
PHP | 1857 lines | 1445 code | 377 blank | 35 comment | 203 complexity | 48648ccc3776f926e84195d936232d24 MD5 | raw file
Possible License(s): LGPL-2.1

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /*
  3. Question2Answer by Gideon Greenspan and contributors
  4. http://www.question2answer.org/
  5. Description: Controller for most admin pages which just contain options
  6. This program is free software; you can redistribute it and/or
  7. modify it under the terms of the GNU General Public License
  8. as published by the Free Software Foundation; either version 2
  9. of the License, or (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. More about this license: http://www.question2answer.org/license.php
  15. */
  16. if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
  17. header('Location: ../../../');
  18. exit;
  19. }
  20. require_once QA_INCLUDE_DIR . 'db/admin.php';
  21. require_once QA_INCLUDE_DIR . 'db/maxima.php';
  22. require_once QA_INCLUDE_DIR . 'db/selects.php';
  23. require_once QA_INCLUDE_DIR . 'app/options.php';
  24. require_once QA_INCLUDE_DIR . 'app/admin.php';
  25. // Pages handled by this controller: general, emails, users, layout, viewing, lists, posting, permissions, feeds, spam, caching, mailing
  26. $adminsection = strtolower(qa_request_part(1));
  27. // Get list of categories and all options
  28. $categories = qa_db_select_with_pending(qa_db_category_nav_selectspec(null, true));
  29. // See if we need to redirect
  30. if (empty($adminsection)) {
  31. $subnav = qa_admin_sub_navigation();
  32. if (isset($subnav[@$_COOKIE['qa_admin_last']]))
  33. qa_redirect($_COOKIE['qa_admin_last']);
  34. elseif (count($subnav)) {
  35. reset($subnav);
  36. qa_redirect(key($subnav));
  37. }
  38. }
  39. // Check admin privileges (do late to allow one DB query)
  40. if (!qa_admin_check_privileges($qa_content))
  41. return $qa_content;
  42. // For non-text options, lists of option types, minima and maxima
  43. $optiontype = array(
  44. 'avatar_message_list_size' => 'number',
  45. 'avatar_profile_size' => 'number',
  46. 'avatar_q_list_size' => 'number',
  47. 'avatar_q_page_a_size' => 'number',
  48. 'avatar_q_page_c_size' => 'number',
  49. 'avatar_q_page_q_size' => 'number',
  50. 'avatar_store_size' => 'number',
  51. 'avatar_users_size' => 'number',
  52. 'caching_catwidget_time' => 'number',
  53. 'caching_q_start' => 'number',
  54. 'caching_q_time' => 'number',
  55. 'caching_qlist_time' => 'number',
  56. 'columns_tags' => 'number',
  57. 'columns_users' => 'number',
  58. 'feed_number_items' => 'number',
  59. 'flagging_hide_after' => 'number',
  60. 'flagging_notify_every' => 'number',
  61. 'flagging_notify_first' => 'number',
  62. 'hot_weight_a_age' => 'number',
  63. 'hot_weight_answers' => 'number',
  64. 'hot_weight_q_age' => 'number',
  65. 'hot_weight_views' => 'number',
  66. 'hot_weight_votes' => 'number',
  67. 'logo_height' => 'number-blank',
  68. 'logo_width' => 'number-blank',
  69. 'mailing_per_minute' => 'number',
  70. 'max_len_q_title' => 'number',
  71. 'max_num_q_tags' => 'number',
  72. 'max_rate_ip_as' => 'number',
  73. 'max_rate_ip_cs' => 'number',
  74. 'max_rate_ip_flags' => 'number',
  75. 'max_rate_ip_logins' => 'number',
  76. 'max_rate_ip_messages' => 'number',
  77. 'max_rate_ip_qs' => 'number',
  78. 'max_rate_ip_registers' => 'number',
  79. 'max_rate_ip_uploads' => 'number',
  80. 'max_rate_ip_votes' => 'number',
  81. 'max_rate_user_as' => 'number',
  82. 'max_rate_user_cs' => 'number',
  83. 'max_rate_user_flags' => 'number',
  84. 'max_rate_user_messages' => 'number',
  85. 'max_rate_user_qs' => 'number',
  86. 'max_rate_user_uploads' => 'number',
  87. 'max_rate_user_votes' => 'number',
  88. 'min_len_a_content' => 'number',
  89. 'min_len_c_content' => 'number',
  90. 'min_len_q_content' => 'number',
  91. 'min_len_q_title' => 'number',
  92. 'min_num_q_tags' => 'number',
  93. 'moderate_points_limit' => 'number',
  94. 'page_size_activity' => 'number',
  95. 'page_size_ask_check_qs' => 'number',
  96. 'page_size_ask_tags' => 'number',
  97. 'page_size_home' => 'number',
  98. 'page_size_hot_qs' => 'number',
  99. 'page_size_pms' => 'number',
  100. 'page_size_q_as' => 'number',
  101. 'page_size_qs' => 'number',
  102. 'page_size_related_qs' => 'number',
  103. 'page_size_search' => 'number',
  104. 'page_size_tag_qs' => 'number',
  105. 'page_size_tags' => 'number',
  106. 'page_size_una_qs' => 'number',
  107. 'page_size_users' => 'number',
  108. 'page_size_wall' => 'number',
  109. 'pages_prev_next' => 'number',
  110. 'q_urls_title_length' => 'number',
  111. 'show_fewer_cs_count' => 'number',
  112. 'show_fewer_cs_from' => 'number',
  113. 'show_full_date_days' => 'number',
  114. 'smtp_port' => 'number',
  115. 'allow_anonymous_naming' => 'checkbox',
  116. 'allow_change_usernames' => 'checkbox',
  117. 'allow_close_questions' => 'checkbox',
  118. 'allow_close_own_questions' => 'checkbox',
  119. 'allow_login_email_only' => 'checkbox',
  120. 'allow_multi_answers' => 'checkbox',
  121. 'allow_private_messages' => 'checkbox',
  122. 'allow_user_walls' => 'checkbox',
  123. 'allow_self_answer' => 'checkbox',
  124. 'allow_view_q_bots' => 'checkbox',
  125. 'avatar_allow_gravatar' => 'checkbox',
  126. 'avatar_allow_upload' => 'checkbox',
  127. 'avatar_default_show' => 'checkbox',
  128. 'caching_enabled' => 'checkbox',
  129. 'captcha_on_anon_post' => 'checkbox',
  130. 'captcha_on_feedback' => 'checkbox',
  131. 'captcha_on_register' => 'checkbox',
  132. 'captcha_on_reset_password' => 'checkbox',
  133. 'captcha_on_unapproved' => 'checkbox',
  134. 'captcha_on_unconfirmed' => 'checkbox',
  135. 'comment_on_as' => 'checkbox',
  136. 'comment_on_qs' => 'checkbox',
  137. 'confirm_user_emails' => 'checkbox',
  138. 'confirm_user_required' => 'checkbox',
  139. 'do_ask_check_qs' => 'checkbox',
  140. 'do_close_on_select' => 'checkbox',
  141. 'do_complete_tags' => 'checkbox',
  142. 'do_count_q_views' => 'checkbox',
  143. 'do_example_tags' => 'checkbox',
  144. 'extra_field_active' => 'checkbox',
  145. 'extra_field_display' => 'checkbox',
  146. 'feed_for_activity' => 'checkbox',
  147. 'feed_for_hot' => 'checkbox',
  148. 'feed_for_qa' => 'checkbox',
  149. 'feed_for_questions' => 'checkbox',
  150. 'feed_for_search' => 'checkbox',
  151. 'feed_for_tag_qs' => 'checkbox',
  152. 'feed_for_unanswered' => 'checkbox',
  153. 'feed_full_text' => 'checkbox',
  154. 'feed_per_category' => 'checkbox',
  155. 'feedback_enabled' => 'checkbox',
  156. 'flagging_of_posts' => 'checkbox',
  157. 'follow_on_as' => 'checkbox',
  158. 'links_in_new_window' => 'checkbox',
  159. 'logo_show' => 'checkbox',
  160. 'mailing_enabled' => 'checkbox',
  161. 'moderate_anon_post' => 'checkbox',
  162. 'moderate_by_points' => 'checkbox',
  163. 'moderate_edited_again' => 'checkbox',
  164. 'moderate_notify_admin' => 'checkbox',
  165. 'moderate_unapproved' => 'checkbox',
  166. 'moderate_unconfirmed' => 'checkbox',
  167. 'moderate_users' => 'checkbox',
  168. 'neat_urls' => 'checkbox',
  169. 'notify_admin_q_post' => 'checkbox',
  170. 'notify_users_default' => 'checkbox',
  171. 'q_urls_remove_accents' => 'checkbox',
  172. 'recalc_hotness_q_view' => 'checkbox',
  173. 'register_notify_admin' => 'checkbox',
  174. 'show_c_reply_buttons' => 'checkbox',
  175. 'show_compact_numbers' => 'checkbox',
  176. 'show_custom_answer' => 'checkbox',
  177. 'show_custom_ask' => 'checkbox',
  178. 'show_custom_comment' => 'checkbox',
  179. 'show_custom_footer' => 'checkbox',
  180. 'show_custom_header' => 'checkbox',
  181. 'show_custom_home' => 'checkbox',
  182. 'show_custom_in_head' => 'checkbox',
  183. 'show_custom_register' => 'checkbox',
  184. 'show_custom_sidebar' => 'checkbox',
  185. 'show_custom_sidepanel' => 'checkbox',
  186. 'show_custom_welcome' => 'checkbox',
  187. 'show_home_description' => 'checkbox',
  188. 'show_message_history' => 'checkbox',
  189. 'show_notice_visitor' => 'checkbox',
  190. 'show_notice_welcome' => 'checkbox',
  191. 'show_post_update_meta' => 'checkbox',
  192. 'show_register_terms' => 'checkbox',
  193. 'show_selected_first' => 'checkbox',
  194. 'show_url_links' => 'checkbox',
  195. 'show_user_points' => 'checkbox',
  196. 'show_user_titles' => 'checkbox',
  197. 'show_view_counts' => 'checkbox',
  198. 'show_view_count_q_page' => 'checkbox',
  199. 'show_when_created' => 'checkbox',
  200. 'site_maintenance' => 'checkbox',
  201. 'smtp_active' => 'checkbox',
  202. 'smtp_authenticate' => 'checkbox',
  203. 'suspend_register_users' => 'checkbox',
  204. 'tag_separator_comma' => 'checkbox',
  205. 'use_microdata' => 'checkbox',
  206. 'minify_html' => 'checkbox',
  207. 'votes_separated' => 'checkbox',
  208. 'voting_on_as' => 'checkbox',
  209. 'voting_on_cs' => 'checkbox',
  210. 'voting_on_q_page_only' => 'checkbox',
  211. 'voting_on_qs' => 'checkbox',
  212. 'smtp_password' => 'password',
  213. );
  214. $optionmaximum = array(
  215. 'feed_number_items' => QA_DB_RETRIEVE_QS_AS,
  216. 'max_len_q_title' => QA_DB_MAX_TITLE_LENGTH,
  217. 'page_size_activity' => QA_DB_RETRIEVE_QS_AS,
  218. 'page_size_ask_check_qs' => QA_DB_RETRIEVE_QS_AS,
  219. 'page_size_ask_tags' => QA_DB_RETRIEVE_QS_AS,
  220. 'page_size_home' => QA_DB_RETRIEVE_QS_AS,
  221. 'page_size_hot_qs' => QA_DB_RETRIEVE_QS_AS,
  222. 'page_size_pms' => QA_DB_RETRIEVE_MESSAGES,
  223. 'page_size_qs' => QA_DB_RETRIEVE_QS_AS,
  224. 'page_size_related_qs' => QA_DB_RETRIEVE_QS_AS,
  225. 'page_size_search' => QA_DB_RETRIEVE_QS_AS,
  226. 'page_size_tag_qs' => QA_DB_RETRIEVE_QS_AS,
  227. 'page_size_tags' => QA_DB_RETRIEVE_TAGS,
  228. 'page_size_una_qs' => QA_DB_RETRIEVE_QS_AS,
  229. 'page_size_users' => QA_DB_RETRIEVE_USERS,
  230. 'page_size_wall' => QA_DB_RETRIEVE_MESSAGES,
  231. );
  232. $optionminimum = array(
  233. 'flagging_hide_after' => 2,
  234. 'flagging_notify_every' => 1,
  235. 'flagging_notify_first' => 1,
  236. 'max_num_q_tags' => 2,
  237. 'max_rate_ip_logins' => 1,
  238. 'min_len_a_content' => 1,
  239. 'min_len_c_content' => 1,
  240. 'min_len_q_title' => 1,
  241. 'page_size_activity' => 1,
  242. 'page_size_ask_check_qs' => 3,
  243. 'page_size_ask_tags' => 3,
  244. 'page_size_home' => 1,
  245. 'page_size_hot_qs' => 1,
  246. 'page_size_pms' => 1,
  247. 'page_size_q_as' => 1,
  248. 'page_size_qs' => 1,
  249. 'page_size_search' => 1,
  250. 'page_size_tag_qs' => 1,
  251. 'page_size_tags' => 1,
  252. 'page_size_users' => 1,
  253. 'page_size_wall' => 1,
  254. );
  255. // Define the options to show (and some other visual stuff) based on request
  256. $formstyle = 'tall';
  257. $checkboxtodisplay = null;
  258. $maxpermitpost = max(qa_opt('permit_post_q'), qa_opt('permit_post_a'));
  259. if (qa_opt('comment_on_qs') || qa_opt('comment_on_as'))
  260. $maxpermitpost = max($maxpermitpost, qa_opt('permit_post_c'));
  261. switch ($adminsection) {
  262. case 'general':
  263. $subtitle = 'admin/general_title';
  264. $showoptions = array('site_title', 'site_url', 'neat_urls', 'site_language', 'site_theme', 'site_theme_mobile', 'site_text_direction', 'tags_or_categories', 'site_maintenance');
  265. break;
  266. case 'emails':
  267. $subtitle = 'admin/emails_title';
  268. $showoptions = array(
  269. 'from_email', 'feedback_email', 'notify_admin_q_post', 'feedback_enabled', 'email_privacy',
  270. 'smtp_active', 'smtp_address', 'smtp_port', 'smtp_secure', 'smtp_authenticate', 'smtp_username', 'smtp_password'
  271. );
  272. $checkboxtodisplay = array(
  273. 'smtp_address' => 'option_smtp_active',
  274. 'smtp_port' => 'option_smtp_active',
  275. 'smtp_secure' => 'option_smtp_active',
  276. 'smtp_authenticate' => 'option_smtp_active',
  277. 'smtp_username' => 'option_smtp_active && option_smtp_authenticate',
  278. 'smtp_password' => 'option_smtp_active && option_smtp_authenticate',
  279. );
  280. break;
  281. case 'users':
  282. $subtitle = 'admin/users_title';
  283. $showoptions = array('show_notice_visitor', 'notice_visitor');
  284. if (!QA_FINAL_EXTERNAL_USERS) {
  285. require_once QA_INCLUDE_DIR . 'util/image.php';
  286. array_push($showoptions, 'show_custom_register', 'custom_register', 'show_register_terms', 'register_terms', 'show_notice_welcome', 'notice_welcome', 'show_custom_welcome', 'custom_welcome',
  287. '', 'allow_login_email_only', 'allow_change_usernames', 'register_notify_admin', 'suspend_register_users', '', 'block_bad_usernames',
  288. '', 'allow_private_messages', 'show_message_history', 'page_size_pms', 'allow_user_walls', 'page_size_wall',
  289. '', 'avatar_allow_gravatar');
  290. if (qa_has_gd_image())
  291. array_push($showoptions, 'avatar_allow_upload', 'avatar_store_size', 'avatar_default_show');
  292. }
  293. $showoptions[] = '';
  294. if (!QA_FINAL_EXTERNAL_USERS)
  295. $showoptions[] = 'avatar_profile_size';
  296. array_push($showoptions, 'avatar_users_size', 'avatar_q_page_q_size', 'avatar_q_page_a_size', 'avatar_q_page_c_size',
  297. 'avatar_q_list_size', 'avatar_message_list_size');
  298. $checkboxtodisplay = array(
  299. 'custom_register' => 'option_show_custom_register',
  300. 'register_terms' => 'option_show_register_terms',
  301. 'custom_welcome' => 'option_show_custom_welcome',
  302. 'notice_welcome' => 'option_show_notice_welcome',
  303. 'notice_visitor' => 'option_show_notice_visitor',
  304. 'show_message_history' => 'option_allow_private_messages',
  305. 'avatar_store_size' => 'option_avatar_allow_upload',
  306. 'avatar_default_show' => 'option_avatar_allow_gravatar || option_avatar_allow_upload',
  307. );
  308. if (!QA_FINAL_EXTERNAL_USERS) {
  309. $checkboxtodisplay = array_merge($checkboxtodisplay, array(
  310. 'page_size_pms' => 'option_allow_private_messages && option_show_message_history',
  311. 'page_size_wall' => 'option_allow_user_walls',
  312. 'avatar_profile_size' => 'option_avatar_allow_gravatar || option_avatar_allow_upload',
  313. 'avatar_users_size' => 'option_avatar_allow_gravatar || option_avatar_allow_upload',
  314. 'avatar_q_page_q_size' => 'option_avatar_allow_gravatar || option_avatar_allow_upload',
  315. 'avatar_q_page_a_size' => 'option_avatar_allow_gravatar || option_avatar_allow_upload',
  316. 'avatar_q_page_c_size' => 'option_avatar_allow_gravatar || option_avatar_allow_upload',
  317. 'avatar_q_list_size' => 'option_avatar_allow_gravatar || option_avatar_allow_upload',
  318. 'avatar_message_list_size' => '(option_avatar_allow_gravatar || option_avatar_allow_upload) && (option_allow_private_messages || option_allow_user_walls)',
  319. ));
  320. }
  321. $formstyle = 'wide';
  322. break;
  323. case 'layout':
  324. $subtitle = 'admin/layout_title';
  325. $showoptions = array('logo_show', 'logo_url', 'logo_width', 'logo_height', '', 'show_custom_sidebar', 'custom_sidebar', 'show_custom_sidepanel', 'custom_sidepanel', 'show_custom_header', 'custom_header', 'show_custom_footer', 'custom_footer', 'show_custom_in_head', 'custom_in_head', 'show_custom_home', 'custom_home_heading', 'custom_home_content', 'show_home_description', 'home_description', '');
  326. $checkboxtodisplay = array(
  327. 'logo_url' => 'option_logo_show',
  328. 'logo_width' => 'option_logo_show',
  329. 'logo_height' => 'option_logo_show',
  330. 'custom_sidebar' => 'option_show_custom_sidebar',
  331. 'custom_sidepanel' => 'option_show_custom_sidepanel',
  332. 'custom_header' => 'option_show_custom_header',
  333. 'custom_footer' => 'option_show_custom_footer',
  334. 'custom_in_head' => 'option_show_custom_in_head',
  335. 'custom_home_heading' => 'option_show_custom_home',
  336. 'custom_home_content' => 'option_show_custom_home',
  337. 'home_description' => 'option_show_home_description',
  338. );
  339. break;
  340. case 'viewing':
  341. $subtitle = 'admin/viewing_title';
  342. $showoptions = array(
  343. 'q_urls_title_length', 'q_urls_remove_accents', 'do_count_q_views', 'show_view_counts', 'show_view_count_q_page', 'recalc_hotness_q_view', '',
  344. 'voting_on_qs', 'voting_on_q_page_only', 'voting_on_as', 'voting_on_cs', 'votes_separated', '',
  345. 'show_url_links', 'links_in_new_window', 'show_when_created', 'show_full_date_days'
  346. );
  347. if (count(qa_get_points_to_titles())) {
  348. $showoptions[] = 'show_user_titles';
  349. }
  350. array_push($showoptions,
  351. 'show_user_points', 'show_post_update_meta', 'show_compact_numbers', 'use_microdata', 'minify_html', '',
  352. 'sort_answers_by', 'show_selected_first', 'page_size_q_as', 'show_a_form_immediate'
  353. );
  354. if (qa_opt('comment_on_qs') || qa_opt('comment_on_as')) {
  355. array_push($showoptions, 'show_fewer_cs_from', 'show_fewer_cs_count', 'show_c_reply_buttons');
  356. }
  357. $showoptions[] = '';
  358. $widgets = qa_db_single_select(qa_db_widgets_selectspec());
  359. foreach ($widgets as $widget) {
  360. if ($widget['title'] == 'Related Questions') {
  361. array_push($showoptions, 'match_related_qs', 'page_size_related_qs', '');
  362. break;
  363. }
  364. }
  365. $showoptions[] = 'pages_prev_next';
  366. $formstyle = 'wide';
  367. $checkboxtodisplay = array(
  368. 'show_view_counts' => 'option_do_count_q_views',
  369. 'show_view_count_q_page' => 'option_do_count_q_views',
  370. 'recalc_hotness_q_view' => 'option_do_count_q_views',
  371. 'votes_separated' => 'option_voting_on_qs || option_voting_on_as',
  372. 'voting_on_q_page_only' => 'option_voting_on_qs',
  373. 'show_full_date_days' => 'option_show_when_created',
  374. );
  375. break;
  376. case 'lists':
  377. $subtitle = 'admin/lists_title';
  378. $showoptions = array('page_size_home', 'page_size_activity', 'page_size_qs', 'page_size_hot_qs', 'page_size_una_qs');
  379. if (qa_using_tags())
  380. $showoptions[] = 'page_size_tag_qs';
  381. $showoptions[] = '';
  382. if (qa_using_tags())
  383. array_push($showoptions, 'page_size_tags', 'columns_tags');
  384. array_push($showoptions, 'page_size_users', 'columns_users', '');
  385. $searchmodules = qa_load_modules_with('search', 'process_search');
  386. if (count($searchmodules))
  387. $showoptions[] = 'search_module';
  388. $showoptions[] = 'page_size_search';
  389. array_push($showoptions, '', 'admin/hotness_factors', 'hot_weight_q_age', 'hot_weight_a_age', 'hot_weight_answers', 'hot_weight_votes');
  390. if (qa_opt('do_count_q_views'))
  391. $showoptions[] = 'hot_weight_views';
  392. $formstyle = 'wide';
  393. break;
  394. case 'posting':
  395. $getoptions = qa_get_options(array('tags_or_categories'));
  396. $subtitle = 'admin/posting_title';
  397. $showoptions = array('do_close_on_select', 'allow_close_questions', 'allow_close_own_questions', 'allow_self_answer', 'allow_multi_answers', 'follow_on_as', 'comment_on_qs', 'comment_on_as', 'allow_anonymous_naming', '');
  398. if (count(qa_list_modules('editor')) > 1)
  399. array_push($showoptions, 'editor_for_qs', 'editor_for_as', 'editor_for_cs', '');
  400. array_push($showoptions, 'show_custom_ask', 'custom_ask', 'extra_field_active', 'extra_field_prompt', 'extra_field_display', 'extra_field_label', 'show_custom_answer', 'custom_answer', 'show_custom_comment', 'custom_comment', '');
  401. array_push($showoptions, 'min_len_q_title', 'max_len_q_title', 'min_len_q_content');
  402. if (qa_using_tags())
  403. array_push($showoptions, 'min_num_q_tags', 'max_num_q_tags', 'tag_separator_comma');
  404. array_push($showoptions, 'min_len_a_content', 'min_len_c_content', 'notify_users_default');
  405. array_push($showoptions, '', 'block_bad_words', '', 'do_ask_check_qs', 'match_ask_check_qs', 'page_size_ask_check_qs', '');
  406. if (qa_using_tags())
  407. array_push($showoptions, 'do_example_tags', 'match_example_tags', 'do_complete_tags', 'page_size_ask_tags');
  408. $formstyle = 'wide';
  409. $checkboxtodisplay = array(
  410. 'allow_close_own_questions' => 'option_allow_close_questions',
  411. 'editor_for_cs' => 'option_comment_on_qs || option_comment_on_as',
  412. 'custom_ask' => 'option_show_custom_ask',
  413. 'extra_field_prompt' => 'option_extra_field_active',
  414. 'extra_field_display' => 'option_extra_field_active',
  415. 'extra_field_label' => 'option_extra_field_active && option_extra_field_display',
  416. 'extra_field_label_hidden' => '!option_extra_field_display',
  417. 'extra_field_label_shown' => 'option_extra_field_display',
  418. 'custom_answer' => 'option_show_custom_answer',
  419. 'show_custom_comment' => 'option_comment_on_qs || option_comment_on_as',
  420. 'custom_comment' => 'option_show_custom_comment && (option_comment_on_qs || option_comment_on_as)',
  421. 'min_len_c_content' => 'option_comment_on_qs || option_comment_on_as',
  422. 'match_ask_check_qs' => 'option_do_ask_check_qs',
  423. 'page_size_ask_check_qs' => 'option_do_ask_check_qs',
  424. 'match_example_tags' => 'option_do_example_tags',
  425. 'page_size_ask_tags' => 'option_do_example_tags || option_do_complete_tags',
  426. );
  427. break;
  428. case 'permissions':
  429. $subtitle = 'admin/permissions_title';
  430. $permitoptions = qa_get_permit_options();
  431. $showoptions = array();
  432. $checkboxtodisplay = array();
  433. foreach ($permitoptions as $permitoption) {
  434. $showoptions[] = $permitoption;
  435. if ($permitoption == 'permit_view_q_page') {
  436. $showoptions[] = 'allow_view_q_bots';
  437. $checkboxtodisplay['allow_view_q_bots'] = 'option_permit_view_q_page<' . qa_js(QA_PERMIT_ALL);
  438. } else {
  439. $showoptions[] = $permitoption . '_points';
  440. $checkboxtodisplay[$permitoption . '_points'] = '(option_' . $permitoption . '==' . qa_js(QA_PERMIT_POINTS) .
  441. ')||(option_' . $permitoption . '==' . qa_js(QA_PERMIT_POINTS_CONFIRMED) . ')||(option_' . $permitoption . '==' . qa_js(QA_PERMIT_APPROVED_POINTS) . ')';
  442. }
  443. }
  444. $formstyle = 'wide';
  445. break;
  446. case 'feeds':
  447. $subtitle = 'admin/feeds_title';
  448. $showoptions = array('feed_for_questions', 'feed_for_qa', 'feed_for_activity');
  449. array_push($showoptions, 'feed_for_hot', 'feed_for_unanswered');
  450. if (qa_using_tags())
  451. $showoptions[] = 'feed_for_tag_qs';
  452. if (qa_using_categories())
  453. $showoptions[] = 'feed_per_category';
  454. array_push($showoptions, 'feed_for_search', '', 'feed_number_items', 'feed_full_text');
  455. $formstyle = 'wide';
  456. $checkboxtodisplay = array(
  457. 'feed_per_category' => 'option_feed_for_qa || option_feed_for_questions || option_feed_for_unanswered || option_feed_for_activity',
  458. );
  459. break;
  460. case 'spam':
  461. $subtitle = 'admin/spam_title';
  462. $showoptions = array();
  463. $getoptions = qa_get_options(array('feedback_enabled', 'permit_post_q', 'permit_post_a', 'permit_post_c'));
  464. if (!QA_FINAL_EXTERNAL_USERS)
  465. array_push($showoptions, 'confirm_user_emails', 'confirm_user_required', 'moderate_users', '');
  466. $captchamodules = qa_list_modules('captcha');
  467. if (count($captchamodules)) {
  468. if (!QA_FINAL_EXTERNAL_USERS)
  469. array_push($showoptions, 'captcha_on_register', 'captcha_on_reset_password');
  470. if ($maxpermitpost > QA_PERMIT_USERS)
  471. $showoptions[] = 'captcha_on_anon_post';
  472. if ($maxpermitpost > QA_PERMIT_APPROVED)
  473. $showoptions[] = 'captcha_on_unapproved';
  474. if ($maxpermitpost > QA_PERMIT_CONFIRMED)
  475. $showoptions[] = 'captcha_on_unconfirmed';
  476. if ($getoptions['feedback_enabled'])
  477. $showoptions[] = 'captcha_on_feedback';
  478. $showoptions[] = 'captcha_module';
  479. }
  480. $showoptions[] = '';
  481. if ($maxpermitpost > QA_PERMIT_USERS)
  482. $showoptions[] = 'moderate_anon_post';
  483. if ($maxpermitpost > QA_PERMIT_APPROVED)
  484. $showoptions[] = 'moderate_unapproved';
  485. if ($maxpermitpost > QA_PERMIT_CONFIRMED)
  486. $showoptions[] = 'moderate_unconfirmed';
  487. if ($maxpermitpost > QA_PERMIT_EXPERTS)
  488. array_push($showoptions, 'moderate_by_points', 'moderate_points_limit', 'moderate_edited_again', 'moderate_notify_admin', 'moderate_update_time', '');
  489. array_push($showoptions, 'flagging_of_posts', 'flagging_notify_first', 'flagging_notify_every', 'flagging_hide_after', '');
  490. array_push($showoptions, 'block_ips_write', '');
  491. if (!QA_FINAL_EXTERNAL_USERS)
  492. array_push($showoptions, 'max_rate_ip_registers', 'max_rate_ip_logins', '');
  493. array_push($showoptions, 'max_rate_ip_qs', 'max_rate_user_qs', 'max_rate_ip_as', 'max_rate_user_as');
  494. if (qa_opt('comment_on_qs') || qa_opt('comment_on_as'))
  495. array_push($showoptions, 'max_rate_ip_cs', 'max_rate_user_cs');
  496. $showoptions[] = '';
  497. if (qa_opt('voting_on_qs') || qa_opt('voting_on_as') || qa_opt('voting_on_cs'))
  498. array_push($showoptions, 'max_rate_ip_votes', 'max_rate_user_votes');
  499. array_push($showoptions, 'max_rate_ip_flags', 'max_rate_user_flags', 'max_rate_ip_uploads', 'max_rate_user_uploads');
  500. if (qa_opt('allow_private_messages') || qa_opt('allow_user_walls'))
  501. array_push($showoptions, 'max_rate_ip_messages', 'max_rate_user_messages');
  502. $formstyle = 'wide';
  503. $checkboxtodisplay = array(
  504. 'confirm_user_required' => 'option_confirm_user_emails',
  505. 'captcha_on_unapproved' => 'option_moderate_users',
  506. 'captcha_on_unconfirmed' => 'option_confirm_user_emails && !(option_moderate_users && option_captcha_on_unapproved)',
  507. 'captcha_module' => 'option_captcha_on_register || option_captcha_on_anon_post || (option_confirm_user_emails && option_captcha_on_unconfirmed) || (option_moderate_users && option_captcha_on_unapproved) || option_captcha_on_reset_password || option_captcha_on_feedback',
  508. 'moderate_unapproved' => 'option_moderate_users',
  509. 'moderate_unconfirmed' => 'option_confirm_user_emails && !(option_moderate_users && option_moderate_unapproved)',
  510. 'moderate_points_limit' => 'option_moderate_by_points',
  511. 'moderate_points_label_off' => '!option_moderate_by_points',
  512. 'moderate_points_label_on' => 'option_moderate_by_points',
  513. 'moderate_edited_again' => 'option_moderate_anon_post || (option_confirm_user_emails && option_moderate_unconfirmed) || (option_moderate_users && option_moderate_unapproved) || option_moderate_by_points',
  514. 'flagging_hide_after' => 'option_flagging_of_posts',
  515. 'flagging_notify_every' => 'option_flagging_of_posts',
  516. 'flagging_notify_first' => 'option_flagging_of_posts',
  517. 'max_rate_ip_flags' => 'option_flagging_of_posts',
  518. 'max_rate_user_flags' => 'option_flagging_of_posts',
  519. );
  520. $checkboxtodisplay['moderate_notify_admin'] = $checkboxtodisplay['moderate_edited_again'];
  521. $checkboxtodisplay['moderate_update_time'] = $checkboxtodisplay['moderate_edited_again'];
  522. break;
  523. case 'caching':
  524. $subtitle = 'admin/caching_title';
  525. $formstyle = 'wide';
  526. $showoptions = array('caching_enabled', 'caching_driver', 'caching_q_start', 'caching_q_time', 'caching_catwidget_time');
  527. break;
  528. case 'mailing':
  529. require_once QA_INCLUDE_DIR . 'app/mailing.php';
  530. $subtitle = 'admin/mailing_title';
  531. $showoptions = array('mailing_enabled', 'mailing_from_name', 'mailing_from_email', 'mailing_subject', 'mailing_body', 'mailing_per_minute');
  532. break;
  533. default:
  534. $pagemodules = qa_load_modules_with('page', 'match_request');
  535. $request = qa_request();
  536. foreach ($pagemodules as $pagemodule) {
  537. if ($pagemodule->match_request($request))
  538. return $pagemodule->process_request($request);
  539. }
  540. return include QA_INCLUDE_DIR . 'qa-page-not-found.php';
  541. break;
  542. }
  543. // Filter out blanks to get list of valid options
  544. $getoptions = array();
  545. foreach ($showoptions as $optionname) {
  546. if (strlen($optionname) && (strpos($optionname, '/') === false)) // empties represent spacers in forms
  547. $getoptions[] = $optionname;
  548. }
  549. // Process user actions
  550. $errors = array();
  551. $recalchotness = false;
  552. $startmailing = false;
  553. $securityexpired = false;
  554. $formokhtml = null;
  555. // If the post_max_size is exceeded then the $_POST array is empty so no field processing can be done
  556. if (qa_post_limit_exceeded())
  557. $errors['avatar_default_show'] = qa_lang('main/file_upload_limit_exceeded');
  558. else {
  559. if (qa_clicked('doresetoptions')) {
  560. if (!qa_check_form_security_code('admin/' . $adminsection, qa_post_text('code')))
  561. $securityexpired = true;
  562. else {
  563. qa_reset_options($getoptions);
  564. $formokhtml = qa_lang_html('admin/options_reset');
  565. }
  566. } elseif (qa_clicked('dosaveoptions')) {
  567. if (!qa_check_form_security_code('admin/' . $adminsection, qa_post_text('code')))
  568. $securityexpired = true;
  569. else {
  570. foreach ($getoptions as $optionname) {
  571. $optionvalue = qa_post_text('option_' . $optionname);
  572. if (@$optiontype[$optionname] == 'number' || @$optiontype[$optionname] == 'checkbox' ||
  573. (@$optiontype[$optionname] == 'number-blank' && strlen($optionvalue))
  574. )
  575. $optionvalue = (int)$optionvalue;
  576. if (isset($optionmaximum[$optionname]))
  577. $optionvalue = min($optionmaximum[$optionname], $optionvalue);
  578. if (isset($optionminimum[$optionname]))
  579. $optionvalue = max($optionminimum[$optionname], $optionvalue);
  580. switch ($optionname) {
  581. case 'site_url':
  582. if (substr($optionvalue, -1) != '/') // seems to be a very common mistake and will mess up URLs
  583. $optionvalue .= '/';
  584. break;
  585. case 'hot_weight_views':
  586. case 'hot_weight_answers':
  587. case 'hot_weight_votes':
  588. case 'hot_weight_q_age':
  589. case 'hot_weight_a_age':
  590. if (qa_opt($optionname) != $optionvalue)
  591. $recalchotness = true;
  592. break;
  593. case 'block_ips_write':
  594. require_once QA_INCLUDE_DIR . 'app/limits.php';
  595. $optionvalue = implode(' , ', qa_block_ips_explode($optionvalue));
  596. break;
  597. case 'block_bad_words':
  598. case 'block_bad_usernames':
  599. require_once QA_INCLUDE_DIR . 'util/string.php';
  600. $optionvalue = implode(' , ', qa_block_words_explode($optionvalue));
  601. break;
  602. }
  603. qa_set_option($optionname, $optionvalue);
  604. }
  605. $formokhtml = qa_lang_html('admin/options_saved');
  606. // Uploading default avatar
  607. if (is_array(@$_FILES['avatar_default_file'])) {
  608. $avatarfileerror = $_FILES['avatar_default_file']['error'];
  609. // Note if $_FILES['avatar_default_file']['error'] === 1 then upload_max_filesize has been exceeded
  610. if ($avatarfileerror === 1) {
  611. $errors['avatar_default_show'] = qa_lang('main/file_upload_limit_exceeded');
  612. } elseif ($avatarfileerror === 0 && $_FILES['avatar_default_file']['size'] > 0) {
  613. require_once QA_INCLUDE_DIR . 'util/image.php';
  614. $oldblobid = qa_opt('avatar_default_blobid');
  615. $toobig = qa_image_file_too_big($_FILES['avatar_default_file']['tmp_name'], qa_opt('avatar_store_size'));
  616. if ($toobig) {
  617. $errors['avatar_default_show'] = qa_lang_sub('main/image_too_big_x_pc', (int)($toobig * 100));
  618. } else {
  619. $imagedata = qa_image_constrain_data(file_get_contents($_FILES['avatar_default_file']['tmp_name']), $width, $height, qa_opt('avatar_store_size'));
  620. if (isset($imagedata)) {
  621. require_once QA_INCLUDE_DIR . 'app/blobs.php';
  622. $newblobid = qa_create_blob($imagedata, 'jpeg');
  623. if (isset($newblobid)) {
  624. qa_set_option('avatar_default_blobid', $newblobid);
  625. qa_set_option('avatar_default_width', $width);
  626. qa_set_option('avatar_default_height', $height);
  627. qa_set_option('avatar_default_show', 1);
  628. }
  629. if (strlen($oldblobid))
  630. qa_delete_blob($oldblobid);
  631. } else {
  632. $errors['avatar_default_show'] = qa_lang_sub('main/image_not_read', implode(', ', qa_gd_image_formats()));
  633. }
  634. }
  635. }
  636. }
  637. }
  638. }
  639. }
  640. // Mailings management
  641. if ($adminsection == 'mailing') {
  642. if (qa_clicked('domailingtest') || qa_clicked('domailingstart') || qa_clicked('domailingresume') || qa_clicked('domailingcancel')) {
  643. if (!qa_check_form_security_code('admin/' . $adminsection, qa_post_text('code'))) {
  644. $securityexpired = true;
  645. } else {
  646. if (qa_clicked('domailingtest')) {
  647. $email = qa_get_logged_in_email();
  648. if (qa_mailing_send_one(qa_get_logged_in_userid(), qa_get_logged_in_handle(), $email, qa_get_logged_in_user_field('emailcode')))
  649. $formokhtml = qa_lang_html_sub('admin/test_sent_to_x', qa_html($email));
  650. else
  651. $formokhtml = qa_lang_html('main/general_error');
  652. }
  653. if (qa_clicked('domailingstart')) {
  654. qa_mailing_start();
  655. $startmailing = true;
  656. }
  657. if (qa_clicked('domailingresume'))
  658. $startmailing = true;
  659. if (qa_clicked('domailingcancel'))
  660. qa_mailing_stop();
  661. }
  662. }
  663. $mailingprogress = qa_mailing_progress_message();
  664. if (isset($mailingprogress)) {
  665. $formokhtml = qa_html($mailingprogress);
  666. $checkboxtodisplay = array(
  667. 'mailing_enabled' => '0',
  668. );
  669. } else {
  670. $checkboxtodisplay = array(
  671. 'mailing_from_name' => 'option_mailing_enabled',
  672. 'mailing_from_email' => 'option_mailing_enabled',
  673. 'mailing_subject' => 'option_mailing_enabled',
  674. 'mailing_body' => 'option_mailing_enabled',
  675. 'mailing_per_minute' => 'option_mailing_enabled',
  676. 'domailingtest' => 'option_mailing_enabled',
  677. 'domailingstart' => 'option_mailing_enabled',
  678. );
  679. }
  680. }
  681. // Get the actual options
  682. $options = qa_get_options($getoptions);
  683. // Prepare content for theme
  684. $qa_content = qa_content_prepare();
  685. $qa_content['title'] = qa_lang_html('admin/admin_title') . ' - ' . qa_lang_html($subtitle);
  686. $qa_content['error'] = $securityexpired ? qa_lang_html('admin/form_security_expired') : qa_admin_page_error();
  687. $qa_content['script_rel'][] = 'qa-content/qa-admin.js?' . QA_VERSION;
  688. $qa_content['form'] = array(
  689. 'ok' => $formokhtml,
  690. 'tags' => 'method="post" action="' . qa_self_html() . '" name="admin_form" onsubmit="document.forms.admin_form.has_js.value=1; return true;"',
  691. 'style' => $formstyle,
  692. 'fields' => array(),
  693. 'buttons' => array(
  694. 'save' => array(
  695. 'tags' => 'id="dosaveoptions"',
  696. 'label' => qa_lang_html('admin/save_options_button'),
  697. ),
  698. 'reset' => array(
  699. 'tags' => 'name="doresetoptions" onclick="return confirm(' . qa_js(qa_lang_html('admin/reset_options_confirm')) . ');"',
  700. 'label' => qa_lang_html('admin/reset_options_button'),
  701. ),
  702. ),
  703. 'hidden' => array(
  704. 'dosaveoptions' => '1', // for IE
  705. 'has_js' => '0',
  706. 'code' => qa_get_form_security_code('admin/' . $adminsection),
  707. ),
  708. );
  709. if ($recalchotness) {
  710. $qa_content['form']['ok'] = '<span id="recalc_ok"></span>';
  711. $qa_content['form']['hidden']['code_recalc'] = qa_get_form_security_code('admin/recalc');
  712. $qa_content['script_var']['qa_warning_recalc'] = qa_lang('admin/stop_recalc_warning');
  713. $qa_content['script_onloads'][] = array(
  714. "qa_recalc_click('dorecountposts', document.getElementById('dosaveoptions'), null, 'recalc_ok');"
  715. );
  716. } elseif ($startmailing) {
  717. if (qa_post_text('has_js')) {
  718. $qa_content['form']['ok'] = '<span id="mailing_ok">' . qa_html($mailingprogress) . '</span>';
  719. $qa_content['script_onloads'][] = array(
  720. "qa_mailing_start('mailing_ok', 'domailingpause');"
  721. );
  722. } else { // rudimentary non-Javascript version of mass mailing loop
  723. echo '<code>';
  724. while (true) {
  725. qa_mailing_perform_step();
  726. $message = qa_mailing_progress_message();
  727. if (!isset($message))
  728. break;
  729. echo qa_html($message) . str_repeat(' ', 1024) . "<br>\n";
  730. flush();
  731. sleep(1);
  732. }
  733. echo qa_lang_html('admin/mailing_complete').'</code><p><a href="'.qa_path_html('admin/mailing').'">'.qa_lang_html('admin/admin_title').' - '.qa_lang_html('admin/mailing_title').'</a>';
  734. qa_exit();
  735. }
  736. }
  737. function qa_optionfield_make_select(&$optionfield, $options, $value, $default)
  738. {
  739. $optionfield['type'] = 'select';
  740. $optionfield['options'] = $options;
  741. $optionfield['value'] = isset($options[qa_html($value)]) ? $options[qa_html($value)] : @$options[$default];
  742. }
  743. $indented = false;
  744. foreach ($showoptions as $optionname) {
  745. if (empty($optionname)) {
  746. $indented = false;
  747. $qa_content['form']['fields'][] = array(
  748. 'type' => 'blank'
  749. );
  750. } elseif (strpos($optionname, '/') !== false) {
  751. $qa_content['form']['fields'][] = array(
  752. 'type' => 'static',
  753. 'label' => qa_lang_html($optionname),
  754. );
  755. $indented = true;
  756. } else {
  757. $type = @$optiontype[$optionname];
  758. if ($type == 'number-blank')
  759. $type = 'number';
  760. $value = $options[$optionname];
  761. $optionfield = array(
  762. 'id' => $optionname,
  763. 'label' => ($indented ? '&ndash; ' : '') . qa_lang_html('options/' . $optionname),
  764. 'tags' => 'name="option_' . $optionname . '" id="option_' . $optionname . '"',
  765. 'value' => qa_html($value),
  766. 'type' => $type,
  767. 'error' => qa_html(@$errors[$optionname]),
  768. );
  769. if (isset($optionmaximum[$optionname]))
  770. $optionfield['note'] = qa_lang_html_sub('admin/maximum_x', $optionmaximum[$optionname]);
  771. $feedrequest = null;
  772. $feedisexample = false;
  773. switch ($optionname) { // special treatment for certain options
  774. case 'site_language':
  775. require_once QA_INCLUDE_DIR . 'util/string.php';
  776. qa_optionfield_make_select($optionfield, qa_admin_language_options(), $value, '');
  777. $optionfield['suffix'] = strtr(qa_lang_html('admin/check_language_suffix'), array(
  778. '^1' => '<a href="' . qa_html(qa_path_to_root() . 'qa-include/qa-check-lang.php') . '">',
  779. '^2' => '</a>',
  780. ));
  781. if (!qa_has_multibyte())
  782. $optionfield['error'] = qa_lang_html('admin/no_multibyte');
  783. break;
  784. case 'neat_urls':
  785. $neatoptions = array();
  786. $rawoptions = array(
  787. QA_URL_FORMAT_NEAT,
  788. QA_URL_FORMAT_INDEX,
  789. QA_URL_FORMAT_PARAM,
  790. QA_URL_FORMAT_PARAMS,
  791. QA_URL_FORMAT_SAFEST,
  792. );
  793. foreach ($rawoptions as $rawoption) {
  794. $neatoptions[$rawoption] =
  795. '<iframe src="' . qa_path_html('url/test/' . QA_URL_TEST_STRING, array('dummy' => '', 'param' => QA_URL_TEST_STRING), null, $rawoption) . '" width="20" height="16" style="vertical-align:middle; border:0" scrolling="no"></iframe>&nbsp;' .
  796. '<small>' .
  797. qa_html(urldecode(qa_path('123/why-do-birds-sing', null, '/', $rawoption))) .
  798. (($rawoption == QA_URL_FORMAT_NEAT) ? strtr(qa_lang_html('admin/neat_urls_note'), array(
  799. '^1' => '<a href="http://www.question2answer.org/htaccess.php" target="_blank">',
  800. '^2' => '</a>',
  801. )) : '') .
  802. '</small>';
  803. }
  804. qa_optionfield_make_select($optionfield, $neatoptions, $value, QA_URL_FORMAT_SAFEST);
  805. $optionfield['type'] = 'select-radio';
  806. $optionfield['note'] = qa_lang_html_sub('admin/url_format_note', '<span style=" ' . qa_admin_url_test_html() . '/span>');
  807. break;
  808. case 'site_theme':
  809. case 'site_theme_mobile':
  810. $themeoptions = qa_admin_theme_options();
  811. if (!isset($themeoptions[$value]))
  812. $value = 'Classic'; // check here because we also need $value for qa_addon_metadata()
  813. qa_optionfield_make_select($optionfield, $themeoptions, $value, 'Classic');
  814. $metadataUtil = new \Q2A\Util\Metadata();
  815. $themedirectory = QA_THEME_DIR . $value;
  816. $metadata = $metadataUtil->fetchFromAddonPath($themedirectory);
  817. if (empty($metadata)) {
  818. // limit theme parsing to first 8kB
  819. $contents = @file_get_contents($themedirectory . '/qa-styles.css', false, null, 0, 8192);
  820. $metadata = qa_addon_metadata($contents, 'Theme');
  821. }
  822. if (strlen(@$metadata['version']))
  823. $namehtml = 'v' . qa_html($metadata['version']);
  824. else
  825. $namehtml = '';
  826. if (strlen(@$metadata['uri'])) {
  827. if (!strlen($namehtml))
  828. $namehtml = qa_html($value);
  829. $namehtml = '<a href="' . qa_html($metadata['uri']) . '">' . $namehtml . '</a>';
  830. }
  831. $authorhtml = '';
  832. if (strlen(@$metadata['author'])) {
  833. $authorhtml = qa_html($metadata['author']);
  834. if (strlen(@$metadata['author_uri']))
  835. $authorhtml = '<a href="' . qa_html($metadata['author_uri']) . '">' . $authorhtml . '</a>';
  836. $authorhtml = qa_lang_html_sub('main/by_x', $authorhtml);
  837. }
  838. $updatehtml = '';
  839. if (strlen(@$metadata['version']) && strlen(@$metadata['update_uri'])) {
  840. $elementid = 'version_check_' . $optionname;
  841. $updatehtml = '(<span id="' . $elementid . '">...</span>)';
  842. $qa_content['script_onloads'][] = array(
  843. "qa_version_check(" . qa_js($metadata['update_uri']) . ", " . qa_js($metadata['version'], true) . ", " . qa_js($elementid) . ", false);"
  844. );
  845. }
  846. $optionfield['suffix'] = $namehtml . ' ' . $authorhtml . ' ' . $updatehtml;
  847. break;
  848. case 'site_text_direction':
  849. $directions = array('ltr' => 'LTR', 'rtl' => 'RTL');
  850. qa_optionfield_make_select($optionfield, $directions, $value, 'ltr');
  851. break;
  852. case 'tags_or_categories':
  853. qa_optionfield_make_select($optionfield, array(
  854. '' => qa_lang_html('admin/no_classification'),
  855. 't' => qa_lang_html('admin/tags'),
  856. 'c' => qa_lang_html('admin/categories'),
  857. 'tc' => qa_lang_html('admin/tags_and_categories'),
  858. ), $value, 'tc');
  859. $optionfield['error'] = '';
  860. if (qa_opt('cache_tagcount') && !qa_using_tags())
  861. $optionfield['error'] .= qa_lang_html('admin/tags_not_shown') . ' ';
  862. if (!qa_using_categories()) {
  863. foreach ($categories as $category) {
  864. if ($category['qcount']) {
  865. $optionfield['error'] .= qa_lang_html('admin/categories_not_shown');
  866. break;
  867. }
  868. }
  869. }
  870. break;
  871. case 'smtp_secure':
  872. qa_optionfield_make_select($optionfield, array(
  873. '' => qa_lang_html('options/smtp_secure_none'),
  874. 'ssl' => 'SSL',
  875. 'tls' => 'TLS',
  876. ), $value, '');
  877. break;
  878. case 'custom_sidebar':
  879. case 'custom_sidepanel':
  880. case 'custom_header':
  881. case 'custom_footer':
  882. case 'custom_in_head':
  883. case 'home_description':
  884. unset($optionfield['label']);
  885. $optionfield['rows'] = 6;
  886. break;
  887. case 'custom_home_content':
  888. $optionfield['rows'] = 16;
  889. break;
  890. case 'show_custom_register':
  891. case 'show_register_terms':
  892. case 'show_custom_welcome':
  893. case 'show_notice_welcome':
  894. case 'show_notice_visitor':
  895. $optionfield['style'] = 'tall';
  896. break;
  897. case 'custom_register':
  898. case 'register_terms':
  899. case 'custom_welcome':
  900. case 'notice_welcome':
  901. case 'notice_visitor':
  902. unset($optionfield['label']);
  903. $optionfield['style'] = 'tall';
  904. $optionfield['rows'] = 3;
  905. break;
  906. case 'avatar_allow_gravatar':
  907. $optionfield['label'] = strtr($optionfield['label'], array(
  908. '^1' => '<a href="http://www.gravatar.com/" target="_blank">',
  909. '^2' => '</a>',
  910. ));
  911. if (!qa_has_gd_image()) {
  912. $optionfield['style'] = 'tall';
  913. $optionfield['error'] = qa_lang_html('admin/no_image_gd');
  914. }
  915. break;
  916. case 'avatar_store_size':
  917. case 'avatar_profile_size':
  918. case 'avatar_users_size':
  919. case 'avatar_q_page_q_size':
  920. case 'avatar_q_page_a_size':
  921. case 'avatar_q_page_c_size':
  922. case 'avatar_q_list_size':
  923. case 'avatar_message_list_size':
  924. $optionfield['note'] = qa_lang_html('admin/pixels');
  925. break;
  926. case 'avatar_default_show':
  927. $qa_content['form']['tags'] .= 'enctype="multipart/form-data"';
  928. $optionfield['label'] .= ' <span style="margin:2px 0; display:inline-block;">' .
  929. qa_get_avatar_blob_html(qa_opt('avatar_default_blobid'), qa_opt('avatar_default_width'), qa_opt('avatar_default_height'), 32) .
  930. '</span> <input name="avatar_default_file" type="file" style="width:16em;">';
  931. break;
  932. case 'logo_width':
  933. case 'logo_height':
  934. $optionfield['suffix'] = qa_lang_html('admin/pixels');
  935. break;
  936. case 'pages_prev_next':
  937. qa_optionfield_make_select($optionfield, array(0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5), $value, 3);
  938. break;
  939. case 'columns_tags':
  940. case 'columns_users':
  941. qa_optionfield_make_select($optionfield, array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5), $value, 2);
  942. break;
  943. case 'min_len_q_title':
  944. case 'q_urls_title_length':
  945. case 'min_len_q_content':
  946. case 'min_len_a_content':
  947. case 'min_len_c_content':
  948. $optionfield['note'] = qa_lang_html('admin/characters');
  949. break;
  950. case 'recalc_hotness_q_view':
  951. $optionfield['note'] = '<span class="qa-form-wide-help" title="' . qa_lang_html('admin/recalc_hotness_q_view_note') . '">?</span>';
  952. break;
  953. case 'min_num_q_tags':
  954. case 'max_num_q_tags':
  955. $optionfield['note'] = qa_lang_html_sub('main/x_tags', ''); // this to avoid language checking error: a_lang('main/1_tag')
  956. break;
  957. case 'show_full_date_days':
  958. $optionfield['note'] = qa_lang_html_sub('main/x_days', '');
  959. break;
  960. case 'sort_answers_by':
  961. qa_optionfield_make_select($optionfield, array(
  962. 'created' => qa_lang_html('options/sort_time'),
  963. 'votes' => qa_lang_html('options/sort_votes'),
  964. ), $value, 'created');
  965. break;
  966. case 'page_size_q_as':
  967. $optionfield['note'] = qa_lang_html_sub('main/x_answers', '');
  968. break;
  969. case 'show_a_form_immediate':
  970. qa_optionfield_make_select($optionfield, array(
  971. 'always' => qa_lang_html('options/show_always'),
  972. 'if_no_as' => qa_lang_html('options/show_if_no_as'),
  973. 'never' => qa_lang_html('options/show_never'),
  974. ), $value, 'if_no_as');
  975. break;
  976. case 'show_fewer_cs_from':
  977. case 'show_fewer_cs_count':
  978. $optionfield['note'] = qa_lang_html_sub('main/x_comments', '');
  979. break;
  980. case 'match_related_qs':
  981. case 'match_ask_check_qs':
  982. case 'match_example_tags':
  983. qa_optionfield_make_select($optionfield, qa_admin_match_options(), $value, 3);
  984. break;
  985. case 'block_bad_words':
  986. case 'block_bad_usernames':
  987. $optionfield['style'] = 'tall';
  988. $optionfield['rows'] = 4;
  989. $optionfield['note'] = qa_lang_html('admin/block_words_note');
  990. break;
  991. case 'editor_for_qs':
  992. case 'editor_for_as':
  993. case 'editor_for_cs':
  994. $editors = qa_list_modules('editor');
  995. $selectoptions = array();
  996. foreach ($editors as $editor) {
  997. $selectoptions[qa_html($editor)] = strlen($editor) ? qa_html($editor) : qa_lang_html('admin/basic_editor');
  998. if ($editor == $value) {
  999. $module = qa_load_module('editor', $editor);
  1000. if (method_exists($module, 'admin_form')) {
  1001. $optionfield['note'] = '<a href="' . qa_admin_module_options_path('editor', $editor) . '">' . qa_lang_html('admin/options') . '</a>';
  1002. }
  1003. }
  1004. }
  1005. qa_optionfield_make_select($optionfield, $selectoptions, $value, '');
  1006. break;
  1007. case 'show_custom_ask':
  1008. case 'extra_field_active':
  1009. case 'show_custom_answer':
  1010. case 'show_custom_comment':
  1011. $optionfield['style'] = 'tall';
  1012. break;
  1013. case 'custom_ask':
  1014. case 'custom_answer':
  1015. case 'custom_comment':
  1016. $optionfield['style'] = 'tall';
  1017. unset($optionfield['label']);
  1018. $optionfield['rows'] = 3;
  1019. break;
  1020. case 'extra_field_display':
  1021. $optionfield['style'] = 'tall';
  1022. $optionfield['label'] = '<span id="extra_field_label_hidden" style="display:none;">' . $optionfield['label'] . '</span><span id="extra_field_label_shown">' . qa_lang_html('options/extra_field_display_label') . '</span>';
  1023. break;
  1024. case 'extra_field_prompt':
  1025. case 'extra_field_label':
  1026. $optionfield['style'] = 'tall';
  1027. unset($optionfield['label']);
  1028. break;
  1029. case 'search_module':
  1030. foreach ($searchmodules as $modulename => $module) {
  1031. $selectoptions[qa_html($modulename)] = strlen($modulename) ? qa_html($modulename) : qa_lang_html('options/option_default');
  1032. if ($modulename == $value && method_exists($module, 'admin_form')) {
  1033. $optionfield['note'] = '<a href="' . qa_admin_module_options_path('search', $modulename) . '">' . qa_lang_html('admin/options') . '</a>';
  1034. }
  1035. }
  1036. qa_optionfield_make_select($optionfield, $selectoptions, $value, '');
  1037. break;
  1038. case 'hot_weight_q_age':
  1039. case 'hot_weight_a_age':
  1040. case 'hot_weight_answers':
  1041. case 'hot_weight_votes':
  1042. case 'hot_weight_views':
  1043. $optionfield['note'] = '/ 100';
  1044. break;
  1045. case 'moderate_by_points':
  1046. $optionfield['label'] = '<span id="moderate_points_label_off" style="display:none;">' . $optionfield['label'] . '</span><span id="moderate_points_label_on">' . qa_lang_html('options/moderate_points_limit') . '</span>';
  1047. break;
  1048. case 'moderate_points_limit':
  1049. unset($optionfield['label']);
  1050. $optionfield['note'] = qa_lang_html('admin/points');
  1051. break;
  1052. case 'flagging_hide_after':
  1053. case 'flagging_notify_every':
  1054. case 'flagging_notify_first':
  1055. $optionfield['note'] = qa_lang_html_sub('main/x_flags', '');
  1056. break;
  1057. case 'block_ips_write':
  1058. $optionfield['style'] = 'tall';
  1059. $optionfield['rows'] = 4;
  1060. $optionfield['note'] = qa_lang_html('admin/block_ips_note');
  1061. break;
  1062. case 'allow_view_q_bots':
  1063. $optionfield['note'] = $optionfield['label'];
  1064. unset($optionfield['label']);
  1065. break;
  1066. case 'permit_view_q_page':
  1067. case 'permit_view_new_users_page':
  1068. case 'permit_view_special_users_page':
  1069. case 'permit_post_q':
  1070. case 'permit_post_a':
  1071. case 'permit_post_c':
  1072. case 'permit_vote_q':
  1073. case 'permit_vote_a':
  1074. case 'permit_vote_c':
  1075. case 'permit_vote_down':
  1076. case 'permit_edit_q':
  1077. case 'permit_retag_cat':
  1078. case 'permit_edit_a':
  1079. case 'permit_edit_c':
  1080. case 'permit_edit_silent':
  1081. case 'permit_flag':
  1082. case 'permit_close_q':
  1083. case 'permit_select_a':
  1084. case 'permit_hide_show':
  1085. case 'permit_moderate':
  1086. case 'permit_delete_hidden':
  1087. case 'permit_anon_view_ips':
  1088. case 'permit_view_voters_flaggers':
  1089. case 'permit_post_wall':
  1090. $dopoints = true;
  1091. if ($optionname == 'permit_retag_cat')
  1092. $optionfield['label'] = qa_lang_html(qa_using_categories() ? 'profile/permit_recat' : 'profile/permit_retag') . ':';
  1093. else
  1094. $optionfield['label'] = qa_lang_html('profile/' . $optionname) . ':';
  1095. if (in_array($optionname, array('permit_view_q_page', 'permit_view_new_users_page', 'permit_view_special_users_page', 'permit_post_q', 'permit_post_a', 'permit_post_c', 'permit_anon_view_ips')))
  1096. $widest = QA_PERMIT_ALL;
  1097. elseif ($optionname == 'permit_close_q' || $optionname == 'permit_select_a' || $optionname == 'permit_moderate' || $optionname == 'permit_hide_show')
  1098. $widest = QA_PERMIT_POINTS;
  1099. elseif ($optionname == 'permit_delete_hidden')
  1100. $widest = QA_PERMIT_EDITORS;
  1101. elseif ($optionname == 'permit_view_voters_flaggers' || $optionname == 'permit_edit_silent')
  1102. $widest = QA_PERMIT_EXPERTS;
  1103. else
  1104. $widest = QA_PERMIT_USERS;
  1105. if ($optionname == 'permit_view_q_page') {
  1106. $narrowest = QA_PERMIT_APPROVED;
  1107. $dopoints = false;
  1108. } elseif ($optionname == 'permit_view_special_users_page' || $optionname == 'permit_view_new_users_page') {
  1109. $narrowest = QA_PERMIT_SUPERS;
  1110. $dopoints = false;
  1111. } elseif ($optionname == 'permit_edit_c' || $optionname == 'permit_close_q' || $optionname == 'permit_select_a' || $optionname == 'permit_moderate' || $optionname == 'permit_hide_show' || $optionname == 'permit_anon_view_ips')
  1112. $narrowest = QA_PERMIT_MODERATORS;
  1113. elseif ($optionname == 'permit_post_c' || $optionname == 'permit_edit_q' || $optionname == 'permit_retag_cat' || $optionname == 'permit_edit_a' || $optionname == 'permit_flag')
  1114. $narrowest = QA_PERMIT_EDITORS;
  1115. elseif ($optionname == 'permit_vote_q' || $optionname == 'permit_vote_a' || $optionname == 'permit_vote_c' || $optionname == 'permit_post_wall')
  1116. $narrowest = QA_PERMIT_APPROVED_POINTS;
  1117. elseif ($optionname == 'permit_delete_hidden' || $optionname == 'permit_edit_silent')
  1118. $narrowest = QA_PERMIT_ADMINS;
  1119. elseif ($optionname == 'permit_view_voters_flaggers')
  1120. $narrowest = QA_PERMIT_SUPERS;
  1121. else
  1122. $narrowest = QA_PERMIT_EXPERTS;
  1123. $permitoptions = qa_admin_permit_options($widest, $narrowest, (!QA_FINAL_EXTERNAL_USERS) && qa_opt('confirm_user_emails'), $dopoints);
  1124. if (count($permitoptions) > 1) {
  1125. qa_optionfield_make_select($optionfield, $permitoptions, $value,
  1126. ($value == QA_PERMIT_CONFIRMED) ? QA_PERMIT_USERS : min(array_keys($permitoptions)));
  1127. } else {
  1128. $optionfield['type'] = 'static';
  1129. $optionfield['value'] = reset($permitoptions);
  1130. }
  1131. break;
  1132. case 'permit_post_q_points':
  1133. case 'permit_post_a_points':
  1134. case 'permit_post_c_points':
  1135. case 'permit_vote_q_points':
  1136. case 'permit_vote_a_points':
  1137. case 'permit_vote_c_points':
  1138. case 'permit_vote_down_points':
  1139. case 'permit_flag_points':
  1140. case 'permit_edit_q_points':
  1141. case 'permit_retag_cat_points':
  1142. case 'permit_edit_a_points':
  1143. case 'permit_edit_c_points':
  1144. case 'permit_close_q_points':
  1145. case 'permit_select_a_points':
  1146. case 'permit_hide_show_points'

Large files files are truncated, but you can click here to view the full file