Задать вопрос
  • Как найти параметр который отвечает за выход из экрана блокировки Windows?

    IgorPI
    @IgorPI
    Вам нужно обратиться с этим вопросом на другой форум, например на фриланс.
    Я писал давным-давно программу для перехвата событий.

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

    Есть и другие варианты, например с перехватом сообщений.
  • Что такое нормализация базы данных простыми словами?

    IgorPI
    @IgorPI
    Есть вероятность, что авторы тоже не до конца понимают, о чём говорят.
    Есть и такие.
    Я тоже не исключение.

    Вы ответили себе на вопрос сами.
    Вам нужно пожить с этим.


    Нормализация — это процесс организации данных в базе данных, включающий создание таблиц и установление отношений между ними в соответствии с правилами, которые обеспечивают защиту данных и делают базу данных более гибкой, устраняя избыточность и несогласованные зависимости.
  • Почему store.getters в Роутере beforeEnter получает до того как в Vuex actions отработает axios?

    IgorPI
    @IgorPI
    Каково цель вашего?

    if (!store.getters.get_test_id) {
            next({ name: 'error' });
          } else {
            next();
          }
  • Почему store.getters в Роутере beforeEnter получает до того как в Vuex actions отработает axios?

    IgorPI
    @IgorPI
    Ну так роутинг отработает первым.
    Не желе чем App created

    Это же очевидно.
  • Как отрефакторить работу с ошибками?

    IgorPI
    @IgorPI
    А ещё есть возможность общаться с компонентами с помощью сообщений, наверняка вам это известно.

    Из реальной жизни.

    Мне нужен диалог, ну что-то типа
    Вы хотите удалить эту запись, да, нет?
    Или отобразить прогресс диалог

    Если речь идёт о собственном компоненте.
    1. Создать компонент
    2. Подкачать там где это нужно.

    Тут я призадумался, зачем мне каждый раз подключать компонент, если я могу его подключить всего один в layout.vue или App.vue.

    Как общаться я буду с компонентом?

    Код компонента

    <template>
      <div class="text-center">
        <v-dialog
          v-model="progress_dialog_visible"
          hide-overlay
          persistent
          width="300"
        >
          <v-card
            color="#c04a3c"
            dark
          >
            <v-card-text>
              {{message}}
              <v-progress-linear
                :indeterminate="progress === -1"
                color="white"
                class="mb-0"
                :value="progress"
              ></v-progress-linear>
            </v-card-text>
          </v-card>
        </v-dialog>
      </div>
    </template>
    
    <script>
      export default {
    
        model: {
          prop: 'visible',
          event: 'change'
        },
    
        data() {
          return {
            message: "Подождите...",
            progress: -1,
            progress_dialog_message: "",
            progress_dialog_visible: false,
          }
        },
    
        mounted() {
          this.$root.$on("progress-dialog-show", (message = "Подождите...") => {
            this.message = message
            this.progress_dialog_visible = true
          })
    
          this.$root.$on("progress-dialog-hide", () => {
            this.progress_dialog_visible = false
          })
    
          this.$root.$on("progress-dialog-set-progress", ({message, progress}) => {
            this.message = message || ""
            this.progress = progress || 0
          })
        },
    
    
      };
    </script>



    <v-app>
        ...
        <progress-dialog />
      </v-app>
    </template>
    
    <script>
    
      import ProgressDialog     from "../components/ProgressDialog/ProgressDialog";
    
      ...
    </script>


    Для того что бы показать диалог, я выполняю следующее...

    this.$root.$emit("progress-dialog-show", "Подождите...")


    Итог:

    Подключение всего в одном месте.
    Всегда можно вызвать диалог из любой страницы.
    Меньше кода.
  • Как отрефакторить работу с ошибками?

    IgorPI
    @IgorPI
    pro-dev,

    Я так понимаю примеси это как трейт на php)

    Не совсем, хотя могу ошибаться, коллеги поправят.

    Примеси это часть возможности фреймворка vue, а Trate в php возможность языка.
    Но идя одна, возможность повторного использования кода.

    Если сравнивать некоторые важные параметры, то

    Примеси в VUE имеют контекст страницы в которой вы его подключили.
    В php такая же история, если вы подключили трейт, то в Trate вы получите $this базового класса.
  • Как отрефакторить работу с ошибками?

    IgorPI
    @IgorPI
    pro-dev, Я не считаю это решением, как таковым исходя из вашего вопроса.

    Ответ может быть следующим:

    Сори, сайт на русском не открылся, гребаный роскомпозор

    Mixins - Mixins are a flexible way to distribute reusable functionalities for Vue components. A mixin object can contain any component options. When a component uses a mixin, all options in the mixin will be “mixed” into the component’s own options.


    Вам очень помогут миксины, код станет чище и легче будет поддерживать.

    Создавайте свои компоненты обёртки, но не просто завернуть ради того что бы создать компонент.
    Для того что бы из группы компонентов создать один компонент, для многоразового использования.
  • Как отрефакторить работу с ошибками?

    IgorPI
    @IgorPI
    pro-dev, Вы уже используете компоненты ))
    Но, да вы правы, можно сделать компонент обёртку, для того что бы уменьшить количество тегов в разметке.

    Я вам сейчас приведу пример реализации компонента.

    Компонент fg-input

    <template>
      <div class="form-group"
           :class="[
           {'input-group': hasIcon},
           {'has-danger': error},
           {'input-group-focus': focused},
           {'has-label': label || $slots.label}]">
        <slot name="label">
          <label v-if="label" :class="labelClasses">
            {{label}}
            <span v-if="required">*</span>
          </label>
        </slot>
    
        <slot name="addonLeft">
          <div v-if="addonLeftIcon" class="input-group-prepend">
            <i class="input-group-text" :class="addonLeftIcon"></i>
          </div>
        </slot>
        <slot>
          <input
            :value="value"
            v-on="listeners"
            v-bind="$attrs"
            class="form-control"
            :class="[{valid: value && !error}, inputClasses]"
            aria-describedby="addon-right addon-left"
            :type="type"
            :autocomplete="autocomplete ? 'on':'off'"
          >
        </slot>
        <slot name="addonRight">
            <span v-if="addonRightIcon" class="input-group-addon input-group-append">
              <i class="input-group-text" :class="addonRightIcon"></i>
            </span>
        </slot>
    
        <slot name="infoBlock"></slot>
        <slot name="helpBlock">
          <div class="text-danger invalid-feedback" style="display: block;" :class="{'mt-2': hasIcon}" v-if="error">
            {{ error }}
          </div>
        </slot>
      </div>
    </template>
    <script>
      export default {
        inheritAttrs: false,
        name: 'fg-input',
        props: {
          autocomplete: {
            type: [Boolean],
            default: false
          },
          required: Boolean,
          label: String,
          error: String,
          labelClasses: String,
          inputClasses: String,
          value: {
            type: [String, Number],
            default: ''
          },
          addonRightIcon: String,
          addonLeftIcon: String,
          type: {
            type: [String],
            default: 'text'
          },
        },
        data() {
          return {
            focused: false
          }
        },
        computed: {
          listeners() {
            return {
              ...this.$listeners,
              input: this.updateValue,
              focus: this.onFocus,
              blur: this.onBlur
            }
          },
          hasIcon() {
            const {addonRight, addonLeft} = this.$slots;
            return addonRight !== undefined || addonLeft !== undefined || this.addonRightIcon !== undefined || this.addonLeftIcon !== undefined
          }
        },
        methods: {
          updateValue(evt) {
            let value = evt.target.value;
            this.$emit('input', value);
          },
          onFocus(value){
            this.focused = true;
            this.$emit('focus', value);
          },
          onBlur(value){
            this.focused = false;
            this.$emit('blur', value);
          }
        }
      }
    </script>
    <style>
    
    </style>



    То как я использую это.
    <!-- NAME -->
                <fg-input
                  class="no-border input-lg"
                  addon-left-icon="now-ui-icons mdi mdi-textbox"
                  placeholder="Your name"
                  v-model="name"
                  type="text"
                >
                </fg-input>
    
                <!-- EMAIL -->
                <fg-input
                  class="no-border input-lg"
                  addon-left-icon="now-ui-icons mdi mdi-at"
                  placeholder="Email"
                  v-model="email"
                >
                </fg-input>
    
                <!-- PASSWORD -->
                <fg-input
                  class="no-border input-lg"
                  addon-left-icon="now-ui-icons mdi mdi-textbox-password"
                  placeholder="Password"
                  type="password"
                  v-model="password"
                >
                </fg-input>
    
                <!-- REPEAT PASSWORD -->
                <fg-input
                  class="no-border input-lg"
                  addon-left-icon="now-ui-icons mdi mdi-textbox-password"
                  placeholder="Repeat password"
                  type="password"
                  v-model="confirm_password"
                >
                </fg-input>


    Но сами формы как таковые я не использую.
    Я отправляю чистый JSON.

    Например вот так
    /**
           * Add new nodes
           * @param node
           */
          async addNodes(node) {
            this.showProgressDialog("Подождите...")
            this.new_node_dialog_visible = false
            let items = this.new_node_dialog_textarea.split("\n")
            let new_node = {
              owner_id: node.id,
              items
            }
            await this.$axios.$post(`${process.env.api}/categories.add`, new_node)
                .then(({code, msg}) => {
                   // что-то сообщаем пользователю о завершении операции
                })
            this.hideProgressDialog()
          }
  • Как отрефакторить работу с ошибками?

    IgorPI
    @IgorPI
    pro-dev,


    А как вы рефакторите формы? Создаете свой компонент форм?


    Не совсем понял вопрос.
  • Как в Symfony проверить на НЕ авторизованность пользователя?

    IgorPI
    @IgorPI
    Все это настраиваться в файрволе.

    Правильно я понимаю, что авторизация уже есть?

    Расскажите, как вы её реализовали.
  • Warning: A non-numeric value encountered как исправить?

    IgorPI
    @IgorPI
    Warning: A non-numeric value encountered


    В PHP есть два оператора для работы со строками (string). Первый - оператор конкатенации ('.'), который возвращает строку, представляющую собой соединение левого и правого аргумента. Второй - оператор присваивания с конкатенацией ('.='), который присоединяет правый аргумент к левому. Для получения более полной информации ознакомьтесь с разделом


    Или я что-то не понимаю?
  • Warning: A non-numeric value encountered как исправить?

    IgorPI
    @IgorPI
    Вот это что такое?
    + '&' + md5($Order_IDP) + '&' +
  • Как отрефакторить работу с ошибками?

    IgorPI
    @IgorPI
    Как вариант, axios оформить как плагин.

    Посмотрите как я это делаю.
    Из проекта над которым я сейчас работаю.

    /plugins/axios.js
    import {ACCESS_TOKEN} from "../store/mutation-types";
    
    
    const DO_NOT_SET_TOKEN_FOR = [
      /\/security\.checkAccessToken/,
      /\/security\.getAccessToken/,
    ]
    
    export default function ({ $axios, redirect, store }) {
      
      $axios.onRequest(config => {
        
        let not_set_token = false
        if (store.getters[ACCESS_TOKEN]) {
          for (let index in DO_NOT_SET_TOKEN_FOR) {
            if (DO_NOT_SET_TOKEN_FOR[index].test(config.url)) {
              not_set_token = true
              break
            }
          }
        }
        
        if (not_set_token === false) {
          console.log(config.headers.common.Authorization = `Bearer ${store.getters[ACCESS_TOKEN]}`)
        }
        
      })
      
      $axios.onResponse(({data}) => {
        if (data.code === 5) {
          redirect("/login")
        }
      })
    
      $axios.onError(error => {
        const code = parseInt(error.response && error.response.status)
        if (code === 400) {
          redirect('/400')
        }
      })
    }


    plugins: [
        '~plugins/axios',
        ...
      ]


    Для чего мне это нужно?

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

    Так же, для каких то общих задач, вы можете вынести ваш код в "миксины", это крайне удобно, плюсы очевидны.
  • Преобразователь js jquery кода для подключения в main.js vuejs?

    IgorPI
    @IgorPI
    jsprog, Сервис не будет делать то что вам нужно.
    Eslint настраивается индивидуально.

    Например использовать только двойные кавычки.

    У eslint есть специальный метод для автоматического форматирования.
  • Как хранить настройки регистрации?

    IgorPI
    @IgorPI
    pro-dev, Проведите аналогию.
    Что мы делаем, если к продукту привязанно несколько изображений?

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

    IgorPI
    @IgorPI
    pro-dev, конкретно у меня нет такой сущности.

    Если вы используете ORM очевидно, что вы что-то храните.

    Создайте сущьность с
    -------------------------------
    Дата начала регистрации
    Дата окончания регистрации
    Тип калькулятора стоимости
    Валюта
    Максимальное количество регистраций
    Показывать виджет списка регистраций
    Показывать количество участников
    и так далее.

    Установить отношения one to one например к сущьности User