• Как управлять состоянием множества диалоговых окон (Vue, Vuex, Element UI)?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Передавайте в мутацию вместо просто состояния диалога объект вида { имя_диалога: состояние }. Тогда при обновлении состояния диалогов не будет необходимости обращаться к ним поимённо:

    mutations: {
      dialogShow: (state, payload) => Object.assign(state.modals, payload),
    },

    В компоненте, вместо вычисляемого свойства modal, отвечающего за работу с одним диалогом, будет свойство modals, обеспечивающее получение состояния всех диалогов. А чтобы изменение состояния диалога по-прежнему выглядело как присваивание, воспользуемся Proxy, где будем перехватывать установку значений и вызывать мутацию:

    modals() {
      return new Proxy(this.$store.state.modals, {
        set: (target, prop, value) => {
          this.$store.commit('dialogShow', { [prop]: value });
          return true;
        },
      });
    },

    Соответственно, в шаблоне заменяем установку значения просто свойства на установку значения свойства объекта:

    <el-button @click="modals.dialogSignIn = true">sign in</el-button>
    
    <el-dialog :visible="modals.dialogSignIn" @close="modals.dialogSignIn = false">
      <span slot="footer" class="dialog-footer">
        <el-button @click="modals.dialogSignIn = false">Закрыть</el-button>
      </span>
    </el-dialog>

    Посмотреть живьём.
    Ответ написан
    1 комментарий
  • Блокировка DigitalOcean?

    @ynblpb_spb
    дятел php
    Тоже попал под блокировку в DO

    Выход простой
    Топаете в любого отечественного хостера, покупаете самую дешевую VDS с хорошим каналом и настраиваете reverse proxy на nginx приблизительно с таким конфигом:

    server {
            listen                  80;
            server_name             domain.ru;
            
            location / {
                    proxy_pass http://111.111.111.111:80;
                    proxy_connect_timeout                           60;
                    proxy_send_timeout                                      60;
                    proxy_read_timeout                                      60;
                    proxy_redirect                                          off;
                    proxy_buffer_size                                       4k;
                    proxy_buffers                                           4 32k;
                    proxy_busy_buffers_size                         64k;
                    proxy_temp_file_write_size                      10m;
                    proxy_set_header        Host                    $host;
                    proxy_set_header        X-Real-IP               $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }

    где 111.111.111.111 это IP адрес вашего дроплета в DO

    и для https сайтов

    server {
            listen                  443;
            ssl                     on;
            server_name             domain.ru;
            ssl_certificate      /etc/nginx/ssl/domain.ru.crt;
            ssl_certificate_key  /etc/nginx/ssl/domain.ru.key;
            ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers  "RC4:HIGH:!aNULL:!MD5:!kEDH";
    
            location / {
                    proxy_pass https://111.111.111:443;
                    proxy_connect_timeout                           60;
                    proxy_send_timeout                                      60;
                    proxy_read_timeout                                      60;
                    proxy_redirect                                          off;
                    proxy_buffer_size                                       4k;
                    proxy_buffers                                           4 32k;
                    proxy_busy_buffers_size                         64k;
                    proxy_temp_file_write_size                      10m;
                    proxy_set_header        Host                    $host;
                    proxy_set_header        X-Real-IP               $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    
    }


    такая вот у нас замечательная, страна, конечно...
    Ответ написан
    11 комментариев
  • Laravel 5.5 время работы и рендер hello world = ~ 500 мс?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    composer dumpautoload
    php artisan config:cache
    php artisan route:cache
    Ответ написан
    3 комментария
  • Какие HTML/JS/CSS фреймворки популярны для разработки мобильных приложений?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Взято отсюда
    -----------
    В целом: PhoneGap + includeHTML (+jquery)
    Плагины для PhoneGap: здесь
    Поддерживаемые платформы и возможности (таблица): здесь
    Ответ написан
    3 комментария
  • Какие HTML/JS/CSS фреймворки популярны для разработки мобильных приложений?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    angular и react - самые популярные
    у foundation foundation.zurb.com есть даже шаблоны для ангуляр apps
    Ответ написан
    Комментировать
  • Какие есть хорошие программы для проектирования структуры программ?

    @onlinekursi
    Сейчас начнут советовать X-Mind, Mindjet MindManager, freemind, ConceptDraw, Microsoft Visio, LibreOffice Draw, Dia...)
    Но может и правда есть специально под разработку программ?..
    Интересно..
    (глянь сюда, пока что ... - https://en.wikipedia.org/wiki/List_of_concept-_and... )
    Если что - вот кстати рисунок в Mindjet MindManager по Этой теме...))
    85abed00d6e24201baee4804cf6bc59b.png

    Рекомендую также присмотреться к sourceforge.net/projects/tuftsvue Visual Understanding Environment (VUE) . vue.tufts.edu
    Давно что-то подобное искал. А щас благодаря этой теме нашёл)
    Я чаще всего пользуюсь: X-Mind, реже Microsoft Visio, реже Explain1.5.0.0 , реже TheBrain, ещё реже Mindjet MindManager, реже ThinkBuzan iMindMap, реже Dia и LibreOffice Draw. Сейчас вот Visual Understanding Environment (VUE) нашел). Встанет на первое место), или на второе. Но это скорее для других целей.
    freemind вообще чего-то не пошёл.
    Ответ написан
    2 комментария
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

    * Кэш должен очищаться по двум условиям (не по одному из, а именно по двум):
    - Время.
    - Протухание по бизнес логике.
    Разрешается по только времени в безвыходных ситуациях, но тогда время - короткий период.
    - При расчете ключей кэша должна использоваться переменная из конфигурации приложения (на случай обновлений кэш сбрасывается кодом, а не флашем кэш-сервера). В случае использования множества серверов - это очень удобный и гибкий инструмент при диплое.

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

    Это далеко не полный список требований, очень много зависит от проекта в целом и от принципов, заложенных в нем. Для больших мредж реквестов 200 комментариев к коду - это ок. Дерзайте.

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Как вы живете с большим количеством открытых вкладок браузера?

    @Paranoich
    Custom Buttons для FF + кнопка вроде "Session bookmark".
    Кинул на панель кнопку или две (или 10), да распихал вкладки.

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

    @StonedShaman
    Шаман
    Firefox - группы вкладок. Что не сильно надо, естественно, ложу в закладки.
    Ответ написан
    Комментировать
  • Как вы живете с большим количеством открытых вкладок браузера?

    FAN2tom
    @FAN2tom
    Я пришёл с миром!
    Никогда не любил обилие вкладок. Пользуюсь плагином в Мозилле "Speed Dial":
    1. Создаю много тематических групп
    2. По мере надобности накидываю в группы ссылки
    3. Как ссылка не нужна - очищаю.

    Мой метод избавит Вас полностью от всех Ваших проблем:
    - не жрет память
    - не забывается - список перед глазами всегда
    - при необходимости будет открыто то, что будет применено в ближайшее время
    - всё всегда под рукой и перед глазами, а следовательно не потеряете и не отложите в совсем долгий ящик
    Ответ написан
    2 комментария
  • Как вы живете с большим количеством открытых вкладок браузера?

    blasheevich
    @blasheevich
    Firefox -Tab Mix Plus + ScrapBook
    Ответ написан
    Комментировать
  • Как настроить Bitrix для приёма уведомлений от платежной системы?

    Первый вариант. Считаю, что этот вариант самый правильный

    Самое простое - заменить подключение
    <?
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

    на
    <?
    require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");


    В этом случае - ядро будет подключено (соответственно, $APPLICATION будет доступен) , но html-лэйаут не будет выводиться.

    Второй вариант.
    Перед вызовом компонента сделать
    $APPLICATION->RestartBuffer();
    Это почти как ob_start(), только через Api битрикса.

    В обоих случаях подключать файл с футером не нужно.
    Ну и header('Content-Type: application/json'); вставить не помешает
    Ответ написан
    Комментировать
  • Почему Jetbrains phpStorm не видит файлы на FTP?

    @glilya Автор вопроса
    Проблему решил сам, достаточно выставить пассивный режим
    Ответ написан
    17 комментариев
  • Как изменить расположение элементов WooCommerce в WordPress?

    Punkie
    @Punkie
    В папке плагина woocommerce есть файл со всеми хуками - woocommerce_hooks.php . Находите в нем отрезок, который отвечает за нужный вам кусок шаблона (в вашем случае woocommerce_single_product_summary), смотрите вызовы add_action.
    У вас они будут как раз такие, как закоментировано в коде выше, то есть:
    @hooked woocommerce_template_single_title - 5
                 * @hooked woocommerce_template_single_price - 10
                 * @hooked woocommerce_template_single_excerpt - 20
                 * @hooked woocommerce_template_single_add_to_cart - 30
                 * @hooked woocommerce_template_single_meta - 40
                 * @hooked woocommerce_template_single_sharing - 50


    В данном случае числа - это последовательность (приоритет) активации action'ов.
    Теперь вам нужно в functions.php вашей темы деактивировать эти action'ы методом remove_action и выполнить их активацию в нужном вам порядке.
    Например, вам нужно, чтобы сначала выводилось название товара, затем краткое описание, затем цена и тд.
    Код будет примерно такой:
    *тут перечисляем все строки с методом remove_action:
    
    remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_title', 5);
    remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 10);
    ... и т.д.
    
    *Теперь вызываем те же действия по хуку woocommerce_single_product_summary, но в нужной нам последовательности:
    add_action('woocommerce_single_product_summary', 'woocommerce_template_single_title', 5);
    add_action('woocommerce_single_product_summary', 'woocommerce_template_single_excerpt', 10);
    add_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 15);
    ... и т.д.

    Числовой приоритет вызова обычно делают кратным 5 для того, чтобы можно было потом еще что нибудь впихнуть между вызовами. Например, захотите потом добавить вывод ключевых слов или уникального поля товара между названием и кратким описанием. Тогда приоритет вызова можно будет сделать 6-9 без необходимости заново перебирать весь массив вызова хука.

    Подробнее про понятия hook, action и filter читайте в официальном руководстве: Introduction to hooks: actions and filters
    Ответ написан
    7 комментариев