В бой идет старик
HTML код старого спойлера выглядит так:
<!--dle_spoiler-->
<div class="title_spoiler">
	<img id="image-spa9f2ecb68fe8e529104c93fad10c96d5" style="vertical-align: middle;border: none;" alt="" src="/templates/Default/dleimages/spoiler-plus.gif" /> 
	<a href="javascript:ShowOrHide('spa9f2ecb68fe8e529104c93fad10c96d5')"><!--spoiler_title-->Показать / Скрыть текст<!--spoiler_title_end--></a>
</div>
<div id="spa9f2ecb68fe8e529104c93fad10c96d5" class="text_spoiler" style="display:none;">
	<!--spoiler_text-->Текст внутри спойлера<!--spoiler_text_end-->
</div>
<!--/dle_spoiler-->Мне он не нравиться, а вам? Взять атрибуты
id и style у <img /> или href у <a>.Теперь посмотрим на страую javascript функцию:
function ShowOrHide(a){
	var b=$("#"+a),
	a=document.getElementById("image-"+a)?document.getElementById("image-"+a):null,
	c=1E3*(b.height()/200);
	3E3<c&&(c=3E3);250>c&&(c=250);
	"none"==b.css("display")?(b.show("blind",{},c),
	a&&(a.src=dle_root+"templates/"+dle_skin+"/dleimages/spoiler-minus.gif")):(2E3<c&&(c=2E3),b.hide("blind",{},c),
	a&&(a.src=dle_root+"templates/"+dle_skin+"/dleimages/spoiler-plus.gif"))
}А этот код красив и функционален на сегодняшний день? Нет!
Новая версия. Сравните ее с существующей!
HTML выглядит так:
<!--dle_spoiler--> <div data-type="spoiler"> <a>Показать / Скрыть текст</a> <div data-type="text"> <!--spoiler_text-->Текст внутри спойлера<!--spoiler_text_end--> </div> </div> <!--/dle_spoiler-->
jQuery функция так:
$('[data-type=spoiler] a').click(function(){
	$(this).toggleClass('opened').next('[data-type=text]').slideToggle(200);return false;
});CSS сравнивать нет смысла ибо в старом коде нет ничего критичного, а в новом - ничего особенного. Обусловлено это тем, что для примера использован стандартный, простейший, внешний вид.
Внедрение нового
1. Открыть /engine/classes/parse.class.php, найти строку:
$source = preg_replace( "#\[/spoiler\]#i", "<!--spoiler_text_end--></div><!--/dle_spoiler-->", $source );
и заменить ее на:
$source = preg_replace( "#\[/spoiler\]#i", "<!--spoiler_text_end--></div></div><!--/dle_spoiler-->", $source );
далее найти строку:
$txt = str_replace( "<!--spoiler_text_end--></div><!--/dle_spoiler-->", '[/spoiler]', $txt );
и заменить на:
$txt = str_replace( "<!--spoiler_text_end--></div></div><!--/dle_spoiler-->", '[/spoiler]', $txt );
далее ищем функцию:
	function build_spoiler($title = "") {
		global $lang;
		
		$title = trim( $title );
		
		$title = stripslashes( $title );
		$title = str_replace( "&amp;", "&", $title );
		$title = preg_replace( "/javascript:/i", "javascript: ", $title );
		
		$id_spoiler = "sp".md5( microtime().uniqid( mt_rand(), TRUE ) );
		
		if( ! $title ) {
			
			return "<!--dle_spoiler--><div class=\"title_spoiler\"><img id=\"image-" . $id_spoiler . "\" style=\"vertical-align: middle;border: none;\" alt=\"\" src=\"{THEME}/dleimages/spoiler-plus.gif\" /> <a href=\"javascript:ShowOrHide('" . $id_spoiler . "')\"><!--spoiler_title-->" . $lang['spoiler_title'] . "<!--spoiler_title_end--></a></div><div id=\"" . $id_spoiler . "\" class=\"text_spoiler\" style=\"display:none;\"><!--spoiler_text-->";
		
		} else {
			
			return "<!--dle_spoiler $title --><div class=\"title_spoiler\"><img id=\"image-" . $id_spoiler . "\" style=\"vertical-align: middle;border: none;\" alt=\"\" src=\"{THEME}/dleimages/spoiler-plus.gif\" /> <a href=\"javascript:ShowOrHide('" . $id_spoiler . "')\"><!--spoiler_title-->" . $title . "<!--spoiler_title_end--></a></div><div id=\"" . $id_spoiler . "\" class=\"text_spoiler\" style=\"display:none;\"><!--spoiler_text-->";
		
		}
	
	}и заменяем ее на новую:
	function build_spoiler($title) {
		global $lang;
		$title = trim(stripslashes($title));
		if (!$title) return "<!--dle_spoiler--><div data-type=\"spoiler\"><a><!--spoiler_title-->". $lang['spoiler_title'] ."<!--spoiler_title_end--></a><div data-type=\"text\"><!--spoiler_text-->";
		else return "<!--dle_spoiler $title --><div data-type=\"spoiler\"><a><!--spoiler_title-->". $title ."<!--spoiler_title_end--></a><div data-type=\"text\"><!--spoiler_text-->";	
	}2. В необходимый файл стилей добавить:
Проверьте наличие изображений 
spoiler-plus.gif и spoiler-minus.gif в директории dleimages. Если они отсутствуют, то их необходимо загрузить. Если же есть, но в другой папке, то в приведенном ниже CSS не забудьте изменить пути.[data-type=spoiler] {
	position:relative;
}
[data-type=spoiler] a {
	display:block;
	line-height:20px;
	padding-left:20px;
}
[data-type=spoiler] a:before {
	content:'';
	position:absolute;
	top:5px;
	left:5px;
	width:9px;
	height:10px;
	background:url(../dleimages/spoiler-plus.gif);
}
[data-type=spoiler] .opened:before {
	background:url(../dleimages/spoiler-minus.gif);
}
[data-type=text] {
	display:none;
}Старые стили можно удалить. Находятся они, обычно, в engine.css. Имена классов, которые больше не нужны: 
.text_spoiler и .title_spoiler3. Открыть /engine/classes/js/dle_js.js, найти функцию:
function ShowOrHide(a){var b=$("#"+a),a=document.getElementById("image-"+a)?document.getElementById("image-"+a):null,c=1E3*(b.height()/200);3E3<c&&(c=3E3);250>c&&(c=250);"none"==b.css("display")?(b.show("blind",{},c),a&&(a.src=dle_root+"templates/"+dle_skin+"/dleimages/spoiler-minus.gif")):(2E3<c&&(c=2E3),b.hide("blind",{},c),a&&(a.src=dle_root+"templates/"+dle_skin+"/dleimages/spoiler-plus.gif"))}и заменить ее на:
$('[data-type=spoiler] a').click(function(){$(this).toggleClass('opened').next('[data-type=text]').slideToggle(200);return false;});Резюме: минусы и плюсы.
Начнем с плохого. И не просто так, ведь минус достаточно существенный для тех, у кого на сайте уже использовано множество спойлеров.
Дело в том, что у старой и новой версий есть очевидные отличия HTML структуры и замена приведет к неработоспособности всех старых спойлеров.
Ну а плюсы очевидны, как по мне:
- в два с половиной раза меньше кода
- более гибкая возможность для стилизации
Демонстрацию работы можно посмотреть по ссылкам:
- Форма входа в админцентр DataLife Engine: http://firstvector.org/broken/dev/28
- Создание приложения из сайта на iOS и Windows 8: http://firstvector.org/broken/dev/43