• Как вывести дочерние категории через событие ajax?

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Тебе нужно повесить событие изменения (change) на select, затем отправить AJAX к серверному скрипту который вернёт JSON список дочерних категорий для только что выбранной категории.

    Пример для JQuery:
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title></title>
      </head>
      <body>
    
        <!-- Select родительских категорий -->
        <select name="categoryfilter">
          <option disabled="disabled" selected value="">Выберите категорию</option>
          <option value="1">Категория 1</option>
          <option value="2">Категория 2</option>
        </select>
    
        <!-- Select дочерних категорий -->
        <select name="subcategories"></select>
    
        <!-- Подключение JQuery для примера -->
        <script
            src="https://code.jquery.com/jquery-3.6.0.min.js"
            integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
            crossorigin="anonymous"></script>
    
        <!-- Логика клиентской части -->
        <script type="text/javascript">
          // Вешаем событие изменения на селект категорий
          $('select[name="categoryfilter"]').on('change', function(){
            let val = $(this).val(); // value только что выбранной категории
            $('select[name="categoryfilter"]').html(''); // Очищаем фильтр дочерних категорий
    
            //Запрашиваем данные
            $.ajax({
              url: '/path/to/file', // Путь к файлу PHP от корня сайта
              type: 'POST', // Отправляем данные методом POST
              dataType: 'json', // Ждём что сервер вернёт JSON
              data: {
                category: val, // Отправляем переменную 'category' со значением 'val'
              },
            })
            .done(function(data) {
              // Когда сервер вернул JSON
              // Перебираем данные циклом
              $.each(data, function(index, item) {
                // Добавляем внутрь select'а дочерних категорий новые опции
                $('select[name="subcategories"]').append('\
                  <option value="' + item.id + '">' + item.name + '</option>\
                ');
              });
            })
            .fail(function() {
              // Любая ошибка
              console.log("error");
            })
            .always(function() {
              // Когда запрос завершился успешно или с ошибкой
              console.log("complete");
            });
          });
        </script>
      </body>
    </html>


    Неполная серверная часть на PHP:
    <?php
    
    	//Тут должна быть логика загрузки нужных дочерних
    	//категорий согласно пришедшему значению 'category' ($_POST['category'])
    
    	$subCategories = [
    		[
    			'id' => 1,
    			'name' => 'Дочерняя категория 1',
    		],
    		[
    			'id' => 2,
    			'name' => 'Дочерняя категория 2',
    		],
    		[
    			'id' => 3,
    			'name' => 'Дочерняя категория 3',
    		],
    	];
    
    	//json_encode превращяет массив PHP в JSON, который ждёт AJAX
    	exit(json_encode($subCategories));
    ?>
    Ответ написан
    Комментировать
  • Как сделать выборку дат?

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Если ты используешь SQL и у тебя есть какая-то запись в таблице хранит в себе данные, по которым должна быть возможна выборка, то тебе стоит сделать две таблицы.

    Например в таблице "Films" хранятся фильмы:
    1. id - Порядковый номер (первичный ключ)
    2. name - Название фильма


    И в таблице "Sessions":
    1. id - Порядковый номер (первичный ключ)
    2. film_id - Номер фильма согласно таблице "Films"
    3. date - Дата сеанса кино


    Таким образом ты можешь делать выборку по нужному фильму и дате.
    Отмечу что благодаря связям можно удалив "фильм" автоматически удалить все "сеансы".

    Если тебе нужно сохранить массив в базе данных, лучше использовать тип ячейки JSON.
    Если очень хочется хранить текст, создай обычный массив и использоваться функцию serialize для того чтобы получить пригодное для хранение представление этого массива. Когда тебе понадобится получить этот массив из базы, достаточно будет применить unserialize
    Но учитывай, что ни по JSON, ни по сериализированному массиву, адекватным образом выбрать из базы не получится. Твой вопрос должен относится к архитектуре базы данных, а не к PHP.
    Ответ написан
    Комментировать
  • Как получить нужную часть ответа от API в PHP?

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Я получаю такую строку : {"day":0,"week":186,"month":186}
    из неё хочу брать только день и число


    <?php
    
        $url = "http://$server/api/?" .http_build_query($request_params);
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        
        //Получаем JSON
        $response = curl_exec($ch);
        curl_close($ch);
    
        //Декодируем JSON в PHP объект
        $data = json_decode($response);
       
        //Выводим только нужные элементы
        echo 'Day: '.$data->day.PHP_EOL;
        echo 'Week: '.$data->week.PHP_EOL;
        echo 'Month: '.$data->month.PHP_EOL;
    
    ?>
    Ответ написан
    Комментировать
  • Как сделать кликабельный никнейм в сообщении от телеграм бота?

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Смотри объект сообщения и элемент entities

    Telegram обычно автоматически обнаруживает внутренние ссылки.
    Ответ написан
  • Как изменить значение в html селекторе с помощью php?

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Можно использовать HTML парсер на PHP (Документация)

    <?php
    
    // Создаём DOM из строки
    $html = str_get_html('
      <div id="hello">Hello</div>
      <div id="world">World</div>
    ');
    
    // Ищем элемент 'div' с 'id="hello"' и меняем его содержимое на 'foo'
    $html->find('div[id=hello]', 0)->innertext = 'foo';
    
    // Ищем второй элемент 'div' по порядку и добавляем ему класс 'bar'
    $html->find('div', 1)->class = 'bar';
    
    echo $html; 
    // Результат:
    // <div id="hello">foo</div>
    // <div id="world" class="bar">World</div>
    
    ?>
    Ответ написан
    Комментировать
  • Почему не работает onblur на textarea?

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Вот решение твоей задачи.
    Дело в том что ты пытаешься повесить событие "onblur" на ещё не существующий элемент.

    <div onclick="transformToTextarea(this);" style="width: 50px; height: 50px; background-color: blue;"></div>

    function transformToTextarea(el) {
      el.outerHTML = '<textarea onblur="transformToDiv(this);">' + el.innerHTML + '</textarea>';
    }
    function transformToDiv(el){
      el.outerHTML = '<div onclick="transformToTextarea(this);">' + el.value + '</div>';
    }

    В данном случае заранее объявлено две функции, а в событии через атрибуты самого элемента указывается их вызов.
    Ответ написан
    5 комментариев
  • Можно ли хранить sitemap.xml в подпапках домена?

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Ты можешь указать в robots.txt где лежит твой sitemap.
    Кроме того, sitemap может быть несколько.

    Пример robots.txt с указанием адреса sitemap.xml
    User-agent: *
    Allow: /
    Sitemap: https://site.ru/sitemap.xml
    Sitemap: https://site.ru/moscow/sitemap.xml


    Поисковик работает только с одним robots.txt, находящимся в корне сайта
    (https://example.com/robots.txt)

    Какие существуют требования к robots.txt:
    • Размер файла не превышает 500 КБ
    • Это TXT-файл с названием robots.txt
    • Файл должен быть размещен в корневом каталоге сайта
    • Файл должен быть доступен для роботов — сервер, на котором размещен сайт, отвечает HTTP-кодом со статусом 200 OK
    • Можно указать до 500 штук файлов sitemap.xml, до 50 000 ссылок в каждом из них


    Какие существуют требования к sitemap.xml:
    • Файл должен быть в кодировке UTF-8
    • Максимальное количество ссылок — 50 000 (О том как разделить большой sitemap.xml написано выше)
    • Максимальный размер файла в несжатом виде — 50 МБ
    • Указывайте ссылки на страницы только того домена, на котором будет расположен файл
    • Разместите файл на том же домене, что и сайт, для которого он составлен
    • При обращении к файлу сервер должен возвращать HTTP-код 200
    Ответ написан
    5 комментариев
  • Как при скролле создать класс и переместить в него некоторые элементы?

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Решение

    Исходный HTML
    <h2>Greetings</h2>
    <div class="container">
      <div class="inner">Hello</div>
      <div class="inner">Goodbye</div>
    </div>

    Вставляем элемент "h2" внутрь элемента с классом "container"
    ("prepend" - в начало / "append" - в конец)
    $('.container').append($('h2'));

    Результат
    <div class="container">
      <div class="inner">Hello</div>
      <div class="inner">Goodbye</div>
      <h2>Greetings</h2>
    </div>


    Ты можешь не только использовать это на существующем элементе, но и создать новый налету
    $('.container').prepend('<h1>Hello World!</h1>');

    <h2>Greetings</h2>
    <div class="container">
      <h1>Hello World!</h1>
      <div class="inner">Hello</div>
      <div class="inner">Goodbye</div>
    </div>


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

    В вёрстке нет класса "header__menu"
    Можешь прислать скриншот как это выглядит?
    Возможно тебе просто нужно создать родительский блок для всех них и уже к нему применять стиль fixed
    Ответ написан