Критические части кода в приложении php? Бдительный categories php

Государственный Эрмитаж в данный момент занимает семь строений: Зимний дворец, Большой Эрмитаж (или Старый Эрмитаж), Малый Эрмитаж, Новый Эрмитаж, Эрмитажный театр, Меншиковский дворец и бывшее здание Главного штаба. Два последних архитектурных ансамбля вошли в состав Государственного Эрмитажа сравнительно недавно.

Эрмитаж - один из самых больших и известных художественных музеев в мире. Каждый посетивший Санкт-Петербург турист начинает свое знакомство с городом прогулки по набережной вдоль пять зданий Эрмитажа. Каждый житель Петербурга просто уверен, что если ты не посетил Эрмитаж, значит не проникся духом Петербурга. В настоящее время Эрмитаж является еще и культурно-образовательным учреждением. Тут читают лекции на самые разнообразные темы преподаватели различных ВУЗов. В школьную программу учащихся Санкт-Петербурга входит посещение Эрмитажа. Эрмитаж тесно сотрудничает со школьным и молодежным центром.

Главным зданием Эрмитажа считают Зимний дворец. Дворец был построен в середине 18 века по приказу Елизаветы Петровны. На его месте стоял другой Зимний дворец, показавшийся императрице недостаточно пышным и просторным для царских апартаментов. Новое здание, достойное называться императорским дворцом, строилось под руководством архитектора Бартоломео Франческо Растрелли, но ни Елизавете, ни вступившему после нее на престол Петру III, пожить в нем не удалось. В законченный Зимний дворец, который позже стал символом Эрмитажа, торжественно въехала после коронации в Москве Екатерина II. Впрочем, ей новое место жительства не понравилось: сначала она распорядилась здесь кое-что перестроить, а потом и вовсе решила возвести рядом с Зимним дворцом другое здание, которое было названо впоследствии - Малый Эрмитаж. Над его проектом работали архитекторы Юрий Матвеевич Фельтен и Валлен-Деламот Жан Батист Мишель. Когда здание Малого Эрмитажа было завершено, Екатерина стала проводить в нем значительную часть своего времени.

Малый Эрмитаж стал для Екатерины II местом где она смогла разместить свою коллекцию живописи, которая легла в основу будущего музея. Коллекция постоянно пополнялась новыми картинами, скульптурами, изделиями из поделочных камней и другими предметами искусства. И в конце концов в Малом Эрмитаже не осталось свободного места для их размещения. В 1771-1787 годах к нему было пристроено еще одно здание - Большой Эрмитаж, которое специально предназначалось для хранения живописных и скульптурных произведений. Большой Эрмитаж, построенный под руководством архитектора Ю. М. Фельтена, отличался от Зимнего дворца и Малого Эрмитажа очень строгим, без каких-либо украшений, внешним обликом.

В моду вошло участие в театрализованных представлениях. Примерно в те же годы, что и Большой Эрмитаж, на Дворцовой площади был возведен Эрмитажный театр, созданный по проекту Джакомо Кваренги. Императрица Екатерина II приглашала на спектакли так много гостей, что Малый Эрмитаж не вмещал всех приглашенных. Новый Эрмитаж стал необходим когда в Малом и Большом Эрмитаже закончилось свободное место. Разработка проекта Нового Эрмитажа была поручена немецкому архитектору Лео фон Кленце, а осуществляли его российские зодчие Василий Петрович Стасов и Николай Ефимович Ефимов. Удивительно красивый Эрмитажный театр, в настоящее время является местом проведения массовых мероприятий городского уровня.
(Просмотров папки: 78464)

Найдено: 188 фотографий 16 страницах. Показано: с 13 по 24.



Эрмитаж
Смотрели:2939. Комменты:0


Эрмитаж
Смотрели:2659. Комменты:0


Эрмитаж
Смотрели:2027. Комменты:0


Эрмитаж
Смотрели:2227. Комменты:0


Эрмитаж
Смотрели:2542. Комменты:0


Эрмитаж
Смотрели:2531. Комменты:0


Эрмитаж
Смотрели:3068. Комменты:0


Эрмитаж
Смотрели:2737. Комменты:0


Эрмитаж
Смотрели:2945. Комменты:0

Уважаемые товарищи программисты, мой проект уже давно вышел за рамки желаний просто разобраться с технологиями web-программирования, и попрактиковаться в реализации. В связи с этим я все чаще стал задумываться о развитии проекта более глобально.

Задумывался я уже как с месяц и наконец, пришел к выводу: надо выносить проект дальше, нежели записи в блоге, и дать ему какое-то имя.

С подбором имени были некоторые проблемы, ибо все красивые домены давно заняты, либо скуплены перекупщиками. По итогам нескольких дней подбора имен, я нашел достойное название моему проекту!

Встречайте: MOGUTA.CMS

Я уже зарегистрировал домен moguta.ru , и в скором времени все новости по проекту начнут публиковаться именно там.

Кроме этого с сегодняшнего дня стала доступна группа вконтакте: MOGUTA.CMS

Но это еще не все!

Приглашаю к сотрудничеству

Всем, кто заинтересован в развитии проекта MOGUTA.CMS я предлагаю вступить в ряды разработчиков.

Какие плюсы вы получите, вступив в команду:

  • Реальный обмен опытом;
  • Возможность творить;
  • В итоге: готовую, быструю, современную CMS для разработки интернет магазина;
  • Общественное уважение.
  • Кроме этого в перспективе я хочу зарегистрировать юридическое лицо, и обеспечить рабочие места всей команде, соответственно, с положенным окладом. Конечно, это будет не скоро, и нет гарантий, что вообще будет, все зависит от активности откликов на мое приглашение.

    Поэтому если ты школьник, студент, или просто умный парень – не упускай возможности, вступай в ряды разработчиков, и со временем наша команда будет занимать свое почетное место на рынке CMS. (Достаточно оптимистично! 🙂)

    Вернемся к уроку…

    Проверяет принадлежит ли текущий (или указанный) пост к указанной категории (можно указать несколько категорий). Условный тег.

    Проверяется прямая принадлежность поста к категории, т.е. содержит ли указанная категория текущий/указанный пост. Если, например, пост принадлежит родительской категории или дочерней к указанной, то функция вернет false.

    Чтобы проверить отношение поста к дереву категорий используйте самописную функцию post_is_in_descendant_category() (см. пример ниже).

    in_category() можно использовать внутри Цикла WordPress или за пределами Цикла WordPress, но на отдельной странице поста (single.php). Или можно использовать где угодно, если указать какой именно пост нужно проверить.

    ✈ 1 раз = 0.003672с = очень медленно | 50000 раз = 1.00с = очень быстро | PHP 7.1.5, WP 4.8.1

    Хуков нет.

    Возвращает

    true, если условие выполняется и false, если нет.

    Использование if(in_category($category, $post)){ // ... } $category(строка/массив/число) (обязательный)

    ID, название или ярлык (slug) категории, которую нужно проверить принадлежит ли ей пост.

    Можно указать несколько параметров в массиве вперемешку.
    По умолчанию: нет

    $post(число/объект) ID или объект поста. По умолчанию текущий пост определяется автоматически внутри Цикла WordPress или на странице поста.
    По умолчанию: нет

    Примеры #1 Проверка текущего поста внутри Цикла WordPress.

    in_category часто используется внутри Цикла, чтобы проверить относится ли пост к указанной категории, если "да", то сделать какие-либо действия:

    If (in_category("pachyderms")) { // действия, если пост относится к категории "pachyderms" } elseif (in_category(array("Tropical Birds", "small-mammals"))) { // действия, если пост относится к одной из категорий "Tropical Birds", "small-mammals" } else { // если никакие из предыдущих условий не выполнены. }

    П.С. Лучше указывать не названия, а ID категории для проверок

    #2 Проверка текущего поста за пределами Цикла.

    На странице поста (обычно это файл шаблона single.php) проверку можно выполнять за пределами Цикла:

    If (in_category("fruit")) { include "single-fruit.php"; } elseif (in_category("vegetables")) { include "single-vegetables.php"; } else { // Ниже начинается Цикл WordPress if (have_posts()) : while (have_posts()) : the_post(); // ... }

    #3 Проверка принадлежности поста к текущей или вложенной в текущую категории

    Бывают случаи, когда нужно проверить относиться ли пост к дереву категорий. Например, мы указываем в проверке ID категории 60, а пост принадлежит категории 70, которая является дочерней к категории 60. Но in_category() вернет в данном случае false, а иногда нужно чтобы вернула true.

    Для того, чтобы проверить принадлежность к дереву категорий, можно последовательно указать в массиве все названия категорий:

    If(in_category(array("Малина", "Яблоки", "Бананы", "Груши", "Сливы"))) { // Действие если выполнено условие }

    Такой подход проверки, совершенно не гибкий, потому что если мы добавим новую подкатегорию к категории "Фрукты", нам так же нужно будет добавить её и в массив, для проверки.

    Чтобы избежать таких сложностей можно воспользоваться такой проверкой:

    // Проверка принадлежности поста к категории "Фрукты" или любой вложенной в эту категорию категории. if (in_category(11) || post_is_in_descendant_category(11)) { // Здесь все "фрукты" }

    Также, менее желательный, но вариант - указать названия:

    Post_is_in_descendant_category(get_term_by("name", "fruit", "category"))

    А вот сама функция post_is_in_descendant_category() :

    Function post_is_in_descendant_category($cats, $_post = null){ foreach ((array) $cats as $cat) { // get_term_children() accepts integer ID only $descendants = get_term_children((int) $cat, "category"); if($descendants && in_category($descendants, $_post)) return true; } return false; }

    #4 Древовидная проверка принадлежности к термину

    Проверим входит ли пост в термин произвольной таксономии (будем проверять и дочерние термины к указанному):

    If(has_term(11, "taxonomy", $post->ID) || post_is_in_descendant_term(11, "taxonomy", $post->ID)){ // Текущая запись в термине 11 или в его дочернем термине }

    Функция post_is_in_descendant_term() :

    Function post_is_in_descendant_term($term_ids, $taxonomy = "category", $post = null){ foreach((array) $term_ids as $term_id){ $descendants = get_term_children((int) $term_id, $taxonomy); if ($descendants && has_term($descendants, $taxonomy , $post)) return true; } return false; }

    За работой которого я слежу. При описании создания магазина я не буду подробно описывать те операции, которые изложены в пункте "Пример создания интернет-аптеки в Dreamweaver" .В пункте меню "file" выберем подпункт "new". Сделаем страницу динамической, т.к будем использовать РНР. Сохраним под именем index.php в папке MAGAZIN. В свойствах страницы (page properties) выберем размер и цвет шрифта, фон. В пункте меню "site" выберем "newsite". Назовем сайт MAGAZIN. Как заполнить предложенную форму можно прочитать в пункте " Создание интернет-аптеки". Вместо Apteka1 вставить magazin

    Создание базы данных и таблиц

    Создадим базу данных magazin . А в базе таблицу categories с категориями товаров и таблицу tovari с описанием товара с помощью администратора баз данных. В таблице categories будут два поля- ID(счетчик,для него атрибут UNSIGNET , дополнительно- auto_increment (автоматически увеличивается на 1) и выберем флажок под рисунком ключа), и CATEGORY -тип поля VARCHAR и длина 20. Если очистить таблицу с помощью администратора, то поле id будет продолжать увеличиваьтся. Если вы хотите начать значение поля ID с нуля, то придется уничтожить таблицу.

    Таблица с товарами будет иметь поля-id-счетчик(с теми же характеристиками, как и в таблице categories ), nom(INT )-для поиска записей,name - наименование товара (VARCHAR30), datapost -DATE поступления(DATE), Cena -цена(FLOAT(8,2), kolvo -количество товара(SMALLINT), razmer - Размер(VARCHAR30), cvet -цвет(VARCHAR60), sostav -состав ткани(VARCHAR50), opisanie - описание товара(TEXT), postav -поставщик(VARCHAR40), foto -путь к папке, где фото товара(VARCHAR20). При вводе цены обязательно должна стоять запятая, а не точка. Если при создании будет ошибка ERROR 1005: Can"t create table (errno: 121) и вы никак не сможете от нее избавиться, то попробуйте создать таблицу под другим именем.

    Регистрация базы данных

    Зарегистрируем базу данных в DR(dramweaver). Для этого в правой части DR в разделе application и закладке databases нажмем "+ ". Далее нажмем на MySQL Connection . Заполним форму. Connection name -magazin, MySQLserve r-localhost , Username -root ,password -пароль при установке MySQL, database -magazin. В папке Files/Site/connection появится файл, описывающий соединение с базой данных-magazin.php.

    Создание скриптов для занесения информации в таблицы

    Создадим папку Admin и в ней скрипт categ_add.php для занесения информации о категориях товаров.На вкладкеВ нем поместим форму для ввода информации(insert/form/form).Поместим курсор в форму и в нее будем заносить информацию о полях. Поле ID не будем заносить, т.к. значение его будет автоматически увеличиваться на 1-цу при создании новой записи (это мы указали при создании таблицы). Вставим курсор в форму, выберем insert/form/TextField для создания окна для поля . Введем в окно для Label слово "Категория" , "OK" . В окно TextField(в нижней части экрана)введем название этого поля- category. В Charwith длину поля для заполнения-20 и максимальную длину для поля-30. Для занесения информации в таблицу нужна кнопка- insert/Form/Button . Для появления на кнопке слова "Добавить" введем его в окне Value . Чтобы кнопка сработала на вставку записи с информацией о товаре, на вкладке ServerBehaviors нажмем на "+" и выберем оператор insert Record (вставка записи). Заполним предложенную оператором форму(рис.1). В ней в окне connection ввести имя нашего соединения-magizin. Особое внимание обратите на поле ID . При создании таблицы обязательно нажать на знак ключа напротив этого поля и сделать его автоматическим и по возрастанию(auto_increment,unsignet )-иначе появится ошибка о дубле значений. В нижнем окошке указывается путь к файлу, к которому после ввода данных перейти программа(если в тот же скрипт, то ввести categ_add.php .После нажатия на "ОК" под кнопкой появится особый знак. Если будут сбои при вызове скрипта добавления записи, то лучше замените вызов файла magazin.php:








    ввод данных о товаре



    Наименование


    Категория





    gМы сделали вывод списка категорий одежды. Нам далее необходимо, чтобы при выборе категории произошел выбор из таблицы с товарами по коду категории (параметр kod ). Этот параметр будет описан при создании набора записей для вывода информации о товаре (см. рис.9.).Мы самостоятельно сделаем ссылку. Ниже привожу тот же фрагмент, но уже подкорректированный:


    // начало цикла

    , чтобы записи находились одна под другой.Но нам нужно, чтобы содержание корзины появлялось при ее заполнении. Выделим заголовок и таблицу, на вкладке Server Behaviors нажмем на + и в разделе выберем show if recordset is not empty и в нем выберем таблицу korzina (рис. 12).

    Рис.13.Результат нашей проделанной работы.

    После нажатия на кнопку "в корзину" в таблицу korzina должна занестись информация о выбранном товаре. Для этого мы соpдадим скрипт korzina.php. На вкладке Bindings создадим набор записей tovari для таблицы tovari с фильтрацией по коду товара idtov (рис. 14):

    В этой форме на рис.14 мы указываем, что этот параметр передается методом POST , через форму (FORM Variable). мы его передаем как невидимый параметр (см. рис. 11). В скрипте korzina.php создадим набор записей korzina. Ниже привожу код скрипта korzina.php, т.к. вставку выбранных параметров товара в таблицу korzina сделаем самостоятельно:

    width="67" height="150">

    Выведем наименование и цену товара:

    Сделаем вывод списка размеров и цветов с помощью оператора select .В режиме Design после обозначения PHP вставим курсор и добавим форму, а в ней -List/menu .

    Зайдем в код скрипта и подкорректируем оператор select, который создал DR:



    Рядом вставим еще оператор list/menu для цвета и подкорректируем его:



    Далее сделаем ссылку на скрипт prosm.php (его сделаем позже), в котором можно будет посмотреть товар поближе). Для этого в форме напишем- "посмотреть" и в окне link набьем prosm.php. Выбранную информацию о товаре необходимо внести с помощью кнопки с названием "в корзину" . Также нам нужно передать и уникальный номер записи данного товара (idtov ). Для этого введем в форме элемент Hidden field - невидимый для передаваемого номера записи. С помощью Dinamic Dat a (его получим, нажав на молнию) определим для невидимого элемента поле idtov:

    Выбранные товары необходимо поместить в корзину. Создадим таблицу с полями- kodtov(smallint),name (varchar(50), razmer (varchar(3)) , cvet(varchar(20)), postav(varchar(60), cena (float(9,2) , kolzak(smallint(3) . А в таблице под списком категорий разместим таблицу с выбранными товарами. Напишем- "Ваша корзина:" .Под этим выражением разместим таблицу из двух срок и двух столбцов- для наименования и цены. Введем заголовки таблицы. На вкладке Bindings нажмем на + для создания набора данных и назовем его korzina и отсортируем по наименованию. Нажмем на + напротив этого набора и курсором перенесем соответствующие поля в таблицу. Выделим строку с полями и сделаем цикл с помощью .При этом обратите внимание на тэг

    После того, как покупатель поместил выбранные товары в корзину, необходимо посчитать общую сумму с возможностью коррекировки. Напишем под содержанием корзины выражение "оформить заказ" и сделаем ссылку на скрипт raskorz.php. Создадим этот скрипт и в нем в цетре напишем "Ваша корзина". Создадим форму и вставим в нее таблицу из 4 столбцов и двух строк. В первой строке запишем-код, наименование, поставщик,размер, цвет,цена,количество.Создадим набор записей (record set) korzina и перенесем соответствующие поля (Рис.15). Сделаем вторую строку в цикле (repeat region). Там, где указывется количество мы сделаем самостоятельно, т.к. необходимо дать покупателю возможность указать количество товара. Для этого создадим массив $kolm , в него занесем количество товара и сделаем корректировку массива в последнем столбце- . Подсчитаем сумму товара, для этого используем переменную $s . Напишем "Общая сумма" под таблицей, а в коде поставим рядом оператор- . При изменении количества необходимо пересчитать сумму. для этого мы в форму вставим кнопку (form/Button) с надписью "пересчитать" слева от "Общей суммы". Имя кнопки-Subper . Справа поместим кнопку subobnul для обнуления содержания корзины. Эти операции мы проведем в новом скрипте pereskor.php. К нему мы обратимся из формы. В pereskor.php создадим набор записей korzina . Ниже я привожу фрагмент кода скрипта pereskor.php:

    Для отправки заказа необходимы данные о покупателе. Для этого создадим новую форму(Рис.15).

    Ниже привожу текст скрипта raskorz.php:





    Расчет корзины для магазина



    Ваша корзина:





    Код товара
    Наименование
    Поставщик
    Размер
    Цвет
    Цена
    Количество
















    Общая сумма-




    Заполните, пожалуйста, форму:








    Ф.И.О.

    Адрес


    Телефон


    email


    Комментарий








    После заполнения формы и нажатии на кнопку "Отправить" мы должны сформировать сообщение. Для этого создадим скрипт otpzak.php. В нем создадим набор записей korzina с таблицей korzina . Ниже привожу текст скрипта:





    отправка заказа из магазина





    ?>




    интернет-магазин





    ИНТЕРНЕТ-МАГАЗИН для шикарных женщин








    Категории






    ">





    И так для начала опишу с чем мы будем работать и что нам понадобится.
    Система : PHP 5 и выше, mySQL 4 и выше
    Вспомогательные классы : dbsql.class.php (класс для работы с базой данных)
    Класс вложенных категорий : classTreeCategory.php (непосредственно основной класс, ниже приведен его листинг и пояснения.

    Создаем таблицу в БД, следующей структуры:

    Просмотр кода MYSQL

    В данной таблице присутствует поле ID — порядковый номер категории, podcat — имеет значение ноль у категорий первого порядка или ID родительской категории, name — название категории.

    Пример работы класса, вывод категорий списком с подкатегориями:

    Просмотр кода PHP

    include ("dbsql.class.php" ) ; include ("classTreeCategory.php" ) ; $DB = new DB_Engine("mysql" , $settings [ "dbHost" ] , $settings [ "dbUser" ] , $settings [ "dbPass" ] , $settings [ "dbName" ] ) ; // подключаемся к БД, с указанием данных доступа $category = new TreeCategory ($DB ) ; // передаем в класс категорий, объект работы с БД $category -> table = "category" ; // название таблицы в БД с категорийми $array = $category -> getCategory () ; // получаем все категории из БД в виде многоуровневого массива, отсортированные и вложенные уже в нужном нам порядке $category -> outCategory ($array , "option" ) ; // подготовка вывода категорий (формируем HTML), передаем массив с категориями echo $category -> html ; // вывод категорий в виде HTML name

    Как видно из примера выше, все предельно просто, создаем новый объект $category, устанавливаем с какой таблицей БД работаем: ‘category’, далее получаем из таблицы список всех категорий уже оформленный в виде массива и разложенных в иерархичном порядке, с учетом всех подкатегорий. затем передаем массив в метод outCategory() который формирует для нас готовый HTML код, который остается только вывести в браузер.

    Метод outCategory(), как мы видим принимает два параметра @array и @string в первом параметре массив со всеми категориями, а во втором строка содержащая значение option или table , это значени указывает какой тип HTML кода требуется сформировать.
    Значение option

    Просмотр кода HTML

    -категория1 --подкатегория 1 ---подподкатегория 1 -категория 2

    Для вставки данного HTML кода в поле select какой либо формы.

    Значение table — формирует следующий HTML код:

    Просмотр кода HTML

    Этот HTML код удобен для вставки в таблицу которая отображает все наши категории подкатегории.

    Класс имеет также следующие методы:
    deleteItem($id); — удаляет одну категорию, не смотря на вложенные
    delCategory($array, $id); — удаляет категорию со всеми вложенными подкатегориями, $array — массив со всеми категориями подготовленный методом $category->getCategory(), $id- номер удаляемой категории
    addItem(); — данный метод следует вызывать если вы хотите добавить категорию, при этом этот метод считывает значения из данных переданных методом POST, т.е. из массива $_POST.
    $name=$this->PHP_slashes(strip_tags($_POST[‘name’])); // имя категории
    $podcat=intval($_POST[‘podcat’]); // ID родительской категории, если указан 0 категория будет в корне.
    updateItem() ; — аналогично предыдущему методу, кроме того что данный метод обновляет категорию, её название и уровень вложенности.

    table="category"; // запрос на выборку списка категорий, название таблицы * $category->outCategory($category->getCategory()); // подготовка вывода категорий(запрос массива категорий) * echo $category->html; // вывод категорий в HTML name * */ /** * Дамп таблицы с которой ведется работа * * DROP TABLE IF EXISTS `category`; * CREATE TABLE `category` (* `id` int(11) NOT NULL auto_increment, * `podcat` int(11) NOT NULL, * `name` varchar(255) NOT NULL, * PRIMARY KEY (`id`), * KEY `id` (`id`) *) ENGINE=MyISAM DEFAULT CHARSET=utf8; * */ class TreeCategory { /** * Строка запроса в БД */ var $table; /** * Интерфейс работы с БД */ var $DB; /** * Массив категорий с вложенными подкатегориями */ var $arrayCat; /** * Авто-подстчет кол-ва прочерков перед названием категории при выводе */ var $countPodcat; /** * HTML код для вывода категорий с подкатегориями */ var $html; /** * Получаем интерфейс для работы с БД и кладем его в локальные переменную */ function __construct($DB) { $this->DB=$DB; $this->component=$_GET["component"]; } /** * Получает список категорий, сортирует и помещает в массив с вложенными массивами и т.д. * @return array category */ function getCategory () { $all = $this->DB->getAll("SELECT * FROM `{$this->table}` ORDER BY `id` ASC"); $path = array(); if(count($all)>0) { foreach($all as $item): if($item["podcat"]==0)$sort[$item["id"]]=$item; if($item["podcat"]>0) { if(isset($path[$item["podcat"]])) { $str="$sort"; foreach($path[$item["podcat"]] as $pitem): $rep=$item["podcat"]; $str.="[$pitem]"; endforeach; $str.="[{$item["podcat"]}]"; $str.="[{$item["id"]}]"; $str.="=$item;"; eval($str); foreach($path[$item["podcat"]] as $pitem): $path[$item["id"]]=$pitem; endforeach; $path[$item["id"]]=$item["podcat"]; } else { $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $path[$item["id"]]=$item["podcat"]; } } endforeach; } $this->arrayCat=$sort; return $this->arrayCat; } /** * Печатает категории, помещает готовый HTML в $this->html * @param array Массив с категориями и вложенными подкатегориями * @param string Тип генерируемого HTML кода для вывода, option или table */ function outCategory(&$arrayCat, $type="option", $idSel=0) { foreach($arrayCat as $sub) { $this->countPodcat++; $this->outItem($sub, $type); if(!empty($sub["sub"]))$this->outCategory($sub["sub"], $type, $idSel); $this->countPodcat--; } } /** * Вспомогательный метод подготовки HTML кода * @param array Массив с категорией * @param string Тип генерируемого HTML кода для вывода, option или table */ function outItem($sub, $type="option", $idSel=0) { for($i=0;$icountPodcat;$i++) { $out.="-"; } if($idSel==$sub["id"])$se="selected"; else $se=""; if($type=="option")$this->html.=" {$out} {$sub["name"]} "; if($type=="table")$this->html.= {$out} {$sub["name"]} HTML; } function delCategory(&$a_tree,&$id=0) { foreach($a_tree as $sub) { if($sub["id"]$id and isset($sub["sub"]))$this->delCategory($sub["sub"],$id); if($sub["id"]==$id) { $sql="DELETE FROM {$this->table} WHERE id = "$id" LIMIT 1"; $this->DB->execute($sql); if (isset($sub["sub"])) $this->delCategory_process($sub["sub"]); } } } function delCategory_process(&$a_tree) { foreach($a_tree as $sub) { $sql="DELETE FROM {$this->table} WHERE id = "{$sub["id"]}" LIMIT 1"; $this->DB->execute($sql); if(isset($sub["sub"]))$this->delCategory_process($sub["sub"]); } } function updateItem() { $name=$this->PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="UPDATE `{$this->table}` SET `name` = "{$name}",`podcat` = "{$podcat}" WHERE `id`="{$id}" LIMIT 1; "; $this->DB->execute($sql); } function addItem() { $name=$this->PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="INSERT INTO `{$this->table}` (`id`,`podcat`,`name`) VALUES ("", "$podcat", "$name");"; $this->DB->execute($sql); } function deleteItem($id) { $id=intval($id); $sql="DELETE FROM `{$this->table}` WHERE `id` = "{$id}" LIMIT 1"; $DB->execute($sql); header("Location: ?component={$this->component}"); } function PHP_slashes($string,$type="add") { if ($type == "add") { if (get_magic_quotes_gpc()) { return $string; } else { if (function_exists("addslashes")) { return addslashes($string); } else { return mysql_real_escape_string($string); } } } else if ($type == "strip") { return stripslashes($string); } else { die("error in PHP_slashes (mixed,add | strip)"); } } }

    Весь класс писался в течении часа и разумеется имеет недочеты, но все этот поправимо. Его использование целесообразно в обучающих целях, хотя впрочем немного допилив его, вы сможете встроить его в любую систему и наслаждаться его работой)).

    Буду признателен если в комментариях вы предложите собственные варианты решения данной задачи — организации категорий бесконечного уровня вложенности.