/qa-include/pages/admin/admin-widgets.php
PHP | 346 lines | 239 code | 81 blank | 26 comment | 45 complexity | 4ba5dd50ed886ce151271fe705fd80ef MD5 | raw file
Possible License(s): LGPL-2.1
- <?php
- /*
- Question2Answer by Gideon Greenspan and contributors
- http://www.question2answer.org/
- Description: Controller for admin page for editing widgets
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- More about this license: http://www.question2answer.org/license.php
- */
- if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
- header('Location: ../../../');
- exit;
- }
- require_once QA_INCLUDE_DIR . 'app/admin.php';
- require_once QA_INCLUDE_DIR . 'db/selects.php';
- // Get current list of widgets and determine the state of this admin page
- $widgetid = qa_post_text('edit');
- if (!strlen($widgetid))
- $widgetid = qa_get('edit');
- list($widgets, $pages) = qa_db_select_with_pending(
- qa_db_widgets_selectspec(),
- qa_db_pages_selectspec()
- );
- if (isset($widgetid)) {
- $editwidget = null;
- foreach ($widgets as $widget) {
- if ($widget['widgetid'] == $widgetid)
- $editwidget = $widget;
- }
- } else {
- $editwidget = array('title' => qa_post_text('title'));
- if (!isset($editwidget['title']))
- $editwidget['title'] = qa_get('title');
- }
- $module = qa_load_module('widget', @$editwidget['title']);
- $widgetfound = isset($module);
- // Check admin privileges (do late to allow one DB query)
- if (!qa_admin_check_privileges($qa_content))
- return $qa_content;
- // Define an array of relevant templates we can use
- $templatelangkeys = array(
- 'question' => 'admin/question_pages',
- 'qa' => 'main/recent_qs_as_title',
- 'activity' => 'main/recent_activity_title',
- 'questions' => 'admin/question_lists',
- 'hot' => 'main/hot_qs_title',
- 'unanswered' => 'main/unanswered_qs_title',
- 'tags' => 'main/popular_tags',
- 'categories' => 'misc/browse_categories',
- 'users' => 'main/highest_users',
- 'ask' => 'question/ask_title',
- 'tag' => 'admin/tag_pages',
- 'user' => 'admin/user_pages',
- 'message' => 'misc/private_message_title',
- 'search' => 'main/search_title',
- 'feedback' => 'misc/feedback_title',
- 'login' => 'users/login_title',
- 'register' => 'users/register_title',
- 'account' => 'profile/my_account_title',
- 'favorites' => 'misc/my_favorites_title',
- 'updates' => 'misc/recent_updates_title',
- 'ip' => 'admin/ip_address_pages',
- 'admin' => 'admin/admin_title',
- );
- $templateoptions = array();
- if (isset($module) && method_exists($module, 'allow_template')) {
- foreach ($templatelangkeys as $template => $langkey) {
- if ($module->allow_template($template))
- $templateoptions[$template] = qa_lang_html($langkey);
- }
- if ($module->allow_template('custom')) {
- $pagemodules = qa_load_modules_with('page', 'match_request');
- foreach ($pages as $page) {
- // check if this is a page plugin by fetching all plugin classes and matching requests - currently quite convoluted!
- $isPagePlugin = false;
- foreach ($pagemodules as $pagemodule) {
- if ($pagemodule->match_request($page['tags'])) {
- $isPagePlugin = true;
- }
- }
- if ($isPagePlugin || !($page['flags'] & QA_PAGE_FLAGS_EXTERNAL))
- $templateoptions['custom-' . $page['pageid']] = qa_html($page['title']);
- }
- }
- }
- // Process saving an old or new widget
- $securityexpired = false;
- if (qa_clicked('docancel'))
- qa_redirect('admin/layout');
- elseif (qa_clicked('dosavewidget')) {
- require_once QA_INCLUDE_DIR . 'db/admin.php';
- if (!qa_check_form_security_code('admin/widgets', qa_post_text('code')))
- $securityexpired = true;
- else {
- if (qa_post_text('dodelete')) {
- qa_db_widget_delete($editwidget['widgetid']);
- qa_redirect('admin/layout');
- } else {
- if ($widgetfound) {
- $intitle = qa_post_text('title');
- $inposition = qa_post_text('position');
- $intemplates = array();
- if (qa_post_text('template_all'))
- $intemplates[] = 'all';
- foreach (array_keys($templateoptions) as $template) {
- if (qa_post_text('template_' . $template))
- $intemplates[] = $template;
- }
- $intags = implode(',', $intemplates);
- // Perform appropriate database action
- if (isset($editwidget['widgetid'])) { // changing existing widget
- $widgetid = $editwidget['widgetid'];
- qa_db_widget_set_fields($widgetid, $intags);
- } else
- $widgetid = qa_db_widget_create($intitle, $intags);
- qa_db_widget_move($widgetid, substr($inposition, 0, 2), substr($inposition, 2));
- }
- qa_redirect('admin/layout');
- }
- }
- }
- // Prepare content for theme
- $qa_content = qa_content_prepare();
- $qa_content['title'] = qa_lang_html('admin/admin_title') . ' - ' . qa_lang_html('admin/layout_title');
- $qa_content['error'] = $securityexpired ? qa_lang_html('admin/form_security_expired') : qa_admin_page_error();
- $positionoptions = array();
- $placeoptionhtml = qa_admin_place_options();
- $regioncodes = array(
- 'F' => 'full',
- 'M' => 'main',
- 'S' => 'side',
- );
- foreach ($placeoptionhtml as $place => $optionhtml) {
- $region = $regioncodes[substr($place, 0, 1)];
- $widgetallowed = method_exists($module, 'allow_region') && $module->allow_region($region);
- if ($widgetallowed) {
- foreach ($widgets as $widget) {
- if ($widget['place'] == $place && $widget['title'] == $editwidget['title'] && $widget['widgetid'] !== @$editwidget['widgetid'])
- $widgetallowed = false; // don't allow two instances of same widget in same place
- }
- }
- if ($widgetallowed) {
- $previous = null;
- $passedself = false;
- $maxposition = 0;
- foreach ($widgets as $widget) {
- if ($widget['place'] == $place) {
- $positionhtml = $optionhtml;
- if (isset($previous))
- $positionhtml .= ' - ' . qa_lang_html_sub('admin/after_x', qa_html($passedself ? $widget['title'] : $previous['title']));
- if ($widget['widgetid'] == @$editwidget['widgetid'])
- $passedself = true;
- $maxposition = max($maxposition, $widget['position']);
- $positionoptions[$place . $widget['position']] = $positionhtml;
- $previous = $widget;
- }
- }
- if (!isset($editwidget['widgetid']) || $place != @$editwidget['place']) {
- $positionhtml = $optionhtml;
- if (isset($previous))
- $positionhtml .= ' - ' . qa_lang_html_sub('admin/after_x', $previous['title']);
- $positionoptions[$place . (isset($previous) ? (1 + $maxposition) : 1)] = $positionhtml;
- }
- }
- }
- $positionvalue = @$positionoptions[$editwidget['place'] . $editwidget['position']];
- $qa_content['form'] = array(
- 'tags' => 'method="post" action="' . qa_path_html(qa_request()) . '"',
- 'style' => 'tall',
- 'fields' => array(
- 'title' => array(
- 'label' => qa_lang_html('admin/widget_name') . ' ' . qa_html($editwidget['title']),
- 'type' => 'static',
- 'tight' => true,
- ),
- 'position' => array(
- 'id' => 'position_display',
- 'tags' => 'name="position"',
- 'label' => qa_lang_html('admin/position'),
- 'type' => 'select',
- 'options' => $positionoptions,
- 'value' => $positionvalue,
- ),
- 'delete' => array(
- 'tags' => 'name="dodelete" id="dodelete"',
- 'label' => qa_lang_html('admin/delete_widget_position'),
- 'value' => 0,
- 'type' => 'checkbox',
- ),
- 'all' => array(
- 'id' => 'all_display',
- 'label' => qa_lang_html('admin/widget_all_pages'),
- 'type' => 'checkbox',
- 'tags' => 'name="template_all" id="template_all"',
- 'value' => is_numeric(strpos(',' . @$editwidget['tags'] . ',', ',all,')),
- ),
- 'templates' => array(
- 'id' => 'templates_display',
- 'label' => qa_lang_html('admin/widget_pages_explanation'),
- 'type' => 'custom',
- 'html' => '',
- ),
- ),
- 'buttons' => array(
- 'save' => array(
- 'label' => qa_lang_html(isset($editwidget['widgetid']) ? 'main/save_button' : ('admin/add_widget_button')),
- ),
- 'cancel' => array(
- 'tags' => 'name="docancel"',
- 'label' => qa_lang_html('main/cancel_button'),
- ),
- ),
- 'hidden' => array(
- 'dosavewidget' => '1', // for IE
- 'edit' => @$editwidget['widgetid'],
- 'title' => @$editwidget['title'],
- 'code' => qa_get_form_security_code('admin/widgets'),
- ),
- );
- foreach ($templateoptions as $template => $optionhtml) {
- $qa_content['form']['fields']['templates']['html'] .=
- '<input type="checkbox" name="template_' . qa_html($template) . '"' .
- (is_numeric(strpos(',' . @$editwidget['tags'] . ',', ',' . $template . ',')) ? ' checked' : '') .
- '/> ' . $optionhtml . '<br/>';
- }
- if (isset($editwidget['widgetid'])) {
- qa_set_display_rules($qa_content, array(
- 'templates_display' => '!(dodelete||template_all)',
- 'all_display' => '!dodelete',
- ));
- } else {
- unset($qa_content['form']['fields']['delete']);
- qa_set_display_rules($qa_content, array(
- 'templates_display' => '!template_all',
- ));
- }
- if (!$widgetfound) {
- unset($qa_content['form']['fields']['title']['tight']);
- $qa_content['form']['fields']['title']['error'] = qa_lang_html('admin/widget_not_available');
- unset($qa_content['form']['fields']['position']);
- unset($qa_content['form']['fields']['all']);
- unset($qa_content['form']['fields']['templates']);
- if (!isset($editwidget['widgetid']))
- unset($qa_content['form']['buttons']['save']);
- } elseif (!count($positionoptions)) {
- unset($qa_content['form']['fields']['title']['tight']);
- $qa_content['form']['fields']['title']['error'] = qa_lang_html('admin/widget_no_positions');
- unset($qa_content['form']['fields']['position']);
- unset($qa_content['form']['fields']['all']);
- unset($qa_content['form']['fields']['templates']);
- unset($qa_content['form']['buttons']['save']);
- }
- $qa_content['navigation']['sub'] = qa_admin_sub_navigation();
- return $qa_content;