(function($){
$.fn.clearSelect = function() {
return this.each(function(){
if(this.tagName=='SELECT') {
this.options.length = 0;
$(this).attr('disabled','disabled');
}
});
}
$.fn.clearField = function(selector) {
this.nextAll(selector).remove();
return this;
}
$.fn.fillSelect = function(dataArray) {
return this.clearSelect().each(function(){
if(this.tagName=='SELECT') {
var currentSelect = this;
var start = new Option('Выбрать...', '-1');
if($.support.cssFloat) {
currentSelect.add(start,null);
} else {
currentSelect.add(start);
}
$.each(dataArray,function(index,data){
if(data.name) {
var option = new Option(data.name,data.id);
if($.support.cssFloat) {
currentSelect.add(option,null);
} else {
currentSelect.add(option);
}
}
});
$(this).removeAttr('disabled').find('option:first').attr('selected', 'selected');
}
});
}
})(jQuery);
function getCategory(pcategory, level) {
$.ajax({
url: 'engine/list.php',
type: 'POST',
data: 'pcategory='+ pcategory +'&level='+ level,
dataType: 'JSON',
timeout: 5000,
beforeSend: function(){
$('select[name^=category_]').attr('disabled', 'disabled');
},
complete: function(){
$('select[name^=category_]').removeAttr('disabled');
},
success: function(response){
var data = eval('('+ response +')');
if(data.count === 'undefined' || data.count == 0) {
$('select[name=category_'+ (data.level - 1) +']')
.clearField('select[name^=category]')
.clearField('span');
return false;
}
if( $('select[name=category_'+ data.level +']').length ) {
$('select[name=category_'+ data.level +']')
.clearField('select[name^=category]')
.clearField('span')
.fillSelect(data.item);
} else {
$('#categories select:last').after('<span>></span> <select name="category_'+ data.level +'"></select>');
$('select[name=category_'+ data.level +']').fillSelect(data.item);
}
$('select[name=category_'+ data.level +']').unbind('change');
$('select[name=category_'+ data.level +']').change(function(){ return clickEvent($(this)); });
return false;
},
error: function(){
$('#msg').append('<p>Some error with categories. Please, try later
</p>');
return false;
}
});
}
function clickEvent(select)
{
var id = select.find('option:selected').attr('value');
if (id == '-1') {
select.clearField('select[name^=category]').clearField('span');
return false;
}
var level = parseInt(select.attr('name').replace('category_', '')) + 1;
return getCategory(id, level);
}
$(document).ready(function(){
$('select[name^=category] option').live("click", function(){
var select = $(this).parents('select');
var level = parseInt(select.attr('name').replace('category_', '')) + 1;
return getCategory(select.find('option:selected').attr('value'), level);
})
getCategory(0, 0);
});
Подключаем в main.tpl
Код
<script type="text/javascript" src="{THEME}/js/javascript.js"></script>
В addnews.tpl находим {category} заменяем на
Код
<div id="categories">
<select name="category_0">
</select></div>
Создаем файл list.php в папке engine такого содержания
Код
<?php
if( $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest')
die( 'Request Error!' );
define ( 'DATALIFEENGINE', true );
define ( 'ROOT_DIR', '..' );
define ( 'ENGINE_DIR', ROOT_DIR . '/engine' );
require_once ENGINE_DIR . '/classes/mysql.php';
require_once ENGINE_DIR . '/data/dbconfig.php';
require_once ENGINE_DIR . '/modules/functions.php';
require_once ENGINE_DIR . '/classes/templates.class.php';
$result = $db->query("SELECT id, name FROM " . PREFIX . "_category") or die(mysql_error());
$categories = array();
while ($row = $db->get_array($result)) {
$cid = $row['id'];
$title = $row['name'];
$categories[$cid] = $title;
}
$result = $db->query("SELECT id, name FROM " . PREFIX . "_category ORDER BY name ASC") or die(mysql_error());
$categories = array();
while ($row = $db->get_array($result)) {
$cid = $row['id'];
$title = $row['name'];
$categories[$cid] = $title;
}
$result = $db->query("SELECT id, parentid FROM " . PREFIX . "_category ORDER BY name ASC") or die(mysql_error());
$levels = array();
while ($row = $db->get_array($result)) {
$cid = $row['id'];
$parentid = $row['parentid'];
$levels[$cid] = $parentid;
}
$pcategory = isset($_POST['pcategory']) ? $_POST['pcategory'] : 0;
$level = isset($_POST['level']) ? $_POST['level'] : 0;
/**
* @var array Результирующий список категорий
* [item] => Массив категорий
* [id] => Идентификатор
* [name] => Название
* [count] => Количество категорий
* [level] => Уровень каскада
*/
$list = array();
/**
* @var array Промежуточный массив идентификаторов категорий
*/
$result = array();
/**
* Получаем идентификаторы нужных нам категорий
* @see
Для просмотра ссылки Войди или Зарегистрируйся
*/
foreach( array_keys($levels, $pcategory) as $value)
$result[] = array('id'=>$value, 'name'=>$categories[$value]);
if(count($result))
$list['item'] = $result;
$list['count'] = count($result);
$list['level'] = $level;
header('Content-type: application/json');
/**
* Преобразуем в массив в JSON
* @see
Для просмотра ссылки Войди или Зарегистрируйся
*/
function json_safe_encode($var)
{
return json_encode(json_fix_cyr($var));
}
function json_fix_cyr($var)
{
if (is_array($var)) {
$new = array();
foreach ($var as $k => $v) {
$new[json_fix_cyr($k)] = json_fix_cyr($v);
}
$var = $new;
} elseif (is_object($var)) {
$vars = get_object_vars($var);
foreach ($vars as $m => $v) {
$var->$m = json_fix_cyr($v);
}
} elseif (is_string($var)) {
$var = iconv('cp1251', 'utf-8', $var);
}
return $var;
}
echo json_safe_encode($list);
?>