• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Помощь Как создать отдельную форму выбора категорий и подкатегорий ?

Статус
В этой теме нельзя размещать новые ответы.

luckybuy

Местный житель
Регистрация
8 Июн 2010
Сообщения
176
Реакции
21
Добрый день , уважаемые коллеги !
Как известно, выбор подкатегории в ДЛЕ находится в одной форме, вместе с выбором категорий, т.е.
Категория 1
Подкатегория 1.1
Подкатегория 1.2
Подкатегория 1.3
Категория 2
Подкатегория 2.1
Подкатегория 2.2
Подкатегория 2.3
Что нужно ?
Нужно сделать две формы в форме 1 находятся категории, в форме 2 - подкатегории. При выборе категории в форме 1, в форме 2 автоматически без перезагрузки страницы формировался список подкатегорий для выбора.
Буду благодарен за конструктивную помощь. Спасибо.
 
Модуль вывода подкатегорий (сколько угодно) в отдельных формах.

Вот решение:
Создаем javascript.js в папке templates/vasha_tema/js с таким содержанием
(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>&gt;</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);
?>
В engine/modules/addnews.php после
$alt_name = trim( $parse->process( stripslashes( $_POST['alt_name'] ) ) );
добавляете
if (isset($_POST['category_4']) AND $_POST['category_4'] !=-1) {
$cid = trim( $parse->process( stripslashes($_POST['category_4'] ) ) );
} elseif (isset($_POST['category_3']) AND $_POST['category_3'] !=-1) {
$cid = trim( $parse->process( stripslashes($_POST['category_3'] ) ) );
} elseif (isset($_POST['category_2']) AND $_POST['category_2'] !=-1) {
$cid = trim( $parse->process( stripslashes($_POST['category_2'] ) ) );
} elseif (isset($_POST['category_1']) AND $_POST['category_1'] !=-1) {
$cid = trim( $parse->process( stripslashes($_POST['category_1'] ) ) );
} elseif (isset($_POST['category_0']) AND $_POST['category_0'] !=-1) {
$cid = trim( $parse->process( stripslashes($_POST['category_0'] ) ) );
}
В этом же файле находите
$db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_rate, allow_br, flag, tags) values ('$thistime', '$member_id[name]', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_rating', '$allow_br', '1', '" . $_POST['tags'] . "')" );
заменяете на
$db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_rate, allow_br, flag, tags) values ('$thistime', '$member_id[name]', '$short_story', '$full_story', '$filecontents', '$title', '', '$cid', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_rating', '$allow_br', '1', '" . $_POST['tags'] . "')" );
Вот и все. Работает даже на 9,2.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху