Контакти

Розумний category php. Побудова дерева категорії на PHP. Рекурсія. Унікальна тема категорії

Category subcategory tree viewзабезпечує user-friendly way to list the parent and child categories. Категорії і їх subcategory є easily separated by a tree structure. Category tree view is always recomended to display an infinite level of categorias and subcategories.

In this tutorial, we will show you how to create dynamic category subcategory tree using PHPі MySQL. The recursive category tree is very useful to list n level categories in a dropdown. Докладніше про код helps ви будувати n level категорії subcategory dropdown in PHP. Dynamic category data будуть від'єднані з MySQL Database і розміщені в parent-child категорії формату.

Create Database Table

Для категорії і subcategories, table needs to be created in the database. Наступні SQL створюють категорії категорії в MySQL Database.

CREATE TABLE `categories` (`id` int (11 ) NOT NULL AUTO_INCREMENT, `parent_id` int (11 ) NOT NULL DEFAULT "0" , `name` varchar (100 ) COLLATE utf8_unicode_ci NOT NULL , `created` da `modified` datetime NOT NULL , `status` enum("1" ,"0" ) COLLATE utf8_unicode_ci NOT NULL DEFAULT "1" COMMENT "1:Active, 0:Inactive" , PRIMARY KEY (`id` )) ENGINE= InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

parent_id column specifies whether the category is parent or child. If parent_id is 0, it will be a parent category. Іншийвихід, він буде бути дитячою категорією і ID є parent of this category.

Database Configuration (dbConfig.php)

dbConfig.php file is used to connect and select the database. Specify the database host ($ dbHost), username ($ dbUsername), password ($ dbPassword), і name ($ dbName) як для ваших MySQL credentials.

// Database configuration
$dbHost = "localhost";
$dbUsername = "root";
$dbPassword = "root";
$dbName = "codexworld"; // Create database connection
$db = new mysqli ($dbHost, $dbUsername, $dbPassword, $dbName);// Check connection
if ($db -> connect_error ) (
die("Connection failed: " . $db -> connect_error );
}
?>

PHP Recursive Function to Generate Parent/Child Tree

categoryTree() function generates an n level category subcategory tree using PHP. Це буде створювати затримані опції для категорії stromу.

  • $parent_id- Optional. Specify parent ID для отримання дітей категорії цієї parent category.
  • $sub_mark- Optional. Марк, який буде підтверджено на початку дитини категорії name.
// Include the database configuration file
require "dbConfig.php" ;categoryTree ($parent_id = 0 , $sub_mark = "" )(
global $db;
$query = $db -> query ( "SELECT * FROM categories WHERE parent_id =$parent_id ORDER BY name ASC" );$query -> num_rows > 0 )(
while($row = $query -> fetch_assoc())(
echo " " ;
categoryTree ($row [ "id" ], $sub_mark . "---" );
}
}
}

Category Subcategory Dropdown in PHP

Use categoryTree() function to build dynamic categories tree dropdown in PHP with MySQL.

Чи є ви, щоб отримати implementation help, або modify або extend the functionality of this script?

Вітаю всіх читачів блогу WordPress Insideу 2011 році, вітаю з наступаючими та наступаючими святами, бажаю багато здоров'я, щастя та радості на наступні 360 днів. Як і обіцяв у своїй статті про плани на майбутній 2011 рік, займаюся трохи поліпшенням усіх своїх основних блогів — оновлюю системи, ставлю останні версії плагінів і копаюся в шаблонах заради оптимізації та виправлення помилок. Працював це вкрай складна, я навіть сказав би дуже копітка — знаходиш одну неточність, наважуєшся її виправити і перед тобою 5 окремих проектів, для кожного з яких потрібно внести правки. Ну, раз я вже запланував все це зробити, назад дороги немає, заодно в процесі отримую додатковий досвід і вже знайшов штук 5-6 тем для нових постів у блог:) Сьогодні поговоримо про категорії та функції для їх відображення.

В одній із минулих статей блогу я публікував хак який допомагає. Дане рішення використовувалося для функції виведення списку категорій у сайдбарі за допомогою wp_list_categories. На виході ви отримували записи на кшталт цієї:

Безпека

Якщо вже для seo атрибут title має хоч якесь значення, то куди корисніше там було б розмістити просто назву категорії, а не весь цей непотрібний текст. Власне, зазначене вище посилання на хак допомагало вирішити цю проблему. Але ось завдання, все це було справедливо (працювало) для , яка дозволяла попередньо обробити отриманий список не виводячи його відразу ж. Але що робити з іншими функціями виведення категорій? - ось у чому питання.

Наприклад, я сьогодні цілком випадково виявив, що купа непотрібного тексту в атрибут title посилання пишеться і відображення списку категорій для конкретного посту.

Вся проблема полягала у тому, що тут використовується функція the_category, для якої, на жаль, не можна встановити параметр, щоб результат її виклику не відображався відразу. Натомість у Вордпрес є ще одна функція get_the_category, яка повертається масив об'єктів категорій для конкретного посту.

Функція get_the_category

Синтаксис функції get_the_category досить простий:

cat_name; ?>

Програмісти знають, що нульовий параметр масиву виводить перший елемент, що і пояснює принцип роботи даного коду.

ID); var_dump ($categories); ?>

ID); var_dump($categories); ?>

Для цього як параметр функції потрібно передавати id поста, що і відбувається в коді.

До речі, цю функцію я використовую в деяких сайтах, щоб виводити назву категорії посту, але без активного посилання - так просто додатковий корисний текст на сторінці. У такому випадку можна застосувати код:

cat_name. ""; ) ?>

cat_name. " "; ) ?>

Ну, і насамкінець, трохи подумавши вийшов хак для виведення списку категорії для поста без використання функції the_category, яку ми успішно замінюємо на get_the_category. Якщо ви хочете додати код безпосередньо в місце шаблону, де виводяться категорії, наприклад, файл archive.php, то пишемо щось на зразок:

Можна, в принципі, розмістити код для відображення категорій у файлі функцій, а потім у файлах шаблону поміняти the_category на нову функцію, наприклад, під назвою my_thecat(). Звичайно, не забудьте попередньо до заміни додати відповідний код у файл функцій functions.php:

function my_thecat() ( global $post ; foreach ((get_the_category($post -> ID ) ) як $category ) ( echo " cat_ID ) . "" title="" . $category -> cat_name . "">" . $ category -> cat_name.";";))

function my_thecat() ( global $post; foreach((get_the_category($post->ID)) as $category) ( echo "cat_ID)."" title="".$category->cat_name."">".$ category->cat_name."; "; ) )

Потестував, все працює. Залишається лише одне питання — наскільки це все корисно і вкрай потрібне. Якщо у вас один блог з постійним дизайном, який ви хочете зробити найкращим, можна витратити пару хвилин і внести відповідні зміни. Якщо у вас таких блогів багато, думаю, особливої ​​seo вигоди маніпуляція з title не принесе в плані, простіше купити посилань у Rotapost на всі ці проекти - до речі експеримент з підйому ТІЦ в системі успішно і позитивно завершено, скоро буде звіт про це.

Виведення категорій кастомних записів

У коментарях підказують, що приклади, зазначені вище, не працюють для кастомних (користувацьких) типів записів. Я з цим завданням не стикався, тому можу вам лише порадити погуглити рішення в англомовних блогах за ключем wordpress custom post type show category або скористатися підказкою користувача Stinker (з коментарів). У місці виведення категорій потрібно просто вставити код:

Де categoria_video — це таксономія запису користувача (вона ж кастомна). А тепер детальніше від куди і що. Наприклад, у нас є:

// Тип запису Відео if ( ! ( "Відео" , "Post Type Singular Name" , "video" ) , "menu_name" => __( "Відео" , "video" ) , "parent_item_colon" => __( "Батьківський:" , "video" ) , "all_items" => __( "Всі відеоматеріали", "video" ) , "view_item" => __( "Переглянути" , "video" ) , "add_new_item" => __( "Додати нове відео", "video" ) , "add_new" => __( "Додати відео" , "video" ) , "edit_item" => __( "Редагувати відео", "video" ) , "update_item" => __( "Оновити відео" , "video" ) , "search_items" => __( "Знайти відео" , "video" ) , "not_found" => __( "Не знайдено " , "video" ) , "not_found_in_trash" => __( "Не знайдено в кошику", "video"),); $args = array ( "labels" => $labels , "supports" => array ( "title" , "editor" , "excerpt" , ) , "taxonomies" => array ( "categoria_video" ) , // категорія, яку ми створимо нижче (вона таксономія)"public" => true , "menu_position" => 5 , "menu_icon" => "dashicons-id-alt" , ) ; register_post_type( "video", $ args); ) add_action( "init", "video_cp", 0); // ініціалізуємо) if ( ! function_exists ( "categoria_video" ) ) ( // Категорії для вакансії function categoria_video() ( $labels = array ( "name" => _x( "Категорії Відео", "Taxonomy General Name" , "categoria_video" ) , "singular_name" => _x( "Категорія Відео", "Taxonomy Singular Name" , "categoria_video" ) , "menu_name" => __( "Категорії" , "categoria_video" ) , "all_items" => __( "Категорії" , "categoria_video" ) , "parent_item" ( "Батьківська категорія Відео", "categoria_video" ) , "parent_item_colon" => __( "Батьківська категорія Відео:", "categoria_video" ) , "new_item_name" => __( "Нова категорія", "categoria_video" ) , "add_new_item" => __( "Додати нову категорію", "categoria_video" ) , "edit_item" => __( "Редагувати категорію", "categoria_video" ) , "update_item" => __( "Оновити категорію", "categoria_video" ) , "search_items" => __( "Знайти" , "categoria_video" ) , "add_or_remove_items" => __( "Додати або видалити категорію", "categoria_video" ) , "choose_from_most_used" => __( "Пошук серед популярних", "categoria_video"), "not_found" => __( "Не знайдено", "categoria_video"),); $args = array ( "labels" => $labels , "hierarchical" => true , "public" => true , ) ; register_taxonomy( "categoria_video", array ("video"), $ args); ) add_action( "init", "categoria_video", 0); // ініціалізуємо }

// Тип запису Відео if (! singular_name" => _x("Відео", "Post Type Singular Name", "video"), "menu_name" => __("Відео", "video"), "parent_item_colon" => __("Батьківський:", "video"), "all_items" => __("Всі відеоматеріали", "video"), "view_item" => __("Переглянути", "video"), "add_new_item" => __("Додати нове відео" , "video"), "add_new" => __("Додати відео", "video"), "edit_item" => __("Редагувати відео", "video"), "update_item" => __("Оновити відео ", "video"), "search_items" => __("Знайти відео", "video"), "not_found" => __("Не знайдено", "video"), "not_found_in_trash" => __("Не знайдено в кошику", "video"),); $args = array("labels" => $labels, "supports" => array("title", "editor", "excerpt",), "taxonomies" = > array("categoria_video"), // категорія, яку ми створимо нижче (вона ж таксономія) "public" => true, "menu_position" => 5, "menu_icon" => "dashicons-id-alt",); register_post_type("video", $args); ) add_action("init", "video_cp", 0); // ініціалізуємо ) if (! "), "singular_name" => _x("Категорія Відео", "Taxonomy Singular Name", "categoria_video"), "menu_name" => __("Категорії", "categoria_video"), "all_items" => __(" Категорії", "categoria_video"), "parent_item" => __("Батьківська категорія Відео", "categoria_video"), "parent_item_colon" => __("Батьківська категорія Відео:", "categoria_video"), "new_item_name" => __("Нова категорія", "categoria_video"), "add_new_item" => __("Додати нову категорію", "categoria_video"), "edit_item" => __("Редагувати категорію", "categoria_video"), "update_item" => __("Оновити категорію", "categoria_video"), "search_items" => __("Знайти", "categoria_video"), "add_or_remove_items" => __("Додати або видалити категорію", "categoria_video"), " choose_from_most_used" => __("Пошук серед по популярних", "categoria_video"), "not_found" => __("Не знайдено", "categoria_video"),); $args = array("labels" => $labels, "hierarchical" => true, "public" => true,); register_taxonomy("categoria_video", array("video"), $args); ) add_action("init", "categoria_video", 0); // ініціалізуємо)

Дякуємо користувачеві Stinker за підказку, можливо, вам вона знадобиться.

P.S. Постовий. В одному з блогів рунета була знайдена чудова добірка тем wordpress портфоліо з 17 безкоштовних якісних шаблонів.

Фанатів WordPress стає більше з кожним днем, і багато хто використовує цей двигун вже просто як CMS. Він настільки простий, що зрозумілий навіть новачкові-не-програмістові. Нижче я покажу кілька прийомів, які використовуються багатьма просунутими блогерами, в основному ці прийоми направлені на юзабіліті;

1) Динамічне підсвічування меню

Як зробити динамічне підсвічування меню, як, наприклад, . Пишемо умову: якщо це перша сторінка Home / Category / Archive / Search / Single, додамо class=current до тега li (він буде підсвічуватись як Gallery). Якщо другий елемент буде About, додайте клас current. і т.д.

2) Динамічні теги у заголовку

Для того щоб використовувати динамічні заголовки для сторінок, пишемо в header.php.

<?php if (is_home() ) { echo bloginfo("name" ) ; } elseif (is_404() ) { echo "404 Not Found" ; } elseif (is_category() ) { echo "Category:" ; wp_title("" ) ; } elseif (is_search() ) { echo "Search Results" ; } elseif ( is_day() || is_month() || is_year() ) { echo "Archives:" ; wp_title("" ) ; } else { echo wp_title("" ) ; } ?>

<?php if (is_home()) { echo bloginfo("name"); } elseif (is_404()) { echo "404 Not Found"; } elseif (is_category()) { echo "Category:"; wp_title(""); } elseif (is_search()) { echo "Search Results"; } elseif (is_day() || is_month() || is_year()) { echo "Archives:"; wp_title(""); } else { echo wp_title(""); } ?>

3) Динамічний контент:

Якщо хочете, щоб якийсь контент знаходився лише на першій сторінці, пишемо:

5) Як змінити тему окремої категорії

Допустимо, ви хочете змінити тему для постів якоїсь окремої категорії. Для цього можна скористатися функцією in_category.
Якщо стандартний стоїть single.php, використовуйте цей код. Якщо пост у категорії 1 використовуємо single1.php, для категорії 2 - single2.php, ну і для інших single_other.php.

post; if ( in_category("1" ) ) ( include (TEMPLATEPATH . "/single1.php" ) ; ) elseif ( in_category("2" ) ) ( include (TEMPLATEPATH . "/single2.php" ) ; ) else ( include ( TEMPLATEPATH ."/single_other.php" ) ; ) ? >

post; if (in_category("1")) ( include(TEMPLATEPATH . "/single1.php"); ) elseif (in_category("2")) ( include(TEMPLATEPATH . "/single2.php"); ) else ( include( TEMPLATEPATH ."/single_other.php"); ) ? >

Буквально недавно в одному з блогів також піднімалася схожа тема, довелося з її допомогою позбавитися зовнішніх посилань блогу.

6) Унікальна тема категорії

Що, якщо ви хочете особливу тему для певної категорії? Просто збережемо тему цієї категорії під ім'ям category-2.php (саме за таким шаблоном!). Так, category-2.php буде використовуватись категорією categoryID 2, category-3.php - категорією categoryID 3 і т.д.

Досить просто вирішуване завдання. Для цього нам потрібно задати змінну ($loopcounter) цикл. Якщо $loopcounter менший або дорівнює 1, підключається код google-ad.php.

// the loop stuffs

// the loop stuffs

Query Posts

Query Posts використовується для контролю над виведенням постів усередині циклу. З його допомогою можна керувати тим, що виводити, коли виводити і як виводити.

8) Виводимо останні пости

останні 5 постів:

  • ">

  • ">

9) Пости певної категорії

  • ">

  • ">

Допустимо, нам потрібно виключити відображення будь-якої категорії (categoryID 2):

//the loop here

//the loop here

Довільні поля (Custom Field)

Custom Field — дуже корисна річ, часто використовується для виведення інформації після поста. Використовується, наприклад, виведення інформації про автора поста.

Для початку додамо довільне поле в пост.

Щоб відобразити зображення і прикріпити до нього посилання на пост, поміщаємо наступний код цикл (перед самим текстом посту):

//отримуємо картинку (custom field)?> ID, "article_image", true); ?> "> " alt="(!LANG: !}" />

ID, "article_image", true); ?> "> " alt="(!LANG:!}" />

Не забувайте, що довільних полів після поста може бути кілька. Схожий ефект можна побачити на Best Web Gallery , де подібно відображені мініатюри, посилання URL і підсвічування інформації. Також про довільні поля можна почитати в даній статті - використання custom fields в WordPress.

WP List Pages

Тег wp_list_pages використовується для відображення списку сторінок у хедері та сайдбарі

12) Site map

Для того, щоб відобразити Sitemap, достатньо додати цей код до сторінки sitemap.php

Зауважу, що pageID 12 виключено, т.к. це сторінка - сама sitemap.php, і її не потрібно відображати.
Метод працює, хоча, напевно, краще скористатися більш стандартним методом та побудувати карту сайту за допомогою плагіна.

13) Динамічний субсторінкове меню

Додайте цей код у sidebar.php і він відобразить субсторінкове меню, якщо субсторінки є на цій сторінці:

ID. "&echo=0"); if ($children ) ( ?>

ID."&echo=0"); if ($children) (?>

14) Тема сторінки

Добре не втрачати і таку функцію як Page Template, яка дозволяє ставити нову тему для вашого блогу. Для початку потрібно створити саму тему, потім потрібно позначити сторінці своб власну тему. Ось як вона виглядає (напр., portfolio.php)

/* Template Name: Portfolio */ ?> //the loop here

//the loop here

При написанні або редагуванні сторінки праворуч можна буде побачити “Page Template”, і там вказати потрібну тему.

Опції WordPress

Останнє, що ми розглянемо, будуть опції самого WordPress та блогу загалом.

15) Стартова сторінка

За умовчанням, WordPress має блог на стартовій сторінці сайту. Але якщо ви хочете якусь іншу сторінку, наприклад, привітання, зайдіть Admin > Options > Reading.

16) Адреси сторінок

За умовчанням, WordPress використовує посилання виду Permalinks www.yoursite.com/?p=123, які не красиві і не зрозумілі пошукачам. Але можна змінити це в Admin > Options > Permalinks (Параметри > Постійні посилання). Непоганий варіант запису адрес ось цей: /%category%/%postname%/

За промовчанням WordPress використовує префікс категорій "category" (напр., yoursite.com/category/cat-name/). Але щоб замінити його на «article», зайдіть в Options > Permalinks (Параметри > Постійні посилання), і посилання виглядатимуть так: yoursite.com/article/cat-name/

Якщо хочете, то префікс за допомогою спеціальних плагінів.

Ось такі вийшли ці 17 приймачів для WordPress, дякую Михайлу за них. Нагадую, що багато чого корисного ви також зможете знайти в його блозі про веб-дизайн, де зібрано багато цікавої інформації. В принципі, деякі хакі вже розглядалися, але такого свого роду повторення не завадить. Де це було можливим я додав посилання на повноцінні (докладніші) з детальним розглядом питання. Хоча це більше для новачків, досвідченим розробникам вистачить наведеного у статті коду, ви, гадаю, зможете самі додати туди, що потрібно:)

P.S. Постовий. Для тих, хто планує серйозно зайнятися дизайном, будуть корисні Відеоуроки з веб-дизайну – українською! - приєднуйтесь до читачів сайту.
Інтернет магазин ЛінзМайстер пропонує контактні лінзи, кольорові контактні лінзи, а також розчини та аксесуари.

Сьогодні наша мета – створити ієрархічну структуру категорій. Нам важливо, щоб було зручно зберігати категорії і щоб було легко виводити їх там, де нам треба.

Іноді просте здається складним, саме тому викладу кілька фрагментів коду, які я сподіваюся вам знадобляться для реалізації php категорій у вигляді дерева.

Отже, структура повинна складатися з id категорії (id), назви категорії (name) і звичайно id батьківської категорії (parent_id). У MySQL це виглядає так:

CREATE TABLE IF NOT EXISTS `category` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `parent_id` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE =InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

Мінімальна та зрозуміла структура таблиці для зберігання категорій.

INSERT INTO `category` (`id`, `name`, `parent_id`) VALUES (1, "Телефони та планшети", "0"), (2, "Автомобілі", "0"), (3, "Samsung ", "1"), (4, "Apple", "1"), (5, "LG", "1"), (6, "Ford", "2"), (7, "Lexus", "2"), (8, "BMW", "2"), (9, "Galaxy Tab 4", "3"), (10, "Galaxy S6", "3");

Там де значення parent_id=0, дана категорія не має батьківської категорії.

Тут усе зрозуміло та просто. Тепер будемо виводитися до списку категорій. Але для правильного виведення списку нам потрібно спочатку отримати весь список php категорій, а вже потім за допомогою рекурсії сформувати наше дерево. Наступна функція призначена для отримання цього списку:

Function get_cat() ( //запит до бази даних $sql = "SELECT * FROM category"; $result = mysql_query($sql); if(!$result) ( return NULL; ) $arr_cat = array(); if( mysql_num_rows($result) != 0) ( //У циклі формуємо масив for($i = 0; $i< mysql_num_rows($result);$i++) { $row = mysql_fetch_array($result,MYSQL_ASSOC); //Формируем массив, где ключами являются адишники на родительские категории if(empty($arr_cat[$row["parent_id"]])) { $arr_cat[$row["parent_id"]] = array(); } $arr_cat[$row["parent_id"]] = $row; } //возвращаем массив return $arr_cat; } }

//отримуємо масив каталогу $result = get_cat();

Тепер потрібна функція з рекурсією

Function view_cat($arr,$parent_id = 0) ( // Умови виходу з рекурсії if(empty($arr[$parent_id])) ( return; ) echo "

    "; //перебираємо в циклі масив і виводимо на екран for($i = 0; $i< count($arr[$parent_id]);$i++) { echo "
  • " .$arr[$parent_id][$i]["name"].""; //рекурсія - перевіряємо чи немає дочірніх категорій view_cat($arr,$arr[$parent_id][$i]["id"] ); echo "
  • ";) echo "
"; }

Тепер залишилося лише вивести каталог на екран за допомогою рекурсивної функції

View_cat($result);

І взагалі те й усе. Таким чином, ми можемо отримати повне дерево категорій з нескінченними підкатегоріями.

Досить поширений ступор розробки теми для WordPress, як користуватися конструктором умов if else , як правильно їх задати і як їх взагалі використовувати в WordPress. Щоб мільйони користувачів не божеволіли в пошуках рішень, WordPress, так би мовити, створив умовні теги про використання яких сьогодні йтиметься.

Стандартна конструкція умови виглядає так:

З одного боку, все зрозуміло, а з іншого стоїть питання як правильно сформулювати умову, щоб WordPress зрозумів, то чого ми від нього хочемо.

1. Головна сторінка

Часто хочемо, щоб певна інформація відображалася лише на головній сторінці. Для вирішення можна створити в папці Вашої теми файл home.php або файл index.php внести таку умову:

....Тут виводимо інформацію, яку ми хочемо бачити на головній сторінці

2. Перевіряємо рубрики

Задамо таку умову: Якщо ми знаходимося в рубриці WordPress, то виведемо фразу «Вас вітає, WordPress!», а якщо немає фразу «Ласкаво просимо, на наш сайт!»

/*Можна і такою схемою*/

"Вас вітає, WordPress!"

Ласкаво просимо на наш сайт!"

Тут і далі як ідентифікатор рубрики (мітки) або запису (сторінки) я використовуватиму id - його можна дізнатися в панелі управління сайтом. Якщо Ви пишете умови для рубрик(міток), то дивіться id на сторінці рубрик(міток), а якщо записів(сторінок) — то на сторінці всіх записів(сторінок)… паніка). Як все-таки дізнатися? - Дивіться ілюстрацію:

І ще такий фінт 🙂 допустимо нам потрібна умова для перевірки кількох рубрик, тоді умови матимуть вигляд:

виведемо те, що нам потрібно

3. Перевіряємо мітки

Мітки – крутий класифікатор усередині рубрик. Розглянь кілька прикладів, як їх можна перевірити.

Завдання: Якщо запис має мітку "plugin", то вивести фразу - WordPress Plugin

Завдання: Якщо перебуваємо на сторінці мітки "plugin", то вивести фразу - Колекція плагінів WordPress.

Примітка: у роботі з умовами міток краще використовувати ярлик мітки, а не її ідентифікатор.

Висновок

Я розглянув основні умовні теги, якщо у Вас є якісь питання, задавайте їх у коментарях! Вдалого використання!



Сподобалась стаття? Поділіться їй