• Как в js/jquery сравнить строки "дата время" на больше - меньше?

    dluhhbiu
    @dluhhbiu
    var date1 = new Date();
    var date2 = new Date('30.10.2015 19:53');


    И сравниваете
    date1 > date2
    Ответ написан
    1 комментарий
  • Как сделать скриншот страницы полностью?

    rdifb0
    @rdifb0
    Программист, реалист
    В Firefox Shift-F2 и вводим screenshot file.png --fullpage
    Ответ написан
    11 комментариев
  • Как сейчас актуально делать свой почтовый сервер, чтобы доходило до gmail/yandex/mail?

    @CHolfield
    Чтобы доходили письма, нужно:
    1. Настроить DNS. MX- запись, А-запись хоста, в обратной зоне соответствующая PTR-запись.
    2. Купить сертификат для SMTP и прикрутить его к серваку. Имя субъекта в серте должно совпадать с именем хоста DNS.
    3. Пройтись по публичным блек-листам и удалить свой айпишник оттуда, если он там был.
    Ответ написан
  • Как установить composer и как им пользоваться под windows?

    K-2
    @K-2 Автор вопроса
    Постараюсь подвести первые итоги.

    Composer можно пользоваться в 2х вариантах.
    Глобально(установив программу) и Локально(ничего не устонавливая)
    И тот и тот способы работают только из командной строки. (Пуск->Стандартные->Командная строка)
    Для того чтобы что-то скопировать в командную строку ctrl+v не работает! Пользуемся правой кнопкой мышки->вставить

    ЛОКАЛЬНО пошагово
    1. Создаем папку, в которой будет проект на компьютере.
    2. В Командной строке пишем команду cd и путь к папке с проектом:
    cd C:\xampp\htdocs\test_composer
    3. Т.к. программа не установлена, нужен загрузочный файл(мини-программа composer), для его загрузки в Командной строке пишем команду:
    php -r "readfile('https://getcomposer.org/installer');" | php
    теперь в директории появился загрузочный файл
    4. Запускаем команду загрузки фреймворка(у каждого свой), в Командной строке пишем:
    php composer.phar require silex/silex ~1.1 (для фреймворка silex)

    В Командной строке, команды запускаются по разному при локальной и глобальной загрузках:
    Локально: php composer.phar require silex/silex ~1.1
    Глобально: composer require silex/silex ~1.1
    php composer.phar меняется на composer
    Еще при локальной загрузке нужно каждый раз закачивать установочный файл(это не сложно и описано в шаге 3):php -r "readfile('https://getcomposer.org/installer');" | php
    При глобальной загрузке этот файл не нужен.

    ГЛОБАЛЬНО пошагово
    1. Скачиваем программу composer https://getcomposer.org/Composer-Setup.exe
    2. Запускаем. При запросе файла php указываем путь к локальному хостингу -> папку php
    3. Теперь делаем все тоже самое что и при локальной загрузке, но пропускаем шаг 3, и изменяем запросы из Командной строки(вместо php composer.phar пишем composer). Пример:
    было так: php composer.phar require silex/silex ~1.1
    стало так: composer require silex/silex ~1.1

    О других отличиях между глобальной и локальной загрузками пока-что тут ничего не ответили!
    Ответ написан
    1 комментарий
  • На базе чего можно грамотно организовать совместную разработку для маленькой команды?

    AutomationD
    @AutomationD
    Если позволите, как показывает моя практика - на этом этапе вам главное не подменить понятия и не наделить инструменты свойствами им не свойственными. Почитайте, очень полезно - создавалось годами и я полностью с этим согласен.
    (Я работаю в штатах, в команде разработчиков в 20 человек. Agile очень эффективен)

    Лично мне нравится такой вариант:
    -Создавайте закрытый проект на github.
    -В pivotal tracker/trello создавайте спринты и дайте разрабам самим планировать время (под вашим чутким контролем, конечно)
    -Делайте утренний скрам по Skype/Google Hangout (последнее мне нравится больше - вижу всех сразу), а также другие Agile созвоны (ретроспективы, планирование спринтов)
    -В чем будут писать люди (IDE) - это их дело, главное чтобы они умели пользоваться github, а точнее ветками, форками и пул реквестами. Github for Windows/Mac вполне сносная софтина, и красивая к тому же (чего нет у bitbucket).

    Вообще, если честно, подойдет и google spreadsheet + github :)

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

    Желаю удачи!
    Ответ написан
    1 комментарий
  • Разработка сайта с использованием git. Как работать правильно?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Чтобы решить проблемы, которые у вас существуют, нужно сделать 3 вещи, но планомерно и плавно.
    1. Обучите программистов такой вещи, как git. Подождите с недельку. Затем просто прогоните их по циклу - откати эти изменения. Верните изменения. Ну раз 5, с дедлайном вчера. Все, кто не будет пользоваться git, будут мучаться часами и днями. Напомните им, как легко это делается с помощью git. Повторите испытание через некоторое время. Поставьте ультиматум: git или идите искать новую работу. Кстати, у каждого человека должен быть свой отдельный аккаунт.
    2. Держите репозитарий для проекта целиком. Сделайте отдельные папки для исходников верстки, для собранной верстки и самого сайта. Верстальщики работают со своими папками. Собирают верстку и коммятят собранную верстку в отдельную папку. Программисты через историю коммитов смогут отследить изменения и внести их назад в разработанные компоненты.
    3. Реализуйте автоматизированное развертывание проекта и запретите редактирование файлов через FTP/минуя git.

    Ну а в целом ваша проблема - низкая квалификация кадров. Решается просмотром ютуба и обучением разработчиков. Если кто-то не хочет учиться, немного снижается ставка, а деньги отдаются тем, кто учится. Даже 500 рублей будут отличным мотиватором.
    Ответ написан
    9 комментариев
  • Объясните плиз, что тут eval(base64_decode())?

    @d-stream
    Готовые решения - не подаю, но...
    Если вкратце - то "удаление всего". На мой взгляд стоит побить разработчика, желательно ногами.
    Ответ написан
    2 комментария
  • Для чего нужны Генераторы (yield) в php?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    php.net/manual/ru/language.generators.syntax.php
    yield - возврат из функции с сохранением текущего итерационного состояния этой функции.
    При запросе следующего значения в цикле итерационном цикле - снова вызов этой функции с использованием сохранённого состояния, т.е. продолжение обработки данных с места возврата внутри этой функции.

    Можно провести некую аналогию с "курсором" и местом обработки данных в позиции курсора.
    Ответ написан
    3 комментария
  • Как вывести"Вы экономите" в Opencart2?

    dim565
    @dim565
    Здравствуйте! Работает при установке для товара цены акции (не скидки), думаю это более логично.
    На странице товара
    /catalog/controller/product/product.php
    Найти:
    $data['special'] = $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
    Добавить после:
    $data['discount_amount'] = $this->currency->format($this->tax->calculate(($product_info['price'] - $product_info['special']), $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);

    /catalog/view/theme/default/template/product/product.tpl
    Найти:
    <li>
    <h2><?php echo $special; ?></h2>
    </li>
    Добавить после:
    <li class="discount_amount">
    <?php echo 'Вы экономите '.$discount_amount; ?>
    </li>

    На странице категории
    /catalog/controller/product/category.php
    Найти:
    $special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
    Добавить после:
    $discount_amount = $this->currency->format($this->tax->calculate(($result['price'] - $result['special']), $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
    Найти:
    'price'       => $price,
    'special'     => $special,
    Добавить после:
    'discount_amount' => $discount_amount,

    /catalog/view/theme/default/template/product/category.tpl
    Найти:
    <span class="price-new"><?php echo $product['special']; ?></span> <span class="price-old"><?php echo $product['price']; ?></span>
    Добавить после:
    <span class="discount_amount"><?php echo 'Вы экономите '.$product['discount_amount']; ?></span>

    Проверено на чистом OpenCart 2.3.0.2. По-хорошему, надо бы создать модификатор ocmod в формате xml, а не редактировать код напрямую, но это уже другой уровень.
    Ответ написан
    1 комментарий
  • Какой хороший курс по JS (для среднего уровня)?

    tundramani
    @tundramani
    learn.javascript.ru
    +
    фленагана справочник
    +
    годы тяжелой практики
    Ответ написан
    2 комментария
  • Какой хороший курс по JS (для среднего уровня)?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    https://www.youtube.com/watch?v=bzuelEN1Kg8&list=P... вот это дело мозг хорошо поставило на место по части ES5, Еще зоракса послушай. learn.javascript.ru хорош, но нудноват...
    Ответ написан
    2 комментария
  • Как настроить постоянные ссылки в Wordpress на nginx?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    У вас не конфиг, а какой-то винегрет...
    return 301 https://$server_name$request_uri;
    В рамках listen :80 вы редиректите на https?!
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    Этот фрагмент у вас вложен в такой же
    location / {
        ...
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
        ...
    }

    Что это за чушь? В этом конфиге даже разбираться не хочется.

    Вот базовый конфиг, который работает и отвечает за пермалинки в том числе:
    server {
            # Слушаем 80й порт
            listen 80; 
            # Обслуживаем доменное имя, www тут же слушать не надо - будут дубликаты контента, печаль для SEO
            server_name example.com;
            # Корневая директория проекта
            root /var/www/example.com/httpdocs;
    
            # Индексы
            index index.php index.html;
    
            # Обработка запросов
            # $uri - существует ли конкретный файл
            # $uri/ - существует ли директория
            # /index.php?$args - если это не запрос на существующий файл или директорию, то перебрасываем на роутер WordPress (это и есть то, что надо для пермалинков)
            location / {
                    try_files $uri $uri/ /index.php?$args;
            }
    
            # Обрабатываем PHP
            location ~ \.php$ {
                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
                    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                    fastcgi_pass unix:/var/run/php5-fpm.sock; # или php7.0-fpm.sock
                    fastcgi_index index.php;
                    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    include fastcgi_params;
            }
    
            # Все остальное
    
            # Запрещаем доступ к .htaccess
            location ~ /\.ht {
                    deny all;
            }
    
            # Просим кешировать статику на Х дней, не писать в логи
            location ~*
            ^.+\.(js|css|swf|xml|txt|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
                    access_log off;
                    log_not_found off;
                    expires 30d;
            }
    
    }
    
    # Отдельно слушаем домен с www и редиректим на основной
    server {
            # Слушаем 80й порт
            listen 80; 
            # Обслуживаем доменное имя c www
            server_name www.example.com;
            # Отправляем запрос на основной домен
            return 301 $scheme://example.com$request_uri;
    }

    Снабдил комментами для ясности.

    Что касается протокола HTTPS, то во-первых, его слушать надо на отдельном порту, а во-вторых, там еще SSL-сертификат надо подключать.
    Ответ написан
    5 комментариев
  • Оптимизация сайта на Wordpress + Woocommerce?

    secsite
    @secsite
    Безопасные и быстрые сайты
    Кто что посоветует?

    Разбираться с причинами, а не бежать ставить костыли в виде кеш-плагинов.

    wordpress.tv/2013/08/19/konstantin-kovshenin-wordp...
    wordpress.tv/2015/08/20/konstantin-kovshenin-wordp...
    Ответ написан
    Комментировать
  • Как вывести только товары с акцией в WooCommerce?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    так wp-panda.com/woocommerce_posts/woocommerce-shortco...

    цикл сильно прощще

    <ul class="products">
    	<?php
                    $product_ids_on_sale = wc_get_product_ids_on_sale();
    
    		$args = array(
    			'post_type' => 'product',
                            'post__in' => array_merge( array( 0 ), $product_ids_on_sale )
    			);
    		$loop = new WP_Query( $args );
    		if ( $loop->have_posts() ) {
    			while ( $loop->have_posts() ) : $loop->the_post();
    				wc_get_template_part( 'content', 'product' );
    			endwhile;
    		} else {
    			echo __( 'Продуктов не найдено' );
    		}
    		wp_reset_postdata();
    	?>
    </ul><!--/.products-->
    Ответ написан
    1 комментарий
  • Где почитать про разработку woocommerce кроме документации?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    на экшен фильтр повесить нельзя, экшен это событие, фильтры нужны для модификации параметров принимаемых или возвращаемых функцией. Для применения фильтра мрдифицируемое должно иметь apply_filters( 'filter_name' , $array, бла бла бла всякое другое )

    do_action( 'woocommerce_before_main_content' ); - это событие на которое повешены функции, сверху вежливо написано, какие функции на него повешены. В данном случае это хлебные крошки с приоритетом 20

    Для посмотреть на woocommerce_breadcrumb, идем на гитхаб woocommerce и в нем ищем function woocommerce_breadcrumb, находим ее в файле https://github.com/woocommerce/woocommerce/blob/75... и из ее кода видим, что,
    1. filter / woocommerce_breadcrumb_defaults - можем поменять разметку
    2. filter / woocommerce_breadcrumb_home_url - можем поменять адрес главной
    3. action / woocommerce_breadcrumb - повешен метод который генерирует микроразмеку, можем его отключить, подключить свой, обработать данные дополнительно
    4. wc_get_template( 'global/breadcrumb.php - можем переопределить шаблон вывода полностью
    Ответ написан
    1 комментарий
  • Как передать данные из HTML в PDF?

    NeiroNx
    @NeiroNx
    Программист
    нужен скрипт на серверной стороне.
    Например так в PHP:
    require_once('fpdf.php');
    require_once('fpdi.php');
    
    $pdf =& new FPDI();
    $pages_count = $pdf->setSourceFile('your_file.pdf'); 
    
    for($i = 1; $i <= $pages_count; $i++)
    {
        $pdf->AddPage(); 
    
        $tplIdx = $pdf->importPage($i);
    
        $pdf->useTemplate($tplIdx, 0, 0); 
    
    
        $pdf->SetFont('Arial'); 
        $pdf->SetTextColor(255,0,0); 
        $pdf->SetXY(25, 25); 
        $pdf->Write(0, "This is just a simple text"); 
    }

    на каждую страницу добавит текст в точке [25,25]
    разбирать получение данных из формы думаю излишне.

    Нужно будет сидеть и скурпулезно расчитывать позиции, откуда данные, куда вставить.
    Ответ написан
    1 комментарий
  • Какую защиту использовать от спам ботов?

    @egorinsk
    Повторяю способы защиты, выбирайте любой, который нравится:

    Начнем со случая, когад у вас маленький (меньше 100 тыс юников в день/1 млн зарегистрированных юзеров) сайт.

    1) Сделать невидимое поле с именем email. 98% ботов-дебилов его заполнят, дальше вы понимаете, что с ними делать и куда вносить их IP. Чтобы не палиться, не пишите style=display:none, а скройте его чуть хитрее.

    Этот способ у меня отсеивает практически всех ботов на одном сайте. Правда, там боты, не заточенные под сайт, а просто, которые ходят и заполняют все формы подряд своей рекламой. Типа Хрумера наверно.

    2) Заполняемое яваскриптом поле типа hidden. Куча ботов не выполняют яваскрипт. Куки, кстати, наоборот, большинство ботов исправно присылают. Реферер и юзер-агент тоже обычно у них правильный.

    3) Более радикальный подход — убрать кнопку submit, заменив ее на div, который по событию onclick собирает значения полей формы и отправляет их аяксом. Аттрибут action тега form сделать указывающим на скрипт-ловушку. Если бот не написан специально под ваш сайт, он тупо не сможет отправить такую форму.

    Ок, допустим, вам не повезло, и ваш сайт с миллионами пользователей атакуют спамеры специально написанными скриптами. Что мы можем вам предложить?

    4) Добавлять вычисляемые/расшифровываемые яваскриптом поля. Внезапная смена алгоритма шифрования в 2 часа ночи скорее всего сдаст тех ботов, которые смогли через нее пробиться, но не успели переписать алгоритм.

    5) Проверять поддержку клиентом Flash (загружать флешку и через нее подписывать форму кодом).

    6) Проверять соответствие User-Agent и уровня поддержки технологий HTML5/CSS3 (например, определенные версии браузеров не поддерживают border-radius, другие поддерживают, и тд.)

    Более серьезные возможности дают методы статистического анализа. Например, можно вычленять из сообщений несловарные слова (это будут ссылки например) и анализировать источники их отправки. Например, если 1000 пользователей начинает за час отправлять по 100 сообщений не-друзьям с одним и тем же словом super-shop — это явный признак спам-рассылки. Для таких систем надо собирать статистику и писать белые/черные правила, вводить негласные лимиты подозрительных действий, в общем. серьезная работа.

    Можно, как вконтакте, привязывать аккаунты к телефонам. это работает.

    Еще немного рассуждений на эту тему тут: habrahabr.ru/qa/16920/#answer_70019

    А использование капчи в формах говорит о лени/низкой квалификации/урезанном бюджете или непрофессионализме и причиняет неудобства пользователям.
    Ответ написан
    1 комментарий
  • Хороший сервис рассылок email?

    @MechanID
    Админ хостинг провайдера
    А вы уверены что формально у вас точно не спам ?
    unsubscribe есть и работает ?
    хедеры необходимые по rfc5322 присутствуют ?
    ptr, spf, dkim, dmarc - все это настроенно ?
    с какой скоростью отправляете ? (писем в минуту)

    Есть большие проверенные сервисы - mailchimp, sendgrid и тд... используйте их или наймите админа.
    Ответ написан
    Комментировать
  • Как кастомизировать стрелки next/prev у слайдера Slick?

    @Dumb
    Вам уже наверное не актуально, но может пригодится другим.
    Js
    $(function(){
        	$('.your-class').slick({
                slidesToShow: 4,
                slidesToScroll: 1,
                appendArrows: $('.your-class-arrow'),
                prevArrow: '<button id="prev" type="button" class="btn btn-juliet"><i class="fa fa-chevron-left" aria-hidden="true"></i> Туда</button>',
                nextArrow: '<button id="next" type="button" class="btn btn-juliet">Сюда <i class="fa fa-chevron-right" aria-hidden="true"></i></button>'
        	});
        });

    Html
    <div class="your-class">
      <div>your content</div>
      <div>your content</div>
      <div>your content</div>
    </div>
    <div class="your-class-arrow"></div>

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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Форма, предложенная Роман Краббз только передает через скрытое поле нужный параметр. Надо еще сам запрос модифицировать:
    function search_filter( $query ) {
      // Берем название таксономии из скрытого поля
      $taxonomy = sanitize_text_field( $_GET['taxonomy'] );
      // Получаем ID всех терминов в заданной таксономи
      $terms = get_terms( $taxonomy, array(
        'fields' => 'ids'
      ) );
      // Изолируем нужный запрос
      if ( !is_admin() && $query->is_main_query() && $query->is_search ) {
          // Формируем массив параметров подзапроса по таксономии
          $tax_query = array(
            array(
              'taxonomy' => $taxonomy,
              'field' => 'id',
              'terms' => $terms,
              'operator'  => 'IN'
            ),
          );
          // Передаем параметры подзапроса в основной запрос
          $query->set( 'tax_query', $tax_query );
      }
    }
    add_action( 'pre_get_posts', 'search_filter' );

    Если я правильно понимаю, вы хотите, чтобы введенное в поиске слово расценивалось как термин таксономии, и в результате выводились посты с этим термином в этой таксономии? Тогда в параметры в коде выше нужно передавать tax_query.
    Ответ написан
    8 комментариев