396 lines
14 KiB
PHP
396 lines
14 KiB
PHP
|
<?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);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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) {
|
||
|
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) {
|
||
|
// 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;
|