Hi there, thanks for some awesome tools.
I have made a custom field class for a Widget I’m building. The custom field resides in a plugin based on this sample code: https://github.com/siteorigin/so-dev-examples/blob/develop/extend-widgets-bundle/custom-fields/better-text.class.php. I have followed your documentation and I got the field working as it should, except when I put it inside a repeater. When I put it inside a repeater the indexing of the name-field seems to be incorrect. Instead of a number I get a variable that looks like #products# where products is the name of my repeater. Like so:
widgets[c60][products][#products#][start-date]
What can possibly be the reason for this?
My Custom Field class:
class My_Custom_Date_Time_Picker extends SiteOrigin_Widget_Field_Base { protected function render_field( $value, $instance ) { ?> <input type="date" id="<?php echo $this->element_id ?>" name="<?php echo $this->element_name ?>" value="<?php echo esc_attr( $value ); ?>" /> <?php } protected function sanitize_field_input( $value, $instance ) { $sanitized_value = sanitize_text_field( $value ); return $sanitized_value; } }
My Widget code
class TestWidget extends SiteOrigin_Widget { function __construct() { //Here you can do any preparation required before calling the parent constructor, such as including additional files or initializing variables. //Call the parent constructor with the required arguments. parent::__construct( // The unique id for your widget. 'test', // The name of the widget for display purposes. __('Test', 'jimbo'), // The $widget_options array, which is passed through to WP_Widget. // It has a couple of extras like the optional help URL, which should link to your sites help or support page. array( 'description' => __('A simple test', 'jimbo'), ), //The $control_options array, which is passed through to WP_Widget array( ), //The $form_options array, which describes the form fields used to configure SiteOrigin widgets. We'll explain these in more detail later. array( 'products' => array( 'type' => 'repeater', 'label' => __( 'Products', 'jimbo' ), 'item_name' => __( 'Product (article number)', 'jimbo' ), 'fields' => array( 'start-date' => array( 'type' => 'date-time-picker', 'label' => __( 'Choose a start date', 'jimbo' ) ) ) ) ), //The $base_folder path string. plugin_dir_path(__FILE__) ); } function get_template_name($instance) { return 'test-template'; } function get_style_name($instance) { return ''; } } siteorigin_widget_register('test', __FILE__, 'TestWidget');
Hi Jim
This is actually expected behaviour. If you try using a standard text field, you’ll see it gives the same type of name attribute. The widgets bundle replaces the #products# part of the field’s name attribute using Javascript. Is this not happening for you?
Hi Greg
Yes, the problem for me is that the #products# variable is not being replaced by the repeater index in my HTML.
I don’t get any javascript errors and all the original fields from your plugin is working as expected. Do you have any idea why this might happen?