Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Хаки » Перечесление значений через точку с запятой в доп поле с включенной настройкой перекрестные гиперссылки

Перечесление значений через точку с запятой в доп поле с включенной настройкой перекрестные гиперссылки


     19.04.2013    Все вопросы » Хаки    3997

вопрос
Как известно в доп поле с включенной опцией "Использовать значения полей как перекрестные гиперссылки", для того что бы каждое отдельное слово было ссылкой, необходимо использовать запятую как разделитель. В моем случае очень необходимо использовать еще и точку с запятой ";" как разделитель. Если такое реализовать не трудно то буду очень благодарен если кто то с этим поможет, ну или хотя бы подскажет в каком файле копать.

Ответил: rashpil


Список файлов в которых доступны дополнительные поля:
  • engine/modules/show.short.php - краткая новость
  • engine/modules/show.full.php - полная новость
  • engine/modules/show.custom.php - кастом
  • engine/modules/search.php - поиск


Во всех файлах есть строка:
$temp_array = explode( "[b],[/b]", $xfieldsdata[$value[0]] );


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

$xfieldsdata[$value[0]] = str_replace("[b];[/b]", "[b],[/b]", $xfieldsdata[$value[0]]);


То это может вам помочь.

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

Kane
Юзер

Kane - 19 апреля 2013 21:52 -

Спасибо что откликнулись, а так же за столь развернутый ответ!

Если я правильно понял то эта строчка
$xfieldsdata[$value[0]] = str_replace("[b];[/b]", "[b],[/b]", $xfieldsdata[$value[0]]);

заменяет точку с запятой на запятую, но это немножко не то, так как мне необходимо что бы она отображался в новости.
В explode вроде нельзя использовать несколько разделителей.
По этому использовал
$temp_array = preg_split("/[,|;|!]/", $xfieldsdata[$value[0]]);

Но что то не работает. ! и ; заменяется на запятую, наверно где то еще что то надо отредактировать
К сожалению знания по php на этом кончаются((
Как же тут быть?

rashpil
Эксперт

rashpil - 19 апреля 2013 22:39 -

Если используешь свой вариант, кстати он мне даже понравился, то строку которую я велел добавить попросту удали.

Kane
Юзер

Kane - 20 апреля 2013 00:04 -

то строку которую я велел добавить попросту удали

Ну это само собой

Я только заменил
$temp_array = explode( ",", $xfieldsdata[$value[0]] );
на
$temp_array = preg_split("/[,|;|&]/", $xfieldsdata[$value[0]]);

Да теперь знаки ";" и "&" работают как разделители. Но в новости эти знаки почему то отображаются как запятая, ума не приложу почему
Мне это необходимо так как в поле у меня слова делятся на группы, и многие пользователи путаются, например
Сейчас так:
ппппп, ннннн, оооооооо, лллл, кккк, мммммм, вввввв, уууу
Пытаюсь сделать так
ппппп & ннннн & оооооооо; лллл & кккк & мммммм; вввввв & уууу

Sander
PHP-developer

Sander - 20 апреля 2013 02:56 -

А что дальше делается с переменной $temp_array ?

SanDev.pro - мой блог.

Telegram: @sandev
Skype: Sander8804

rashpil
Эксперт

rashpil - 20 апреля 2013 05:06 -

Я при ответе поспешил малость. Там в этой же процедуре после цикла есть вот такая вот строчка:

  $xfieldsdata[$value[0]] = implode(", ", $value3);


По крайней мере, теперь ты знаешь, откуда эта запятая :)

Kane
Юзер

Kane - 20 апреля 2013 20:18 -

А что дальше делается с переменной $temp_array ?

Перебор массива..

 $xfieldsdata[$value[0]] = implode(", ", $value3);

Ага вот оно что. В конечном массиве не остаётся информации о том, какой разделитель там был. implode не может определить, где какой разделитель применять.

Пол дня просидел, уже весь мозг сломал
Эх ладно, видимо не судьба

rashpil еще раз спасибо за уделенное время

Sander
PHP-developer

Sander - 21 апреля 2013 01:07 -

$temp_array = preg_split("/[,|;|!]/", $xfieldsdata[$value[0]], -1, PREG_SPLIT_OFFSET_CAPTURE);

Ну и далее читаем про флаг, используем цикл и значение полученное с помощью флага.

SanDev.pro - мой блог.

Telegram: @sandev
Skype: Sander8804

Kane
Юзер

Kane - 21 апреля 2013 14:57 -

Должно получиться как то так?
$array = 'link1,link2;link3&link4,link5';

preg_match_all('#(?:([^;,&]+);|([^;,&]+),|([^;,&]+)&|([^;,&]+$))#', $array, $match, PREG_PATTERN_ORDER);

    $temp_array [1] = $match[1];
    $temp_array [2] = $match[2];
    $temp_array [3] = $match[3];
    $temp_array [4] = $match[4];

    $value1 = array();
    $value2 = array();
    $value3 = array();
    $value4 = array();

    foreach ($temp_array as $key=>$value) {

        foreach ($value as $link){
            if(!empty($link)) {
                $link = trim($link);
                if ($key == 1)
                    $value1[] = "<a href=".$link.">new $link</a>";
                if ($key == 2)
                    $value2[] = "<a href=".$link.">new $link</a>";
                if ($key == 3)
                    $value3[] = "<a href=".$link.">new $link</a>";
                if ($key == 4)
                    $value4[] = "<a href=".$link.">new $link</a>";
            }
        }

    }
     $str = implode("; ", $value1)."; ";
     $str .= implode(", ", $value2).", ";
     $str .= implode("& ", $value3)."& ";
     $str .= $value4[0];

   echo $str;//new link2; new link1, new link4, new link3& new link5

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

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

наверх