Супербыстрый хостинг на SSD от 115р в месяц   •   Реклама
1 947 просм
34 комм
Поделиться:

Выводим информацию о новости в файле (attachment) в DLE

Как мне сообщил один из посетителей сайта, в DataLife Engine нельзя использовать теги от новости в шаблоне файла attachment, для того чтобы вывести необходимую информацию о самой новости, к которой привязан тот или иной файл.

Немного подумав и еще раз посмотрев, как устроен движок, я нашел решение его проблемы.

1. Подключитесь к вашему сайту по FTP.

2. Откройте файл «show.full.php» в папке /engine/modules/. В нем найдите строку:

$news_id = $row['id'];

и сразу после нее вставьте:

$row_malcov_id = $row["id"];
$row_malcov_autor = $row["autor"];
$row_malcov_title = $row["title"];
$row_malcov_xfields = $row["xfields"];

3. Здесь же найдите строку:

$tpl->result['content'] = show_attach( $tpl->result['content'], $news_id );

и также после нее вставьте:

// Copyright (c) 2017 Artem Malcov | https://www.pandoge.com/haki/vyvodim-informaciyu-o-novosti-v-fayle-attachment-v-dle

$tpl->result["content"] = str_replace("{id_news}", $row_malcov_id, $tpl->result["content"]);
$tpl->result["content"] = str_replace("{autor_news}", $row_malcov_autor, $tpl->result["content"]);
$tpl->result["content"] = str_replace("{title_news}", $row_malcov_title, $tpl->result["content"]);

$xfields_1 = explode("images", $row_malcov_xfields);
$xfields_1 = explode("||", $xfields_1[1]);
$tpl->result["content"] = str_replace("{xfields_news_1}", substr($xfields_1[0], 1), $tpl->result["content"]);

Сохраняете изменения и отправляете файл обратно на сайт.

3. Чистите кэш сайта. Установка закончена.

Теперь в шаблоне вашего файла (attachment.tpl) вам доступны следующие теги для вывода информации:

{id_news} – ID новости.
{autor_news} – автор новости.
{title_news} – заголовок новости.
{xfields_news_1} – дополнительное поле.

Обратите внимание, что код, используемый в хаке для дополнительных полей, берет информацию только с одного конкретного поля «images». В вашем же случае вы меняете название нужного вам поля на свое, а при необходимости дублируете блок:

$xfields_1 = explode("images", $row_malcov_xfields);
$xfields_1 = explode("||", $xfields_1[1]);
$tpl->result["content"] = str_replace("{xfields_news_1}", substr($xfields_1[0], 1), $tpl->result["content"]);

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

Информация, которую можно вывести из новости в файле, приведена не вся, если чего-то вам не хватает – пишите об этом в комментариях и не забывайте поддерживать проект, если на его страницах вы почерпнули что-то новое и полезное для себя.

«Pandoge» - помощник веб-мастера
34
комментария
18.11 в 12:57

Артем, в актуальной версии код functions.php немножко отличается, как правильно заменить код?

Такой код у меня.

$db->query( "SELECT * FROM " . PREFIX . "_files WHERE $where" );

  • 1

Abasive, в вашем случае эту строку можно не заменять

  • 9
18.11 в 16:07

Получилось, но работает хак только тогда когда в новости одна ссылка атача.

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

http://prntscr.com/hc27i2

  • 0

Abasive, а если не использовать хак - работают все прикрепленные файлы? Мне просто кажется что проблема не в хаке.

  • 8
18.11 в 17:00

Артем, да работает без хака.

  • 0

Abasive, полностью переписал принцип работы метода. Пробуйте.

  • 5
18.11 в 22:15

Артем, все работает. Спасибо

  • 1
14.12 в 04:02

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

Есть поле с именем - hdd-after. Тип поля - одна строка. Как правильно прописать это поле по шаблону:

$xfields_1 = explode("images", $row_malcov_xfields);

$xfields_1 = explode("||", $xfields_1[1]);

$tpl->result['content'] = str_replace ('{xfields_news_1}', substr($xfields_1[0], 1), $tpl->result['content']);

Артём, надеюсь на вашу помощь ;)

  • 0

Artem, в вашем случае код такой:

$xfields_1 = explode("hdd-after", $row_malcov_xfields);

$xfields_1 = explode("||", $xfields_1[1]);

$tpl->result['content'] = str_replace ('{xfields_news_1}', substr($xfields_1[0], 1), $tpl->result['content']);

  • 8
14.12 в 23:07

Делал также первый раз ещё, но код не срабатывает и доп поле выводится в чистом виде, т.е просто код -

[xfvalue_hdd-after]. Версия DLE 12.0 sad

  • 0

Artem, нужно не [xfvalue_hdd-after] вставлять а {xfields_news_1}

  • 8
14.12 в 23:26

Спасибо. Сработало lol

Ещё вопрос есть по выводу - можно ли сделать условия вывода по аналогии как по стандарту вывод?:

[xfgiven_hdd-after]{xfields_news_1}[/xfgiven_hdd-after]

  • 0

Artem, типа вывод только в том случае когда поле заполнено?

$xfields_1 = explode("hdd-after", $row_malcov_xfields);

$xfields_1 = explode("||", $xfields_1[1]);

if($xfields_1[0] != "") {

$xfields_new_1 = substr($xfields_1[0], 1);

} else {

$xfields_new_1 = "";

}

$tpl->result['content'] = str_replace ('{xfields_news_1}', $xfields_new_1, $tpl->result['content']);

  • 10
15.12 в 00:24

Да, именно. Спасибо. А какие именно теги в шаблон прописывать?

  • 0
15.12 в 00:28

И ещё дополнительный вопрос. Извиняюсь за столько всего.

Чтобы вывести ещё доп поля. Какие именно параметры меняются в коде ниже после дублировании блока?:

$xfields_1 = explode("images", $row_malcov_xfields);

$xfields_1 = explode("||", $xfields_1[1]);

$tpl->result['content'] = str_replace ('{xfields_news_1}', substr($xfields_1[0], 1), $tpl->result['content']);

  • 0

Artem, везде _1 меняете на _2 и так далее

  • 5
16.12 в 08:54

Всё работает на ура. Спасибо Артём.

Хочу спросить ещё об одном моменте! В новости у меня выводится всего 3 аттача, к каждому аттачу есть доп. поле с информацией которая указывается необходимой для этого поля. По вашему методу я сделал вывод этих доп. полей в файле attachment.tpl. Вся проблема что все 3 доп поля выводятся в полной новости к каждому аттачу. Т.е 3х аттача имеет 3х значения, вместо того чтобы к каждому иметь своё (по одному). Можно ли прописать какие либо теги в файле attachment.tpl - напр типа условий как у доп полей, чтобы был каждый код для 3х аттачей.

Т.е например для 1 прикреплённого файла напр. такой

[xfgiven_attach1]здесь html код для первого аттача[/xfgiven_attach1]

[xfgiven_attach2]здесь html код для второго аттача[/xfgiven_attach2]

[xfgiven_attach3]здесь html код для третьего аттача[/xfgiven_attach3]

Дабы не запутать вас прикреплю скрин - http://joxi.ru/KAxnEn7uMoz7Rm

P.s скрин после просмотра можете по желанию удалить..

Думаю если поможете - этот хак многим пригодится кто выводит несколько аттачей в полной новости..

  • 0
17.12 в 13:58

Артём, помогите с вопросом выше wink

  • 0

Artem, чуть позже подумаю, что можно сделать

  • 5
18.12 в 07:47

Хорошо, спасибо огромное на отзывчивость такую, честно даже не ожидал. Буду вас читать, много полезных материалов у вас!

  • 0

Artem, я нашел следующее решение:

1. Откройте файл functions.php в папке /engine/modules/

2. Найдите:

while ( $row = $db->get_row() ) {

и выше вставьте:

$mlc_numb = 1;

3. Здесь же найдите:

$tpl->result['attachment'] = '';

и ниже вставьте:

$mlc_numb++;

4. Здесь же найдите:

if( date( 'Ymd', $row['date'] ) == date( 'Ymd', $_TIME ) ) {

и выше вставьте:

$tpl->set_block( "'\\[numbattachment-".$mlc_numb."\\](.*?)\\[/numbattachment-".$mlc_numb."\\]'

;si", "\\1" );

$tpl->set_block( "'\\[numbattachment-[0-9]\\](.*?)\\[/numbattachment-[0-9]\\]'si", "" );

Все сохраняете, чистите кэш сайта.

Далее, в шаблоне атачмента используете теги:

[numbattachment-1] Текст для первого файла [/numbattachment-1]

[numbattachment-2] Текст для второго файла [/numbattachment-2]

[numbattachment-3] Текст для третьего файла [/numbattachment-3]

и так далее.

Как то так glass

  • 5
18.12 в 17:58

Блин) Вы наверное меня не так поняли, код то выше рабочий, но выполняет др функцию.

Нужно чтобы теги numbattachment проверяли доп поле-аттач на присутствие в новости, и в случае если оно заполненно (есть этот аттач) то выводить. Всего в новости выводится от 1го-до 3х аттачей..

Сможете допилить код? slim

  • 0
18.12 в 17:59

Я выше на скрине приводил пример

  • 0

Artem, то есть, если поле 1 заполнено - выводить первый аттач, если заполнено второе поле - второй аттач. Я правильно понял?

  • 5
19.12 в 14:24

Дело в том что может выводится как по одному аттачу, так и 3 сразу.

Суть просто в том, чтобы сделать для аттача №1 - одну конструкцию из html, для второго - другую, и для третьего- третью.

Вроде подключения разных шаблонов вывода для разных аттачей.

  • 0

Artem, дак вот чем выше код не подходит?

[numbattachment-1] Вид 1 файла [/numbattachment-1]

[numbattachment-2] Вид 2 файла [/numbattachment-2]

[numbattachment-3] Вид 3 файла [/numbattachment-3]

  • 5
20.12 в 07:44

Аттачи после этих правок не выводятся вообще.

Может моя ошибка что я не рассказал как идёт добавление аттача?

- Загружается через доп. поле - тип. загружаемый файл. 3 таких поля

название полей - load1 load2 load3

  • 0

Хм, в таком случае нужен доступ к сайту чтобы посмотреть (админка + ftp)

  • 6

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

Способ выше идет четко для аттача.

  • 5
29.12 в 14:27

Хм, именно вывод через аттач идёт, всё оформление и структура через него (attachment.tpl)

Артём, можно ваш любой мессенждер для связи, всё подробно обьясню со скринами и пруфами, много времени не займёт, но надеюсь на вашу помощь)

  • 0
18.05 в 01:42

Артём, а можно ли как-нибудь добавить в php код текст, чтобы он выводился вместе перед текстом из поля текстом из поля? Например, в поле добавляется год, только цифры, и вот, когда это поле заполнено, в аттаче появлялись не только цифры, но и слово "Год:".

  • 0
18.05 в 02:27

Делаю так:

$tpl->result['content'] = str_replace ('Год:', '{xfields_news_2}', $xfields_new_2, $tpl->result['content']);

Контент фуллстори пропадает, отображаются лишь комментарии :) Куда в коде нужно вставить, чтобы всё было норм?)

  • 0

Василий, попробуйте так:

if(isset($row_malcov_xfields)) {

$xfields_1 = explode("images", $row_malcov_xfields);

$xfields_1 = explode("||", $xfields_1[1]);

$new_file = 'Год: '.substr($xfields_1[0], 1);

$tpl->result['content'] = str_replace ('{xfields_news_1}', $new_file, $tpl->result['content']);

}

Данные только поменяйте для своего поля

  • -2
18.05 в 03:53

Вау, спасибо. А можно соединить с кодом, который выводит это поле только если оно заполнено?

$xfields_2 = explode("god", $row_malcov_xfields);

$xfields_2 = explode("||", $xfields_2[1]);

if($xfields_2[0] != "") {

$xfields_new_2 = substr($xfields_2[0], 1);

} else {

$xfields_new_2 = "";

}

$tpl->result['content'] = str_replace ('{xfields_news_2}', $xfields_new_2, $tpl->result['content']);

  • 3
Показать остальные комментарии  •••
Гостям запрещено участвовать в обсуждениях сайта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
Подняться наверх