Задать вопрос
  • Douglas Crockford или Flanagan D для изучения JavaScript?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Все зависит от того, что вы вкладываете в понятие "разобраться". Я бы рекомендовал прочитать учебник Ильи Кантора, скорее всего, этого будет достаточно.
    Ответ написан
    5 комментариев
  • Арендовав vps/vps, можно разместить только ОДИН сайт?

    Это вполне нормальная практика.
    Только вам, скорее всего, лучше будет обратиться к профессионалам для настройки сервера.
    Ответ написан
  • Как с помощью php делать копию сайта?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Давайте рассуждать:
    • Сайт состоит из набора файлов и, возможно, БД
    • Значит, копирование сайта заключается в:
      1. копировании файлов
      2. копировании БД
      3. настройке веб-сервера



    С каким из этапов у вас сложности?
    Ответ написан
    8 комментариев
  • Как добавить картинку в input?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега CSS
    Комментировать
  • Почему PDO query не хочет выводить контент?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    скрипт выводит только строку title в таблице news

    SELECT title FROM news

    "Действительно, в чем же причина такого странного поведения?" - спросил Алексей Уколов с явным сарказмом в голосе.
    Ответ написан
    2 комментария
  • Как решить: Выдает ошибку при отправке почты Laravel send в цикле foreach?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Вы после каждого письма заставляете скрипт ждать 1 секунду. Если писем, например, 60 и таймаут в nginx минута, клиенту в итоге отдается ответ, что таймаут исчерпан. Это логично.
    Правильно - отправлять письма в фоновой задаче.
    Ответ написан
  • Автоматический счетчик? Разметка в цикле?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Алгоритм, на самом деле, довольно прост:
    <div class="container">
    <div class="row">
    <?php
    for($i = 0; $i < 10; $i++)
    {
    	echo '<div class="col-md-4 col-xs-12">Запись '.$i.'</div>';
    	
    	if ($i % 3 == 2)
    	{
    		echo '</div>';
    		echo '<div class="row">';
    	}
    }
    ?>
    </div>
    </div>

    У него есть один недостаток - в конце может получиться пустой .row, но этого можно избежать, добавив проверку на последнюю итерацию:
    $ar = range(0, 11);
    $size = count($ar) - 1;
    
    foreach($ar as $i => $v)
    {
    	echo '<div class="col-md-4 col-xs-12">Запись '.$v.'</div>';
    	
    	if ($v % 3 == 2 && $i < $size)
    	{
    		echo '</div>';
    		echo '<div class="row">';	
    	}
    }
    Ответ написан
    Комментировать
  • Как понять эту матрицу?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    You may also pass in a matrix while instantiating the PF.Grid class. It will initiate all the nodes in the grid with the same walkability indicated by the matrix. 0 for walkable while 1 for blocked.

    Как обычно, ответ на ваш вопрос находится в документации.

    Эта матрица, по сути - карта вашего поля, где 0 означает, что по клетке можно пройти, а 1 - нельзя.
    Если вам нужно получить информацию о проходимости какой-то конкретной клетки, то это сделать довольно легко:
    matrix [координата Y (номер строки)] [координата X (номер колонки)]
    Ответ написан
    3 комментария
  • Когда правильно использовать списки?

    Промышленного стандарта нет, как и ограничений на количество используемых списков.

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

    Пример с навигацией немного неудачен - это, вроде бы, и список пунктов меню, но для нее есть специальные семантические элементы (правда, ученые астрономы спорят и спорят о том, что все-таки использовать).

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

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    $string = '!rand 1-10'; // или $_POST['text'], как в вашем случае
    
    $matches = [];
    
    if (preg_match_all('/!rand (\d+)-(\d+)/', $string, $matches))
    {
        $min = (int)$matches[1][0];
        $max = (int)$matches[2][0];
    
        echo rand($min, $max);
    }
    Ответ написан
    Комментировать
  • Что не так в Javascript?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    document.querySelector("#nav-toggle")
    На странице нет такого элемента, поэтому querySelector возваращает null.
    Об этом в ошибке и написано - у null нет метода addEventListener.
    addEventListener вызывается только в одном месте - правда, разобраться совсем не сложно.

    А вообще, если уж используете jquery, так и используйте на полную катушку:
    if ($(window).width() > 991) {
        $("#nav-toggle").on("click", function() {
            $(this).toggleClass("active");
        });
    }
    Ответ написан
    3 комментария
  • Как изменить/унаследовать коллекцию в laravel?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    У коллекций есть методы transform и groupBy. Возможно, вам подойдет один из них.
    Ответ написан
    Комментировать
  • Почему так происходит?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Потому что в первом случае вы в $new_events присваиваете результат сравнения $order->get_new_events_count('comments') > 0 (это может быть true или false).

    echo true;  // выведет "1"
    echo false; // выведет "" (пустую строку).

    Поэтому, какое бы число ни возвращала функция get_new_events_count, если оно больше 0 - всегда будет выводиться цифра 1.

    Правильно делать так:
    <?php
    $new_events = $order->get_new_events_count('comments');
    ?>
    <?php if ($new_events > 0): ?>
        <?= $new_events; ?>
    <?php endif; ?>


    Можно было бы написать то же самое вот так:
    <? if (($new_events = $order->get_new_events_count('comments')) > 0): ?>
        <?= $new_events; ?>
    <? endif; ?>

    Но, сами видите, в таком коде легко допустить ошибку. Присвоение внутри оператора сравнения считается плохой практикой, помимо проблем с порядком выполнения нередки ситуации, когда разработчик пишет if ($foo = $bar), вместо if ($foo == $bar)

    А во втором в if выполняется нормальная проверка, но функция get_new_events_count вызывается дважды, вы, судя по всему, именно этого хотите избежать.
    Ответ написан
    Комментировать
  • Как получить id авторизированного пользователя?

    Auth::instance()->get_user()->id
    Я Кохану ни разу не видел, но нашел ответ на ваш вопрос за минуту и за один поисковый запрос.
    Ответ написан
    Комментировать
  • На сколько правильно использовать для composer-а git форки (fork) в своём проекте?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Если у вас такая дикая паранойя - пишите свои велосипеды.
    Форки вас не спасут. Форкать и потом все-равно сливать обновления из базового репозитория - бессмысленный труд, все-равно нужно код тщательно просматривать, анализировать все изменения. Ну так это и без форка можно сделать - перед установкой новой версии просто смотрите все коммиты.
    Ответ написан
    Комментировать
  • Как правильно изменить метод в библиотеке?

    Самый разумный вариант в плане дальнейшей поддержки - форкнуть библиотеку и добавить в зависимости свой форк. Если это хотфикс какого-то бага, то можно и в основную репу его отправить и потом переключиться на нее обратно, когда его примут.
    Еще один (костыльный) вариант - скопировать нужный класс в отдельную папку, изменить его поведение, а потом написать скрипт, который после composer update и composer install будет заменять измененным файлом файл из библиотеки. Для этого можно использовать хуки (Спасибо D' Normalization за ссылку).
    Ответ написан
    Комментировать
  • Как можно улучшить код на JQuery?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Я же вам здесь очень подробно ответил.
    Принципы, которые там описаны, применяются одинаково хорошо и для ванильного js и для jquery.

    var classes = ['item-id', 'item-title', 'item-price', 'delete-btn'];
    
    $('#sf tr').each(function () {
        var $cell = $('<td>').append('<a class="add_item">Добавить в корзину</a>');
        
        $(this).append($cell);
    
        $(this).find('td').each(function (index, element) {
            $(element).addClass(classes[index]);
        });    
    });


    Или вот такой вариант, без итерации по строкам:
    var classes = ['item-id', 'item-title', 'item-price', 'delete-btn'],
        $rows = $('#sf tr').filter(':gt(0)'),
        $link = $('<a>').addClass('add_item').text('Добавить в корзину'),
        $cell = $('<td>').append($link),
        $cells;
    
    $rows.append($cell);
    
    $cells = $rows.find('td');
    
    $cells.each(function (index, cell) {
        $(cell).addClass(classes[index % classes.length]);
    });


    Интересные, кстати, получаются результаты сравнения скорости работы этих двух вариантов.
    Ответ написан
    9 комментариев
  • Как правильно организовать/хранить перечень features/bugs для git проекта?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    На Github/Bitbucket/Gitlab есть и wiki и issues.
    Если вам нужен отдельный баг-трекер, то их море - выбирайте по вкусу.
    Ответ написан
    Комментировать
  • Почему постоянно лезет undefined?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    На сколько я поля это фишка асинхронности !?
    Правильно поняли.

    Это получается нужно код выстраивать цепочкой из калбэков ?
    Необязательно. (для nodejs, понятно, своя специфика, но общие принципы такие же, естественно).
    Ответ написан
    Комментировать
  • Как выполнять функцию по завершении часто повторяющегося события, а не много раз подряд?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Дело в том, что за время вращения колеса мыши, событие mousewheel срабатывает много раз. Соотвественно и обработчик события срабатывает столько же раз.
    Чтобы этого избежать, нужно применить debounce обработчика, то есть сделать так, чтобы он выполнился один раз через n миллисекунд после его последнего вызова. Если с момента последнего вызова не прошло n миллисекунд, а обработчик был вызван еще раз, его выполнение откладывается еще на n миллисекунд.
    В данном случае, обработчик выполнится через 100 миллисекунд после того, как перестанут поступать события скролла (100 - это просто пример, реальное значение нужно подбирать исходя из ситуации):
    $(document).ready(function () {
        var owl = $(".sldr").owlCarousel().data('owlCarousel');
    
        $(window).on('mousewheel', debounce(function (event) {
            var direction = event.originalEvent.deltaY < 0 ? 'next' : 'prev';
            owl[direction]();
        }, 100));   
    });
    Код функции debounce
    function debounce(func, wait, immediate) {
        var timeout, args, context, timestamp, result;
    
        var later = function () {
            var last = new Date().getTime() - timestamp;
    
            if (last < wait && last >= 0) {
                timeout = setTimeout(later, wait - last);
            } else {
                timeout = null;
                if (!immediate) {
                    result = func.apply(context, args);
                    if (!timeout) context = args = null;
                }
            }
        };
    
        return function () {
            context = this;
            args = arguments;
            timestamp = new Date().getTime();
            var callNow = immediate && !timeout;
            if (!timeout) timeout = setTimeout(later, wait);
            if (callNow) {
                result = func.apply(context, args);
                context = args = null;
            }
    
            return result;
        };
    }

    Реализацию функции debounce я беззастенчиво позаимствовал из библиотеки underscore.
    Интерактивный пример
    Ответ написан
    Комментировать