Files
wordpress-preseed/wp-content/plugins/all-in-one-event-calendar/lib/html/element/setting/select.php
Adrian Nöthlich 290736650a Add upstream plugins
Signed-off-by: Adrian Nöthlich <git@promasu.tech>
2019-10-25 22:42:20 +02:00

149 lines
4.9 KiB
PHP

<?php
/**
* Renderer of settings page select option.
*
* @author Time.ly Network, Inc.
* @instantiator new
* @since 2.0
* @package Ai1EC
* @subpackage Ai1EC.Html
*/
class Ai1ec_Html_Setting_Select extends Ai1ec_Html_Element_Settings {
/* (non-PHPdoc)
* @see Ai1ec_Html_Element_Settings::render()
*/
public function render( $output = '', $wrap = true, $hidden = false ) {
$options = $this->_args['renderer']['options'];
if ( ! is_array( $options ) ) {
$callback = explode( ':', $options );
if ( ! isset( $callback[1] ) ) {
$options = $this->{$options}();
} else {
$value = $this->_args['value'];
if( false === is_array( $this->_args['value'] ) ){
$value = array( $this->_args['value'] );
}
try {
$options = $this->_registry->dispatch(
$callback[0],
$callback[1]
);
} catch (Ai1ec_Bootstrap_Exception $exc) {
return '';
}
}
}
$options = apply_filters( 'ai1ec_settings_select_options' , $options, $this->_args['id'] );
$fieldsets = array();
foreach ( $options as $key => &$option ) {
// if the key is a string, it's an optgroup
if ( is_string( $key ) ) {
foreach ( $option as &$opt ) {
$opt = $this->_set_selected_value( $opt );
}
} else {
$option = $this->_set_selected_value( $option );
if ( isset( $option['settings'] ) ) {
$fieldsets[] = $this->_render_fieldset(
$option['settings'],
$option['value'],
$this->_args['id'],
isset( $option['args']['selected'] )
);
}
}
}
$select_args = array();
$args = array(
'id' => $this->_args['id'],
'label' => $this->_args['renderer']['label'],
'attributes' => $select_args,
'options' => $options,
'fieldsets' => $fieldsets,
);
$loader = $this->_registry->get( 'theme.loader' );
$file = $loader->get_file( 'setting/select.twig', $args, true );
return parent::render( $file->get_content(), $wrap, $hidden );
}
/**
* Toggle `selected` attribute according to current selection.
*
* @param array $option Option being checked.
*
* @return array Optionally modified option entry.
*/
protected function _set_selected_value( array $option ) {
if ( $option['value'] === $this->_args['value'] ) {
$option['args'] = array(
'selected' => 'selected',
);
}
return $option;
}
/**
* Gets the options for the "Starting day of week" select.
*
* @return array
*/
protected function get_weekdays() {
$locale = $this->_registry->get( 'p28n.wpml' );
$options = array();
for ( $day_index = 0; $day_index <= 6; $day_index++ ) {
$option = array(
'text' => $locale->get_weekday( $day_index ),
'value' => $day_index,
);
$options[] = $option;
}
return $options;
}
/**
* Renders fieldset with options for selected item.
*
* @param array $settings Settings structure.
* @param string $parent_id Option value from parent Html select element.
* @param string $select_id Html Select element id.
* @param bool $visible Whether fieldset is visible or not.
*
* @return string Html content.
*
* @throws Ai1ec_Bootstrap_Exception
*/
protected function _render_fieldset(
array $settings,
$parent_id,
$select_id,
$visible = false
) {
$setting_renderer = $this->_registry->get(
'html.element.setting-renderer'
);
$global_settings = $this->_registry->get(
'model.settings'
);
$content = '';
foreach ( $settings as $id => $setting ) {
$setting['id'] = $id;
// fetch value from real setting as this one is some kind of
// mockup.
$setting['value'] = $global_settings->get( $id );
$content .= $setting_renderer->render( $setting );
}
$args = array(
'parent_id' => $parent_id,
'contents' => $content,
'select_id' => $select_id,
'visible' => $visible,
);
$loader = $this->_registry->get( 'theme.loader' );
$file = $loader->get_file( 'setting/select-fieldsets.twig', $args, true );
return parent::render( $file->get_content(), false );
}
}