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

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


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

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

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. В том месте где создаётся. И по идее ничего больше трогать не надо.

Тестовый репозиторий установки плагинов: teramoune

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;

Тестовый репозиторий установки плагинов: teramoune

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 файлу, админский же раздел лишён функции, а предпросмотр как раз будет подключать тот файл откуда вызван предпросмотр. Если из админки вызвать то будет ошибка.

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



Тестовый репозиторий установки плагинов: teramoune

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

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

наверх