@@ -0,0 +1,148 @@
|
||||
<?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 );
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user