Не нравятся результаты поиска? Попробуйте другой поиск!
dle-faq.ru FAQ (все вопросы) Хаки Перечесление значений через точку с запятой в доп поле с включенной настройкой перекрестные гиперссылки

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


     19.04.2013    Хаки    2266

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

Ответил: 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
12

96 | 32

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
33

232 | 182

rashpil - 19 апреля 2013 22:39 - Эксперт

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

Kane
12

96 | 32

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

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

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

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

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

Sander
1125

1637 | 1204

Sander - 20 апреля 2013 02:56 - Эксперт

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

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

ICQ: 404-037-556
Skype: Sander8804

rashpil
33

232 | 182

rashpil - 20 апреля 2013 05:06 - Эксперт

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

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


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

Kane
12

96 | 32

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

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

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

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

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

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

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

Sander
1125

1637 | 1204

Sander - 21 апреля 2013 01:07 - Эксперт

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

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

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

ICQ: 404-037-556
Skype: Sander8804

Kane
12

96 | 32

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

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

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