Как переопределить существующее поле в Siteorigin? - PullRequest
0 голосов
/ 23 мая 2018

Я хочу создать настраиваемое поле для существующего типа поля color, по умолчанию из комплекта виджетов Siteorigin.По сути, то, что мне нужно для создания собственного пользовательского интерфейса и внутренней логики для типа поля color.

Поскольку это поле используется во многих местах, если бы я мог переопределить тип поля напрямую, он будет автоматически работать в каждомplace.

Я искал много раз, а также копался в исходном коде комплекта виджетов и самого SO, но не смог найти то, что мне было нужно, даже пытался загрузить папку с полями с приоритетом 0 (наивысший) но не работал.Он по-прежнему отображает тип цветового поля по умолчанию.

Кто-нибудь может указать мне на некоторые действия или фильтры, чтобы я мог отменить регистрацию и повторно зарегистрироваться с тем же типом color?Или, если возможно, какой-нибудь другой обходной путь?


ОБНОВЛЕНИЕ

Мой вопрос направлен на Плагин пакета виджетов Siteorigin .

Я не хочучтобы просто переопределить любые переменные стиля, скорее хотите переопределить существующие поля.После некоторых исследований я обнаружил 2 фильтра, которые можно использовать для переопределения существующих полей:

// Give other plugins a way to modify this form.
$form_options = apply_filters( 'siteorigin_widgets_form_options', $form_options, $this );
$form_options = apply_filters( 'siteorigin_widgets_form_options_' . $this->id_base, $form_options, $this );

Два фильтра вызываются в методе form_options() в классе SiteOrigin_Widget, но этот метод называется какthis:

public function form( $instance, $form_type = 'widget' ) {

    if( $form_type == 'widget' ) {
        if( empty( $this->form_options ) ) {
            $this->form_options = $this->form_options();
        }
        $form_options = $this->form_options;
    }

...
...

}

Но похоже, что $this->form_options никогда не бывает пустым, и поэтому никогда не вызывается метод $this->form_options(), который, в свою очередь, никогда не применяет фильтры siteorigin_widgets_form_options и siteorigin_widgets_form_options_<id_base>

* 1033.* И, таким образом, мой шанс изменить поля формы при таком подходе становится равным zero.

Что мне, в основном, нужно, например, для.есть существующее поле color, а у меня есть другое настраиваемое поле adv-color.Теперь задача состоит в том, чтобы переопределить весь экземпляр поля color на adv-color, и, таким образом, каждый экземпляр поля будет переопределен.Но это все еще надежда.

Пожалуйста, дайте мне знать, если мой подход неверен или есть другой способ решить эту проблему.Пример (ы) очень ожидаем.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Кто-нибудь может указать мне на некоторые действия или фильтры, чтобы я мог отменить регистрацию и перерегистрацию с тем же типом color?Или если возможен какой-либо другой обходной путь?

Я не вижу способа отменить регистрацию и перерегистрацию поля color type (или generator).

Однако, если вы хотите настроить UI поля (или даже полностью изменить его внешний вид), вы можете создать PHP class, который расширяет один из этих class es:SiteOrigin_Widget_Field_Base, SiteOrigin_Widget_Field_Text_Input_Base или SiteOrigin_Widget_Field_Color.См. Простой пример ниже:

// File: class-my-siteorigin-widget-field-color.php
class My_SiteOrigin_Widget_Field_Color extends SiteOrigin_Widget_Field_Color {

    public function enqueue_scripts() {
        // Enqueues custom CSS and/or JS files, if any.

        wp_enqueue_script( 'my-script', 'path/to/file.js', [ 'jquery' ], '20180601' );
        wp_enqueue_style( 'my-custom-stylesheet', 'path/to/file.css', [], '20180601' );
    }

    // Here you can modify the field's UI to your liking. Even a totally new UI.
    protected function render_field( $value, $instance ) {
        ?>
        <b>Text before</b>
        <input type="<?php echo esc_attr( $this->input_type ) ?>"
               name="<?php echo esc_attr( $this->element_name ) ?>"
               id="<?php echo esc_attr( $this->element_id ) ?>"
                 value="<?php echo esc_attr( $value ) ?>"
                 <?php $this->render_data_attributes( $this->get_input_data_attributes() ) ?>
                 <?php $this->render_CSS_classes( $this->get_input_classes() ) ?>
            <?php if ( ! empty( $this->placeholder ) ) echo 'placeholder="' . esc_attr( $this->placeholder ) . '"' ?>
            <?php if( ! empty( $this->readonly ) ) echo 'readonly' ?> />
        <i>Text after</i>
        <?php
    }

    // See `SiteOrigin_Widget_Field_Base` for all the properties and methods you
    // can extend. See also `SiteOrigin_Widget_Field_Text_Input_Base`, which is
    // being extended by `SiteOrigin_Widget_Field_Color`.
}

Затем вы должны загрузить class in / во время ловушки init в WordPress. Пример:

add_action( 'init', function(){
    require_once __DIR__ . '/includes/class-my-siteorigin-widget-field-color.php';
} );

И затем, чтобы заставить color поля использовать пользовательский class (выше), добавьте префикс class name на $prefixes array ниже:

add_filter( 'siteorigin_widgets_field_class_prefixes', function( $prefixes ){
    return array_merge( [ 'My_SiteOrigin_Widget_Field_' ], $prefixes );
} );

К сожалению, вы не можете unset или удалить SiteOrigin_Widget_Field_Color из списка class, потому что вышеупомянутый фильтр позволяет фильтровать толькоclass name prefixes .

Но в приведенном выше примере обратного вызова пользовательский My_SiteOrigin_Widget_Field_Color сначала будет "виден" плагином SiteOrigin Widgets Bundle;следовательно, color поля будут использовать пользовательские class вместо поля по умолчанию - то есть SiteOrigin_Widget_Field_Color.

Подробнее об этом см. SiteOrigin_Widget_Field_Factory::get_class_prefixes() и всеSiteOrigin_Widget_Field_Factory исходный код.И SiteOrigin_Widget::form().

См. Также:

ОБНОВЛЕНИЕ

Но похоже, что $this->form_options никогда не бывает пустым, и поэтому никогда не вызывается метод $this->form_options(), который, в свою очередь, никогда не применяет фильтры siteorigin_widgets_form_options и siteorigin_widgets_form_options_<id_base>

* 1096.* И, таким образом, мой шанс изменить поля формы при таком подходе становится равным
zero.

Следующий пример может вам помочь: (или, скорее, он работал хорошо для меня)

// Extends the fields for the Button widget.
// @see SiteOrigin_Widget_Button_Widget::get_widget_form()
// @see SiteOrigin_Widget::form_options()
add_filter( 'siteorigin_widgets_form_options_sow-button', function( $form_options, $widget ){
    if ( isset( $form_options['button_icon'] ) ) {
        // `icon_color` is an existing/built-in field for the Button widget. So
        // in this example, we change the `label` from 'Icon color' to 'Icon
        // default color'.
        $form_options['button_icon']['fields']['icon_color']['label'] = 'Icon default color';

        // Or you could completely override the field:
        /*
        $form_options['button_icon']['fields']['icon_color'] = [
            'type'  => 'custom_type_here',
            'label' => 'Icon color',
        ];
        */

        // And here, we add a new field: A color for the button's `hover` state.
        $form_options['button_icon']['fields']['icon_hover_color'] = [
            'type'  => 'color',
            'label' => 'Icon hover color',
        ];
    }

    return $form_options;
}, 10, 2 );

// Callback to handle the `icon_hover_color`.
add_action( 'siteorigin_widgets_after_widget_sow-button', function( $instance, $widget ){
    if ( isset( $instance['button_icon'], $instance['button_icon']['icon_hover_color'] ) ) {
        $selector = $widget->is_preview( $instance ) ?
            '.so-widget-sow-button' : '#' . $widget->id;
        ?>
            <style>
                <?= $selector ?> a:hover .sow-icon-fontawesome {
                    color: <?= $instance['button_icon']['icon_hover_color'] ?> !important;
                }
            </style>
        <?php
    }
}, 10, 2 );

Однако, даже если вы установите для полей color другие type (например, adv_color), вам все равно придется создать соответствующий PHP class, а затем добавить class имя префикс через siteorigin_widgets_field_class_prefixes хук.

0 голосов
/ 26 мая 2018

(ПРИМЕЧАНИЕ. Этот ответ для вопроса , который был задан изначально . Вопрос был изменен после публикации этого ответа, поэтому приведенный ниже ответ может показаться неправильным ответом на вопрос вэто текущее состояние.)

Пакет виджетов SiteOrigin поставляется с широким спектром виджетов.

Каждый виджет компилирует свой собственный CSS, используя LESS переменные.

Поскольку вы можете явно изменять цвет (цвета) для каждого виджета, эти переменные сохраняются в базе данных и извлекаются индивидуально для каждого отдельного виджета, а затем компилируются в специфичные для виджета файлы CSS.Это происходит при «сохранении» виджета, и CSS кэшируется на 7 дней.

Чтобы переопределить переменные для этих виджетов, у вас есть несколько различных фильтров на выбор (см. siteorigin-widget.class.php файл плагина, метод get_instance_css, начиная со строки 816, чтобы увидеть код, который делает это).К вашему сведению, вы захотите сделать это на этом уровне, поскольку это «базовый» класс для всех отдельных виджетов.

Фильтр 1:

$vars = apply_filters( 'siteorigin_widgets_less_variables_' . $this->id_base, $this->get_less_variables( $instance ), $instance, $this );

Это было бы идеальное место, потому что $vars - это массив всех определенных цветов, и вы можете легко переопределить любой из них, который вам нравится. Однако , проблема в том, что этот фильтр будет трудно использовать, так как он запекает в id_base виджета, что приводит к тегам фильтра, подобным siteorigin_widgets_less_variables_sow-accordion - однако, вы могли бы теоретически настроитьдлинный список фильтров, по одному для каждого виджета, которые выполняются через одну и ту же функцию.

Фильтр 2:
Вскоре после этого есть фильтр, однако переменные LESS имеютуже «записано» в LESS:

$less = apply_filters( 'siteorigin_widgets_styles', $less, $this->widget_class, $instance );

Это фильтр, который нужно использовать, но вам нужно знать имена переменных LESS, которые вы хотите заменить.Этот список (по крайней мере, некоторые из них):

$vars = ‌array (
  'heading_background_color'       => '',
  'heading_background_hover_color' => '',
  'title_color'                    => '',
  'title_hover_color'              => '',
  'heading_border_color'           => '',
  'heading_border_hover_color'     => '',
  'heading_border_width'           => '',
  'has_heading_border_width'       => '',
  'panels_background_color'        => '',
  'panels_font_color'              => '',
  'panels_border_color'            => '',
  'panels_border_width'            => '',
  'has_panels_border_width'        => '',
  'panels_margin_bottom'           => '',
}

Построение решения:
Вооружившись этой информацией, мы можем применять фильтры следующим образом:

function my_siteorigin_override_less( $less ) {
    // you'll need to load your override colors here.  that is outside the scope of this question / answer
    $my_colors = array(
      'heading_background_color'       => '#fff',
      'heading_background_hover_color' => '#ff0',
      'title_color'                    => '#000'
      // any other colors you want to include / override....
    );

    foreach( $my_colors as $name => $value ) {
        // Ignore empty string, false and null values (but keep '0')
        if( ! empty( $value ) ) {
            $less = preg_replace('/\@'.preg_quote($name).' *\:.*?;/', '@'.$name.': '.$value.';', $less);
        }
    }

    return $less;
}

add_filter( 'siteorigin_widgets_styles', 'my_siteorigin_override_less' );

Приведенный выше код протестирован и доказал свою работоспособность.

Примечания:
SiteOrigin "кэширует" CSS, который он создает в течение 7 дней.Это означает, что если у вас уже установлены виджеты и вы измените цвет по умолчанию, изменения не будут отражены, пока кэш не будет очищен каким-либо образом.

В коде SiteOrigin есть служебный метод, который вы можете использовать«очистить» кеш, когда вам нужно.Я бы порекомендовал вам сделать что-то вроде ниже в любое время цвета по умолчанию сохранены / обновлены:

if ( is_callable( 'SiteOrigin_Widget', 'clear_file_cache' ) ) {
    // pass TRUE to force delete
    SiteOrigin_Widget::clear_file_cache( TRUE );
}
...