Перейти к публикации

Вывод списка определенных категорий


Рекомендованные сообщения

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

 

Если быть конкретнее, то структура такая:

  • Категория 1
  • Категория 2
    • Подкатегория 1
    • Подкатегория 2
    • Подкатегория 3
    • Подкатегория 4
  • Категория 3

Сама новость принадлежит Категории 1, Категории 2, Подкатегории 3, Подкатегории 4. Нужно вывести только ссылки на Подкатегорию 3, Подкатегорию 4.

 

{link-category} выведет все категории

{category} выведет все категории

 

Есть какие-то варианты без правок движка?

Изменено пользователем MGHaze
Ссылка на сообщение
Поделиться на других сайтах

Нет, такой возможности в стандартном скрипте к сожалению нет. Нужно написание плагина для этого.

Ссылка на сообщение
Поделиться на других сайтах
  26.05.2018 в 12:02, celsoft сказал:

Нет, такой возможности в стандартном скрипте к сожалению нет. Нужно написание плагина для этого.

Расширить  

Понял, спасибо. Подскажите попутно, если не сложно. У меня работает (вроде как) поиск новостей по конкретному значению конкретного допполя. Такой вид: {custom xfields="допполе|значение"}

Либо я слепой, либо в документации описания данного функционала не нашел. Никаких подводных камней не будет? Это же официальный функционал?

 

Но больше интересует, что он ищет? Именно строго заданное "значение" допполя, или будет находить новости и с допполями вроде "123 Значение 456", "Значение 123" и т.д.? Надеюсь, ясно выразился :D

Изменено пользователем MGHaze
Ссылка на сообщение
Поделиться на других сайтах
  26.05.2018 в 12:15, MGHaze сказал:

вид: {custom xfields="допполе|значение"}

Либо я слепой, либо в документации описания данного функционала не нашел. Никаких подводных камней не будет? Это же официальный функционал?

Расширить  

В таком формате значения доп. полей хранится в БД, поэтому такая комбинация работает и будет работать. параметр xfields это поиск доп. полям, указав и название и значение поля, поиск будет только по этому полю. Если только значение то поиск по всем доп. полям у новости.

Ссылка на сообщение
Поделиться на других сайтах
  26.05.2018 в 12:21, celsoft сказал:

В таком формате значения доп. полей хранится в БД, поэтому такая комбинация работает и будет работать. параметр xfields это поиск доп. полям, указав и название и значение поля, поиск будет только по этому полю. Если только значение то поиск по всем доп. полям у новости.

Расширить  

Я там еще вопрос добавил. Гляньте, пожалуйста.

Ссылка на сообщение
Поделиться на других сайтах
  26.05.2018 в 08:26, MGHaze сказал:

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

 

Если быть конкретнее, то структура такая:

  • Категория 1
  • Категория 2
    • Подкатегория 1
    • Подкатегория 2
    • Подкатегория 3
    • Подкатегория 4
  • Категория 3

Сама новость принадлежит Категории 1, Категории 2, Подкатегории 3, Подкатегории 4. Нужно вывести только ссылки на Подкатегорию 3, Подкатегорию 4.

 

{link-category} выведет все категории

{category} выведет все категории

 

Есть какие-то варианты без правок движка?

Расширить  

Посмотрите в сторону этого хака https://punpun.name/blog/17-cat.html

Ссылка на сообщение
Поделиться на других сайтах
  26.05.2018 в 12:15, MGHaze сказал:

Но больше интересует, что он ищет? Именно строго заданное "значение" допполя, или будет находить новости и с допполями вроде "123 Значение 456", "Значение 123" и т.д.? Надеюсь, ясно выразился

Расширить  

Он ищет то, что указано в параметре xfields, в теге custom. При этом в БД значения храняться в формате имя поля|значение поля

Ссылка на сообщение
Поделиться на других сайтах
  27.05.2018 в 00:11, celsoft сказал:

Он ищет то, что указано в параметре xfields, в теге custom. При этом в БД значения храняться в формате имя поля|значение поля

Расширить  

Может подскажете, как тогда можно находить точные значения? К примеру есть допполе Цвет и 2 новости со значением Красный и Красный с синим. Мне нужно выводить через кастом только новость с полем "Красный".

Как вариант, придумал такое выражение xfields="color|Красный| Но если это поле в базе последнее, то символа | не будет

Придумал добавить допполе-костыль, которое будет пустым и в конце всех допполей. Более изящного способа нету?

Ссылка на сообщение
Поделиться на других сайтах
  29.05.2018 в 06:43, MGHaze сказал:

Как вариант, придумал такое выражение xfields="color|Красный| Но если это поле в базе последнее, то символа | не будет

Расширить  

Зачем вы вообще поставили | в конце? Это нелогично. Должно быть xfields="color|Красный". У вас же нет для поля с именем color другого значения например "КрасныйЗеленый"

Ссылка на сообщение
Поделиться на других сайтах
  29.05.2018 в 09:54, celsoft сказал:

Зачем вы вообще поставили | в конце? Это нелогично. Должно быть xfields="color|Красный". У вас же нет для поля с именем color другого значения например "КрасныйЗеленый"

Расширить  

Вот именно, что в перспективе может быть. Я же выше указал:

  29.05.2018 в 06:43, MGHaze сказал:

Красный с синим

Расширить  

 

Ссылка на сообщение
Поделиться на других сайтах
  29.05.2018 в 10:29, MGHaze сказал:

Вот именно, что в перспективе может быть. Я же выше указал

Расширить  

В таком случае точного поиска именно в {custom ...} сделать не получиться.

Ссылка на сообщение
Поделиться на других сайтах
  29.05.2018 в 10:31, celsoft сказал:

В таком случае точного поиска именно в {custom ...} сделать не получиться.

Расширить  

А почему такое выражение не подойдет?  xfields="color|Красный|

Символ | в допполе использоваться не будет точно

Ссылка на сообщение
Поделиться на других сайтах
  29.05.2018 в 10:46, MGHaze сказал:

А почему такое выражение не подойдет?  xfields="color|Красный|

Расширить  

Потому что поле может одно в новости, или может быть последним.

Ссылка на сообщение
Поделиться на других сайтах
  29.05.2018 в 11:04, celsoft сказал:

Потому что поле может одно в новости, или может быть последним.

Расширить  

Тоже про это писал выше:

  29.05.2018 в 06:43, MGHaze сказал:

Придумал добавить допполе-костыль, которое будет пустым и в конце всех допполей.

Расширить  

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

Ссылка на сообщение
Поделиться на других сайтах
  29.05.2018 в 11:22, MGHaze сказал:

Тоже про это писал выше:

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

Расширить  

Если у вас DLE 13.0 используйте этот плагин

<?xml version="1.0" encoding="utf-8"?>
<dleplugin>
	<name>Xfield Custom Search</name>
	<description></description>
	<icon></icon>
	<version></version>
	<dleversion>13</dleversion>
	<versioncompare>greater</versioncompare>
	<mysqlinstall><![CDATA[]]></mysqlinstall>
	<mysqlupgrade><![CDATA[]]></mysqlupgrade>
	<mysqlenable><![CDATA[]]></mysqlenable>
	<mysqldisable><![CDATA[]]></mysqldisable>
	<mysqldelete><![CDATA[]]></mysqldelete>
	<file name="engine/modules/functions.php">
		<operation action="before">
			<searchcode><![CDATA[if( preg_match( "#navigation=['\"](.+?)['\"]#i", $param_str, $match ) ) {]]></searchcode>
			<replacecode><![CDATA[if (preg_match("#like_xfield=['\"](.+?)['\"]#i", $param_str, $match)) {
    if (substr_count('||', $match[1]) > 1) {
		$temp_array = [];
        $field = explode ('||', $match[1]);
        $xf_where = [];
        for ($i = 0; $i < count($field); $i++) {
            $temp_array = explode('|', $field[$i]);
			if ($temp_array[0] && $temp_array[1]) {
				$key = $db->safesql(trim(strip_tags($temp_array[0])));
				$value = $db->safesql(trim(strip_tags($temp_array[1])));
				$xf_where[] = "SUBSTRING_INDEX(SUBSTRING_INDEX(xfields, '{$key}|', -1), '||', 1) LIKE '{$value}'";
			}
        }
		if ($xf_where) {
			$xf_where = implode (' AND ', $xf_where);
		}
    } else {   
        $temp_array = explode('|', $match[1]);
		$key = $db->safesql(trim(strip_tags($temp_array[0])));
		$value = $db->safesql(trim(strip_tags($temp_array[1])));
        $xf_where = "SUBSTRING_INDEX(SUBSTRING_INDEX(xfields, '{$key}|', -1), '||', 1) LIKE '{$value}'";
    }
	if ($xf_where) {
		$where[] = $xf_where;
	}
}]]></replacecode>
		</operation>
	</file>
</dleplugin>

В custom пишете так

{custom like_xfield="color|Красный"}

И никаких доп полей не надо в конце.

Ссылка на сообщение
Поделиться на других сайтах
  29.05.2018 в 12:07, Gameer сказал:

И никаких доп полей не надо в конце.

Расширить  

Что-то не так. Первый кастом находит новости, второй - нет. Я несколько раз провожу поиск на странице через custom. Что-то вроде:

{custom like_xfield="size|XL"}

{custom like_xfield="color|Красный"}

{custom like_xfield="type|С длинным рукавом"}

Изменено пользователем MGHaze
Ссылка на сообщение
Поделиться на других сайтах

Так и не разобрался, в чем было дело. Не искало в одной категории. И кеш чистил, и допполя в базе проверял, и все, что в голову пришло. Сейчас пересохранил новость, стала отображаться. Спасибо за модуль!

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...