Перед созданием новой темы, пожалуйста, ознакомьтесь с FAQ по LinkorCMS

Вопрос про создание функции изм. статуса категорий

Супер пользователь
Сообщений: 125
Делаю возможность Вкл и Откл категорий

Добавил кнопку так

<?
System::admin()->SpeedStatus('Включена', 'Отключена', ADMIN_FILE.'?exe='.$th
is->module.'&'.$this->action_par_name.'=changecatstatus&'.$this->id_par_name.'='.$id, $cat['active'] == '1');
?>

создал функцию так(admin файл)

<?
public function ChangeStatus(){<br />
<br />
        if(!isset($_GET['id'])){<br />
            if(IsAjax()){<br />
                exit("ERROR");<br />
            }<br />
            GO(ADMIN_FILE.'?exe='.$this->module.'&'.$this->action_par_name.'=cats');<br />
        }<br />
        System::database()->Select($this->module.'_cats', "`id`='".SafeEnv($_GET['id'], 11, int)."'");<br />
        if(System::database()->NumRows() > 0){<br />
            $r = System::database()->FetchRow();<br />
            if($r['active'] == 1){<br />
                $en = '0';<br />
            }else{<br />
                $en = '1';<br />
            }<br />
            System::database()->Update($this->module.'_cats', "`active`='$en'", "`id`='".SafeEnv($_GET['id'], 11, int)."'");<br />
            Audit('Категории: Изменение статуса категори
и "'.$r['title'].'" в '.$this->module);<br />
            System::cache()->Delete('tree', $this->Table);<br />
        }<br />
        if(IsAjax()){<br />
            exit("OK");<br />
        }<br />
        GO(ADMIN_FILE.'?exe='.$this->module.'&'.$this->action_par_name.'=cats');<br />
    }
?>


в модулях вызов так

<?
case 'changecatstatus':<br />
        if(!$edit_cats){<br />
            System::admin()->AccessDenied();<br />
        }else{<br />
            AdminDownloadsGetTree()->ChangeStatus();<br />
        }<br />
        break;
?>


Вывод пользователю:

<?
public function ShowCats( $cat_id ){<br />
        $vars = array();<br />
        $cats = $this->GetChildTree($cat_id); // получаем категории<br />
        $c = count($cats); // кол-во всех категорий в текущей<br />
        <br />
        // Удаляем из массива все не активные категории<br />
        for($i = 0; $i < $c; $i++){<br />
            if($cats[$i]['active'] == 0){<br />
                unset($cats[$i]);<br />
            }<br />
        }<br />
        <br />
        // пересобираем массив категорий<br />
        $nn = 0;<br />
        foreach ($cats as $cat){<br />
            $cats2[$nn] = $cat;<br />
            $nn++;<br />
        }<br />
        $cats = $cats2;<br />
        unset($cats2);<br />
        $c = count($cats); // кол-во активных категорий в текущей
?>


Просьба посмотреть и дать комментарий, может что то не очень корректно в фун-и написано

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

<?
function IndexGalleryGetNumItems(){<br />
    System::database()->Select('gallery', GetWhereByAccess('view', "`show`='1'"));<br />
    $num = System::database()->NumRows();<br />
    System::database()->FreeResult();<br />
    return 'Всего изображений в галерее: '.$num;<br />
}
?>

первое зачем делать такую большую выборку только для подсчета? Класс для sql может просто посчитать?
и второе как посчитать только в активных категориях? или все таки делать авто-выключение объектов при выкл категории... (

-- Изменено "Fort": 15.10.2015 13:50 --

-- Изменено "Fort": 15.10.2015 23:02 --
Разработчик
Сообщений: 605
Мне не очень нравится, когда в роутерах находится код. Задача роутера - роутить действия, а не заниматься их выполнением. Хотя небольшие действия могут быть не критично. Так что на ваш вкус.

Метод ChangeStatus() выглядит подобным, но:
- Не очень хорошо пытаться строить таблицу по названию модуля. Последний сам передает название таблицы (которая не факт, что будет называться module_cats), которая доступна через свойство $Table класса.
- Та же самая история и с названием экшена. Есть свойство $showcats_met для этого.
- Проверять так не очень красиво:
if($r['active'] == 1){
$en = '0';
}else{
$en = '1';
}

Можно использовать тернарный оператор для этого.

Больше всего интересен метод ShowCats(). Проверку на активность можно вынести из него в более низкоуровневые методы. И есть ли смысл перестраивать массив? Может просто при рендеринге пропускать итерации, которые приходятся на неактивные категории?

Fort:
первое зачем делать такую большую выборку только для подсчета? Класс для sql может просто посчитать?

Текущие слои не умеют производить запросы а-ля COUNT(*). Подвижки с этим будут в следующих версиях. Если не предполагается использовать файловую БД, то можно написать SQL запрос.

Fort:
и второе как посчитать только в активных категориях?

Добавить в WHERE условие на это.
Супер пользователь
Сообщений: 125
как использовать свойство $showcats_met ?

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

<?
public function ShowCats( $cat_id ){<br />
        $vars = array();<br />
        $cats = $this->GetChildTree($cat_id); // получаем категории<br />
        $c = count($cats); // кол-во всех категорий в текущей<br />
        <br />
        // Удаляем из массива все не активные категории<br />
        for($i = 0; $i < $c; $i++){<br />
            if($cats[$i]['active'] == 0){<br />
                unset($cats[$i]);<br />
            }<br />
        }<br />
        <br />
        // пересобираем массив категорий<br />
        $nn = 0;<br />
        $cats_new = array();<br />
        foreach ($cats as $cat){<br />
            $cats_new[$nn] = $cat;<br />
            $nn++;<br />
        }<br />
        $cats = $cats_new;<br />
        unset($cats_new);<br />
        $c = count($cats); // кол-во активных категорий в текущей<br />
        <br />
        $vars['desc_parent'] = '';<br />
        if($cat_id != 0){ // если не корень, то получ. инф о родителе<br />
            $parent = $this->GetParent($cat_id); // получаем данные родителя<br />
            $vars['desc_parent'] = $parent['description']; // описание родителя<br />
        }<br />
        <br />
        if( $c > 0 || $vars['desc_parent'] != '' ){ // если есть категории или описание родителя<br />
            <br />
            System::site()->AddTemplatedBox('', $this->catTemplate); // добавляем шаблон категорий<br />
            // Включаем все блоки в шаблоне (по умолчанию)<br />
            System::site()->AddBlock('this_cat', true, true, 'cat'); // Включаем блок this_cat<br />
            System::site()->AddBlock('cats', true, true, 'cat'); // Включаем блок cats<br />
            System::site()->AddBlock('cat_caption', true, false, '', '', '');  // Включаем блок cat_caption<br />
            <br />
            if(isset($vars['desc_parent'])){ // если есть описание родителя<br />
                System::site()->AddSubBlock('this_cat', true, $vars); // Включаем субблок this_cat<br />
            }<br />
            <br />
            if($c > 0){ // если есть категории<br />
                <br />
                for($i = 0; $i < $c; $i++){ // перебираем категории<br />
                    $id = SafeDB($cats[$i]['id'], 11, int);<br />
                    $vars['url'] = Ufu('index.php?name='.$this->moduleName.'&'.$this->id_par_name.'='.$id, $this->moduleName.'/{'.$this->id_par_name.'}/');<br />
                    $vars['title'] = SafeDB($cats[$i]['title'], 255, str);<br />
                    $vars['icon_url'] = 'images/cat_'.$this->moduleName.'_noicon.png';<br />
                    if(file_exists($cats[$i]['icon'])){ // если существует файл иконки<br />
                        $vars['icon_url'] = SafeDB(RealPath2($cats[$i]['icon']), 255, str);<br />
                    }<br />
                    $vars['description'] = '';<br />
                    if($cats[$i]['description'] != ''){<br />
                        $vars['description'] = trim(str_replace('&nbsp;', ' ', $cats[$i]['description']));<br />
                        $vars['description'] = SafeDB($vars['description'], 999, str, true, false);<br />
                        $vars['description'] = substr($vars['description'], 0, 80).'&hellip;';<br />
                    }<br />
                    $counters = $this->GetCountersRecursive($id);<br />
                    $vars['count'] = $counters['files'];<br />
                    $vars['cat_count'] = $counters['cats'];<br />
<br />
                    // Выводим подкатегории<br />
                    $childs = '';<br />
                    $sub = '';<br />
                    if(isset($cats[$i][TREE_CHILD_ID])){<br />
                        for($j = 0, $k = count($cats[$i][TREE_CHILD_ID]); $j < $k; $j++){<br />
                            $child_id = SafeDB($cats[$i][TREE_CHILD_ID][$j]['id'], 11, int);<br />
                            $child_counters = $this->GetCountersRecursive($child_id);<br />
                            $link = Ufu('index.php?name='.$t
his->moduleName.'&'.$this->id_par_name.'='.$child_id, $this->moduleName.'/{'.$this->id_par_name.'}/');<br />
                            $sub .= '<a href="'.$link.'">'.$cats[$i][TREE_CHILD_ID][$j]['title'].'</a>'.'&nbsp;('.$child_counters['files'].'), ';<br />
                        }<br />
                        $childs .= substr($sub, 0, -2);<br />
                    }<br />
                    $vars['childs_cats'] = $childs;<br />
<br />
                    System::site()->AddSubBlock('cats', true, $vars);  // Добавляем субблок cats<br />
                }<br />
                $text = '';<br />
                if($cat_id == 0 && function_exists($this->NumItems)){ // если в корне и в модуле есть фун-я подсчета кол-ва элементов<br />
                    $text = $this->NumItemsCaption.call_user_func($this->NumItems); // кол-во всех элементов во всех категориях<br />
                }<br />
                System::site()->AddBlock('cat_caption', true, false, '', '', $text);  // Включаем блок cat_caption<br />
            }<br />
        }elseif($cat_id == 0){<br />
            System::site()->AddTextBox('', '<div class="simple_message">Категорий пока нет.</div>');<br />
        }<br />
    }
?>


есть говая функция для подсчета ? для класса sql
сайт будет сильно заполнен, так совсем не годится

Добавить в WHERE условие на это.

там не храниться инф об этом, только id категории

-- Изменено "Fort": 17.10.2015 18:51 --
Супер пользователь
Сообщений: 125
Мартин:

Можно использовать тернарный оператор для этого.

Больше всего интересен метод ShowCats(). Проверку на активность можно вынести из него в более низкоуровневые методы. И есть ли смысл перестраивать массив? Может просто при рендеринге пропускать итерации, которые приходятся на неактивные категории?


тернарный оператор трудно читать!

Я убрал цикл для перестройки массива, для этого пришлось след. цикл for заменить на foreach
И так же была не доработка при проходе "детей", не учитывался статус... вкл/выкл
также появился $this->CatStatus и теперь подсчет файлов происходит из данных категорий !
Пользовательская функция вырезана.
public $NumItems = 0; - в классе
$tree->NumItems = 'Всего статей: '; - при определении свойств класса


<?
public function ShowCats( $cat_id ){<br />
        $vars = array();<br />
        $cats = $this->GetChildTree($cat_id); // получаем категории<br />
        $c = count($cats); // кол-во всех категорий в текущей<br />
        <br />
        // Удаляем из массива все не активные категории<br />
        for($i = 0; $i < $c; $i++){<br />
            if($cats[$i][$this->CatStatus] == 0){<br />
                unset($cats[$i]);<br />
            }<br />
        }<br />
        $c = count($cats); // кол-во всех Активных категорий в текущей<br />
        <br />
        // если не корень, то получ. инф о родителе<br />
        if($cat_id != 0){<br />
            $parent = $this->GetParent($cat_id); // получаем данные родителя<br />
            $vars['desc_parent'] = $parent['description']; // описание родителя<br />
        }else{<br />
            $vars['desc_parent'] = '';<br />
        }<br />
        <br />
        // если есть категории или описание родителя<br />
        if( $c > 0 || $vars['desc_parent'] != '' ){<br />
            <br />
            System::site()->AddTemplatedBox('', $this->catTemplate); // добавляем шаблон категорий<br />
            // Включаем все блоки в шаблоне (по умолчанию)<br />
            System::site()->AddBlock('this_cat', true, true, 'cat'); // Включаем блок this_cat<br />
            System::site()->AddBlock('cats', true, true, 'cat'); // Включаем блок cats<br />
            System::site()->AddBlock('cat_caption', true, false, '', '', '');  // Включаем блок cat_caption<br />
            <br />
            if(isset($vars['desc_parent'])){ // если есть описание родителя<br />
                System::site()->AddSubBlock('this_cat', true, $vars); // Включаем субблок this_cat<br />
            }<br />
            <br />
            $all_count = 0;<br />
            // Перебираем категории<br />
            foreach($cats as $cat){<br />
                <br />
                if($cat[$this->CatStatus] == 1){<br />
                        <br />
                    $id = SafeDB($cat['id'], 11, int);<br />
                    $counters = $this->GetCountersRecursive($id);<br />
                    $all_count += $counters['files'];<br />
                    <br />
                    $vars['url'] = Ufu('index.php?name='.$this->moduleName.'&'.$this->id_par_name.'='.$id, $this->moduleName.'/{'.$this->id_par_name.'}/');<br />
                    $vars['title'] = SafeDB($cat['title'], 255, str);<br />
                    $vars['count'] = $counters['files'];<br />
                    $vars['cat_count'] = $counters['cats'];<br />
                    <br />
                    // если существует файл иконки<br />
                    if(file_exists($cat['icon'])){<br />
                        $vars['icon_url'] = SafeDB(RealPath2($cat['icon']), 255, str);<br />
                    }else{<br />
                        $vars['icon_url'] = 'images/cat_'.$this->moduleName.'_noicon.png';<br />
                    }<br />
                    // если есть описание<br />
                    if($cat['description'] != ''){<br />
                        $vars['description'] = trim(str_replace('&nbsp;', ' ', $cat['description']));<br />
                        $vars['description'] = SafeDB($vars['description'], 0, str, true, false);<br />
                        $vars['description'] = substr($vars['description'], 0, 80).'&hellip;';<br />
                    }else{<br />
                        $vars['description'] = '';    <br />
                    }<br />
                    <br />
                    // Выводим подкатегории<br />
                    $childs = '';<br />
                    $sub = '';<br />
                    if(isset($cat[TREE_CHILD_ID])){<br />
                        for($j = 0, $k = count($cat[TREE_CHILD_ID]); $j < $k; $j++){<br />
                            if($cat[TREE_CHILD_ID][$j][$this->CatStatus] == 1){<br />
                                $this_id = SafeDB($cat[TREE_CHILD_ID][$j]['id'], 11, int);<br />
                                $child_counters = $this->GetCountersRecursive($this_id);<br />
                                $link = Ufu('index.php?name=
'.$this->moduleName.'&'.$this->id_par_name.'='.$this_id, $this->moduleName.'/{'.$this->id_par_name.'}/');<br />
                                $sub .= '<a href="'.$link.'">'.$cat[TREE_CHILD_ID][$j]['title'].'</a>'.'&nbsp;('.$child_counters['files'].'), ';<br />
                                $all_count += $child_counter
s['files'];<br />
                            }<br />
                        }<br />
                        $childs .= substr($sub, 0, -2);<br />
                    }<br />
                    $vars['childs_cats'] = $childs;<br />
<br />
                    System::site()->AddSubBlock('cats', true, $vars);  // Добавляем субблок cats<br />
                }<br />
                <br />
                if($cat_id == 0 && $all_count && $this->NumItems){<br />
                    System::site()->AddBlock('cat_caption', true, false, '', '', $this->NumItems.$all_count);  // Включаем блок cat_caption<br />
                }<br />
                <br />
            }<br />
        }elseif($cat_id == 0){<br />
            System::site()->AddTextBox('', '<div class="simple_message">Категорий пока нет.</div>');<br />
        }<br />
    }
?>


также просьба глянуть на корректность
Супер пользователь
Сообщений: 125
Все таки вы правы. При таком подходе не учитывается построение карты сайта.
Сейчас переделаю на низкоуровневый класс и выложу в расширениях.
Гости не могут отвечать на темы. Войдите или Зарегистрируйтесь.
Здесь присутствуют
(пользователей: 0, гостей: 1)
Быстрый переход: