Задать вопрос
  • Есть ли ошибки в этом коде?

    @MikUrrey
    $(this).toggleClass('active');-> строка лишняя
    Ответ написан
  • Как добавить в базу данных несколько записей?

    @MikUrrey
    Ошибка в строке
    $query->execute(['nickname', 'email' => $nickname, $email]);

    вероятно, должно быть так
    $query->execute(['nickname' => $nickname, 'email' => $email]);

    и еще,
    'VALUES(:nickname, email)'
    должно быть так:
    'VALUES(:nickname, :email)'
    Ответ написан
    Комментировать
  • Как накидать логику работы будущей программы?

    @MikUrrey
    Это называется "архитектура". Если вы начинающий и хотите создать приложение с более-менее хорошей архитектурой, попробуйте какой-нибудь известный в вашем стеке фреймворк. Фреймворки зачастую диктуют свою архитектуру или имеют готовые шаблоны проектов, в которых предусмотрена "тысяча мелочей". Так же вникание в премудрости архитектуры можно / нужно начать с изучения паттернов (factory, dependency injection, adapter и т.п.) и подходов (MVC, TDD, SOLID, DRY и т.п.)

    А вот что касается именно бизнес-логики, тут все слишком специфично и зависит от предметной области. Я бы посоветовал в ходе разработки временами задумываться на тему "как потом я смогу расширить этот модуль/класс/метод, не редактируя его код?". Это временами даёт очень годные идеи.
    Ответ написан
    1 комментарий
  • Как найти значение по ключу в объекте с неизвестной глубиной вложенности?

    @MikUrrey
    Доброго!
    const findByKey = (object, key) => {
     if (object instanceof Array) {
      for (let i = 0; i < object.length; i++) {
        let result = findByKey(object[i], key);
        if (result  !== null) {
         return result;
        }
      }
      return null;
     }
     for (let p in object) {
      if (p === key) {
       return object[p]
      } else if (typeof object[p] === 'object') {
       let result = findByKey(object[p], key);
       if (result  !== null) {
        return result;
       }
      }
     }
     return null;
    }
    
    findByKey(someObject, someKey)
    Ответ написан
    2 комментария
  • Почему не срабатывает функция при нажатии?

    @MikUrrey
    Не срабатывает потому, что клик "поднимается" до .section и его обработчик срабатывает тоже.
    Нужно запретить всплывание события:

    $('.close').on('click', function (e) {
      e.stopPropagation(); // вот так
      $('.section').removeClass('opened');
    });


    или stopImmediatePropagation, если в вашем случае первое не сработает
    Ответ написан
    1 комментарий
  • Как автоматически увеличивать количество дней на JavaScript?

    @MikUrrey
    Попробуйте поэкспериментировать с целым остатком от деления.
    Например, так:
    let remain = Math.round((new Date).getTime()/1000)%(24*3600*10);
    //и с remain работать дальше
    Ответ написан
    Комментировать
  • Как делать раскрытие и закрытие подменю, при клике по элементу li и переход при клике по ссылке?

    @MikUrrey
    Это потому, что e.preventDefault();блокирует переход.

    А чтобы сработало открытие, затем переход, нужно использовать complete-калбэк в методе slideToggle:
    $(this).next('.top-menu li ul').slideToggle(200, function(){
      document.location.href = e.currentTarget.href
    })
    Ответ написан
  • Можно ли подгружать данные на многостраничный сайт при помощи api?

    @MikUrrey
    Почему нет?)
    Сервер может делать так:
    if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
      //вот тебе данные в виде JSON
    } else {
      //а вот тебе те же данные, но в виде HTML
    }
    Ответ написан
    7 комментариев
  • Как вызвать метод в другом компоненте, который находится на другом уровне?

    @MikUrrey
    Из всех решений наилучшими будет пара приемов, которые сводятся к выводу взаимодействий на глобальный уровень.
    1) Как уже подсказали, event bus. Но лучше всего не так, как рекомендует документация, а на экземпляре $root. Например:

    //один из компонентов сообщает, что надо что-то выполнить
    methods: {
      iChangeSomething(value) {
        this.$root.$emit("something-changed", value)
      }
    }

    //другой это выполняет силами своего метода
    methods: {
      somethingChanged(value) {
        console.log({value})
      }
    },
    created() {
        this.$root.$on("something-changed", this.somethingChanged )
    },
    destroy() {
        this.$root.$off("something-changed", this.somethingChanged )
    }


    2) Плагин, который "сшит" с компонентом, и транслирует его метод в глобальную область.
    //определяем
    //@/plugins/user.js
    let doSomething = () => null
    
    export default function install(Vue) => {
      
      const MyComponent = {
        name: "MyComponent ",
        methods: {
          doSomething() {
             console.log("I'm doing something!")
          }
        },
        created() {
          doSomething = this.doSomething
        },
        render: function (createElement) {
          //...
        }
      }
      
      Vue.component('MyComponent', MyComponent)
      Vue.prototype.$doSomething = doSomething
    }

    //подключаем
    //main.js
    import {VuePlugin as User} from "@/plugins/user"
    Vue.use(User)
    new Vue({ ...

    //используем
    methods: {
       doSomething() {
          this.$doSomething()
       }
    }

    <!-- или так -->
    <button @click="$doSomething">BUTTON</button>

    Но здесь - один нюанс: придется прописывать render не тегами, а функциями.
    Поэтому решение годно больше для некоего универсального пакета, который вы сможете потом повторно использовать в других проектах с минимальными изменениями.

    Vuex - возможно, но не всегда уместно. Это инструмент работы с общими данными, он целесообразен в более-менее крупных проектах. Если стоит задача типа "чтобы от различных действий затемнялась общая панелька в UI", то лучше сделать панельку плагином, чем заводить ее свойства в store.
    Ответ написан
  • Как передать содержимое именованного слота потомку в render-функции?

    @MikUrrey Автор вопроса
    Оказалось все просто, делюсь решением.
    Нужно передать статичные слоты в качестве потомков (третий аргумент createElement), и проставлять в data каждого потомка соответствующий slot:
    export default {
       name: "form-element",
       render(h) {
          let data = {
              //.....................................
          };
          //.....................................
          let slots = []
          for(let slot in this.$slots) {
            slots.push(h('template', {slot}, this.$slots[slot]))
          }
          return h(component, data, slots);
       }
    }
    Ответ написан
    Комментировать
  • Как решить проблему с fetch?

    @MikUrrey
    У вас обращение к серверу прописано как
    await fetch('upload', ...)
    Это значит, что он будет в URL страницы подставлять `upload` и пытаться грузить файл туда.
    А это, в свою очередь, значит, что страница, открытая кликом из проводника, передаст функции fetch невалидный URL.
    Чтобы всё работало, страницу нужно разместить на том же домене, где работает сервер, и открывать, набирая адрес в браузере, чтобы в адресной строке URL начинался не с file://, а с http://
    Ответ написан
    Комментировать
  • Как кастомизировать кнопки в vue-tiny-slider слайдере?

    @MikUrrey
    :prev-button="prevButton"
    ...
    ...
    computed: {
        prevButton() {
            return "<div class='button'>назад</div>"
        }
    }
    Ответ написан
  • Для каких задач Node.js является более приоритетным выбором среди других платформ?

    @MikUrrey
    Реактивные веб-сайты.
    Есть такой термин: Server Side Rendering, упоминается чаще всего в связи с технологиями Vue и React.
    Реактивные фреймворки "собирают" контент на клиенте, а node js позволяет тот же код использовать на сервере, чтобы он мог отдавать странички, готовые для СЕО.

    Кроссплатформенные мобильные приложения.
    Создаются по технологии React Native и подобным.

    Кроссплатформенные приложения для РС.
    Это, обычно, фреймворк Electron. Например, популярный нынче VS Code создан по такой технологии.
    Ответ написан
    Комментировать
  • Как правильно выполнить код внутри шаблона Vue?

    @MikUrrey Автор вопроса
    Нашел лишь единственный способ: сделать собственный компонент.
    <badge-cell :params="join('status', 'id', props.value)">{{props.value}}</badge-cell>

    вот в нутри компонента как раз переданный объект декомпозируется в необходимые для вывода данные.
    Ответ написан
    Комментировать
  • Есть ли реализации packagist (composer-сервера) на PHP?

    @MikUrrey Автор вопроса
    Нашел сам. https://github.com/Rarst/release-belt
    Все делаем по инструкции, получаем репозиторий. Только веб рут должен указывать на public/index.php вместо index.php, а composer.json кроме указанных строк нужно добавлять
    "config": {
            "secure-http": false
    }

    потому что localhost, естественно, не поддерживает https.

    P.S. Да, автор гордо сообщает, что даже composer.json в пакетах не нужен. Но лучше все же с ним, потому что иначе композер может не понять, как создать автозагрузку для вашего пакета.
    Ответ написан
    Комментировать
  • Почему общий подсчет В Google Analytics за короткий период выше, чем за длинный?

    @MikUrrey Автор вопроса
    Оставляю ответ для тех, у кого будет подобный вопрос, зацепка найдена на просторах Stackoverflow.
    Такие "погрешности" связаны с особенностью подсчета статистики на free-аккаунтах. Для экономии ресурсов GA производит "сэмплинг" - вычисляет данные не по всем событиям, а лишь по некоему проценту событий. Так что, в случае странных скачков просто анализируйте ситуацию и берите те данные, которые подтверждаются вашими прикидками или другими источниками статистики.
    Ответ написан
    Комментировать
  • Как сопоставить две базы товаров?

    @MikUrrey
    Библиотек не знаю, но, если правильно понял задачу, опирался бы в решении на следующие подсказки:
    1) Сделать инструмент консольным
    2) Пройти по каждому товару в первой базе и вывести возможные совпадения по второй
    3) Для получения совпадений разбить название на слова, короткие отбросить, по остальным составить условие типа такого: LIKE % word1 % AND LIKE % word2 % AND LIKE % word3 % и т. д.
    4) Опираясь на количество совпадений и порядок следования слов вывести процент схожести по каждой позиции
    5) Предоставить input, где можно будет ввести ID совпадения вручную или выбрать позицию с наибольшим совпадением по мнению скрипта, просто нажав Enter.

    Вот, в принципе, и всё. Только, исходя из своего опыта, скажу что 20000 это реально много для ручной обработки, даже с таким скриптом))
    Ответ написан
    Комментировать
  • Входит ли дата во временной интервал?

    @MikUrrey
    //по феншую
    function checkDateIsBetween(string $data, string $timeFrom, string $timeTo): bool
    {
        $dateObject = new DateTime($date);
        $day = $dataObject->format('Y-m-d');
        $from = (new DateTime($day . ' ' . $timeFrom))->getTimestamp();
        $to = (new DateTime($day . ' ' . $timeTo))->getTimestamp();
        $ts = $dateObject->getTimestamp();
        return ($ts < $to) && ($ts > $from);
    }
    
    //по быстроляну
    function checkDateIsBetween2(string $date, string $timeFrom, string $timeTo): bool
    {
        $ts = strtotime($date);
        list($day, $time) = explode($date);
        return ($ts > strtotime($day . ' ' . $timeFrom)) && ($ts < strtotime($day . ' ' . $timeTo));
    }
    $date = '2019-07-01 16:22:01';
    $timeFrom = '17:40:00';
    $timeTo = '23:59:00';
    $dateIsBetween = checkDateIsBetween($date, $timeFrom, $timeTo);
    $dateIsBetween2 = checkDateIsBetween2($date, $timeFrom, $timeTo);


    Как можно заметить, идея состоит в том, чтобы ко времени начала и конца "пристроить" день заданной даты, а затем получить и сравнить временные метки.
    Ответ написан
    Комментировать