Задать вопрос
  • Как решить синтаксическую ошибку Vue?

    @MikUrrey
    Если productProfileCreditInfo всегда объект, когда он определен, то обычно работает такое:
    {{productProfileCreditInfo? productProfileCreditInfo.balance : ""}}
    то есть при отсутствии свойства в объекте оно просто не выведется, и это не приведет к исключению.
    Ответ написан
    Комментировать
  • В чём здесь ошибка?

    @MikUrrey
    У вас key - объект. Вы его сначала как объект юзаете if (key.status..., а потом в строку вставляете `- ${key}...
    Может быть, ${key.key} ?
    Ответ написан
  • Как лучше всего организовать связь данных дочерних компонентов и родительского?

    @MikUrrey
    В родительском компоненте, дочерние компонент отдельных данных не имеют, данные, как часть родительсикх данных, например, какого-то поля booksList.

    Скорее в компоненте, родительском для каталога книг, а глубже спускать в виде пропсов.
    И как это должно выглядить в коде, чтобы данные оставались связанными?

    <template>
      <lib-category v-model="booksList"></lib-category>
    </template>
    <script>
    import libCategory from "./libCategory.vue"
    default export {
      //...
      components: {libCategory},
      data() {
        return {
          booksList: [],
        }
      }
      //...
    }
    </script>


    libCategory.vue
    <template>
      <div v-for="(category, i) in booksListInner" :key="'i' + i">
         <!-- тут какое-то оформление категории -->
         ...
         <!-- а тут перечисляем книги, в нее входящие -->
         <lib-book v-for="(book, k) in category.children" :key="'k' + k" v-model="book"></lib-book>
      </div>
    </template>
    <script>
    import libBook from "./libBook.vue"
    default export {
      //...
      props: ['value'],
      components: {libBook},
      data() {
        return {
          booksListInner: [],
        }
      },
      watch: {
        value: {
          handler (value) { //связанность снаружи внутрь
            this.booksListInner = value
          },
          immediate: true,
          deep: true, //необходимо для объекта с вложенностью
        },
        booksListInner: {
          handler (booksListInner) { //связанность изнутри наружу
            this.$emit("input", booksListInner)
          },
          deep: true, //необходимо для объекта с вложенностью
        }
      }
    }
    </script>

    libBook.vue аналогично.
    Не знаю всех особенностей вашего списка, исхожу из минимального понимания. В зависимости от структуры данных могут быть нюансы в реактивности при добавлении новых элементов.
    Ответ написан
    Комментировать
  • Возможно ли иметь на одном сервере Flask и PHP?

    @MikUrrey
    Лучше всего, пожалуй, для этого использовать Docker. Flask в одном контейнере, PHP - в другом, база данных - в третьем. Запустить все через Docker compose, и пусть общаются между собой по внутренней сети.
    Можно и прямо как есть, в одном пространстве, но тогда задолбитесь настраивать порты и веб-серверы.

    Хотя еще можно попробовать заставить Flask слушать какой-то специфический порт, скажем, 82, и тогда сайт, теоретически, сможет к нему стучаться через 127.0.0.1:82. Но на практике без тонкой настройки могут элементы окружения подраться между собой.
    Ответ написан
    4 комментария
  • Как отсортировать по цене через Javascript?

    @MikUrrey
    Не представляю, где вы этот код взяли, но часть элементов там вообще от балды.

    Во-первых, costButton, на который вяжется обработчик клика в конце, никак не определен.
    Очевидно, это кнопка сортировки, поэтому заменяем на document.querySelector('#cost-button')

    Во-вторых, const elementsContainer = document.querySelector('.elements__lis');.
    Похоже, list, а не lis - опечатка :)

    В-третьих, costArrow - это, похоже, должна быть картинка, показывающая направление сортировки.
    Её нет, значит, убираем costArrow, убираем аргумент arrow у sortCard и у нее же убираем строку toggleArrow(arrow); (можно так же и саму function toggleArrow выкинуть).

    Вуаля, все работает.

    const allElements = document.querySelectorAll('.elements__item');
    const allPrice = '.elements__item-title_cost';
    
    const elementsContainer = document.querySelector('.elements__list');
    
    //функция по сортировке
    function sortCard(elements, type) {
        let sortingObj = {};
        elements.forEach((element, index) => {
            const elementValue = parseInt(element.querySelector(type).textContent.replace('руб.', '').replace(/\s+/g, ''));
            sortingObj[elementValue] = {'element': element, 'index': index};
        });
            
            const keys = Object.keys(sortingObj);
        
            function numberSort(a, b) {
                a = parseInt(a);
                b = parseInt(b);
                if (a < b) return -1;
                if (a > b) return 1;
              }
            keys.sort(numberSort);
    
            keys.map(function(key, index){
                elementsContainer.insertAdjacentElement('beforeend', sortingObj[key]['element']);
              });
            
    }
    
    
    
    document.querySelector('#cost-button').addEventListener("click", function() {
        sortCard(allElements, allPrice);
    
    })
    Ответ написан
    2 комментария
  • Как сделать кастомный checkbox перед input[type="text"] через JS?

    @MikUrrey
    Если правильно понял вопрос, то
    .form-check-other {
        position: relative;
     }
     .form-check-other .form-check-label{
       position: absolute!important;
       left: 0;
     }

    https://jsfiddle.net/b2vdsk76/
    Ответ написан
  • Проблема в cors политике или нет?

    @MikUrrey
    > Тут проблема в cors политике?
    Посмотрите в Chrome Dev Tools / Network, там будет однозначный ответ.
    > И можно это как-нибудь обойти
    Если это CORS, то только созданием "зеркала" на своем собственном сервере.
    Ответ написан
    3 комментария
  • Есть песненные синтезаторы речи?

    @MikUrrey
    Берем это самое видео, извлекаем звуковую дорожку, загоняем в какой-нибудь популярный секвенсор (FL Studio, Ableton Live), там нарезаем на слова и тюним нотки автотюном. Некто Энджойкин на таком нехило хайпанул лет 10-15 назад.
    Ответ написан
    Комментировать
  • Как организовать подстраницы во vue?

    @MikUrrey
    По смыслу Register = SignUp. Следовательно, Register - это должен быть Auth, или подобное более общее название - так было бы понятнее, семантичнее.
    Далее, если Register у вас не несет сам по себе какой-то функциональной и смысловой нагрузки и применяется только как "обертка", то лучше его не упоминать в маршрутизации и использовать только как "обертку".
    SignIn / SignUp:
    <template>
      <component :is="'auth-layout'">
        <!-- ... Vue-разметка для SignIn или SignUp ... -->
      </component>
    </template>
    <script>
      import AuthLayout from "@/layouts/AuthLayout";
      export default {
       components: {
         AuthLayout
       }
        //... код для SignIn или SignUp
      }
    </script>

    AuthLayout:
    <template>
      <div class="auth">
        <slot><!-- здесь отобразятся странички SignIn и SignUp --></slot>
      </div>
    </template>

    Т. е. целесообразно будет создать папку layouts, куда будут помещаться подобные глобальные шаблоны.
    Сами SignIn и SignUp размещайте исходя из размеров проекта и карты маршрутов: если маршрут идет через общий префикс, (/auth/sign-up, /auth/sign-in), то можно их поместить в папку auth, а можно и не помещать, если планируется, скажем, не более десятка страниц.
    Ответ написан
  • Как открыть представление модуля Yii в браузере?

    @MikUrrey
    По умолчанию - /имя модуля (это папка, где он лежит)/имя контроллера (без Controller)/имя экшна (без action)
    Ответ написан
    Комментировать
  • Что плохого в статических функциях?

    @MikUrrey
    Статические блоки памяти (переменные, функции, методы, свойства) нужно использовать только тогда, когда вы понимаете, почему они у вас здесь и сейчас должны быть статическими.
    Статические методы ругают за то, что они вызываются без инициализации класса и, соответственно, не взаимодействуют с другими его членами, что идет вразрез и с самой идеей ООП, и с практическими подходами вроде SOLID.
    Часто статические методы применяются в составе хелперов, т. е. если класс используется как контейнер для методов (а, по сути, обычных функций), сгруппированных по смыслу, где не подразумевается создание объекта. Например,
    namespace app\helpers;
    
    class StringHelper
    {
    
       public static function truncate($string)
       {
           //...
       }
    
       public static function capitalize($string)
       {
           //...
       }
    }

    Но такой подход тоже ругают :) Хотя бы потому, что с приходом пространств имен в PHP группировать и изолировать таким образом функции уже не нужно.
    namespace app\helpers\string;
    
       function truncate($string)
       {
           //...
       }
    
       function capitalize($string)
       {
           //...
       }

    - теперь вместо
    \app\helpers\StringHelper::truncate($string);
    используем
    \app\helpers\string\truncate($string);
    суть не меняется, но мусорный бак с набором "всякой всячины" превратился в аккуратный чемоданчик инструментов)

    P. S.: как справедливо заметили коллеги по цеху, автозагрузки функций в PHP до сих пор нет. Поэтому такой подход остается "правильным" только теоретически, а на практике до сих пор используются "хэлперы"
    Ответ написан
  • Как снимают деньги с баланса при переходе на сайт?

    @MikUrrey
    Здравствуйте, с Праздником!
    Дело не в куках. Ваше соединение обрабатывается мобильным оператором, он списывает определенные суммы при переходах по определенным ссылкам.
    Если пройти по тем же ссылкам через кабельное соединение, они могут оказаться либо заблокированными, либо... бесплатными :)
    00-е годы, слава богу, закончились, но кое-кто с этим упорото не желает мириться.
    Ответ написан
    2 комментария
  • Как правильно организовать API?

    @MikUrrey
    Привет!
    Как правильно организовать нахождение классов с API в структуре проекта (MVC)? Они хранятся вместе с моделями? Или нужно создавать отдельную папку в папке APP (Или вне ее?)?

    Часто применяемая (но не единственно правильная!) схема:
    - /App
       | - /Models
       | | - Article.php
       | | - Category.php
       | - /Controllers
       | | - Articles.php
       | | - Categories.php
       | - /views
       | | - /articles
       | | | - articles_list.php 
       | | | - article_page.php 
       | | - /categories
       | | | - my_categories.php 
       | | | - categories_list.php 
       | | | - article_page.php

    App - соответственно название вашего приложения, MyFirstSobes ;)
    Имейте в виду, что структура не "железная" - могут создаваться папки при необходимости как в App, так и в других папках приложения.
    допускается делать методы внутри Модели\контроллера?

    И допускается, и приветствуется)
    Далее: если вы делаете REST API (сужу по упоминанию json_encode), имейте в виду, что это MVC без "V".
    Т. е. "представления" здесь не нужны, обычно контроллер выплевывает клиенту JSON без помощи шаблонов.

    Просто показать на собесе, что я умею пользоваться функцией json_encode()

    Ой-ой-ой, с таким подходом до собеса дело не дойдет, простите за прямоту)

    Коллеги верно пишут - штудируйте ООП, вникайте в паттерны проектирования, пилите личные проекты, изучайте фреймворки и структуру чужих проектов. Развивайтесь, в общем)
    Ответ написан
  • Как передать массив дат в javascript?

    @MikUrrey
    У вас происходит путаница со структурой из-за того, что вы пытаетесь создавать JSON "вручную".
    Смотрите, тут все просто: вам нужно создать подобный по структуре массив в РНР, а потом сконвертировать его в JSON штатными средствами.
    <?php
    $datejs    = [];
    //...
    $datejs[] = [$YY, $MM, $DD];
    //...
    echo json_encode($datejs);

    json_encode даст на выходе по сути валидный JS код, который можно потом присвоить переменной
    echo '<script type="text\javascript">';
    echo 'var disabled = ';
    echo json_encode($datejs);
    echo ';' . "\n"
    echo '</script>';

    или передать в ответ на AJAX-запрос.
    Ответ написан
  • Как подгружать текст без повторов на php?

    @MikUrrey
    Подойдет вариант с удалением?
    Файл называется index.php и размещается в папке skripti :
    <?php
    $files = glob('*.txt'); //получаем список имен файлов
    $idx = rand(0, sizeof($files)-1); //генерируем случайный номер в списке
    $file = $files[$idx]; //получаем по этому номеру имя файла
    echo file_get_contents($file); //выводим его содержимое
    unlink($file); //и удаляем.
    ?>

    Это простейший вариант с выводом в браузер без HTML-тегов и автоудалением.
    Если нужно в виде HTML-страницы или удаление не будет работать, дайте знать.
    Ответ написан
  • Как добавить класс к уже имеющемуся?

    @MikUrrey
    # Если кнопка "Yes" нажата
        if( isset( $_POST['btn_yes'] ))
        {
            //Здесь должно происходить что-то типа
            echo '<div class="vacancy remove">';
        } else {
            echo '<div class="vacancy">';
        }
    Ответ написан
  • Что лучше Null или пустая строка в ValueObject?

    @MikUrrey
    Вы получаете и обрабатываете GET-параметры, обычный GET-параметр - это строка.
    "По-правильному" -
    $this->fullname = $request->request->get('fullname', '');

    Создавать NullObject в данном случае - это излишество, PHP - один из немногих ЯП, где строка не является объектом. Сгодился бы и null, но это "не православно".
    Ответ написан
  • Как правильно записать функцию (jQuery) чтобы когда мы обновляем страницу значение cheked, подтягивало нужные данные?

    @MikUrrey
    Для начала нужно, чтобы ваш код ждал отрисовки страницы:
    jQuery(function($) { //так в jQuery создается обработчик события DOMReady
        //И уже после того, как страница полностью готова, выполняем код:
        //Получаем value текущей активной радиокнопки. В этом помогает псевдокласс :checked
        let radioValue = $('input[name="radio"]:checked').val();
        //делаем с ним что хотим
        //....
        //остальной код
        $('input[name="radio"]').click(function(){
            var target = $('#block-' + $(this).val());
        
            $('.block-text').not(target).hide(0);
            target.fadeIn();
        });
    });
    Ответ написан
    Комментировать
  • Как исправить исчезновение выпадающего меню при наведение?

    @MikUrrey
    Приветствую!
    Убрать
    .nav-head:hover ~ .nav-submenu {
      display: block
    }

    и вместо него прописать
    .nav-item:hover .nav-submenu {
      display: block
    }

    https://jsfiddle.net/puwkmv20/

    С таким селектором .nav-head:hover ~ .nav-submenu, когда вы уводите курсор на .nav-submenu, .nav-item больше не :hover, и поэтому .nav-submenu больше не display: block (скрывается).

    С .nav-item:hover .nav-submenu, уводя курсор на .nav-submenu, мы всё еще держим :hover на .nav-item, потому что .nav-submenu его потомок.
    Ответ написан
    Комментировать