• Как реализовать повторитель (аналог acf repeater) в битриксе?

    Starina_js
    @Starina_js
    full-stack web dev
    1. Использовать множественное свойство с типом строка или даже иногда листа (в свойствах инфобока поставить галочку). Но не подойдет, когда вам нужно объединить в группу разного типа контента.
    2. Писать свое кастомное свойство . Ну такое, не быстрое решение)
    3. Использовать Модуль из маркетплейса , допустим Такой
    Есть минус, там почему-то местами нельзя менять когда заполнил уже...
    Ответ написан
  • Как получить ответ от сервера с помощью cURL PHP?

    Starina_js
    @Starina_js
    full-stack web dev
    Там cloudflare стоит, все чутка сложнее.

    Тут посмотрите решение для php

    Ключевое, надо 1 шагом получить нужные куки , второй шаг как раз выставить нужные заголовки

    Но возможно лучше использовать допустим pupeeter на js , который эмулирует браузер и ждет нужные загрузки
    Ответ написан
    1 комментарий
  • Замена тега через JS почему не работает?

    Starina_js
    @Starina_js
    full-stack web dev
    Какой робот? seo? Робот видит то, что приходит от сервера, а не во время работы js на фронте. То есть, изменяя h3 в моменте никакого влияние не оказывается на seo и роботов.
    Ответ написан
    Комментировать
  • Как обернуть элементы в контейнер внутри details с помощью JQuery?

    Starina_js
    @Starina_js
    full-stack web dev
    Как-то так?)

    $(document).ready(function() {
      $('.js-form-wrapper').each(function() {
        var $container = $('<div class="my-wrapper"></div>');
        $(this).find('.responsive, .js-form-type-managed-file').wrapAll($container);
      });
    });
    Ответ написан
    Комментировать
  • Как выводить определенное модальное окно?

    Starina_js
    @Starina_js
    full-stack web dev
    Теория.
    Получаете ответ от обработчика форм / бека - считываете ответ. Если успех -> вызываете функцию открытия формы с успехом, если ошибка -> форма с ошибкой (по id или data attr нужной формы).
    А еще это форма то может быть одна, просто вы в форму можете вставлять свои сообщения.
    Если форму пишите с нуля, то вам нужно сделать html разметку, css стили.
    Функция вызова формы - можно просто добавлять нужные классы для открытия формы.

    А если используете какой-то css фреймворк, допустим bootstrap, то там есть функции вызова формы и вообще сама форма готовая.

    Далее простой пример
    <!-- Модальное окно успешного результата -->
    <div id="modal-success" class="modal">
      <div class="modal-content">
        <span class="close">&times;</span>
        <h2>Успех!</h2>
        <p>Данные успешно отправлены.</p>
      </div>
    </div>
    
    <!-- Модальное окно с ошибкой -->
    <div id="modal-error" class="modal">
      <div class="modal-content">
        <span class="close">&times;</span>
        <h2>Ошибка!</h2>
        <p>Произошла ошибка при отправке данных.</p>
      </div>
    </div>


    // При успешной отправке данных
    const showSuccessModal = () => {
        document.getElementById("modal-success").style.display = "block";
    };
    
    // При ошибке отправки данных
    const showErrorModal = () => {
        document.getElementById("modal-error").style.display = "block";
    };
    
    // Закрытие модального окна при клике на крестик
    const closeButtons = document.getElementsByClassName("close");
    for (let i = 0; i < closeButtons.length; i++) {
        closeButtons[i].addEventListener("click", function() {
            const modal = this.parentElement.parentElement;
            modal.style.display = "none";
        });
    }
    
    //пример обработки ответа с формы
    
    const form = document.querySelector('form');
    
    form.addEventListener('submit', async (event) => {
      event.preventDefault();
    
      const formData = new FormData(form);
      const response = await fetch('/api/submit-form', {
        method: 'POST',
        body: formData
      });
    
      if (response.ok) {
        const result = await response.json();
        // обработка успешного ответа
        console.log(result);
      } else {
        const error = await response.text();
        // обработка ошибки
        console.error(error);
      }
    });


    // а это пример с promise .then 
    const form = document.getElementById("myForm");
    form.addEventListener("submit", function(event) {
      event.preventDefault(); // Предотвращаем отправку формы по умолчанию
      
      // Получаем данные из формы
    const formData = new FormData(form);
      
      // Отправляем данные на сервер с помощью Fetch API
      fetch("URL_СЕРВЕРА", {
        method: "POST",
        body: formData
      })
      .then(function(response) {
        if (response.ok) {
          showSuccessModal(); // Показываем модальное окно успешного результата
        } else {
          showErrorModal(); // Показываем модальное окно с ошибкой
        }
      })
      .catch(function(error) {
        console.error("Ошибка:", error);
        showErrorModal(); // Показываем модальное окно с ошибкой
      });
    });


    .modal {
      display: none; /* Скрываем модальное окно по умолчанию */
      position: fixed;
      z-index: 1;
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
      overflow: auto;
      background-color: rgba(0, 0, 0, 0.5);
    }
    
    .modal-content {
      background-color: #fefefe;
      margin: 15% auto;
      padding: 20px;
      border: 1px solid #888;
      width: 80%;
    }
    
    .close {
      float: right;
      font-size: 28px;
      font-weight: bold;
      cursor: pointer;
    }
    
    .close:hover,
    .close:focus {
      color: #000;
      text-decoration: none;
      cursor: pointer;
    }
    Ответ написан
    1 комментарий
  • Как правильно распределять ответственность между классами?

    Starina_js
    @Starina_js
    full-stack web dev
    Литература. Хороший источник, имхо
    По ddd можно погуглить порядок чтения книг, плюс допом видосы с конференций на ютубе.
    "Clean Architecture" и "Domain-Driven Design" как знакомство с этим всем делом.

    И скажите, в чём разница между Store и Repository?
    Store - хранилище. Обычно это про паттерн состояние. Оно может содержать логику обновления состояния и взаимодействия с другими частями приложения
    Repository - это такая абстракция для доступа к источнику данных, то есть где хранятся данные. Может быть файловое хранилище, может быть база данных , а иногда , если работаешь с cms/фреймами - их интерфейсы для работы с хранилищами. Как пример: репозиторий, отвечающий за получение и сохранение данных пользователей в базе данных
    Ответ написан
    3 комментария
  • Почему MathJax.typeset() не работает?

    Starina_js
    @Starina_js
    full-stack web dev
    Вместо вызова MathJax.typeset() попробуйте использовать MathJax.typesetPromise() для перерендеринга элементов после определенных действий пользователя.

    Может поможет
    и еще

    MathJax.typesetPromise().then(() => {
            // Рендеринг MathJax завершен
            // Выполните другие действия здесь
        });


    или посмотреть порядок подключения библиотеки)
    Ответ написан
  • Как установить на каталог в 1с-Битрикс Basic AuthType?

    Starina_js
    @Starina_js
    full-stack web dev
    Должно работаь

    $http->setHeaders(
      array(
        "Accept"        => "application/json",
        "Content-Type"  => "application/json; charset=UTF-8",
        "Cache-Control" => "no-cache, no-store, must-revalidate",
        "Authorization" => "Basic " . base64_encode($login . ":" . $password)
      )
    );


    Если нет, то надо проверять что там с $http что там с htpasswd и htaccess и т.п.
    Ответ написан
    Комментировать
  • Как выводить по свойству раздела?

    Starina_js
    @Starina_js
    full-stack web dev
    Если menu в header.php шаблона, то нужно вводить отложенные функции, так как загрузки свойства на этапе подключения header нет

    Вот тут почитать
    Ответ написан
    Комментировать
  • Почему в всех элементах списка одно и тоже значение?

    Starina_js
    @Starina_js
    full-stack web dev
    Кажется проблема связана с использованием одной и той же переменной DATA_PUBLISHED внутри цикла map(). Каждая итерация цикла должна иметь свою собственную переменную DATA_PUBLISHED, чтобы сохранить соответствующие значения для каждого элемента списка ITOG.

    Вообще этот код хотя бы выровнять, визуально поправить)
    Ответ написан
    Комментировать
  • Вызов функции один раз в компоненте VUE при срабатывании watch?

    Starina_js
    @Starina_js
    full-stack web dev
    Возможо
    watch(
      () => storeRisks.isClearRisk,
      (newValue, oldValue) => {
        if (newValue) {
          onRisk(newValue);
        }
      },
      { immediate: true }
    );


    или

    let isRiskHandled = false;
    
    watch(
      () => storeRisks.isClearRisk,
      (newValue) => {
        if (!isRiskHandled) {
          onRisk(newValue);
          isRiskHandled = true;
        }
      }
    );
    Ответ написан
  • Как подключить express в HTML файл?

    Starina_js
    @Starina_js
    full-stack web dev
    Эм, не очень понятен вопрос. Express является фреймворком для разработки серверных приложений на языке JavaScript, который работает на Node.js. Вы не можете подключить Express напрямую в HTML файл

    Чтобы делать нужные вам вещи, вам нужно через javascript на фронте обращаться к серверу , который как раз написан на Express

    <button onclick="connectToDatabase()">Подключиться к базе данных</button>
    
      <script>
        function connectToDatabase() {
          fetch('/connect')
            .then(response => response.text())
            .then(data => {
              console.log(data); // Вывод ответа от сервера в консоль
            })
            .catch(error => {
              console.log('Ошибка при подключении к базе данных:', error);
            });
        }
      </script>


    В данном примере мы обращаемся к странице / роут - /connect
    Этот роут слушает Express и на запрос отвечает / что-то делает

    // index.js (серверное приложение с использованием Express)
    const express = require('express');
    const app = express();
    
    // Функции для подключения к базе данных
    // ...
    
    // Обработка GET-запроса на /connect
    app.get('/connect', (req, res) => {
      // Вызов функции подключения к базе данных
      // ...
    
      // Отправка ответа клиенту
      res.send('Подключение к базе данных выполнено успешно');
    });
    
    // Запуск сервера на порту 3000
    app.listen(3000, () => {
      console.log('Сервер запущен на порту 3000');
    });
    Ответ написан
    Комментировать
  • Как убрать воспроизведение нескольких аудио в html?

    Starina_js
    @Starina_js
    full-stack web dev
    Как-то так?
    Когда запускаем одно аудио, мы отключаем остальные, кроме текущего

    <audio id="audio1" src="music.mp3"></audio>
    <audio id="audio2" src="music2.mp3"></audio>

    const audioElements = Array.from(document.getElementsByTagName('audio'));
    
      const stopOtherAudio = (currentAudio) => {
        audioElements.forEach((audio) => {
          if (audio !== currentAudio) {
            audio.pause();
            audio.currentTime = 0;
          }
        });
      };
    
      audioElements.forEach((audio) => {
        audio.addEventListener('play', () => stopOtherAudio(audio));
      });
    Ответ написан
    1 комментарий
  • Как можно в Js реализовать доступ к полям родительского "класса"?

    Starina_js
    @Starina_js
    full-stack web dev
    В вашем примере obj является простым объектом и не связан с прототипом класса.
    Поэтому, если вы измените obj в одном экземпляре класса, это не отразится на других экземплярах.

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

    class A {
      constructor() {
        if (!A.prototype.hasOwnProperty('obj')) {
          A.prototype.obj = { 'b': 1, 'c': 2 };
        }
      }
    }
    
    class B extends A {
      constructor() {
        super();
        this.nvmProp = 'zZzz';
      }
      changeObj() {
        this.obj.b = 10;
      }
    }
    
    class C extends A {
      constructor() {
        super();
        this.nvmProp = 'zZzzZz';
      }
      changeObj() {
        this.obj.c = 20;
      }
    }
    
    let a = new A();
    let b = new B();
    let c = new C();
    
    b.changeObj();
    c.changeObj();
    
    console.log(b.obj); // {b: 10, c: 20}
    Ответ написан
    1 комментарий
  • Отправлять информацию о заказе Клиенту в TG \ Vb?

    Starina_js
    @Starina_js
    full-stack web dev
    Скорей всего писать для себя интеграцию. Хотя может на github что-то есть..

    Пример с telegram.
    Задача. Нам нужен бот, который будет присылать сообщение о заказе нужному пользователю.
    Как работает с телеграмом? Когда клиент пишет боту, бот получает id клиента и id комнаты. Их нужно запоминать (ниже) и далее использовать при заказе.

    Задача. Далее нам надо связать клиента с сайта с клиентами из телеграмм.
    То есть нам нужно заранее от клиента в магазине получить разрешение на получение сообщений от телеграмм бота.
    Мы просим клиента написать нашему боту. Кстати там есть специальные даже ссылки, при переходе, бот может их распарсить.

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

    Дальше про процесс заказа.
    Задача. Нужно после успешного / не успешного заказа отправлять информацию нужному клиенту через бота.

    1ой Вариант. Через хуки заказа от Woo .
    Нам нужно подрубиться к хуку заказа Woo и при успешном заказе отправлять клиенту в нужный канал связи, в нужную комнату.
    Когда срабатывает хук заказа -> парсим заказ -> получаем канал связи -> получаем id комнаты для бота -> отправляем через бота сообщение в нужное место

    2ой Вариант. Через очереди и расписание.
    Можно через cron и wp_schedule_event, допустим каждые 10 секунд, запускаем процесс получения заказов -> смотрим те, что еще не были оповещены -> отправляем через бота -> ставим статус отправлено

    Можно даже через сторонний менеджер очередей))
    Ответ написан
    Комментировать
  • Как сделать автоматический переход на следующий input?

    Starina_js
    @Starina_js
    full-stack web dev
    А если так?

    $('input').keyup(function(){
      if($(this).val().match(/^\d{1}$/)){
        $(this).closest('div').next('div').find('input').focus();
      }else{
        $(this).val('');
      }
    });
    Ответ написан
    Комментировать
  • Как оптимальнее вывести процентное соотношение каждого символа в строке?

    Starina_js
    @Starina_js
    full-stack web dev
    Может как-то так?
    function orderedCount2(str) {
        const symbols = new Map();
        for (const c of str) {
          const currCount = symbols.get(c) || 0;
          symbols.set(c, currCount + 1);
        }
        const totalCount = str.length;
        const orderedSymbols = {};
        for (const [symbol, count] of symbols.entries()) {
          orderedSymbols[symbol] = (count / totalCount) * 100;
        }
        return orderedSymbols;
      }
    input: 
    orderedCount("hello world")
    output
    
    {
      h: 9.090909090909092,
      e: 9.090909090909092,
      l: 27.27272727272727,
      o: 18.181818181818183,
      ' ': 9.090909090909092,
      w: 9.090909090909092,
      r: 9.090909090909092,
      d: 9.090909090909092
    }
    Ответ написан
    2 комментария
  • Почему не работает споллер?

    Starina_js
    @Starina_js
    full-stack web dev
    Потому что у вас ошибка на ошибке)

    - не claccList, а classList,
    - не sppollers / sppoller, а spollers / spoller
    и тут
    matchMedia.addEventListener(function () {
            initSpollers(spollersArray, matchMedia);
          });


    Какое событие должно отслеживаться для matchMedia ? click?

    matchMedia.addEventListener('click', function() {
                    initSpollers(spollersArray, matchMedia);
                });


    Сначала смотрите в консоль, она рассказывает где ошибки.
    Но даже исправив такие , то все равно надо разобраться как это все должно работать)
    Ответ написан
    2 комментария
  • Не отправляются файлы на сервер через BX.ajax.runComponentAction, в чем может быть проблема?

    Starina_js
    @Starina_js
    full-stack web dev
    Эту ветку смотрели?

    BX.ajax.runComponentAction('componentName', "actionName", {
        mode: 'ajax',
        data: new FormData(form)
    })


    use \Bitrix\Main\Application;
    $request = Application::getInstance()->getContext()->getRequest();
    $files = $request->getFileList()->toArray();
    Ответ написан
    4 комментария
  • Почему возникает ошибка popup.js:32 Uncaught TypeError: Cannot read properties of null (reading 'value')?

    Starina_js
    @Starina_js
    full-stack web dev
    1. document.querySelector('input-name') (и другие такие же) — Что за selector такой 'input-name'?
    Либо ('.input-name') - как класс, либо ('input[name="input-name"]')

    2. Везде const поставить:
    const userName = nameInput.value;
    const tel = telInput.value;
    const text = textInput.value;


    получается в попапе есть форма, по событию отправки нужно куда-то передавать данные?
    тогда можно просто найти form , а там получить все значения из инпутов

    new FormData(form)

    Пример
    Ответ написан
    Комментировать