Домой Wp-Recall WP-Recall: Предложения и идеи Добавление полей в форму публикации
15ответ(ов) в теме
Preci
не в сети 3 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1598
1
17:54
Версия WP-Recall: 16.23

Задача:

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

Сейчас если создать дефолтное поле и присвоить ему в values список пользователей, то этот список фиксируется таким, каким он был на момент добавления в конструктор формы и если пользователи были удалены / добавлены - в форме публикации это никак не отразится.

Из-за чего приходится добавлять это поле в дефолтные как тип custom

А затем через фильтр rcl_public_form_fields перед выводом фильтровать все поля, искать наше и редактировать его

$fields[$key]['type'] = 'select';
$fields[$key]['empty-first'] = 'Не выбрано';
$fields[$key]['values'] = $select_users;

Было бы, конечно, в сто раз удобнее если бы достаточно было 1 раз добавить поле, без дополнительных манипуляций

0
Андрей CS
не в сети 2 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16344
2
17:59

может быть указывать какой то callback в массиве поля, который будет формировать его значения?

0
Preci
не в сети 3 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1598
3
18:08

Ну получается тут 2 варианта решения:

1. Добавлять callback
2. Пробовать как-то добавлять поля в редактор форм, которые добавлены через фильтр rcl_public_form_fields

Главная цель что бы значения были динамические и поле было в редакторе, чтобы можно было его в любое место поместить.

С callback то же проблема может возникнуть:

Например на сайте 1000 пользователей и выбор формируется из 500.

Тогда, с callback, вероятно, в админке в редакторе форм при раскрытии этого поля будет показываться 500 значений. А если не показывать значения для полей с callback, то может какие проблемы всплывут?

0
Андрей CS
не в сети 2 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16344
4
18:22

Я вижу лучшим решением работать с атрибутом callback у поля, в менеджере полей его не вызывать, чтобы там значению не генерились. Поле с пустым значением value вполне может находится в менеджере, никаких проблем быть не должно.
У полей разных типов значения могут находится в values или в value, поэтому предлагаю callback вешать на атрибут default, который подменяет значения поля, если они пустые, этот атрибут одинаков для всех типов, должен подойти.
Но надо продумать еще все.

0
Preci
не в сети 3 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1598
5
18:36

А как отличать что в default именно callback? Если по function_exists то будет проблема:

Если в default например указано 'reset' - то в php есть такая функция.

0
Андрей CS
не в сети 2 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16344
6
18:58

не, предлагают отдельный параметр callback и уже в него складывать нужные данные для инициализации функции

0
Preci
не в сети 3 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1598
7
20:25

Еще вот с чем столкнулся:

Создаем дефолтное поле, но при этом value_in_key не работает - значение все равно не из ключа берется.
Видимо из-за того что поле сбрасывает ключи при сохранении на странице редактирования формы публикации.

add_filter('rcl_default_public_form_fields', 'rcl_test_field_asdbasjdhabdj', 10, 2);

function rcl_test_field_asdbasjdhabdj($fields, $post_type) {

  $fields[] = array(
	  'type' => 'select',
	  'title' => 'Тестовое поле',
	  'value_in_key' => true,
	  'slug' => 'test_field',
	  'values' => array('slug1' => 'Слаг 1', 'slug2' => 'Слаг 2'),
	  'required' => 1
  );

  return $fields;

}

Пытаюсь пофиксить фильтром полей перед выводом. Но помогает только если вписать

$fields[$k]['value_in_key'] = false;

Если писать

$fields[$k]['value_in_key'] = true;

То значение не из ключа берется


add_filter('rcl_public_form_fields', 'rcl_test_field_asdbasjdhabdj_filter', 10, 2);

function rcl_test_field_asdbasjdhabdj_filter($fields, $post) {

  foreach ($fields as $k => $field) {
	if ($field['slug'] == 'test_field') {
	  $fields[$k]['values'] = array('slug1' => 'Слаг 1', 'slug2' => 'Слаг 2');
	  $fields[$k]['value_in_key'] = false;
	}
  }

  return $fields;

}

0
Preci
не в сети 3 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1598
8
20:31

т.е. опять упирается в то, что если хочется создать поле которому можно менять положение перетаскиванием в редактировании формы публикации - то для некоторых полей, типа select, приходится еще 1 фильтр добавлять.

Да еще и с "ошибкой", приписывая value_in_key = false

Может, например, сделать так, что бы в редактировании формы публикации ключи значений не сбрасывались и полю можно было указать значение, типа "editable" = false - что бы юзер не мог менять его значения, ибо там нет возможности указывать ключ=>значение

0
Андрей CS
не в сети 2 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16344
9
22:20

Добавляя дефолтное поле, ты можешь использовать только те настройки поля, что есть. В опциях поля менеджера полей нет настройки для указания value_in_key, но необходимые опции для своего поля можно добавлять самостоятельно:

add_filter( 'rcl_default_public_form_fields', 'rcl_test_field_asdbasjdhabdj', 10, 2 );
function rcl_test_field_asdbasjdhabdj( $fields, $post_type ) {

	$fields[] = array(
		'type'		 => 'select',
		'title'		 => 'Тестовое поле',
		'slug'		 => 'test_field',
		'values'	 => array( 'slug1' => 'Слаг 1', 'slug2' => 'Слаг 2' ),
		'required'	 => 1,
		'options'	 => [
			[
				'type'	 => 'hidden',
				'slug'	 => 'value_in_key',
				'value'	 => 1
			]
		]
	);

	return $fields;
}

тут опция будет фиксированной, передаваемая полем типа hidden, но можно например и на радиокнопки посадить значение

0
Preci
не в сети 3 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1598
10
22:45

У меня все равно так не работает. У поля в качестве значения не подставляется key.

Если заменить value в опции на 0 - тогда подставляет, правда не slug1 а 0, т.е. ключи сбрасываются

0
Андрей CS
не в сети 2 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16344
11
22:49

Ага, сейчас понял до конца проблему.
Думаю, стоит сделать так: если для дефолтного поля указаны значения values в которых ключи прописаны строками, то строки должны жестко закрепляться в ключах и должна теряться возможность удаления этих значений или добавления новых, тк при удалении ключи будут утеряны, а новые значения не позволят указать произвольные ключи.
т.е. поле задано с жесткими значениями программно и не подлежит редактированию значений.
Пробуй открыть файл /fields/types/class-rcl-field-dynamic.php
и привести метод get_input к виду

function get_input() {

		if ( ! $this->default )
			$this->default = '';

		$content = '<span class="dynamic-values">';

		if ( $this->value && is_array( $this->value ) ) {
			$cnt = count( $this->value );
			foreach ( $this->value as $k => $val ) {

				$key = is_string( $k ) ? $k : '';

				$content .= '<span class="dynamic-value">';
				$content .= '<input type="text" ' . $this->get_required() . ' ' . $this->get_placeholder() . ' name="' . $this->input_name . '[' . $key . ']" value="' . $val . '"/>';
				if ( ! is_string( $k ) ) {
					if ( $cnt == ++ $k ) {
						$content .= '<a href="#" onclick="rcl_add_dynamic_field(this);return false;"><i class="rcli fa-plus" aria-hidden="true"></i></a>';
					} else {
						$content .= '<a href="#" onclick="rcl_remove_dynamic_field(this);return false;"><i class="rcli fa-minus" aria-hidden="true"></i></a>';
					}
				}
				$content .= '</span>';
			}
		} else {
			$content .= '<span class="dynamic-value">';
			$content .= '<input type="text" ' . $this->get_required() . ' ' . $this->get_placeholder() . ' name="' . $this->input_name . '[]" value="' . $this->default . '"/>';
			$content .= '<a href="#" onclick="rcl_add_dynamic_field(this);return false;"><i class="rcli fa-plus" aria-hidden="true"></i></a>';
			$content .= '</span>';
		}

		$content .= '</span>';

		return $content;
	}

Далее регистрируй поле так:
add_filter( 'rcl_default_public_form_fields', 'rcl_test_field_asdbasjdhabdj', 10, 2 );
function rcl_test_field_asdbasjdhabdj( $fields, $post_type ) {

	$fields[] = array(
		'type'		 => 'select',
		'title'		 => 'Тестовое поле',
		'slug'		 => 'test_field',
		'values'	 => array( 'slug1' => 'Слаг 1', 'slug2' => 'Слаг 2' ),
		'required'	 => 1,
		'options'	 => [
			[
				'type'	 => 'hidden',
				'slug'	 => 'value_in_key',
				'value'	 => 0
			]
		]
	);

	return $fields;
}

должно сработать

0
Андрей CS
не в сети 2 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16344
12
22:52

Preci сказал(а)
Да еще и с "ошибкой", приписывая value_in_key = false

value_in_key = false указывает, что значения не должны переходить в ключи, а когда value_in_key = true, то значения переходят в ключи

0
Preci
не в сети 3 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1598
13
00:04

Андрей CS сказал(а)

Preci сказал(а)
Да еще и с "ошибкой", приписывая value_in_key = false

value_in_key = false указывает, что значения не должны переходить в ключи, а когда value_in_key = true, то значения переходят в ключи

Хм, я всегда думал что value_in_key = true означает что в генерируемом теге option value будет браться из ключа элемента массива, а value_in_key = false - что в генерируемом теге option value будет браться из значения элемента массива. Выходит это не так? Я что-то уже запутался.

т.е. поле задано с жесткими значениями программно и не подлежит редактированию значений.
Пробуй открыть файл /fields/types/class-rcl-field-dynamic.php
и привести метод get_input к виду

В данном примере я про поле select, но эта проблема и в других полях может встречаться.

Мне кажется такая проверка не очень подойдет, т.к. значения могут быть числом и тогда они потеряются. По этому я и предложил добавить для полей новую опцию, типо 'editable'. По-умолчанию это значение будет "true", но если создать поле и указать в эту опцию false - тогда например для select поля будут жестко фиксироваться значения, как они были заданы при создании поля в коде и юзер не сможет их редактировать на странице редактирования формы. Такое реально сделать*

0
Андрей CS
не в сети 2 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16344
14
10:34

Preci сказал(а)
В данном примере я про поле select, но эта проблема и в других полях может встречаться.

я поэтом и предложил внести изменения в поле типа dynamic, потому что именно оно задает значения указываемые через настройки поля для этих типов полей.

Preci сказал(а)
добавить для полей новую опцию, типо 'editable'

думаю, такое реально сделать.
Получается, что опция "editable" будет отрабатывать только в менеджере полей и только для полей типа: select, radio, checkbox и multiselect

Preci сказал(а)
жестко фиксироваться значения, как они были заданы при создании поля в коде

порядок значений тоже предлагаешь фиксировать?

0
Preci
не в сети 3 дня
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1598
15
15:50

Андрей CS сказал(а)
порядок значений тоже предлагаешь фиксировать?

Не могу сказать, для моих задач это было не важно, но например может понадобится создать select поле типа:

1 => 1 час
6 => 6 часов
12 => 12 часов

и тогда если это все перемешается - будет некрасиво.

Кстати, а такое поле получается будет хранить свои значения в базе? Т.е. если в менеджере полей сохранить изменения, а затем в коде добавить новое значение для поля - надо будет пересохранять изменения в менеджере, или нет? Если нет, то в принципе это должно еще и проблему из стартового поста темы решить - с динамическими значениями

0
Вы не имеете права на публикацию сообщений в этой теме