This repository has been archived on 2023-08-16. You can view files and clone it, but cannot push or open issues or pull requests.
footnotes/classes/admin.php

402 lines
15 KiB
PHP
Raw Permalink Normal View History

<?php
/**
* Created by Stefan Herndler.
* User: Stefan
* Date: 15.05.14
* Time: 16:21
* Version: 1.0.7
* Since: 1.0
*/
// define class only once
if (!class_exists("MCI_Footnotes_Admin")) :
/**
* Class MCI_Footnotes_Admin
* @since 1.0
*/
class MCI_Footnotes_Admin {
// page hook for adding a new sub menu page to the settings
// @since 1.0
private $a_str_Pagehook = null;
// collection of settings values for this plugin
// @since 1.0
private $a_arr_Options = array();
// collection of tabs for the settings page of this plugin
// @since 1.0
private $a_arr_SettingsTabs = array();
// current active tab
public static $a_str_ActiveTab = null;
/**
* @constructor
* @since 1.0
*/
public function __construct() {
// include script and stylesheet functions
require_once(dirname(__FILE__) . "/../includes/wysiwyg-editor.php");
// load setting tabs
add_action('admin_init', array($this, 'Register'));
// register plugin in settings menu
add_action('admin_menu', array($this, 'RegisterMenu'));
}
/**
* register the settings field in the database for the "save" function
* called in class constructor @ admin_init
* @since 1.0
*/
public function Register() {
// register settings
register_setting(FOOTNOTES_SETTINGS_TAB_GENERAL, FOOTNOTES_SETTINGS_CONTAINER);
register_setting(FOOTNOTES_SETTINGS_TAB_CUSTOM, FOOTNOTES_SETTINGS_CONTAINER_CUSTOM);
// load tab 'general'
require_once(dirname( __FILE__ ) . "/tab_general.php");
new MCI_Footnotes_Tab_General($this->a_arr_SettingsTabs);
// load tab 'custom'
require_once(dirname( __FILE__ ) . "/tab_custom.php");
new MCI_Footnotes_Tab_Custom($this->a_arr_SettingsTabs);
// load tab 'how to'
require_once(dirname( __FILE__ ) . "/tab_howto.php");
new MCI_Footnotes_Tab_HowTo($this->a_arr_SettingsTabs);
// load tab 'diagnostics'
require_once(dirname( __FILE__ ) . "/tab_diagnostics.php");
new MCI_Footnotes_Tab_Diagnostics($this->a_arr_SettingsTabs);
}
/**
* sets the plugin's title for the admins settings menu
* called in class constructor @ admin_menu
* @since 1.0
*/
public function RegisterMenu() {
// current user needs the permission to update plugins for further access
if (!current_user_can('update_plugins')) {
return;
}
// Add a new sub menu to the standard Settings panel
$this->a_str_Pagehook = add_options_page(
FOOTNOTES_PLUGIN_PUBLIC_NAME,
FOOTNOTES_PLUGIN_PUBLIC_NAME,
'administrator',
FOOTNOTES_SETTINGS_PAGE_ID,
array($this, 'DisplaySettings')
);
}
/**
* Plugin Options page rendering goes here, checks
* for active tab and replaces key with the related
* settings key. Uses the plugin_options_tabs method
* to render the tabs.
* @since 1.0
*/
public function DisplaySettings() {
// load stylesheets and scripts
$this->LoadScriptsAndStylesheets();
// gets active tab, or if nothing set the "general" tab will be set to active
self::$a_str_ActiveTab = isset($_GET['tab']) ? $_GET['tab'] : FOOTNOTES_SETTINGS_TAB_GENERAL;
// outputs all tabs
echo '<div class="wrap">';
echo '<h2 class="nav-tab-wrapper">';
// iterate through all register tabs
foreach ($this->a_arr_SettingsTabs as $l_str_TabKey => $l_str_TabCaption) {
$l_str_Active = self::$a_str_ActiveTab == $l_str_TabKey ? 'nav-tab-active' : '';
echo '<a class="nav-tab ' . $l_str_Active . '" href="?page=' . FOOTNOTES_SETTINGS_PAGE_ID . '&tab=' . $l_str_TabKey . '">' . $l_str_TabCaption . '</a>';
}
echo '</h2>';
// outputs a form with the content of the current active tab
echo '<form method="post" action="options.php">';
wp_nonce_field('update-options');
settings_fields(self::$a_str_ActiveTab);
// outputs the settings field of the current active tab
do_settings_sections(self::$a_str_ActiveTab);
do_meta_boxes(self::$a_str_ActiveTab, 'main', NULL);
// adds a submit button to the current page
if (self::$a_str_ActiveTab != FOOTNOTES_SETTINGS_TAB_HOWTO && self::$a_str_ActiveTab != FOOTNOTES_SETTINGS_TAB_DIAGNOSTICS) {
submit_button();
}
echo '</form>';
echo '</div>';
// output settings page specific javascript code
$this->OutputJavascript();
}
/**
* register and loads css and javascript files for settings
* @since 1.3
*/
private function LoadScriptsAndStylesheets() {
// register settings stylesheet
wp_register_style('footnote_settings_style', plugins_url('../css/settings.css', __FILE__));
// add settings stylesheet
wp_enqueue_style('footnote_settings_style');
// Needed to allow meta box layout and close functionality
wp_enqueue_script('postbox');
}
/**
* outputs page specific javascript code
* @since 1.0.7
*/
private function OutputJavascript() {
?>
<!-- Needed to allow meta box layout and close functionality. -->
<script type="text/javascript">
jQuery(document).ready(function ($) {
// close postboxes that should be closed
$('.if-js-closed').removeClass('if-js-closed').addClass('closed');
// postboxes setup
postboxes.add_postbox_toggles('<?php echo $this->a_str_Pagehook; ?>');
jQuery('#<?php echo $this->getFieldID(FOOTNOTES_INPUT_PLACEHOLDER_START); ?>').on('change', function() {
var l_int_SelectedIndex = jQuery(this).prop("selectedIndex");
jQuery('#<?php echo $this->getFieldID(FOOTNOTES_INPUT_PLACEHOLDER_END); ?> option:eq(' + l_int_SelectedIndex + ')').prop('selected', true);
footnotes_Display_UserDefined_Placeholders();
});
jQuery('#<?php echo $this->getFieldID(FOOTNOTES_INPUT_PLACEHOLDER_END); ?>').on('change', function() {
var l_int_SelectedIndex = jQuery(this).prop("selectedIndex");
jQuery('#<?php echo $this->getFieldID(FOOTNOTES_INPUT_PLACEHOLDER_START); ?> option:eq(' + l_int_SelectedIndex + ')').prop('selected', true);
footnotes_Display_UserDefined_Placeholders();
});
footnotes_Display_UserDefined_Placeholders();
});
function footnotes_Display_UserDefined_Placeholders() {
if (jQuery('#<?php echo $this->getFieldID(FOOTNOTES_INPUT_PLACEHOLDER_START); ?>').val() == "userdefined") {
jQuery('#<?php echo $this->getFieldID(FOOTNOTES_INPUT_PLACEHOLDER_START_USERDEFINED); ?>').show();
jQuery('#<?php echo $this->getFieldID(FOOTNOTES_INPUT_PLACEHOLDER_END_USERDEFINED); ?>').show();
} else {
jQuery('#<?php echo $this->getFieldID(FOOTNOTES_INPUT_PLACEHOLDER_START_USERDEFINED); ?>').hide();
jQuery('#<?php echo $this->getFieldID(FOOTNOTES_INPUT_PLACEHOLDER_END_USERDEFINED); ?>').hide();
}
}
</script>
<?php
}
/**
* loads specific setting and returns an array with the keys [id, name, value]
* @since 1.0
* @param $p_str_FieldID
* @return array
*/
protected function LoadSetting($p_str_FieldID) {
// loads and filters the settings for this plugin
if (empty($this->a_arr_Options)) {
$this->a_arr_Options = MCI_Footnotes_getOptions(true);
}
$p_arr_Return = array();
$p_arr_Return["id"] = $this->getFieldID($p_str_FieldID);
$p_arr_Return["name"] = $this->getFieldName($p_str_FieldID);
$p_arr_Return["value"] = esc_attr($this->getFieldValue($p_str_FieldID));
return $p_arr_Return;
}
/**
* access settings field by name
* @since 1.0
* @param string $p_str_FieldName
* @return string
*/
protected function getFieldName($p_str_FieldName) {
// general setting
if (MCI_Footnotes_Admin::$a_str_ActiveTab == FOOTNOTES_SETTINGS_TAB_GENERAL) {
return sprintf('%s[%s]', FOOTNOTES_SETTINGS_CONTAINER, $p_str_FieldName);
// custom setting
} else if (MCI_Footnotes_Admin::$a_str_ActiveTab == FOOTNOTES_SETTINGS_TAB_CUSTOM) {
return sprintf('%s[%s]', FOOTNOTES_SETTINGS_CONTAINER_CUSTOM, $p_str_FieldName);
}
// undefined
return sprintf('%s[%s]', FOOTNOTES_SETTINGS_CONTAINER, $p_str_FieldName);
}
/**
* access settings field by id
* @since 1.0
* @param string $p_str_FieldID
* @return string
*/
protected function getFieldID($p_str_FieldID) {
return sprintf( '%s', $p_str_FieldID );
}
/**
* get settings field value
* @since 1.0
* @param string $p_str_Key
* @return string
*/
protected function getFieldValue($p_str_Key) {
return $this->a_arr_Options[$p_str_Key];
}
/**
* outputs a break to have a new line
* @since 1.0.7
*/
public function AddNewline() {
echo '<br/><br/>';
}
/**
* outputs a simple text
* @param string $p_str_Text
* @since 1.1.1
*/
public function AddText($p_str_Text) {
echo '<span>' . $p_str_Text . '</span>';
}
/**
* outputs a simple text with some highlight
* @param string $p_str_Text+
* @return string
* @since 1.1.1
*/
public function Highlight($p_str_Text) {
return '<b>' . $p_str_Text . '</b>';
}
/**
* outputs a label for a specific input/select box
* @param string $p_str_SettingsID
* @param string $p_str_Caption
* @param string $p_str_Styling
* @since 1.0.7
*/
public function AddLabel($p_str_SettingsID, $p_str_Caption, $p_str_Styling = "") {
// add styling tag if styling is set
if (!empty($p_str_Styling)) {
$p_str_Styling = ' style="' . $p_str_Styling . '"';
}
echo '<label for="' . $p_str_SettingsID . '"' . $p_str_Styling . '>' . $p_str_Caption . '</label>';
}
/**
* outputs a input type=text
* @param string $p_str_SettingsID [id of the settings field]
* @param string $p_str_ClassName [css class name]
* @param int $p_str_MaxLength [max length for the input value]
* @param bool $p_bool_Readonly [input is readonly] in version 1.1.1
* @param bool $p_bool_Hidden [input is hidden by default] in version 1.1.2
* @since 1.0-beta
* removed optional parameter for a label in version 1.0.7
*/
public function AddTextbox($p_str_SettingsID, $p_str_ClassName = "", $p_str_MaxLength = 0, $p_bool_Readonly = false, $p_bool_Hidden = false) {
// collect data for given settings field
$l_arr_Data = $this->LoadSetting($p_str_SettingsID);
// if input shall have a css class, add the style tag for it
if (!empty($p_str_ClassName)) {
$p_str_ClassName = 'class="' . $p_str_ClassName . '"';
}
// optional add a max length to the input field
if (!empty($p_str_MaxLength)) {
$p_str_MaxLength = ' maxlength="' . $p_str_MaxLength . '"';
}
if ($p_bool_Readonly) {
$p_bool_Readonly = ' readonly="readonly"';
}
if ($p_bool_Hidden) {
$p_bool_Hidden = ' style="display:none;"';
}
// outputs an input field type TEXT
echo '<input type="text" ' . $p_str_ClassName . $p_str_MaxLength . $p_bool_Readonly . $p_bool_Hidden . ' name="' . $l_arr_Data["name"] . '" id="' . $l_arr_Data["id"] . '" value="' . $l_arr_Data["value"] . '"/>';
}
/**
* outputs a input type=checkbox
* @param string $p_str_SettingsID [id of the settings field]
* @param string $p_str_ClassName [optional css class name]
* @since 1.0-beta
*/
public function AddCheckbox($p_str_SettingsID, $p_str_ClassName = "") {
require_once(dirname(__FILE__) . "/convert.php");
// collect data for given settings field
$l_arr_Data = $this->LoadSetting($p_str_SettingsID);
// if input shall have a css class, add the style tag for it
if (!empty($p_str_ClassName)) {
$p_str_ClassName = 'class="' . $p_str_ClassName . '"';
}
// lookup if the checkbox shall be pre-checked
$l_str_Checked = "";
if (MCI_Footnotes_Convert::toBool($l_arr_Data["value"])) {
$l_str_Checked = 'checked="checked"';
}
// outputs an input field type CHECKBOX
echo sprintf('<input type="checkbox" ' . $p_str_ClassName . ' name="' . $l_arr_Data["name"] . '" id="' . $l_arr_Data["id"] . '" %s/>', $l_str_Checked);
}
/**
* outputs a select box
* @param string $p_str_SettingsID [id of the settings field]
* @param array $p_arr_Options [array with options]
* @param string $p_str_ClassName [optional css class name]
* @since 1.0-beta
*/
public function AddSelect($p_str_SettingsID, $p_arr_Options, $p_str_ClassName = "") {
// collect data for given settings field
$l_arr_Data = $this->LoadSetting($p_str_SettingsID);
// if input shall have a css class, add the style tag for it
if (!empty($p_str_ClassName)) {
$p_str_ClassName = 'class="' . $p_str_ClassName . '"';
}
// select starting tag
$l_str_Output = '<select ' . $p_str_ClassName . ' name="' . $l_arr_Data["name"] . '" id="' . $l_arr_Data["id"] . '">';
// loop through all array keys
foreach ($p_arr_Options as $l_str_Value => $l_str_Caption) {
if (!is_string($l_str_Value)) {
$l_str_Value = (string)$l_str_Value;
}
// add key as option value
$l_str_Output .= '<option value="' . $l_str_Value . '"';
// check if option value is set and has to be pre-selected
if ($l_arr_Data["value"] == $l_str_Value) {
$l_str_Output .= ' selected';
}
// write option caption and close option tag
$l_str_Output .= '>' . $l_str_Caption . '</option>';
}
// close select
$l_str_Output .= '</select>';
// outputs the SELECT field
echo $l_str_Output;
}
/**
* outputs a textarea
* @param string $p_str_SettingsID [id of the settings field]
* @param int $p_int_Rows [amount of rows]
* @param string $p_str_ClassName [css class name]
* @since 1.3
*/
public function AddTextarea($p_str_SettingsID, $p_int_Rows, $p_str_ClassName = "") {
// collect data for given settings field
$l_arr_Data = $this->LoadSetting($p_str_SettingsID);
// if input shall have a css class, add the style tag for it
if (!empty($p_str_ClassName)) {
$p_str_ClassName = 'class="' . $p_str_ClassName . '"';
}
// outputs an input field type TEXT
echo '<textarea ' . $p_str_ClassName . ' name="' . $l_arr_Data["name"] . '" id="' . $l_arr_Data["id"] . '" rows="'.$p_int_Rows.'">' . $l_arr_Data["value"] . '</textarea>';
}
}// class MCI_Footnotes_Admin
endif;