foto

Функция сохранения доп.полей xfields

Автор темы: Sander, 10 марта 2017г
Sander
Отправлено: 10 март 2017, 11:32:21
Функция формирующая строку хранения данных доп.полей из массива с ключами для записи в БД:
{ключ}|{значение}||{ключ2}|{значение2}

function xfieldsdatasave($xfields = [])
{
	global $db;
	$filecontents = [];
	foreach ($xfields as $xfielddataname => $xfielddatavalue) {
		if ($xfielddataname == "" OR $xfielddatavalue === "") continue;
		$xfielddataname = str_replace( "|", "|", $xfielddataname );
		$xfielddataname = str_replace( "\r\n", "__NEWL__", $xfielddataname );
		$xfielddatavalue = str_replace( "|", "|", $xfielddatavalue );
		$xfielddatavalue = str_replace( "\r\n", "__NEWL__", $xfielddatavalue );
		$filecontents[] = "$xfielddataname|$xfielddatavalue";
	}
	$filecontents = count($filecontents) ? $db->safesql(join("||", $filecontents)) : '';
	return $filecontents;
}


Пример использования:
$id = 117;
$xfields = [
	'link' => 'http://sandev.pro/',
	'price' => '50',
];

$filecontents = xfieldsdatasave($xfields);
$db->query("UPDATE dle_post set xfields = '$filecontents' WHERE id=$id");
foto
  • Администратор
  1. • Sensey #1
    Отправлено: 27 май 2019, 14:06:39
    А как сделать, что бы не затирало уже существующие поля ?
    Сейчас при записи добавляет только те что указываю
    $xfields = array(
      'link' => 'http://sandev.pro/',
      'price' => '50',
    );

    Если в новости уже были другие поля их затирает и добавляет только новые.
    foto
    • Гость
    • Сообщений: 0
  2. Sander #2
    Отправлено: 27 май 2019, 14:19:40
    Цитата: Sensey
    А как сделать, что бы не затирало уже существующие поля ?
    Сейчас при записи добавляет только те что указываю
    $xfields = array(
      'link' => 'http://sandev.pro/',
      'price' => '50',
    );

    Если в новости уже были другие поля их затирает и добавляет только новые.

    Получаете данные из новости, дописываете новые данные, сохраняете.
    $sql = $db->query("SELECT id, xfields FROM dle_post");
    while ($row = $db->get_row($sql)) {
        $xfields = xfieldsdataload(stripslashes($row['xfields']));
        $xfields['link'] = 'новая ссылка или значение';
        $filecontents = xfieldsdatasave($xfields);
        $db->query("UPDATE dle_post set xfields = '$filecontents' WHERE id={$row['id']}");
    }
    foto
    • Администратор
    • Сообщений: 919
  3. • Sensey #3
    Отправлено: 27 май 2019, 14:51:37
    Если я правильно понял, то весь код будет таким?
    function xfieldsdatasave($xfields = [])
    {
    	global $db;
    	$filecontents = [];
    	foreach ($xfields as $xfielddataname => $xfielddatavalue) {
    		if ($xfielddataname == "" OR $xfielddatavalue === "") continue;
    		$xfielddataname = str_replace( "|", "|", $xfielddataname );
    		$xfielddataname = str_replace( "\r\n", "__NEWL__", $xfielddataname );
    		$xfielddatavalue = str_replace( "|", "|", $xfielddatavalue );
    		$xfielddatavalue = str_replace( "\r\n", "__NEWL__", $xfielddatavalue );
    		$filecontents[] = "$xfielddataname|$xfielddatavalue";
    	}
    	$filecontents = count($filecontents) ? $db->safesql(join("||", $filecontents)) : '';
    	return $filecontents;
    }
    
    $sql = $db->query("SELECT id, xfields FROM dle_post");
    while ($row = $db->get_row($sql)) {
        $xfields = xfieldsdataload(stripslashes($row['xfields']));
        $xfields = array('link' => 'http://sandev.pro/',  'price' => '50');
        $filecontents = xfieldsdatasave($xfields);
        $db->query("UPDATE dle_post set xfields = '$filecontents' WHERE id={$row['id']}");
    }
    foto
    • Гость
    • Сообщений: 0
  4. • Богдан #4
    Отправлено: 17 сентябрь 2024, 20:10:53
    А можно обновить код под новые DLE?

    У меня до сохранения данные были так в базе:
    <table><colgroup><col width=\"79\"><col width=\"48\"><col width=\"53\"><col width=\"67\"></colgroup>


    После стали так:
    <table><colgroup><col width="79"><col width="48"><col width="53"><col width="67"></colgroup>


    В новых версиях обработка с визуальных редакторов видимо по другому идет. Если есть возможность, скиньте апдейт)
    foto
    • Гость
    • Сообщений: 0
  5. Sander #5
    Отправлено: 24 сентябрь 2024, 20:04:49
    Цитата: Богдан
    В новых версиях обработка с визуальных редакторов видимо по другому идет. Если есть возможность, скиньте апдейт)

    Проблема не столько новых версий, сколько в целом принцип работы движка. К сожалению этот момент с удалением слеша в этой функции не предусмотрен.
    В настройках поля есть 2 режима, с поддержкой BB и HTML тегов и без, так называемый "Безопасный режим"
    При включенной галочке все HTML теги включая кавычки заменяются на их HTML сущности:
    < → &lt;
    " → &quot;
    ' → &039;
    и т.д.

    При выключенном выполняется только экранирование:
    < → <
    " → \"
    ' → \'
    \ → \\\


    Я категорически не разделяю ни один из этих методов. Данные должны храниться в чистом виде, а при отображении уже будет экранирование и преобразование.
    Этот переключатель меняет логику сохранения данных. И соответственно при сохранении данных в БД необходимо учитывать состояние этого чекбокса. Это сделать не сложно, но делается не за 5 минут и мне не охота этим пока заниматься :|
    foto
    • Администратор
    • Сообщений: 919
  6. • Богдан #6
    Отправлено: 8 октябрь 2024, 13:16:05
    Цитата: Sander
    Цитата: Богдан
    В новых версиях обработка с визуальных редакторов видимо по другому идет. Если есть возможность, скиньте апдейт)

    Проблема не столько новых версий, сколько в целом принцип работы движка. К сожалению этот момент с удалением слеша в этой функции не предусмотрен.
    В настройках поля есть 2 режима, с поддержкой BB и HTML тегов и без, так называемый "Безопасный режим"
    При включенной галочке все HTML теги включая кавычки заменяются на их HTML сущности:
    < → <
    " → "
    ' → &039;
    и т.д.

    При выключенном выполняется только экранирование:
    < → <
    " → \"
    ' → \'
    \ → \\\


    Я категорически не разделяю ни один из этих методов. Данные должны храниться в чистом виде, а при отображении уже будет экранирование и преобразование.
    Этот переключатель меняет логику сохранения данных. И соответственно при сохранении данных в БД необходимо учитывать состояние этого чекбокса. Это сделать не сложно, но делается не за 5 минут и мне не охота этим пока заниматься :|


    А если на платной основе, сможем договориться?)
    foto
    • Гость
    • Сообщений: 0
Добавить комментарий

Внимание! Все сообщения касающиеся техподдержки будут удалены или проигнорированы

Attention! All messages asking for technical support will be removed or ignored

  • Логин
  • E-mail (не обязательно)
Повторите рисунок:
antibot
© Sander-Development. 2009-2024.
При копировании, ссылка на источник обязательна.