Переключение шаблонов shortstory для DLE

Переключение шаблонов shortstory

Переключение шаблонов shortstory

На многих сайтах, в частности каталогах, встречается функция смены оформления коротких новостей, например: списком, маленькими иконками, большими иконками и т.п.
В DLE такой опции нету, возможно будет добавлена, но пока постараемся обойтись простым методом на JS и костылях :)
Суть метода заключается в том, что выводятся сразу все варианты оформления новости, но не нужные скрытые в display:none;
Для работы нам понадобится дополнительно подключить только плагин jQuery Cookie, чтобы запоминать выбранный тип оформления при переходе по страницам навигации.
Плюсы:
  • [+] Простая установка
  • [+] Быстрота работы


Минусы:
  • [-]Пока страница не загрузится будет отображаться первый тип шаблона
  • [-]Большой вес страницы, много скрытого не используемого текста


Вот примерно так и будет выглядеть нижеописанное:
Переключение шаблонов shortstory
Переключение шаблонов shortstory


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

CSS:
.templater .current{color:#c00;}
.templtes{display:none;}
.templtes.current{display:block;}


javascript:
$(function(){
	if($.cookie('short_template')){
		$(".templtes").removeClass('current');
		$(".templater a[data-template]").removeClass('current').each(function(){
			if($(this).data('template')==$.cookie('short_template')){
				$(this).addClass('current');
				$(".template-"+$.cookie('short_template')).addClass('current');
			}
		});
	}
	$(".templater a[data-template]").click(function(){
		if($(this).hasClass('current')) return false;
		$(this).addClass('current').siblings().removeClass('current');
		$(".templtes").removeClass('current');
		$(".template-"+$(this).data('template')).addClass('current');
		$.cookie('short_template', $(this).data('template'),{path:'/'});
		return false;
	});
})

Не забудьте подключить jquery.cookie.js

Шаблон формы переключений:
<div class="templater">Режим просмотра: <a href="#" class="current" data-template="default">Стандарт</a> |  <a href="#" data-template="list">Список</a> | <a href="#" data-template="icons">Иконки</a></div>


И шаблон короткой новости:
<div class="templtes template-default current">
 Первый шаблон, я оставил стандартный
</div>
<div class="templtes template-list">
 Второй шаблон, в виде списка
</div>
<div class="templtes template-icons" style="float:left;width:25%;">
 Третий шаблон, в виде иконок, по 4 в ряд.
</div>


С Уважением,
Олег Александрович a.k.a. Sander
Комментарии: (20)
  1. foto
    Администратор 21 августа 2013 20:36 #
    Основной этап работ уже завершен, скоро сделаю регистрацию и прочие плюшки :)
    +10
    1. foto
      VIP 22 августа 2013 10:52 #
      Отлично, осталось запретить юзерам стирать комменты, убрать FP и наладить Ctrl+Enter
      +3
  2. foto
    Посетитель 18 сентября 2013 20:31 #
    идея хорошая, но минусы очень серьезные,

    к ним еще причисли СЕО вред, не только из за повторяющегося текста, ссылок, но еще и из за большего размера страницы.
    0
  3. foto
    Посетитель 22 сентября 2013 07:31 #
    Цитата: shamanim
    СЕО вред

    Согласен...
    0
  4. foto
    Посетитель 21 февраля 2015 12:43 #
    Здравствуйте, пожалуйста напишите как заставить работать с доп полями
    0
    1. foto
      Администратор 21 февраля 2015 17:28 #
      Этот хак не предназначен для работы с доп. полями. Он их ни коим образом не касается и не мешает их работе. Выводите их так же как и в обычном шаблоне.
      0
  5. foto
    Посетитель 22 февраля 2015 04:34 #
    Цитата: Sander
    Этот хак не предназначен для работы с доп. полями. Он их ни коим образом не касается и не мешает их работе. Выводите их так же как и в обычном шаблоне.

    т.е я допустил когдато ошибку в установке? у меня при смене вида кратких новостей, выводит: если скачка: то [attachment=3], а если картинка тогда белый фон. так и должно быть или ошибку в установке допустил?
    0
  6. foto
    Посетитель 22 февраля 2015 04:35 #
    Если перезагружаю страницу все отображается нормально
    0
  7. foto
    Посетитель 22 февраля 2015 05:07 #
    пожалуйста напишите как правильнее всего сделать?
    использовать ваш вариант или
    2 вариант
    0
  8. foto
    Посетитель 11 апреля 2015 12:48 #
    не работает на 10.4,
    пожалуйста напишите где скачать чистую чистейшую, как попка младенца, дле 10.4
    не 10.3 как на офф сайте,а именно 10.4 т.е последнюю?
    и почему не работает на 10.4 этот переключателЬ?
    0
  9. foto
    Посетитель 15 июля 2017 13:03 #
    Доброго времени суток! Всё поставил всё работает на ура, большое спасибо!
    У меня стоит AJAX подгрузка страниц LiveLoad
    И я столкнулся с проблемой:
    1) при переходе в категорию не выводятся новости
    2) если выбрать ИКОНКИ и нажать кнопку подгрузить ещё новость то подгружаются новости в стандарте
    У меня стоит дле 11.1.
    Помогите подправить буду весьма благодарен.
    Спасибо!
    0
  10. foto
    Посетитель 15 июля 2017 13:41 #
    Цитата: GASTROLYOR
    Доброго времени суток! Всё поставил всё работает на ура, большое спасибо!
    У меня стоит AJAX подгрузка страниц LiveLoad
    И я столкнулся с проблемой:
    1) при переходе в категорию не выводятся новости
    2) если выбрать ИКОНКИ и нажать кнопку подгрузить ещё новость то подгружаются новости в стандарте
    У меня стоит дле 11.1.
    Помогите подправить буду весьма благодарен.
    Спасибо!

    Или же вот ещё есть простое решение автоподгрузки новостей но я понятие не имею что тут править помогите пожалуйста!!!
    <div id="ajax-next-page" style="display: none;">[next-link][/next-link]</div>
    <script type="text/javascript">
        $(function() {
            $(window).scroll(function() {
                if ($(window).scrollTop() > $('body').height()-$(window).height()-10) {
                    var nextPage = $('#ajax-next-page a').attr('href');
                    if (nextPage !== undefined) {
                        $.ajax({
                            url: nextPage,
                            success: function(data) {
                                $('#ajax-next-page').remove();
                                $('#dle-content').append($('#dle-content', data).html());
                            }
                        })
                    }
                }
            });
        });
    </script>

    Подгружает стандарт при выборе иконки...
    0
  11. foto
    Посетитель 5 октября 2018 22:50 #
    Первый минус устранён, второй тоже думаю.
    
    <?xml version="1.0" encoding="utf-8"?>
    <dleplugin>
    	<name>Change shortstory</name>
    	<description>В шаблоне main.tpl и других подключенных в нём в удобном месте используйте {sortn}
    
    Добавление и изменение html разметки осуществляется в разделе &quot;Действия в файлах&quot; в правках над файлом &quot;engine/modules/main.php&quot;</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/show.short.php">
    		<operation action="replace">
    			<searchcode><![CDATA[	if( $view_template != "rss" ) {
    		if( $category_id and $cat_info[$category_id]['short_tpl'] != '' ) $tpl->load_template( $cat_info[$category_id]['short_tpl'] . '.tpl' );
    		else $tpl->load_template( 'shortstory.tpl' );
    	}]]></searchcode>
    			<replacecode><![CDATA[$change_template = true;
    if( isset($config['change_template']) AND $config['change_template'] != '' ) {
      $user_short_tpl_tmp = explode(',', $config['change_template']);
      if( count($user_short_tpl_tmp) <= 1 ) $change_template = false;
    } 
    
    $user_tpl = isset($_COOKIE['short_template']) ? trim($_COOKIE['short_template']) : 'default';
    $user_tpl = ($user_tpl == 'default' OR !$change_template) ? 'shortstory.tpl' : 'shortstory_'.$user_tpl.'.tpl';
    if( $view_template != "rss" ) {
    	if( $category_id and $cat_info[$category_id]['short_tpl'] != '' ) $tpl->load_template( $cat_info[$category_id]['short_tpl'] . '.tpl' );
    	else $tpl->load_template( $user_tpl );
    }]]></replacecode>
    		</operation>
    		<operation action="after">
    			<searchcode><![CDATA[$db->free( $sql_result );]]></searchcode>
    			<replacecode><![CDATA[$onload_scripts[] = <<<HTML
        $(".templater a[data-template]").click(function(){
            if($(this).hasClass('current')) return false;
            $(this).addClass('current').siblings().removeClass('current');
            $(".templtes").removeClass('current');
            $(".template-"+$(this).data('template')).addClass('current');
            Cookie.create('short_template', $(this).data('template'), {
    			expires: 8760,
    			path: '/'
    		});
            window.location.href=location.href;        
            return false;
        });
    HTML;]]></replacecode>
    		</operation>
    	</file>
    	<file name="engine/modules/main.php">
    		<operation action="after">
    			<searchcode><![CDATA[$tpl->set ( '{speedbar}', $tpl->result['speedbar'] );]]></searchcode>
    			<replacecode><![CDATA[$change_template = true;
    if( isset($config['change_template']) AND $config['change_template'] != '' ) {
      $user_short_tpl = array();
      $user_short_tpl_tmp = explode(',', $config['change_template']);
      if( count($user_short_tpl_tmp) <= 1 ) $change_template = false;
      if( $change_template ) {
        foreach($user_short_tpl_tmp as $val) {
          $val = explode('|', $val);
          $user_short_tpl[] = array('template' => $val[0], 'name' => htmlspecialchars_decode($val[1]));
        }
      }
    } else { 
    $user_short_tpl = array(
      array('template' => 'default', 'name' => 'Стандарт'),
      array('template' => 'list', 'name' => 'Список'),
      array('template' => 'icons', 'name' => 'Иконки')
    );
    }
    
    if( $change_template ) {
    $sortn_arr = array();
    $user_tpl = isset($_COOKIE['short_template']) ? trim($_COOKIE['short_template']) : 'default';
    
    foreach($user_short_tpl as $val){
      
      if( is_array($val) ) {
      $active_template = ' ';
      if($user_tpl == $val['template']) $active_template = ' class="current" ';
      $sortn_arr[] = '<a href="#"'.$active_template.'data-template="'.$val['template'].'">'.$val['name'].'</a>';
      }
    
    }
    $sortn_arr = implode(' | ', $sortn_arr);
    $sortn = <<<HTML
       <div class="sortn dpad">
    	   <div class="sortn">
    	   <div class="templater">Режим просмотра: {$sortn_arr}</div>
    	   </div>
    	</div> 
    HTML;
    
    $tpl->set ( '{sortn}',  $sortn);
    } else $tpl->set ( '{sortn}',  '');]]></replacecode>
    		</operation>
    	</file>
    	<file name="engine/inc/options.php">
    		<operation action="after">
    			<searchcode><![CDATA[showRow( $lang['opt_sys_biw'], $lang['opt_sys_biwd'], makeCheckBox( "save_con[bbimages_in_wysiwyg]", "{$config['bbimages_in_wysiwyg']}" ) );]]></searchcode>
    			<replacecode><![CDATA[showRow( $lang['change_template'], $lang['change_template_2'], "<textarea class=\"classic\" style=\"width:100%;height:150px;\" name=\"save_con[change_template]\">{$config['change_template']}</textarea>" );]]></replacecode>
    		</operation>
    		<operation action="before">
    			<searchcode><![CDATA[$save_con['offline_reason'] = trim(strip_tags(stripslashes( $save_con['offline_reason'] )));]]></searchcode>
    			<replacecode><![CDATA[$save_con['change_template'] = trim(stripslashes( $save_con['change_template'] ));
    $save_con['change_template'] = htmlspecialchars( $save_con['change_template'], ENT_QUOTES, $config['charset']);]]></replacecode>
    		</operation>
    		<operation action="replace">
    			<searchcode><![CDATA[if( $name != "offline_reason" ) {]]></searchcode>
    			<replacecode><![CDATA[if( $name != "offline_reason" AND $name != "change_template" ) {]]></replacecode>
    		</operation>
    	</file>
    	<file name="language/Russian/adminpanel.lng">
    		<operation action="after">
    			<searchcode><![CDATA['wysiwyg_language'		=>  "ru",]]></searchcode>
    			<replacecode><![CDATA['change_template'		=>  "Список шаблонов",
    'change_template_2'		=>  "Перечислите шаблоны для смены<br />Пример: <strong>default</strong>-<strong>Стандарт</strong> | <strong>list</strong>-<strong>Список</strong> | <strong>icons</strong>-<strong>Иконки</strong><br /><br />Префикс шаблона - Текст или картинка<br /> - default = shortstory.tpl<br /> - list = shortstory_<strong>list</strong>.tpl<br />Для отключения смены оставьте один шаблон. Пустое поле задействует стандартный набор смены шаблонов.",]]></replacecode>
    		</operation>
    	</file>
    </dleplugin>
    
    0
    1. foto
      Посетитель 5 октября 2018 22:51 #
      Это содержание xml для 13 версии движка.
      0
    2. foto
      Администратор 6 октября 2018 13:34 #
      trim($_COOKIE['short_template'])

      trim? И все? Это и вся фильтрация входящих данных?
      Достаточно прописать в cookies /../main.tpl и будет показан шаблон main.tpl. И только благодаря защите в самом шаблонизаторе DLE не получится использовать php файлы.

      PS. Достаточно trim заменить на totranslit.
      0
      1. foto
        Посетитель 7 октября 2018 03:59 #
        Ну установил я значение /../main.tpl в cookies, получаю следующее Template not found: /templates/smartphone/main.tpl.tpl

        А Вы заметили строчку где написано, что значение cookies это префикс для shortstory.tpl, любое значение будет ссылаться на shortstory_cookies.tpl и является лишь префиксом для шаблона.

        Я конечно послушаю, как это может мне аукнуться и какой вред могут нанести вредители если начнут использовать cookies в своих корыстных целях. smile Но я не вижу ничего слишком опасного, или хоть малость существенного. Я конечно сейчас еще раз пересмотрю всё (Реально, а в друг кто нибудь и сможет

        И вообще я кусок кода взял на другом сайте который в свою очередь вырезал из вашей реализации и естественно его поправили или изменили. А я самую малость доделал. Ведь реально отличается всё у вас заранее html часть скрытая, а на сайте уже была реализация с переключениями самих tpl, в начальном том варианте вообще никакой фильтрации не было там был массив.
        $user_short_tpl = array(
        'default' => 'shortstory.tpl', //дефолтный шаблон
        'list' => 'shortstory_list.tpl', // шаблон списком
        'icons' => 'shortstory_icons.tpl' // шаблон картинки
        );


        Пересмотрел еще раз, добавил totranslit, а так же слегка поправил. Теперь значение в куках проверяется в наличие шаблонов, если префикса шаблона нету в заданных админом будет подключен стандартный. А сам переключатель виден только там где используется модуль show.short.php
        0
  12. foto
    Посетитель 22 января 2019 22:11 #
    Поставил плугин на 13.1, прописал стиль и разбил shortstory.tpl как написано выше... Переключение получается "на ходу", НО при переходе (пагинации) на другую страницу или просто при обновлении самой страницы, настройки возвращаются к режиму стандартной короткой новости, если был режим выбран другой, например список...
    Это нормально, так и задумано? (в чем сомневаюсь, возможно где-то ошибся). Хорошо бы увидеть инструкцию и архив файлов с последними изменениями. Думаю что не я один в этом заинтересован. Заранее спасибо.
    0
    1. foto
      Администратор 23 января 2019 21:46 #
      Может сегодня чуть позже напишу обновленную статью как лучше реализовывать подобный функционал, чисто в рамках работы шаблона.
      0
    2. foto
      Посетитель 13 февраля 2019 08:03 #
      Пока могу посоветовать выключить кэширование на сайте. С этим увы ни один из вариантов не работает.
      0
  13. foto
    VIP 2 февраля 2022 04:56 #
    Всем привет, перелазил весь рунет. На сегодняшний день ни одного плагина нет на ajax работающего под 15+ dle
    0
Добавить комментарий

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

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

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