Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы по PHP » Как вывести значения доп полей "массивом"?

Как вывести значения доп полей "массивом"?


     13.01.2024    Все вопросы » Общие вопросы по PHP    489

вопрос
Здравствуйте.

DLE 12.1

Пытаюсь заставить предпросмотр выводить ifxfvalue и xfvalue_thumb_url

Их вывода в пребью (в предварительном просмотре) в принципе не предусмотрено, притом до сих пор - в DLE 16.1 тоже нету.

Простое копирование в xfields.php из других файлов данных кусков кода (отвечающих за обработку ifxfvalue и xfvalue_thumb_url) результатов не даёт.

Чтобы понять "что не так", нужно вывести "значения" доп полей типа var_dump($array) или print_r($array):

[0] => Andi или [0] => string(4) "Andi"

Прошу подсказать, как вывести данные значения массивом? Не могу понять в какой переменной лежит "готовый" массив со значениями...

Ответа пока нет


8 комментариев

lutskboy
Эксперт

lutskboy - 13 января 2024 21:26 -

$xfields = xfieldsdataload($row['xfields']);

NONSENS
Юзер

NONSENS - 23 января 2024 03:44 -

Заставил работать xfvalue_thumb_url и xfvalue_image_url:

В xfields.php после:

			} else $xfield[$value[0]] = "<img class=\"xfieldimage {$value[0]}\" src=\"{$img_url}\" alt=\"\" />";
		}


добавить:


		// отработка доп поля с картинкой
		
		if($value[3] == "image") {

					if( $xfield[$value[0]] ) {
						$xfieldsoutput = str_replace( "[xfvalue_thumb_url_{$value[0]}]", $thumb_url, $xfieldsoutput );
						$xfieldsoutput = str_replace( "[xfvalue_image_url_{$value[0]}]", $img_url, $xfieldsoutput );
					} else {
						$xfieldsoutput = str_replace( "[xfvalue_thumb_url_{$value[0]}]", "", $xfieldsoutput );
						$xfieldsoutput = str_replace( "[xfvalue_image_url_{$value[0]}]", "", $xfieldsoutput );
					}
		}
		
		// отработка доп поля с картинкой


Столкнулся с тем, что xfields не работает нормально со списками - выводит значения в виде "pic.jpg|Название".

Победил это так - в xfields.php после:

$xfield[$value[0]] = $options[$xfield[$value[0]]];


добавить:

$xfield[$value[0]] = stristr($xfield[$value[0]], '|', true);


Отсталась одна проблема - не хочет ifxfvalue отрабатывать. В принципе я придумал "колхозный" обход (вывести просто значения и с помощью str_replace позаменять значения на нужные из подцепляемого php-файла), но всё таки хочется доделать до конца без "колхозинга".

После:

          $xfieldsoutput = str_replace( "[/xfgiven_{$value[0]}]", "", $xfieldsoutput );
       }


добавил:

$xfieldsoutput = preg_replace_callback ( "#\\[ifxfvalue(.+?)\\](.+?)\\[/ifxfvalue\\]#is", "check_xfvalue", $xfieldsoutput );


Как я понял, тут цепляется функция "check_xfvalue" (почему то выглядящая как строка), но она не отрабатывает:

function check_xfvalue( $matches=array() ) {
	global $xfieldsdata, $preg_safe_name, $value;
	
	$matches[1] = trim($matches[1]);

	if( preg_match( "#{$preg_safe_name}\s*\!\=\s*['\"](.+?)['\"]#i", $matches[1], $match ) ) {

		if( $xfieldsdata[$value[0]] != trim($match[1]) ) {
			return $matches[2];
		} else return "";

	}
	
	if( preg_match( "#{$preg_safe_name}\s*\=\s*['\"](.+?)['\"]#i", $matches[1], $match ) ) {

		if( $xfieldsdata[$value[0]] == trim($match[1]) ) {
			return $matches[2];
		} else return "";

	}
	
	return $matches[0];
}


Не отрабатывает, походу, во первых из-за $xfieldsdata. Создал функцию "check_xfvalue2" в которой позаменял $xfieldsdata на $xfield, но всё равно не хочет отрабатывать...
Самое главное, что я совсем не понимаю как "это" работает - preg_match (не заходят мне "трёхэтажные функции")...

Понимающие люди, подскажите пожалуйста что и почему не хочет отрабатывать?... ...Давайте доведём до ума работу предпросмотра!...

TeraMoune
Эксперт

TeraMoune - 23 января 2024 04:45 -

Прошу подсказать, как вывести данные значения массивом? Не могу понять в какой переменной лежит "готовый" массив со значениями...

В предпросмотре никак, они уже подаются в виде массива и находятся в $_POST["xfield"], который в последствии записывается в переменную $xfield. Ну вы её уже и так нашли.


Заставил работать xfvalue_thumb_url и xfvalue_image_url:

В xfields.php после:

Зачем после ? Не надо после, код который вы определили уже является частью условия обработки изображений... Просто добавьте в условии необходимое. Потому в следующем вы делаете странные выводы и у вас появляется лишний код.

А именно:

Столкнулся с тем, что xfields не работает нормально со списками - выводит значения в виде "pic.jpg|Название".

Победил это так

Он работает ровно так как задумано по коду, так как написано автором. И именно вот так он и работает, да, значение хранится в разных видах в зависимости от типа поля, и как раз в своих условиях оно и меняется в нужном. То есть в стандартном условии обработки изображения как раз имеется код:

$temp_array = explode('|', $xfield[$value[0]]);

И в условии уже используется эта переменная для создания последующих $img_url и $thumb_url которые являются полными путями на изображения оригинала и миниатюры.

Как я понял, тут цепляется функция "check_xfvalue" (почему то выглядящая как строка)

Так и должно быть.


Не отрабатывает, походу, во первых из-за $xfieldsdata. Создал функцию "check_xfvalue2" в которой позаменял $xfieldsdata на $xfield, но всё равно не хочет отрабатывать...

Можно просто попробовать создать аналог переменной $xfieldsdata которая будет копией $xfield. В том месте где создаётся. И по идее ничего больше трогать не надо.

Принимаю оплату только на карту Мир. Крипту меньше трёхзначной цифры не принимаю.

NONSENS
Юзер

NONSENS - 24 января 2024 01:31 -

Я придумал более простой способ (без цепляния всяких функций и проверок):

Просто подставляем в preg_replace название доп. поля и его знчение - и всё: если подходит, то заменится/отработает. После чего подставляем только название доп. поля без значения и заменяем на "" (затираем).

Придумал, то придумал, но что-то не работает - скорее всего опять регулярку неправильно написал:

$xfieldsoutput = preg_replace( "#\\[ifxfvalue {$preg_safe_name}\=['\"]{$value[0]}['\"]\\](.+?)\\[/ifxfvalue\\]#is", "", $xfieldsoutput );


Прошу глянуть и поправить меня. "" - это временно - потом заменю на "$1".

Отрабатывать должно следующий текст:

[ifxfvalue namepole="znachenie"]Значение[/ifxfvalue]

NONSENS
Юзер

NONSENS - 24 января 2024 01:47 -

Только отписал... И сам решил!!!

В xfields.php после:

          $xfieldsoutput = str_replace( "[/xfgiven_{$value[0]}]", "", $xfieldsoutput );
       }


добавить:

	  // ifxfvalue
		if(strpos( $xfieldsoutput, "[ifxfvalue" ) !== false ) {
		$xfieldsoutput = preg_replace( "#\\[ifxfvalue {$preg_safe_name}\s*\=\s*['\"]{$xfield[$value[0]]}['\"]\\](.+?)\\[/ifxfvalue\\]#is", "$1", $xfieldsoutput );
		$xfieldsoutput = preg_replace( "#\\[ifxfvalue {$preg_safe_name}\s*\=\s*['\"](.+?)['\"]\\](.+?)\\[/ifxfvalue\\]#is", "", $xfieldsoutput );
			}
	  // ifxfvalue


Всё! - довел до ума предпросмотр. Пользуйтесь на здоровье. Напомню: это для DLE 12.1, но скорее всего данное решение подойдёт для всех последующих версий...

TeraMoune
Эксперт

TeraMoune - 24 января 2024 02:51 -

Всё! - довел до ума

Как бы проще было бы объявить одну переменную вместо такого количества кода.

if (isset ($_POST["xfield"])) $xfield = $_POST['xfield']; else $xfield=array();
$xfieldsdata = $xfield;

Принимаю оплату только на карту Мир. Крипту меньше трёхзначной цифры не принимаю.

NONSENS
Юзер

NONSENS - 24 января 2024 11:02 -

Ну нет! И по поводу первого Вашего коммента - тоже совсем нет!

Посмотрите внимательно файл xfields.php - и сами придёте к тому же выводу:

Там вовсе нет обработки xfvalue_thumb_url, xfvalue_image_url и ifxfvalue. Значение списка выводится в виде "pic.jpg|Название".

Посему первые две "иньекции кода" обязательны и более "простого" хода нет.

Значения списков лежат не в $value[0], а, как оказалось, в $xfield[$value[0]].

И, если мы решаем изпользовать $xfieldsdata (она кстати в начале файла используется) плюс цепляние функции, тогда лучше сделать так:

$xfieldsdata[$value[0]] =$xfield[$value[0]];
$xfieldsoutput = preg_replace_callback ( "#\\[ifxfvalue(.+?)\\](.+?)\\[/ifxfvalue\\]#is", "check_xfvalue", $xfieldsoutput );


Сразу предупрежу - сам не тестил - это теоритические изыскания... ...Смущают меня объявленные в фунции глобальные переменные - не пойму зачем они - я ООП только начал изучать и понял, что для моих потребностей это пока лишнее...

TeraMoune
Эксперт

TeraMoune - 24 января 2024 14:24 -

Ну нет! И по поводу первого Вашего коммента - тоже совсем нет!

Ну вот где я не прав, укажите. Вы сами видимо ничего из написанного в первом ответе не поняли.

Посмотрите внимательно файл xfields.php - и сами придёте к тому же выводу:

Я и посмотрел и понял как сделать, объяснил это и пояснил за момент касательно "pic.jpg|Название".

Там вовсе нет обработки xfvalue_thumb_url, xfvalue_image_url и ifxfvalue. Значение списка выводится в виде "pic.jpg|Название".

Я и не писал же вроде обратного, я написал как добавить это, и это будет более правильней нежели ваши варианты.

Значения списков лежат не в $value[0], а, как оказалось, в $xfield[$value[0]].

Я об этом и написал буквально в первом комментарии.
В предпросмотре никак, они уже подаются в виде массива и находятся в $_POST["xfield"], который в последствии записывается в переменную $xfield. Ну вы её уже и так нашли.

Я как раз это и написал, массив значений полей находится в $xfield. В то время как для уже опубликованной новости они хранятся в $xfieldsdata (предварительно созданные с использованием функции xfieldsdataload).

И, если мы решаем изпользовать $xfieldsdata (она кстати в начале файла используется)

Где именно вы увидели использование $xfieldsdata в файле ?

тогда лучше сделать так

Чем же оно лучше ?

Смущают меня объявленные в фунции глобальные переменные - не пойму зачем они

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

Более того, check_xfvalue функция принадлежит пользовательскому functions.php файлу, админский же раздел лишён функции, а предпросмотр как раз будет подключать тот файл откуда вызван предпросмотр. Если из админки вызвать то будет ошибка.

Поэтому лучше использовать анонимные функции. Выглядит это следующим образом.



Принимаю оплату только на карту Мир. Крипту меньше трёхзначной цифры не принимаю.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх