• Есть ли смысл делать CRUD на yii2 без ajax?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Для ответа на этот вопрос нужно понимать несколько нюансов:

    1. Это 2012 год. За 8 лет в программировании много что поменялось. Я считаю, что нужно обучаться каждые пол года и узнавать новые технологии, а так же их применять в своих проектах.

    2. В последнее время от jQuery активно отказываются. На смену им приходят frontend Фреймворки: Vue, Angular, React и др.

    В 2020 году, чаще всего, проект разделяется на два приложения: frontend (UI) и backend (API).

    Для frontend выбирают фреймворк на js, а для backend выбирают, чаще всего, фреймворк на php.

    frontend взаимодействует с backend через API.

    3. Гибрид никто не отменял. Есть приложения, в которых совмещен backend и frontend В одном приложении. В таких проектах js стараются использовать минимально.

    Поюзайте этот сайт вопросов и вы сами увидите, что не так много функций реализованных на «ajax». Если таких разделов станет много, то вам следует использовать разделение на 2 приложения из пункта 2. В CRUD приложении тем более AJAX будет минимальным.

    Моё мнение:
    1. Если вы не знаете хорошо js, то используйте его минимально в своих проектах, а тем более если это jQuery.
    2. CRUD используйте без AJAX. Возможно будет так, что на одной странице будет несколько форм. Не пугайтесь этого. Просто подумайте о рефакторинге.
    3. “AJAX” используйте в тех случаях, когда действительно нужны действия без перезагрузки страницы: лайки, добавление товара в корзину, добавление в закладки и так далее. Такие действия должны быть оправданы и разумны.

    Подумайте, как можно реализовать это одним файлом на все CRUD действия. Например, я реализовал фильтрацию без перезагрузки страницы на всех index страницах. Но нужно хорошо знать как устроен Фреймворк и уметь пользоваться этим.
    Ответ написан
    Комментировать
  • Как в Yii2 после добавления данных очистить форму и вывести flash сообщение на той же странице без повторной отправки?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Если вам не нужно делать редирект на другую страницу — можно перезагрузить страницу используя $this->refresh(). Страница перезагрузится, форма очистится, flash сообщения будут отображены. После чего можно снова заполнять форму новыми данными.

    Из вашего кода пропадут лишние строки:

    public function actionAdd()
    {
        $model = new News();
    
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            Yii::$app->session->setFlash('success', 'Удача: Новость добавлена!');
            return $this->refresh();
        } else {
            Yii::$app->session->setFlash('error', 'Ошибка: Не удалось добавить новость!');
        }
    
        return $this->render('add', compact('model'));
    }
    Ответ написан
    Комментировать
  • Как в Yii2 после добавления данных очистить форму и вывести flash сообщение на той же странице без повторной отправки?

    @Nc_Soft
    Нужно сделать редирект после записи формы, чтобы скинуть post. А в сессии останется flash сообщение.
    Ответ написан
    Комментировать
  • Yii2 как использовать html BEM блоки?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Так же как и не в Yii! Yii тут причем? Это это относится к Frontend, а не Backend разработке! Используйте Node.js и NPM
    Ответ написан
    Комментировать
  • Как узнать начертание шрифта?

    potapchino
    @potapchino
    100 – Thin || Hairline
    200 – Extra Light || Ultra Light || Thin
    300 – Light
    400 – Normal || Regular
    500 – Medium
    600 – Semi Bold || Demi Bold
    700 – Bold
    800 – Extra Bold || Ultra Bold || Heavy
    900 – Black || Heavy
    Ответ написан
    Комментировать
  • Как поставить метку в google maps?

    @DimaIs
    https://developers.google.com/maps/documentation/j...
    Тут все подробно описано
    Ответ написан
    Комментировать
  • Плагин для анимированных треугольников?

    RAX7
    @RAX7
    Такое и без всяких плагинов можно сделать
    Ответ написан
    1 комментарий
  • Снижает ли производительность множество addEventListner?

    @abberati
    frontend-разработчик
    Если при уничтожении модулей вы отписываетесь, то всё в порядке. Памяти хватит надолго. А вот если не отписываться — память будет «течь».
    Ответ написан
    Комментировать
  • Снижает ли производительность множество addEventListner?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если в большинстве случаев стоит не очень сложная проверка, то нагрузки не будет. Точнее, она будет незначительной. Собственно, такая проверка и нужна, чтобы не было нагрузки от (холостой) работы модуля (к примеру, перерисовывания, что и так нормально нарисовано).

    Если у вас в каждом модуле одним и те же проверки, и они довольно сложные (например, поиск, сортировка), то стоит задуматься о смене архитектуры.

    Но всё равно, конечное решение (ответ на вопрос) зависит от текущих замеров производительности. Даже если убрав все модули, вы снизите нагрузку в 1000 раз, то есть время работы всех этих обработчиков упадёт с 1 мс до 1 нс, то оно того не стоит. А вот если время лага уменьшится всего лишь в 10 раз, то есть с 1 с до 100 мс, то это уже полезно.

    Попробуйте воспользоваться функцией:
    performance.now()
    Для измерения производительности. Можно делать замеры до и после работы кода, которого вы считаете достаточно тяжелым, и потом считать разницу.
    Ответ написан
    1 комментарий
  • Как во вложенном объекте заменить значения?

    @dimoff66
    Кратко о себе: Я есть
    Универсальный merge без привязки к конкретному имени реквизита с возможностью задания глубины посвойственного обновления

    const deepMerge = (a, b, howDeep = 1000) => {
       a = {...a}
       Object.entries(b).forEach(([key, value]) => {
          if (typeof value !== 'object' || howDeep < 1) {
             a[key] = value    
          } else {
             a[key] = deepMerge(a[key], value, howDeep - 1)
          }
       })
       
       return a;
    } 
    
    const c = deepMerge(a, b)
    console.log(c)
    Ответ написан
    1 комментарий
  • Phpstorm и документация кода

    @Trobing
    Для просмотра документации нужно нажать Ctrl+Q на функции.
    Ответ написан
    Комментировать
  • Phpstorm и документация кода

    resurtm
    @resurtm
    В докблоке со второй по пятую строчку у вас отсутствуют пробелы вначале. Т.е. должно быть:
    /**
     * Моя функция
     * @param int $user_id ID-пользователя
     * @return bool 
     */
    

    У вас:
    /**
    * Моя функция
    * @param int $user_id ID-пользователя
    * @return bool 
    */
    

    Попробуйте.
    Ответ написан
    Комментировать
  • Как сделать такой комментарий в phpstorm?

    Decadal
    @Decadal
    введите следующее:

    /**

    и клавишу Enter

    перед функцией будет сгенерирована документация для функции по ее сигнатуре
    для переменной - документация к переменной с ее типом
    не сможет определить, для чего комментарий - сгенерит структуру вида
    /**
    *
    */
    Ответ написан
    Комментировать
  • Как узнать номер элемента в DOM?

    Stalker_RED
    @Stalker_RED
    function getElementIndex(elem) {
        elem = elem.tagName ? elem : document.querySelector(elem) // можно добавить еще проверок
        return [].indexOf.call(elem.parentNode.children, elem)
    }


    Демо jsfiddle.net/ywfoheah
    Ответ написан
    2 комментария
  • Как такое в less сделать?

    SagePtr
    @SagePtr
    Еда - это святое
    .fit-content(@attribute) {
      @{attribute}: -moz-fit-content;
      @{attribute}: -webkit-fit-content;
      @{attribute}: fit-content;
    }
    Ответ написан
    Комментировать
  • Как в git удалить 2 последних коммита из репозитория?

    bitniks
    @bitniks
    Go/PHP/Symfony developer
    Выполнить
    git rebase -i <hash>^
    где <hash> это хеш коммита, с которого удаляем
    Изменить в редакторе pick на drop у коммитов, которые требуется удалить и сохранить изменения. Далее сделать git push --force этой ветки в репозиторий
    Ответ написан
    Комментировать
  • Случайное значение в grid-template-columns?

    rockfeeler
    @rockfeeler
    Фронтендер, дизайнер, верстальщик-перфекционист
    Можно сочетать условия, но именно по max-content не получится, будет занимать все доступное пространство. Необходимо все же указать максимально допустимую ширину:

    Ответ написан
    1 комментарий
  • Можно ли сделать лаконичнее?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    Сделать директиву с селектором use[href], но зачем? Экономия на спичках
    Ответ написан
    1 комментарий
  • Возможно ли передать данные из одного файла в другой файл через JavaScript?

    @2bllk
    Я не буду спрашивать, зачем вам это. Просто расскажу, как я придумал это сделать.
    Файл "a.html":
    <html>
    <head>
    	<title>Document</title>
    </head>
    <body>
    	<form action="b.html" method="GET">
    		<input type="text" name="variable1">
    		<input type="text" name="variable2">
    		<input type="submit">
    	</form>
    </body>
    </html>

    В форме указываем, что будет использоваться метод GET (почитайте в интернетах, если не знаете, что это такое и как это работает). Методом GET значения передаются прямиком в ссылке (ссылка вида "example.com?var1=Hello&var2=World", где жирным выделено название переменной, а курсивом — ее значение). НО! GET имеет ограничение в длине передаваемых данных (об этом тоже почитайте в интернетах), имейте это в виду.
    У элементов input есть параметр name. Он содержит имя переменной, отправляемой в GET запросе, а ее значение автоматически берется из того, что вы ввели в input.
    Так-с, при отправке формы у нас откроется страница b.html
    <html>
    <head>
    	<title>Document</title>
    </head>
    <body>
    	<script type="text/javascript">
    		function getGETParameters(paramStr){
    			return Object.fromEntries(paramStr.split('&').map(e => decodeURI(e).split('=')));
    		}
    		console.log(getGETParameters(window.location.search.substr(1)));
    	</script>
    </body>
    </html>

    Когда она откроется, посмотрите на строку поиска/адреса, там вы увидите, как примерно выглядит GET-запрос. Потом загляните в консоль и увидите, что там отображается массив (или объект). Я думаю, вы поймете, для чего он нужен.

    Немного изменим файл b.html
    <html>
    <head>
      <title>Document</title>
    </head>
    <body>
      <script type="text/javascript">
        function getGETParameters(paramStr){
          return Object.fromEntries(paramStr.split('&').map(e => decodeURI(e).split('=')));
        }
        let variables = getGETParameters(window.location.search.substr(1));
        console.log(variables["variable1"]); // эта строка выведет в консоль то, что Вы вводили в первый input
      </script>
    </body>
    </html>
    Ответ написан
    4 комментария