Задать вопрос
  • Как сделать авторизацию по ссылке для фида?

    @ksnk
    Вот упрощенный пример. Пароль-пользователь указан в файле. Каталог для выгрузки файлов - там же.

    <?php
    
    if (!isset($_SERVER['PHP_AUTH_USER'])) {
        header('WWW-Authenticate: Basic realm="My Realm"');
        header('HTTP/1.0 401 Unauthorized');
        echo 'Authentification required.';
        exit;
    } else {
        // config!
        $password='test';
        $user='test';
        $upload_dir=$_SERVER['DOCUMENT_ROOT'].'/tmp/';
        //
    
        if($_SERVER['PHP_AUTH_USER']!=$user ||$_SERVER['PHP_AUTH_USER']!=$password){
            echo 'No user found, sorry.';
            exit;
        }
    
        $filename=$_SERVER['QUERY_STRING'];
        if(!is_readable($upload_dir.$filename)){
            echo 'No file found, sorry.';
            exit;
        }
    
        header('Content-type: text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($upload_dir.$filename));
        readfile($upload_dir.$filename);
    }

    Использование

    https://test:test@site/file.php?filetoupload.txt
    Ответ написан
    Комментировать
  • Строка из БД как условие сравнения в if?

    @ksnk
    У меня где-то использовался `язык фильтров` - строка с условиями, которую удобно вписывать в область фильтра в столбик таблицы с данными. Постим на сервер - получаем фильтрованное.
    Сама строка условий выглядит примерно так
    count=2,<2;count=3,<300,>44
    условия соединяются запятой, по AND, точкой с запятой - по OR, у OR более низкий приоритет. Операция сравнения соединяет 2 операнда, если один из операндов пустой - берется "сравниваемое значение", если число - то число, иначе ищем во внешних "данных".
    Если записать строку на php - будет что-то вроде
    $current=45; // значение, которое сравниваем
    $data=['count'=>3]; // внешние данные
    if( ($data['count']==2 && $current<2) || ($data['count']==3 &&$current>44 && $current<300)){
        // ...
    }

    Удобно в языке то, что парсер его компактен и легко допиливается напильником по месту.
    function evaluate($current,$cond,$data=[]){
        $res=false;
        foreach(explode(';',$cond) as $or){ //or
            foreach(explode(',',$or) as $and) { //and
                if(preg_match('/^(.*?)(<=|>=|<|>|=)(.*?)$/',$and,$m)){
                    $a=trim($m[1]);$b=trim($m[3]);
                    if(empty($a)) $a=$current;
                    else if(is_numeric($a)) $a=0+$a;
                    else if(isset($data[$a])) $a=$data[$a];
                    else {
                        $res=false; break;
                    }
                    if(empty($b)) $b=$current;
                    else if(is_numeric($b)) $b=0+$b;
                    else if(isset($data[$b])) $b=$data[$b];
                    else {
                        $res=false; break;
                    }
                    if($m[2]=='<=') $res=$a<=$b;
                    else if($m[2]=='>=') $res=$a>=$b;
                    else if($m[2]=='>') $res=$a>$b;
                    else if($m[2]=='<') $res=$a<$b;
                    else if($m[2]=='=') $res=$a==$b;
                } else {
                    $res=false;
                    //throw new \Exception('Некорректное условие в строке '.$and)
                }
                if(!$res) break; // выход по AND
            }
            if($res) break; // выход по OR
        }
        return $res;
    }
    
    $data=['count'=>3];
    
    var_dump(true===evaluate(45,'count=2,<2;count=3,<300,>44', $data));
    var_dump(true===evaluate(1,'<2'));
    var_dump(true===evaluate(1,'>3;<2,>1;<2'));
    Ответ написан
    1 комментарий
  • Как валидировать кнопку у формы при незаполненном инпуте?

    @ksnk
    Так ?
    Кнопка отправки формы - одна - Next
    При нажатии на "Ввод" внутри текстового инпута происходит сабмит формы, При этом срабатывает самая первая кнопка сабмит, которая попадется в форме. Так что порядок кнопок немного другой, а чтобы визуально не отличалось - передернуто с помощью float:left .
    Ну и обрабатывать форму должен сервер, так что все набранные данные туда и отправляем....
    Ответ написан
  • Как сделать так, чтобы когда урок начинался (наступало 8:00), то выводилось "Урок начался!", а когда заканчивался (8:40) - "Урок закончился!"?

    @ksnk

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

    Ответ написан
  • Не добавляются нули в таймер обратного отсчета?

    @ksnk
    days.toString().replace(/\d/gi, (substring) => `${substring}`);

    вот такие 3 строки нужно заменить на
    daysVal.innerHTML = '<span>'+days.toString().padStart(2,'0')+'</span>';
        hoursVal.innerHTML = '<span>'+hours.toString().padStart(2,'0')+'</span>';
        minutesVal.innerHTML = '<span>'+minutes.toString().padStart(2,'0')+'</span>';

    и короче и не каждая цифра оборачивается в свой спан
    Ответ написан
    Комментировать
  • Определить модуль по кешу возможно?

    @ksnk
    <?php die("Access Denied"); ?>#x#a:2:{s:6:"result";a:227:{i:0;O:8:"stdClass":8:{s:2:"id";s:3:"870";s:5:"title";s:23:"БПВР-вопросы";s:6:"module";s:13:"mod_widgetkit";

    вот пример (первые несколько символов) файла с кэшем. Как можно заметить - это сериализованное значение (в определенном смысле). закэширован модуль с именем mod_widgetkit
    Ответ написан
    8 комментариев
  • Как сделать адаптивную разделительную линию между 2-мя текстами?

    @ksnk
    codius.ru/articles/%D0%9A%D0%B0%D0%BA_%D1%81%D0%B2...
    Не оно ? если нужно обязательно к левому краю прижимать номера страниц - можно ul.oglavl span.text задать размер в процентах, например.
    или https://qna.habr.com/q/391993
    Ответ написан
    4 комментария
  • Как настроить 301 редирект в битрикс?

    @ksnk
    самый простой - .htaccess
    добавить туда что-то вроде такого - откуда-куда
    Redirect 301 /karera/vakansii /o-kompanii/nasha-komanda/vakansii/

    Правда требуется применять здравый смысл, чтобы файл не становился уж очень большим.
    Ответ написан
    Комментировать
  • Как можно сделать такой range с кастомными этапами?

    @ksnk
    Логарифмическая шкала?
    Ну вот так, например, можно сделать. Ставим на слайдере 1000 элементов. Пишем функцию конверсии значения слайдера в значение инпута и наоборот, рисуем метки под слайдером учитывая конверсию.
    чем больше step тем "кривее" шкала.
    $(function() {
            var valMap = [0, 1, 3, 6, 10, 15, 22, 30,40, 50]; // более равномерно в логарифмической шкале
    			// 0..1000 --> 0..50 (true, обратно false)
    				const step=2, 
    							w=[1000/Math.pow(50,1/step),50/Math.pow(1000,step)] ;
    			  function _conv(x, forvard){
    					if(!forvard)
    						return Math.pow(x,1/step)*w[0];
    					else
    						return Math.round(Math.pow(x,step)*w[1]);
    				}
    			
    			  $("#slider").slider({
                    max: 1000,//valMap.length - 1,
                    slide: function(event, ui) {
                       $("#radiusAmount").val(_conv(ui.value,true));
                    }
                })
                .each(function() {
    
                    var opt = $(this).data().uiSlider.options;
                    var vals = opt.max - opt.min;
                    var arrayLength = valMap.length;
    								for (var i = 0; i < arrayLength; i++) {
                        var el = $('<label>' + (valMap[i]) + '</label>').css('left', (_conv(valMap[i],false) / 10 ) + '%');
                        $("#slider").append(el);
                    }
                });
    			$(document).on('change','#radiusAmount', function(){
    					$("#slider").slider('value',_conv($(this).val(), false))	;				})
        });
    Ответ написан
    Комментировать
  • Как сделать такой инпут?

    @ksnk
    https://jsfiddle.net/wjg8oLsd/ Не то ?
    функция вычисления размера инпута стырена со stackoverflow
    P.S. Обновил решение
    Ответ написан
  • Как сделать вогнутую кнопку css?

    @ksnk
    htmlbook.ru/css/border-image
    Картинку с бордером можно нарисовать хоть в svg, но если png - в этом случае разумно будет примерно соответствовать средним размерам кнопок, чтобы при разных размерах не бросались в глаза артефакты при увеличении картинки
    Ответ написан
  • Как подписать значение по ГОСТ Р 34.10-2012 256?

    @ksnk
    Ответ написан
    Комментировать
  • Знакомство нового пользователя через подсказки?

    @ksnk
    А в чем проблема посмотреть кто что смотрел?
    Таблица подсказок - {ID подсказки, страница (маска страниц, список страниц), селектор, событие, текст подсказки}.
    Таблица просмотров {ID юзера, ID подсказки, время демонстрации}
    Информация о подсказках с просмотрами left join собирается и выгружается на нужную страницу. Специальный виджет расставляет все непросмотренные подсказки по hover или клику мышки. Он же будет заботится о том, чтобы хранить информацию о показах, либо в localStore, для незарегистрированного, либо в профиле пользователя сайта. Если подсказка демонстрировалась недавно - можно не показывать...
    Удобно то, что система получится "независима" от остального сайта, в том смысле, что ее можно убрать и сайт продолжать работать. Можно поставить ее на любой существующий сайт, отдельно настраивать шаблоны сайта не придется, разве что обеспечить вменяемые селекторы для поясняемых элементов.
    Если вносится новая фича с подсказкой на сайт - никто ее пока не просмотрел - всем насильно показать.
    Придется сделать на каждой странице заметную кнопку "Расскажи мне опять все-все все про ту страницу", это для особо забывчивых. Сделать в профиле пользователя или на странице кнопку-галку "не показывать мне больше ваши всплывающие подсказки", ну чисто для полноты картины мира и ощущения справедливости...
    Ответ написан
    Комментировать
  • Как разделить строку в массив на текст и числа в JS?

    @ksnk
    Если адрес совсем в свободной форме, то лучше доверить разбор адреса профессионалам Яндексу. У него есть Map api с функцией геокодирования https://yandex.ru/dev/maps/jsapi/doc/2.1/dg/concep...
    В песочнице можно поиграться с тем, как расшифровываются кусочки адреса, введенного пользователем https://yandex.ru/dev/maps/jsbox/2.1/direct_geocode/
    Например про адрес из первого сообщения была вот такая информация
    Тип геообъекта: house
    VM75:65 Название объекта: 1-й Волконский переулок, 10
    VM75:66 Описание объекта: Россия, Москва
    VM75:67 Полное описание объекта: Россия, Москва, 1-й Волконский переулок, 10
    VM75:72 
    Государство: Россия
    VM75:73 Населенный пункт: Москва
    VM75:74 Адрес объекта: Россия, Москва, 1-й Волконский переулок, 10
    VM75:75 Наименование здания: -
    VM75:76 Номер здания: 10
    Правда работа с api ограниченно бесплатная, но для небольшого сайта с умеренным трафиком очень даже.
    Ответ написан
  • Как вывести ответы на анкету каждого пользователя на отдельной странице (ответы читаются из файла)?

    @ksnk
    Сохраняй результаты не в txt файл, а в php. Что нибудь такое, при сохранении
    $results_file='results.php';
    $result=include_once($results_file);
    $result[$current_user_id]=['post'=>$_POST, 'time'=>time()];
    file_put_contents($results_file, '<'."?php\nreturn ".var_export($result,true).';')

    Проверку параметров и навороты - по вкусу
    При выводе включаем то же файл и выводит заполненную нужным юзером анкету.

    Ну и начальный results.php
    <?php
    return [];
    Ответ написан
    Комментировать
  • Как ускорить чтение большого архива gz?

    @ksnk
    Читать нужно не по строкам, а блоками, килобайт по 40. Просто проверь - чтение блоками всего файла или чтение построчное gzgets. Вот искать в таких блоках сложнее - нужно гарантировать что найденный кусок не попадет на границу буфера чтения. Для этого, можно последнюю "строку" блока сохранять и копировать в следующий блок.
    Читать загзипованые файлы удобнее, imho, обычными файловыми операциями fread, feof вот только открывать его придется gzopen. Как нибудь так...
    if (preg_match('/\.gz$/', $name)) {
                    $_handle = fopen($name, "rb");
                    fseek($_handle, filesize($name) - 4);
                    $x = unpack("L", fread($_handle, 4));
                    $this->finish = $x[1];
                    fclose($_handle);
                    $handle = gzopen(
                        $handle, 'r'
                    );
                } else {
                    $this->finish = filesize($name);
                    $handle = fopen($name, 'r');
                }
    Ответ написан
  • Как создать обственные BB коды на сайт или форум?

    @ksnk
    Простейший вариант - заменять [CODE] на < pre > и закрывающий [/CODE] на < /pre>. Это не то, что нужно в этом месте ? Чтобы не задумываться о непарных тегах - можно менять регуляркой
    $text=preg_replace('~\[CODE\](.*?)\[/CODE\]~si', '<pre>$1</pre>',$text);

    Если, внезапно, захочется что-то более навороченного - можно посмотреть ответ nokimaro
    Ответ написан
    Комментировать