With the help of FSQM’s built in APIs, it is possible to create and store custom settings variables for individual forms. Please check the snippet below to get started.
Snippet
<?php class FSQM_Add_Custom_Settings { /** * Reference to IPT_FSQM_Form_Elements_Admin object * This is stored during settings filter */ public $that; /** * Constructor * It essentially adds all the necessary filters */ public function __construct() { // Add the filters add_filter( 'ipt_fsqm_filter_default_settings', array( $this, 'add_settings_variable' ), 10 ); add_filter( 'ipt_fsqm_admin_tab_settings', array( $this, 'add_settings_admin_ui' ), 10, 2 ); } /** * Add our custom variables to the default FSQM settings * * @param array $settings Associative array of settings * * @return array */ public function add_settings_variable( $settings ) { // Let us add some variables to the default settings // For this demo we would add an associative array $settings['custom'] = array( 'options' => array( 'bool' => true, 'singleop' => 'op1', // For radio input 'multipleop' => array(), // Whenever adding checkbox related options, always add an empty array. This is just how FSQM backend works // You can look into IPT_FSQM_Form_Elements_Base::merge_elements and you'd understand why ), 'inputs' => array( 'oneliner' => 'This is some text', 'multiliner' => "This is some more\r\nWith multiple line", ), ); return $settings; } /** * Filter settings tab variable to add our own tab * * @param array $tab_settings Associative array of tab variables * @param object $context Reference to the calling IPT_FSQM_Form_Elements_Admin variable * * @return array */ public function add_settings_admin_ui( $tab_settings, $context ) { // First we add a new tab // to provide UI in order to manage our settings variables $tab_settings[] = array( 'id' => 'ipt_fsqm_form_custom', // HTML ID of the tab 'label' => __( 'Custom Settings', 'domain' ), // Label of the tab 'callback' => array( $this, 'settings_admin_ui_cb' ), // Callback function to populate TAB UI 'has_inner_tab' => true, // If is has vertical tabs inside it // For this this demo, we say yes" ); // Store the reference to the object $this->that = $context; return $tab_settings; } public function settings_admin_ui_cb() { // Now let us create two new horizontal tabs // Each one of them would edit settings for a set inside our new settings vairable $hor_tabs = array(); $hor_tabs[] = array( 'id' => 'ipt_fsqm_form_custom_options', 'label' => __( 'Selectables', 'domain' ), 'callback' => array( $this, 'settings_options' ), ); $hor_tabs[] = array( 'id' => 'ipt_fsqm_form_custom_inputs', 'label' => __( 'Writables', 'domain' ), 'callback' => array( $this, 'settings_inputs' ), ); // Call the builtin UI element // @see IPT_Plugin_UIF_Admin $this->that->ui->tabs( $hor_tabs, false, true ); } public function settings_options() { // Get our options variables $op = $this->that->settings['custom']['options']; // Set the radio/checkbox items $items = array( 0 => array( 'value' => 'op1', 'label' => __( 'Option 1' ), ), 1 => array( 'value' => 'op2', 'label' => __( 'Option 2' ), ), 2 => array( 'value' => 'op3', 'label' => __( 'Option 3' ), ), 3 => array( 'value' => 'op4', 'label' => __( 'Option 4' ), ), ); // 'options' => array( // 'bool' => true, // 'singleop' => 'op1', // For radio input // 'multipleop' => array(), // Whenever adding checkbox related options, always add an empty array. This is just how FSQM backend works // // You can look into IPT_FSQM_Form_Elements_Base::merge_elements and you'd understand why // ), // Now populate the table ?> <table class="form-table"> <tbody> <tr> <th><?php $this->that->ui->generate_label( 'settings[custom][options][bool]', __( 'Toggle Element', 'domain' ) ); ?></th> <td> <?php $this->that->ui->toggle( 'settings[custom][options][bool]', __( 'Yes', 'domain' ), __( 'No', 'domain' ), $op['bool'] ); ?> </td> <td> <?php $this->that->ui->help( __( 'Some inline help', 'domain' ) ); ?> </td> </tr> <tr> <th><?php $this->that->ui->generate_label( 'settings[custom][options][singleop]', __( 'Radio Element', 'domain' ) ); ?></th> <td> <?php $this->that->ui->radios( 'settings[custom][options][singleop]', $items, $op['singleop'] ); ?> </td> <td> <?php $this->that->ui->help( __( 'Some inline help', 'domain' ) ); ?> </td> </tr> <tr> <th><?php $this->that->ui->generate_label( 'settings[custom][options][multipleop]', __( 'Checkbox Element', 'domain' ) ); ?></th> <td> <?php $this->that->ui->checkboxes( 'settings[custom][options][multipleop][]', $items, $op['multipleop'] ); ?> </td> <td> <?php $this->that->ui->help( __( 'Some inline help', 'domain' ) ); ?> </td> </tr> </tbody> </table> <?php } public function settings_inputs() { // Get our settings $op = $this->that->settings['custom']['inputs']; // Now populate the table // 'inputs' => array( // 'oneliner' => 'This is some text', // 'multiliner' => "This is some more\r\nWith multiple line", // ), ?> <table class="form-table"> <tbody> <tr> <th><?php $this->that->ui->generate_label( 'settings[custom][inputs][oneliner]', __( 'Oneline Input', 'domain' ) ); ?></th> <td> <?php $this->that->ui->text( 'settings[custom][inputs][oneliner]', $op['oneliner'], __( 'Write here', 'domain' ) ); ?> </td> <td> <?php $this->that->ui->help( __( 'Some inline help', 'domain' ) ); ?> </td> </tr> <tr> <th><?php $this->that->ui->generate_label( 'settings[custom][inputs][multiliner]', __( 'Multiline Input', 'domain' ) ); ?></th> <td> <?php $this->that->ui->textarea( 'settings[custom][inputs][multiliner]', $op['multiliner'], __( 'Write here', 'domain' ) ); ?> </td> <td> <?php $this->that->ui->help( __( 'Some inline help', 'domain' ) ); ?> </td> </tr> </tbody> </table> <?php } } $mycustom_settings = new FSQM_Add_Custom_Settings();
Output
The snippet above, when inserted properly in your plugin, would generate the following output.
Populated Horizontal tab with options elements
Populated Horizontal tab with input elements