* @license BSD
*/
class Settings_API_Util {
const ICON_THEMES = 'icon-themes';
const ICON_COMMENTS = 'icon-edit-comments';
const ICON_INDEX = 'icon-index';
const ICON_LINKS = 'icon-link-manager';
const ICON_UPLOAD = 'icon-upload';
const ICON_PAGES = 'icon-edit-pages';
const ICON_PLUGIN = 'icon-plugins';
const ICON_TOOLS = 'icon-tools';
const ICON_SETTINGS = 'icon-options-general';
const ICON_POSTS = 'icon-edit';
const ICON_USERS = 'icon-users';
public $id;
public $optionName;
public $values;
private $sections;
public $introHTML;
/**
* Fetch/create a form object with the given ID
* @staticvar SN_Tracker_Admin $instance Stores Singleton instances
* @param string $id Form ID
* @param string $optionName Name to store settings under in the WordPress wp_options table. Defaults to $id.
* @return SN_Tracker_Admin instance
*/
public static function forID($id, $optionName = null, $rest=null) {
if(null === $optionName) {
$optionName = $id;
}
static $instances;
if(!isset($instances)) {
$instances = array();
}
if(!isset($instances[$id])) {
$instances[$id] = new Settings_API_Util($id, $optionName);
}
return $instances[$id];
}
private function __construct($id, $optionName) {
$this->id = $id;
$this->optionName = $optionName;
$this->sections = array();
$this->introHTML = '';
$this->outroHTML = '';
register_setting( $id, $optionName, array(__CLASS__, 'validate'));
$this->values = get_option($optionName);
}
/**
* Basic form validation/sanitization
* @param array $input
* @return array validated/filtered input
*/
public static function validate(array $input) {
$output = array();
foreach($input as $key=>$value) {
$output[$key] = trim($value);
}
return $output;
}
/**
* Render a standard WordPress settings form
* @param type $title Settings page title
* @param type $icon Settings_API_Util::ICON_* constant
* @todo Get HTML out of this PHP code
*/
public function renderBasicForm($title, $icon) {
if (MULTISITE && is_network_admin()) {
$url = "edit.php?action=" . $this->id;
} else {
$url="options.php";
}
echo '
';
echo '
';
echo '
'.$title.'
';
if(!empty($this->introHTML)) {
echo '
' . $this->introHTML . '
';
}
echo '
';
echo '
' . $this->outroHTML . '
';
echo '
';
}
/**
* Add a new setting to this form
* @param type $id
* @param type $title
* @param type $sectionHeadCallback
* @return Settings_API_Util_Section
*/
public function addSection($id, $title, $sectionHeadCallback = null) {
$section = new Settings_API_Util_Section($this, $id, $title, $sectionHeadCallback);
$this->sections[$id] = $section;
return $section;
}
/**
* Retrieve an existing section with the given ID
* @param string $id
* @return Settings_API_Util_Section
*/
public function getSection($id) {
return $this->sections[$id];
}
}
class Settings_API_Util_Section {
public $settings;
public $id;
public $title;
private $fields;
function __construct($settings, $id, $title, $sectionHeadCallback = null) {
if($sectionHeadCallback === null) {
$sectionHeadCallback = array(__CLASS__, 'renderEmptySectionHead');
}
$this->settings = $settings;
$this->id = $id;
$this->title = $title;
$this->fields = array();
add_settings_section($id, $title, $sectionHeadCallback, $settings->id);
}
/**
*
* @param string $id
* @param string $title
* @param string $type Settings_API_Util_Field::TYPE_* constant
* @param string $defaultValue
* @return Settings_API_Util_Field
*/
public function addField($id, $title, $type, $defaultValue = null, $additionalArgs = null) {
$field = new Settings_API_Util_Field($this, $id, $title, $type, $defaultValue, $additionalArgs);
$this->fields[$id] = $field;
return $field;
}
/**
* Retrieve an existing field with the given ID
* @param string $id
* @return Settings_API_Util_Field
*/
public function getField($id) {
return $this->fields[$id];
}
/**
* Default callback for rendering the section heading
*/
public static function renderEmptySectionHead() { echo ''; }
}
class Settings_API_Util_Field {
const TYPE_TEXTFIELD = 'textfield';
const TYPE_TEXTAREA = 'textarea';
const TYPE_CHECKBOX = 'checkbox';
const TYPE_RADIO = 'radio';
const TYPE_SELECT = 'select';
const TYPE_HIDDEN = 'hidden';
public $section;
function __construct($section, $id, $title, $type, $defaultValue, $additionalArgs) {
$this->section = $section;
$this->name = $id;
$this->optionID = $section->id.'_'.$id;
$this->defaultValue = $defaultValue;
$this->type = $type;
$values = array(
'id' =>$section->settings->optionName.'_'.$this->optionID,
'name' => $section->settings->optionName.'['.$this->optionID.']',
);
if (isset($this->section->settings->values[$this->optionID])) {
$values['value'] = $this->section->settings->values[$this->optionID];
}
else {
$values['value'] = $defaultValue;
}
if ($additionalArgs) {
$values = array_merge($values, $additionalArgs);
}
$this->values = $values;
add_settings_field($section->id.'_'.$id, __( $title, 'clef' ), array(__CLASS__, $type), $section->settings->id, $section->id, $values);
}
function render($opts = array()) {
call_user_func(array(__CLASS__, $this->type), array_merge($opts, $this->values));
}
///////////////////
// Field renderers
///////////////////
/**
* Textfield
* @param array $options
*/
public static function textfield(array $options) {
if (!isset($options['placeholder'])) $options['placeholder'] = '';
ob_start();
do_action('settings_api_util_pre_textfield');
echo "";
do_action('settings_api_util_after_textfield');
$html = ob_get_contents();
ob_end_clean();
apply_filters('settings_api_util_textfield', $html);
echo $html;
}
/**
* Textarea
* @param array $options
*/
public static function textarea(array $options) {
ob_start();
do_action('settings_api_util_pre_textarea');
echo "";
do_action('settings_api_util_after_textarea');
$html = ob_get_contents();
ob_end_clean();
apply_filters('settings_api_util_textarea', $html);
echo $html;
}
/**
* Checkbox
* @param array $options
*/
public static function checkbox(array $options) {
ob_start();
do_action('settings_api_util_pre_checkbox');
if($options['value']) {
echo "";
} else {
echo "";
}
do_action('settings_api_util_after_checkbox');
$html = ob_get_contents();
ob_end_clean();
apply_filters('settings_api_util_checkbox', $html);
echo $html;
}
/**
* Radio
* @param array $options
*/
public static function radio(array $options) {
ob_start();
do_action('settings_api_util_pre_radio');
echo "";
do_action('settings_api_util_after_radio');
$html = ob_get_contents();
ob_end_clean();
apply_filters('settings_api_util_radio', $html);
echo $html;
}
/**
* Select
* @param array $options
*/
public static function select(array $options) {
ob_start();
do_action('settings_api_util_pre_select');
echo "";
do_action('settings_api_util_after_select');
$html = ob_get_contents();
ob_end_clean();
apply_filters('settings_api_util_select', $html);
echo $html;
}
/**
* Hidden
* @param array $options
*/
public static function hidden(array $options) {
ob_start();
do_action('settings_api_util_pre_hidden');
echo "";
do_action('settings_api_util_after_hidden');
$html = ob_get_contents();
ob_end_clean();
apply_filters('settings_api_util_hidden', $html);
echo $html;
}
}
}
?>