PageRenderTime 46ms CodeModel.GetById 33ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://github.com/begriffs/nomnom
PHP | 1648 lines | 1248 code | 362 blank | 38 comment | 137 complexity | 5c344c02cb71589808335d0ed5175230 MD5 | raw file

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

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

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