Поиск по этому блогу

пятница, 31 августа 2018 г.

php рекурсия пример вывода категорий меню

Здравствуйте!

Хотелось бы поделиться очень хорошим примером рекурсии для php по самой распространённой задаче - сделать меню с категориями.

php, программирование, рекурсия,

Прежде всего создадим таблицу в базе данных.
CREATE  TABLE `categories` (
`id` INT  NOT NULL AUTO_INCREMENT ,
`parent_id`  INT NOT NULL ,
`name`  VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY  ( `id` )
);
Заполним её данными.
INSERT INTO `categories` (`id`, `parent_id`, `name`) VALUES
(1, 0, 'Раздел 1'),
(2, 0, 'Раздел 2'),
(3, 0, 'Раздел 3'),
(4, 1, 'Раздел 1.1'),
(5, 1, 'Раздел 1.2'),
(6, 4, 'Раздел 1.1.1'),
(7, 2, 'Раздел 2.1'),
(8, 2, 'Раздел 2.2'),
(9, 3, 'Раздел 3.1');
Создаём наш php файл для вывода и вытаскиваем данные из базы данных.
//Выбираем всё из нашей таблицы
$result=mysqli_query($connect, "SELECT * FROM  categories");
//Если в базе данных есть записи, формируем массив
if   (mysqli_num_rows($result) > 0){
    $cats = array();
//В цикле формируем массив разделов, ключом будет id родительской категории, а также массив разделов, ключом будет id категории
    while($cat =  mysqli_fetch_assoc($result)){
        $cats_ID[$cat['id']][] = $cat;
        $cats[$cat['parent_id']][$cat['id']] =  $cat;
    }
}
Рекурсивная функция для вывода.
function build_tree($cats,$parent_id,$only_parent = false){
    if(is_array($cats) and isset($cats[$parent_id])){
        $tree = '<ul>';
        if($only_parent==false){
            foreach($cats[$parent_id] as $cat){
                $tree .= '<li>'.$cat['name'].' #'.$cat['id'];
                $tree .=  build_tree($cats,$cat['id']);
                $tree .= '</li>';
            }
        }elseif(is_numeric($only_parent)){
            $cat = $cats[$parent_id][$only_parent];
            $tree .= '<li>'.$cat['name'].' #'.$cat['id'];
            $tree .=  build_tree($cats,$cat['id']);
            $tree .= '</li>';
        }
        $tree .= '</ul>';
    }
    else return null;
    return $tree;
}
Вызываем функцию и передаём в неё наш массив.
echo build_tree($cats,0);
На выходе получаем очень красивую структуру:
<ul>
    <li>Раздел 1
        <ul>
            <li>Раздел 1.1
                <ul>
                    <li>Раздел 1.1.1</li>
                </ul>
            </li>
            <li>Раздел 1.2</li>
        </ul>
    </li>
    <li>Раздел 2
        <ul>
            <li>Раздел 1.1</li>
            <li>Раздел 1.2</li>
        </ul>
    </li>
    <li>Раздел 3
        <ul>
            <li>Раздел 3.1</li>
        </ul>
    </li>
</ul>
Я считаю что это очень хороший пример рекурсии в php. Кроме того он решает столь распространённую задачу вывода меню или списка категорий.

Надеюсь код был полезен.
Успехов и хорошего дня!

четверг, 30 августа 2018 г.

js получение выбранного option в select

Здравствуйте!

Порой бывает ситуация что нужно в js отследить выбор элемента в select, а так же выбранное значение. На чистом js это реализуется через событие onChange.

js, html, программирование,

JS:
function getValue(selectObj) {
    alert(selectObj.value);
}
HTML:
<select onchange="getValue(this)">
     <option value="val1">Text 1</option>
     <option value="val2">Text 2</option>
     <option value="val3">Text 3</option>
</select>
Очень удобно когда вместе с значением нужно передать ещё что то ( например id некого элемента заполняемое в php ).

Надеюсь код был полезен.
Успехов и хорошего дня!

среда, 29 августа 2018 г.

php multi image upload загрузка множества фото

Здравствуйте!

Встала тут задачка сделать загрузку множества фотографий с динамическими input . Да имеется возможность multiple но не всегда она удобна. Был найден и использован следующий вариант. Требует jQuery для работы.

php, js, jquery, html, программирование, инструкция, полезное,

HTML
<div class="field_wrapper">
<input type="file" name="photos[]" class="form-control">
</div>
<i class="add_button fa fa-plus">Добавить ещё</i> 
JS
<script type="text/javascript">
$(document).ready(function(){
    var maxField = 10;
    var addButton = $('.add_button');
    var wrapper = $('.field_wrapper');
    var fieldHTML = '<br><input type="file" name="photos[]" value="" class="form-control">';
    var x = 1;
   
    $(addButton).click(function(){
        if(x < maxField){
            $(wrapper).append(fieldHTML);
        }
    });
   
    $(wrapper).on('click', '.remove_button', function(e){
        e.preventDefault();
        $(this).parent('div').remove();
        x--;
    });
});
</script>
PHP
$total = count($_FILES['photos']['name']);
for( $i=0 ; $i < $total ; $i++ ) {
$tmpFilePath = $_FILES['photos']['tmp_name'][$i];
        $photo = generateFilename();
$photo.=".jpg";
move_uploaded_file($tmpFilePath, "../uploads/".$photo); 
          }

В коде так же используется самописная функция generateFilename которая возвращает созданное имя файла:

function generateFilename(){
$chars = 'abdefhiknrstyz123456789_';
$string = '';
for ($i = 0; $i < 30; $i++) {
$string .= substr($chars, rand(1, 24) - 1, 1);
}
return $string;
}


Надеюсь код был полезен.
Успехов и хорошего дня!

вторник, 28 августа 2018 г.

приказ минкомсвязи 335 о переходе на отечественое п.о.

Здравствуйте!

Вот такое чудо нашёл сегодня.

Об утверждении методических рекомендаций по переходу органов исполнительной власти субъектов Российской Федерации и органов местного самоуправления муниципальных образований Российской Федерации на использование отечественного офисного программного обеспечения, в том числе ранее закупленного офисного программного обеспечения
Полный текст приказа.
Если это подстегнёт всякие ленивые alt linux и прочих - будет здорово. В противном случае всё будет очень плохо.

импортозамещение, минкомсвязь, отечественное п.о., приказ 335, linux,

Кто знает - это обязует использовать только п.о. из реестра?
10. Переход на использование отечественного офисного программного обеспечения рекомендуется осуществлять в отношении: иностранного офисного программного обеспечения и (или) офисного программного обеспечения, сведения о котором не включены в единый реестр российского программного обеспечения

Надеюсь всё будет хорошо.
Успехов и хорошего дня!

понедельник, 27 августа 2018 г.

freeipa установка клиента

Здравствуйте!

Помимо установки сервера free ipa так же требуется установить и настроить клиент на сторонней машине который будет подключаться к этому серверу каталогов. В качестве клиентской машины я использовал Linux Mint 19 Cinnamon 64bit. Как по мне очень приятный дистрибутив стабильный и готовый для домашнего использования из коробки.

инструкция, настройка, полезное, freeipa, linux, ubuntu, ubuntu server,

Установить клиента и ввести в домен достаточно просто:
1. Прежде всего требуется задать имя машины в будущем домене. Делается это так же в файле /etc/hostname где нужно указать имя вида client1.your-domain-name.ru
2. Т.к. в моей сети днс для внутренний имён отсутствовал напрочь - требуется в хосты /etc/hosts прописать жёсткие адреса для клиента и сервера. Например: 192.168.0.х ipa.your-domain-name.ru и 192.168.0.х client1.your-domain-name.ru
3. Следующим шагом будет обновление
apt-get update && apt-get upgrade
4. Устанавливаем клиент:
apt-get install freeipa-client
5. Настройка клиента так же производится в режиме мастера. Для её запуска требуется выполнить команду от рута:
ipa-client-install --mkhomedir
Благодаря ключу --mkhomedir при заходе каждого нового пользователя в каталоге /home/ будет создаваться директория с именем пользователя.
В процессе работы с мастером установки потребуется указать адрес домена ( символьный! ) который соответствует тому что было прописано в шаге 2. А так же ввести имя пользователя и пароль администратора домена ( которые были заданы при настройке сервера ).

На этом настройка завершена и после входа можно входить под пользователем. В Linux Mint для того что бы можно было вводить имя пользователя на экране входа требуется зайти в раздел Настройки - Окно входа в систему - Разрешить ввод имени пользователя.

Для работы прав администратора требуется произвести действия с sudoers по аналогии с данной инструкцией опубликованной ранее. Исключением будет разве что имя группы - в free ipa это группа admins. Хотя ничего не мешает использовать группу wheels для раздачи прав администратора.

Надеюсь инструкция была полезной.
Успехов и хорошего дня!