Задать вопрос
  • Как доработать код?

    @artalexs Автор вопроса
    Почитав ответы, решил немного переделать структуру сервиса (пишу на Yii2) и сделать через DI контейнер. Структура такая - EditServiceInterface, который будет имплементирован в классы, (FastEdit и HideSubject), в которых будут реализованы соответсвующие методы; в конфиге:
    'container' => [
        'singletons' => [
            'fast-edit' => function () {
                return new \frontend\services\editing\FastEdit();
            },
            'hide' => function () {
                return new \frontend\services\editing\HideSubject();
            }
        ],
    ],


    И в нужном месте вызываю Yii::$container->get($type)
    Думаю такой вариант будет оптимален и без лишнего усложнения.
    Ответ написан
    Комментировать
  • Можно ли обновить путь к файлу стилей в шапке при помощи gulp?

    @artalexs Автор вопроса
    Если кому-то интересно, использовал этот плагин. Там хорошо описаны примеры использования и опции
    Ответ написан
    Комментировать
  • Как правильно обернуть ссылки внутри текста при помощи JS?

    @artalexs Автор вопроса
    Немного покопался и доработал функцию, если кому нужно, вот она
    function wrapLinks() {
        let selector = document.querySelectorAll('.article-comment-text.fl'),
            pattern = /(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z()]{1,6}\b([-a-zA-Z0-9()@:;%_\+.~#?&//=]*)/g,
            imgPattern =  /<img[^>]+src="?([^"\s]+)"?\s*(\/)?/g;
    
        selector.forEach(element => {
            let text = element.innerHTML;
            let needless = [];
            let urls = text.match(pattern);
            let links = element.querySelectorAll('a[href]');
    
            if (urls) {
                while (src = imgPattern.exec(text)) {
                    needless.push(src[1]);
                }
    
                if (links.length) {
                    links.forEach(elem => {
                        needless.push(elem.href);
                        needless.push(elem.innerHTML);
                    });
                }
    
                urls = urls.filter(el => {
                    return needless.indexOf(el) < 0;
                });
    
                urls.forEach(elem => {
                    if (elem.match(/^https?\:\/\//i)) {
                        text = text.replace(elem, '<a href="$&" target="_blank">$&</a>');
                    } else {
                        text = text.replace(elem, '<a href="//$&" target="_blank">$&</a>');
                    }
                });
            }
    
            element.innerHTML = text;
        });
    }
    Ответ написан
    Комментировать
  • Как настроить редиректы на nginx?

    @artalexs Автор вопроса
    Вопрос решился следующим образом, если интересно:
    if ($request_uri ~* "([^\/]{3,})\?" ){set  $last_path_component  $1;}
    if ($arg_lang){return 301 /$arg_lang/$last_path_component;}


    Получаю в первом условии последний компонент $request_uri и затем редирект
    Ответ написан
    Комментировать
  • Как представить ajax-запрос в нативном js?

    @artalexs Автор вопроса
    Вдруг кому интересно, вот решение
    let searchRequest = null,
          searchResult = document.querySelector('input[name="search"]');
    
    searchResult.addEventListener('keyup', function(e) {
        let cityName = $(this).val(),
            searchInput = $(this),
            formAction = $(this).parent().attr('action'),
            formMethod = $(this).parent().attr('method'),
            resultBox = $(this).parent().parent().find('.search-form-result'),
            searchForm = $('.search-form-result-city');
    
        if (searchForm.hasClass('selected-city') && (e.keyCode == 38 || e.keyCode == 40)) {
            return false;
        }
    
        if (searchRequest !== null) {
            searchRequest.abort();
        }
    
        searchRequest = new XMLHttpRequest();
        searchRequest.open(formMethod, formAction + "?cityName=" + cityName, true);
    
        searchRequest.onload = function() {
            if (this.status >= 200 && this.status < 400) {
                let data = this.response;
                searchInput.addClass('active');
                resultBox.find('.scrollbar-search-form-result').html(data);
                resultBox.show();
    
                if (e.keyCode === 13) {
                    let url = $.parseHTML(data)[1]['children'][0]['attributes'][0]['value'];
    
                    if (url) {
                        window.location = url;
                        return false;
                    }
                }
    
                if (!searchForm.hasClass('selected-city') && e.code == 'ArrowUp') {
                    let last = document.querySelector('.search-form-result-city:last-child');
                    last.className += ' selected-city';
                } 
                
                if (!searchForm.hasClass('selected-city') && e.code == 'ArrowDown') {
                    let first = document.querySelector('.search-form-result-city:first-child');
                    first.className += ' selected-city';
                }
            } else {
                resultBox.hide();
                searchInput.removeClass('active');
            }
        }
    
        searchRequest.send();
    });
    Ответ написан
    Комментировать
  • Правильное регулярное выражение для поиска габаритов?

    @artalexs Автор вопроса
    Друзья, вопрос решился. Ленивые контент-менеджеры проставили "x" между габаритами кириллицей, поэтому добавил проверку и кириллических символов в регулярку
    REGEXP '(^.*x.*x.*$)|(^.*\\*.*\\*.*$)|(^.*х.*х.*$)'
    Ответ написан
    Комментировать
  • Как оптимизировать данный код php + js?

    @artalexs Автор вопроса
    В js-файл вынес эту функцию
    function addList(arr, thisClass) {
        if (Array.isArray(arr) && arr.length) { 
            arr.forEach(function(value, index) {
                $('.' + thisClass + '-check-class').each(function(){
                    if ($(this).val() == value) {
                        $(this).addClass("active-color");
                        $(this).parent().addClass("active");
                    }
                });
            })
        }
    }


    В шаблоне оставил такой код
    <?php if (!empty($color_names)) { ?>
        let arr = <?= json_encode($color_names); ?>,
            thisClass = 'color';
        addList(arr, thisClass);
    <?php } ?>
    Ответ написан
    Комментировать
  • Как корректно отобразить сортировку таблицы?

    @artalexs Автор вопроса
    Вопрос решился установлением id к тегу tbody

    let tbody = $('#tbody-favorites');
    Ответ написан
    Комментировать