• Как сохранить класс активной ссылки после перезагрузки страницы?

    Exomode
    @Exomode
    Архитектор ПО
    Можно сохранить параметр в куку, можно привязаться к хешу урла, после перезагрузки он никуда не исчезнет и можно будет проверить наличие:
    var hash = window.location.hash;
    var selectedOption = null;
    
    if (hash && hash != '#') {
      var parts = hash.split('=');
    
      if (parts.length == 2 && parts[0] == "select_option") {
        selectedOption = parts[1];
      }
    }

    Дальше просто присвоить свойство selected селектору "select option[name='" + selectOption + "']" при загрузке страницы, а в onchange списка обновлять хэш. Не часто вижу чтобы подобное решение применялось, но иногда оно вписывается куда элегантнее и проще, чем даже те же куки, которые можно очистить и всё слетит, или вообще отключить. Хэши напоминают строку GET-запроса, только работают исключительно в рамках клиентсайда.

    Эти два варианта подойдут для сугубо клиентской привязки. Можно еще и с помощью сервера организовать, сразу отдавать на клиент разметку с выделенным элементом списка в зависимости от параметра запроса или куки, или сессии, как угодно.

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

    Exomode
    @Exomode
    Архитектор ПО
    Потому что в jQuery метод load() работает как обработчик загрузки лишь если вызван у $(window), для других элементов он пытается подгрузить содержимое аяксом. Читайте документацию.
    Ответ написан
    4 комментария
  • Не могу вывести переменную с датой (месяц). В чём проблема?

    Exomode
    @Exomode
    Архитектор ПО
    \DateTime::createFromFormat("d.m.Y в H:i", $dateStr);

    Псевдоним: date_create_from_format.

    И никаких махинаций с explode не надо.

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

    Exomode
    @Exomode
    Архитектор ПО
    $lexems = [
      "text" => "TEXT",
    ];
    
    $data = [];
    
    foreach ($_REQUEST as $k => $v) {
      if (array_key_exists($k, $lexems)) {
        $data[$k] => htmlspecialchars(trim($v));
      }
    }
    
    $sourceText = file_get_contents("/path/to/template.txt");
    
    foreach ($data as $k => $v) {
      $sourceText = str_replace('{' . $lexems[$k] . '}', $v, $sourceText);
    }
    
    echo $sourceText;


    Как оно работает:
    1. На странице есть набор input с именами, соответствующими ключам ассоциативного массива $lexems;
    2. После отправки данных на наш скрипт-обработчик, мы сохраняем все полученные данные в массив с теми же ключами;
    3. Получаем исходный текст шаблона, где содержатся наши лексемы;
    4. Проходимся массивом по полученным данным, выбираем по тем же ключам лексемы и заменяем их на пришедший с клиента текст, после чего выводим результат на экран.

    Вместо str_replace можно использовать preg_replace или составить карту подмены и обойтись в str_replace без цикла. последнее самое предпочтительное в плане производительности на текстах небольшого объёма. Вариант с регулярками лучше использовать на массивных текстах.
    Ответ написан
    Комментировать
  • Как разместить элемент относительно правого нижнего угла родительского?

    Exomode
    @Exomode
    Архитектор ПО
    Можно так. Если нужно чтобы пространство, которое должен занимать блок ссылки, оставалось исходной высоты, то можно эту ссылку обрамить в тег и задать ему text-align: right, или же просто добавить ссылке float: right. но в таком случае нужно будет ввести после неё ещё один элемент, которому задать clear: both, чтобы отступы работали правильно.
    Ответ написан
    Комментировать
  • Как сделать инпуты ровно?

    Exomode
    @Exomode
    Архитектор ПО
    label {
      display: inline-block;
      vertical-align: middle;
      width: 45%;
      box-sizing: border-box;
    }
    
    input:not([type="radio"]) {
      display: block;
      width: 100%;
    }

    В HTML у вас чуть-чуть ошибочка, там не совсем правильно обрамили радио, нужно открывающий тег перенести ниже, за предыдущий label.
    Если нужно выровнять в одну горизонтальную линию еще и надписи к полям ввода, текст надписи тоже нужно обрамить тегом и сделать его вместе с input display: inline-block, а так же зафиксировать ширину, чтобы это всё не плавало.
    Ответ написан
    Комментировать
  • Как сделать отправку данных из формы на несколько эмеил?

    Exomode
    @Exomode
    Архитектор ПО
    Как вариант, сформировать массив почтовых адресов и циклом повторить вызов метода отправки письма, меняя при этом адресата. Универсальный способ, который подойдёт даже для mail(). С uniMail я не знаком, возможно там уже предусмотрена автоматизация отправки нескольким получателям, тогда будет проще. Если там такого нет - опять же, способ с циклом и сюда подойдёт.

    UPD: посмотрел я эту uniMail... печально там всё. Вы сами можете написать за час библиотеку получше. Алгоритм примерно следующий:

    Сервер:
    1. Делаете хранение адресатов (можно конфиг, можно БД, как вам лучше подойдёт);
    2. Валидируете входные параметры запроса, делаете фильтрацию переменных, экранируете спецсимволы;
    3. Формируете массив адресатов из хранимых данных;
    4. Пишете функцию формирования письма, она же будет его и отправлять;
    5. Проходитесь циклом по массиву адресатов, передаёте аргументы в функцию и вызываете её на каждой итерации.

    Клиент:
    Здесь надо просто собрать данные и послать их на серверный скрипт обработки, который я выше описал. Как организуете отправку (ajax, прямой post и тд) - так и будет работать, главное, как ниже отметил Александр, не храните важную информацию в hidden-полях, да и вообще на клиенте не храните никогда ничего подобного, начиная с DOM и заканчивая куками и GET-параметрами в адресной строке.
    Ответ написан
    Комментировать
  • Как с помощью php читать из файла txt только вторую строку?

    Exomode
    @Exomode
    Архитектор ПО
    $show_info = fopen('events/kp1/dungeon1.txt', 'r');
    fgets($show_info);
    echo fgets($show_info);
    fclose($show_info);

    можно ещё сделать как-то так:
    function readLine($pathToFile, $index = 0) {
      if (!file_exists($pathToFile)) {
        return null;
      }
    
      $stream = fopen($pathToFile, 'r');
      $line = null;
    
      for ($i = 0; $i <= $index; $i++) {
        if ($index > 0) {
          fgets($stream);
        }
    
        if ($i == $index) {
          $line = fgets($stream);
        }
      }
    
      fclose($stream);
      return $line;
    }
    
    echo readLine('events/kp1/dungeon1.txt', 1);    // Выведет вторую строку файла.

    Не будет держать в памяти весь файл, как в предложенных вариантах выше, а значит подойдёт и для массивных файлов.
    Ответ написан
    2 комментария
  • Простая система хуков на php?

    Exomode
    @Exomode
    Архитектор ПО
    class Hook {
      protected $callbacks;
    
      public function __construct($callbacks = []) {
        $this->callbacks = [];
    
        if (!isset($callbacks) || !is_array($callbacks) || sizeof($callbacks)) {
          return;
        }
    
        foreach ($callbacks as $k => $v) {
          if (!is_string($k) || !isset($v) || !is_callable($v)) {
            continue;
          }
    
          $this->callbacks[$k] = $v;
        }
      }
    
      public function add($key, $callback) {
        if (!isset($key) || !isset($callback) || !is_string($key) || !is_callable($callback)) {
          return;
        }
    
        $this->callbacks[$key] = $callback;
      }
    
      public function remove($key) {
        if ($this->exists($key)) {
          unset($this->callbacks[$key]);
        }
      }
    
      public function exists($key) {
        return isset($key) && array_key_exists($key, $this->callbacks);
      }
    
      public function run($key, ...$args) {
        if ($this->exists($key)) {
          $func = $this->callbacks[$key];
    
          if (!isset($args) || !is_array($args)) {
            $args = [];
          }
          
          if (isset($func)) {
            $func(...$args);
          }
        }
      }
    }
    
    $hook = new Hook();
    $hook->add("my_hook", function ($args) {
      // todo
    });
    
    $hook->run("my_hook");
    $hook->run("my_hook", 1, "string", true);

    Что-то вроде такого?
    Ответ написан
    3 комментария
  • Создание отдельной таблицы для каждого пользователя. Правильно ли?

    Exomode
    @Exomode
    Архитектор ПО
    Попытаюсь народным языком передать суть реляционок. Каждая таблица должна представлять некую модель данных. Каждая запись - объект, каждый столбец - его свойство определенного типа. Юзер - это одна модель и объектов юзеров может быть множество. Комментарий - другая модель и тоже множество её объектов. Пост форума, товар и тд - другие модели. А выборка данных из других таблиц для какой-то записи в текущей потом делается через связывание, там несколько вариантов, например, JOIN для объединения результатов в одну модель или связывание самих таблиц, или хранение связок в спомогательных таблицах, вариантов масса, выбор нужного зависит от специфики задачи и требований к оптимизации запросов.
    Ответ написан
    Комментировать
  • Как сделать меню с полосками?

    Exomode
    @Exomode
    Архитектор ПО
    .menu .menu_item {
      border-left: 1px solid #c0c0c0;
    }
    
    .menu .menu_item:first-child {
      border-left: 0 none;
    }

    или
    .menu .menu_item {
      border-right: 1px solid #c0c0c0;
    }
    
    .menu .menu_item:last-child {
      border-right: 0 none;
    }


    Вариант для вашей вложенности меню: codepen.io
    Ответ написан
  • Как сделать адаптивное меню с логотипом в центре?

    Exomode
    @Exomode
    Архитектор ПО
    Вариантов действительно масса, можно и таким подходом.
    Ответ написан
    Комментировать
  • У DLE 11.3 новая система паролей. Но заменяет в БД их так что пароли не работают, что делать?

    Exomode
    @Exomode
    Архитектор ПО
    Вам нужно убедиться, что данные, приходящие с формы авторизации, в старой кодировке Win-1251, тогда при проверке пароли должны совпадать, т.к. хэшироваться должны те же наборы байт, что раньше приходили на старой версии движка с формы в кодировке Win-1251. Кроме того, при проверке кодировка хэша так же должна совпадать с той, в которой будет результат md5(). Можно воспользоваться методом mb_convert_encoding(). Если надо удалить BOM, можно после конвертации в кодировку сделать примерно так:
    $bom = pack("H*", "EFBBBF");
    $string = preg_replace("/^$bom/", '', $string);

    Надеюсь, мои заметки вам помогут решить проблему.
    Ответ написан
  • Какая существует библиотека для построения графика по точкам из массива с собственным GUI на VC++ 2015?

    Exomode
    @Exomode
    Архитектор ПО
    Одна из альтернатив gnu plot, возможно вам подойдёт:
    koolplot
    Ответ написан
    Комментировать
  • Из-за чего может возникать проблема с кодировкой?

    Exomode
    @Exomode
    Архитектор ПО
    Проверьте чтобы кодировка везде была UTF-8 without BOM. И сделайте проверку после авторизации в Client::createResponse() типа
    if (!isset($arr) || !is_array($arr) || sizeof($arr) == 0) { return false; }

    Чтобы ошибки не валились в случае неудачной авторизации.
    Ответ написан
    Комментировать
  • Ежедневная смена бэкграунда - как реализовать?

    Exomode
    @Exomode
    Архитектор ПО
    cron/crontab
    Запуск PHP скрипта по расписанию cron. Когда не вс...
    Будет выполнять действие асинхронно по интервалу времени.
    Как вы реализуете логику cron-задачи, уже полностью от вас зависит. Либо будет подменять картинку, либо весь стиль целиком, просто у вас должен быть конфиг, который будет переключаться cron'ом, по нему движок сайта определит, какой контент в данный момент времени отдать клиенту.
    Ответ написан
    Комментировать
  • Как сделать смену даты на сайту каждую субботу?

    Exomode
    @Exomode
    Архитектор ПО
    Если сайт интегрирован с внешним сервисом:
    cron/crontab
    Запуск PHP скрипта по расписанию cron. Когда не вс...

    Если на сайте есть админка и каждую неделю редактор делает пост газеты, то правильнее просто привязать к добавлению поста сразу и обновление даты в шапке, тогда и cron не понадобится.
    Ответ написан
  • Я бы хотел написать пост о моей игры в Хабрахабр, но в каком разделе?

    Exomode
    @Exomode
    Архитектор ПО
    01ae4dd8a9004fdfbdaf3bedd0eb5832.PNG
    Примерно такое.

    Из потоков подойдут "Разработка" и "Разное", если ваша статья будет об истории разработки.
    Из хабов - "Разработка игр", ещё возможно "Тестирование игр", так же можете указать хаб платформы, под которую велась разработка или хаб языка, на котором написана технология игры.
    Ответ написан
    Комментировать
  • Что нужно для первого приложения(ios/android)?

    Exomode
    @Exomode
    Архитектор ПО
    1) Xamarin.Forms для разработки UI и бизнес-логики на C# сразу под обе платформы;
    2) OSX для сборки и деплоинга билдов приложения под iOS (любой макбук подойдёт) и желательно айфон;
    3) Навыки в WPF для верстки UI;
    4) Навыки в SQL для работы с SQLite;
    5) Visual Studio для Windows или OSX;
    6) Документация по Xamarin, Android SDK и iOS SDK;
    7) Прямые руки, желание изучать технологию и представление конечного результата.
    Ответ написан
    Комментировать
  • Какие советы дадите для создания игры для компьютера?

    Exomode
    @Exomode
    Архитектор ПО
    Ни на один из четырёх вопросов нельзя дать конкретного ответа. Даже если попытаться, то получится примерно следующее:

    1) На тех, которые знаете или готовы изучать, потому что их возможности вас устраивают. Для программирования - IDE вроде Visual Studio, Eclipse и другие, можно даже в Notepad++ по олдскульному хардкору писать и потом собирать через консоль, никто не запрещает. Вопрос лишь в том, удобно ли оно вам будет в процессе и оптимально ли скажется на цикле разработки. Для текстурирования - Adobe Photoshop и прочие аналоги, для моделирования - Autodesk 3ds Max, Maya, Blender и прочие. Для шейдеров и материалов - те же самые IDE + в большинстве SDK для разработки игровых проектов уже идут в комплекте мощные визуальные средства. Для работы с аудио - Ableton, FL Studio, Cubase и прочие секвенсоры, для работы с видео - Adobe After Effect и аналоги. Выбор конкретного софта ложится полностью на вас и у всех он разный.

    2) Любой, который позволит получить требуемый результат и который вы знаете, на котором умеете работать и который максимально продуктивно отразится на цикле разработки. От C/C++ до Java и Lua.

    3) Любой подойдёт, который по возможностям удовлетворяет требованиям будущего продукта (конечные платформы, поддержка требуемого стека технологий, лицензия, 2D/3D и тд).

    4) На вкус и цвет... Сколько людей - столько и мнений. Устраивайте опросы друзей и заинтересованных лиц, исследуйте аналитику опросов других компаний, следите за тенденциями игрового рынка, делайте выводы.

    Главное чётко наметьте цели и следуйте им, не ставьте планку выше головы, не ровняйтесь на кого-то, пока у вас не будет несколько законченных рабочих продуктов. Иначе проект будет обречён ещё до старта разработки. 40% Indie-проектов умирает, 50% в итоге полная шляпа и лишь 10% выстреливают. И среди них мало шутеров и RPG, на самом-то деле. Каждый такой проект необычен и уникален, привносящий что-то новое в умирающий сеттинг или вообще открывающий новый.
    Ответ написан
    Комментировать