Задать вопрос
  • Не удается создать связь между таблицами. Что делать?

    @MikUrrey
    Связь не устанавливается - такие утверждения нужно конкретизировать)
    Наверное, выдает ошибку о том, что foreign key ссылается на несуществующие записи?
    В таком случае, нужно сначала все связуемые таблицы проверить JOIN'ами и найти потенциальные несоответствия, потом решить что с ними делать - либо удалить, либо создать недостающие записи.
    (Прошу прощения - ошибку на скрине не сразу заметил).
    Ответ написан
    4 комментария
  • Как сделать форматирование текста в js?

    @MikUrrey
    replace заменит только первое совпадение. Попробуйте заменить его на replaceAll, думаю, получится то, что вам нужно.
    Ответ написан
    1 комментарий
  • Выводится только последний элемент массива в цикле foreach. Что делать?

    @MikUrrey
    Навскидку - вы данние пишете в массив $dec, а выводить их пытаетесь из $val:
    $dec = json_decode($f, true);
    
            // for($val = 0; $val < count($dec); $val++) {
            //     echo "<tr>";
            //     echo "<td>".$val["name"]."</td>";
            //     echo "<td>".$val["number"]."</td>";
            //     echo "<td>".$val["date"]."</td>";
            //     echo "<td>".$val["time"]."</td>";
            //     echo "</tr>";       
            // }

    и формат данных в JSON у вас смешанный, многомерный, а вы его как плоский список перебирали.

    Наиболее универсально - применить рекурсию:
    <?php
    function printDec($dec) {
        foreach ($dec as $k => $item) {
            if ($k === "0" || $k === 0) {
                printDec($item);
            } else if ($k === "name") {
                echo "<tr>";
                echo "<td>".$item."</td>";
            } else if ($k === "time") {
                echo "<td>".$item."</td>";
                echo "</tr>\n";
            } else {
                echo "<td>".$item."</td>";
            }
        }
    }
    $f = file_get_contents("data.json");
    $dec = json_decode($f, true);
    printDec($dec);
    Ответ написан
    6 комментариев
  • Почему не получается задать значение значение по умолчанию не существующему свойству объекта?

    @MikUrrey
    Похоже, это из-за того, что вы не передаете defaultV третьим аргументом здесь:
    return this.getValue(objectValues[valueArray[0]], valueArray.slice(1).join('.'));
    Ответ написан
    Комментировать
  • Везде ли нужно проверять на существование элемента в массиве?

    @MikUrrey
    Привет!
    Если массив является частью входных данных, будь то user input, или какой-то файл, или БД, то всё верно - проверка нужна (даже обязательна). А вот в таком случае и подобных точно нет:
    $this->someParam = [
         'a' => 1,
         'b' => 2,
    ];
    //...
    //...
    //...
    $a = $this->someParam['a'] ?? '';

    Такая проверка уже сродни
    if (TRUE !== FALSE) {
         //...
    }
    Ответ написан
    2 комментария
  • Как запретить срабатывание POST метода?

    @MikUrrey
    В upload.php в самом конце сделайте редирект на эту же страницу:
    //определяем протокол - HTTP/HTTPS
    $proto = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')? 'https': 'http';
    //шлем заголовок для "обновления" страницы без пересылки формы.
    //все последующие "ручные" обновления страницы будут происходить без отправки формы
    header('Location: ' . $proto . '://' . $_SERVER['HTTP_HOST'] . '/' . $_SERVER['REQUEST_URI']);
    exit;

    Вообще, это "best practice", перебрасывать редиректом после обработки формы, если не было ошибок при сохранении формы.
    Exit в конце прерывает выполнение остального кода.
    Ответ написан
    3 комментария
  • Группирование массива php по id?

    @MikUrrey
    Для этого дополните массив еще одним уровнем, индексом менеджера:
    foreach ($history_tables as $history_table) {
        //если данного менеджера еще нет в массиве, создаем его
        $manager_id = $history_table['manager_id'];
        if (!isset($data['history_tables'][$manager_id])) {
          $data['history_tables'][$manager_id] = array();
        }
        $data['history_tables'][$manager_id][] = array(
            'date'      => $history_table['date'],
            'text'      => $history_table['text'],
            'manager'      => $history_table['manager'],
            'manager_id'      => $history_table['manager_id'],
            'status'      => $history_table['status']
          );
    }
    Ответ написан
    3 комментария
  • Товар, умножаем цену на кол-во товара и выводим цену, как сделать?

    @MikUrrey
    Вы сделали так:
    $('.minus').click(function() { ...
    Это вешает клик на все кнопки сразу, и внутри функции будет неудобно разбирать, к какому товару относится кнопка.
    Лучше сделайте селектор для товаров, и перебирайте их циклом, каждому вешая функцию. Вот для примера:
    <div data-product="1920"> ...
    <!-- лучше так вместо id="1920" -->

    $('div[data-product]').each(function() { //собираем все контейнеры товаров и прогоняем по ним цикл
      let $productNode = $(this); //фиксируем jQ-объект товара
      let productId = $productNode.data('product'); //получаем ID товара
      $productNode.find('.plus').on('click', function() {
        //здесь мы уже знаем ID товара (productId) и можем манипулировать
        //элементами внутри контейнера товара с помощью $productNode.find('селектор')
      });
      $productNode.find('.minus').on('click', function() {
        
      });
    });


    Так же в разметке есть ошибка:
    <b id="sum">
    
    <input type="hidden" id="price">
    
    <input type="hidden" id="priceakcia">

    повторяются многократно, id должен быть уникальным в рамках страницы.
    Лучше дайте им, например, атрибут data-role="...", а потом обращайтесь к ним в скрипте через него:
    let price = $productNode.find('input[data-role="price"]').val();
    let priceakcia = $productNode.find('input[data-role="priceakcia"]').val();
    //так вычисляется отпускная цена: если есть акционная, то она становится отпускной
    let sellingPrice = priceakcia? priceakcia: price;
    Ответ написан
  • Правильная url ссылка?

    @MikUrrey
    Думаю, ошибка в том, что вы используете current внутри to.
    Попробуйте какой-нибудь из этих примеров, и будет нужный результат:
    Url::current(['lang_admin' => 'ru']);
    Url::to(['lang_admin' => 'ru']);
    Ответ написан
    Комментировать
  • Инсталляции сайта на Javascript?

    @MikUrrey
    Там JS не нужен по большому счету. Минимум CSS, старый добрый HTML, и PHP, который составляет 95% функциональности подобной подсистемы.
    Конфигурация отправляется из полей POST-запросами и сохраняется обычно в файлы, реже в БД. Почему реже? Потому, что системы настройки обычно настраивают так же и сам доступ к БД.
    Так же из РНР обычно и генерируются input-поля с уже заполненными value.
    Чтобы с непривычки не мучаться с импортами-экспортами-инклюдами конфигурационных файлов, рекомендую использовать JSON - это дёшево и сердито:
    $config = json_decode(file_get_contents(__DIR__ . '/.config'), true); //читаем конфиги
    //...
    file_put_contents(json_encode($config), __DIR__ . '/.config'); //пишем конфиги

    В данном примере .config - с точкой вначале, чтобы конфиги нельзя было открыть и прочитать из браузера - ведь это конфиденциальные данные. `__DIR__` - это магическая константа, путь к папке скрипта, в котором она использована.
    Сохранять конфиги можно как угодно иначе, главное, чтобы они были недоступны из web.
    Так же вам нужно предусмотреть элементарную безопасность: фильтрацию данных, полученных от пользователя.
    Резюмируя, чтобы написать минимальный конфигуратор на РНР, нужно проштудировать информацию о:
    json_encode / json_decode
    file_get_contents / file_put_contents
    htmlspecialchars / strip_tags / preg_match / filter_input

    HTML и CSS, как я понимаю, вы уже и так успешно пользуетесь.
    Ответ написан
    2 комментария
  • Как обратиться такому объекту Object ( [name:protected] => subject)?

    @MikUrrey
    values:
    /**
         * Get all values
         *
         * @return array
         */
         public function get()

    https://github.com/Webklex/php-imap/blob/master/sr...

    name:
    /**
         * Get the attribute name
         *
         * @return string
         */
        public function getName()

    https://github.com/Webklex/php-imap/blob/master/sr...

    оно ведь?
    Ответ написан
    Комментировать
  • Почему выдает ошибку 404 при переходе в router vue?

    @MikUrrey
    Привет!
    Советую обратить внимание на вторую строку children, здесь присутствуют пропсы sub и formName, но маршруту нужно дать разрешение на их использование:
    { path: '/:sub/:formName', component: () => import('pages/Main.vue'), props: true }
    Ответ написан
    Комментировать
  • Как нативно поменять элемент js по нажатию кнопки?

    @MikUrrey
    Используйте лучше
    Element.innerText = 'volume_off'
    и
    Element.classList.toggle('icon-on')
    Element.classList.toggle('icon-off')
    Ответ написан
    Комментировать
  • Bootstrap 4 Как сделать кнопку из png картинки?

    @MikUrrey
    Самый простой способ - убрать у кнопки класс btn-primary.
    Ответ написан
    1 комментарий
  • Как подключить несколько одинаковых скриптов для управления разными селекторами?

    @MikUrrey
    Передайте селектор как аргумент в самовызывающуюся функцию:
    (function (w, selector) {
        w.addEventListener('DOMContentLoaded', () => {
          function start() {
            w.somename(selector);
          }
          start();
        })
      })(window, "container_N");

    Если у вас не фреймы, вам точно не нужно подключать файл несколько раз.
    Ответ написан
  • Как удалить классы в дочерних элементов у всех?

    @MikUrrey
    const elements = document.querySelectorAll('родительский блок *'); //получаем ВСЕХ потомков
    Array.prototype.forEach.call(elements, element => { //перебираем полученный список
      element.classList.remove( 'доп.класс', 'другой доп.класс', 'еще доп.класс' ); //удаляем ненужные классы
    } ); //element.classList.remove поддерживает любое количество аргументов
    Ответ написан
  • Как вызвать метод, который принимает event, когда props меняется?

    @MikUrrey
    Сделайте лучше вместо передачи event'а:
    <input ref="name" @blur="onBlur" ...

    ...
      onBlur() {
        const target = this.$refs.name
        ...
      }
    ...

    и тогда всё должно заработать
    Ответ написан
    Комментировать
  • Как в REST API на Yii2 правильно настроить CORS?

    @MikUrrey Автор вопроса
    По сложившейся здесь традиции, сам же на свой вопрос и отвечаю.
    Чтобы CORS отработал нормально, нужно
    1) corsFilter в behaviors должен быть на самом верху;
    2) убедитесь что в нем разрешено всё, что вам необходимо, в т. ч. заголовки, которые вы шлёте серверу;
    3) в actions нужно добавить:
    'options' => [
      'class' => \yii\rest\OptionsAction::class,
    ],

    4) checkAccess в экшне options не должен фигурировать, этот эндпойнт должен быть доступен всегда;
    5) если в конфигурации задается специальный маршрут посредством UrlRule с verb'ами, то в verb нужно обязательно добавить OPTIONS.
    Ответ написан
    Комментировать
  • Как обработать форму для шаблона страницы (layouts/main.php)?

    @MikUrrey
    Если форма везде работает одинаково и не отправляет информацию, зависящую от текущего контента страницы, то лучше не упоминать ее в контроллерах.
    А отправку данных выполнять либо (элегантно) AJAXом, либо (хардкорно) внутри формы передавать текущий URL и возвращать на него же после обработки формы. То есть, контроллер для неё написать всё же надо, но один и независимый.
    Ответ написан
    Комментировать
  • Как сделать array вывод js split?

    @MikUrrey
    //...начиная со строки с $.each:
    
    $.each( files_path, function( key, val ){ 
      html += "https://" + val.replace(/^\/home\/user\/www\//, "") +'<br>'; 
    } )
    //... остальное убираем и далее:
    $('.ajax-respond').html( html );

    то есть, чтобы обработка прошла по всем элементам, все преобразования помещаем в цикл.
    На счет регулярки: если "/home/user/www/" всегда ожидается только в начале, то она справедлива. Если эта подстрока может быть в середине строки, тогда замените ее на такую:
    /.*\/home\/user\/www\//
    Ответ написан
    1 комментарий