• Modx api как удалить файл из директории?

    i__dmitry
    @i__dmitry
    Weaving a web
    MODX API не умеет, нужно воспользоваться стандартными методами PHP.
    Ответ написан
    2 комментария
  • Modx Revo api как сделать статус онлайн/оффлайн в выборке пользователей?

    alelunegov
    @alelunegov
    Фрилансер. Разработка сайтов на MODX, верстка
    Сергей Миллер, к сожалению в MODX нет решения «из коробки» для показа онлайн ли пользователь. Так как у Вас желание сделать именно через API, а не сторонними дополнениями (UsersOnline), то придется постараться. Для начала надо определить, что значить «пользователь онлайн»? Ведь могут быть различные варианты поведения. Пользователь открыл страницу сайта и отошел от компьютера, не закрывая браузера, или переключился на другую вкладку. Он онлайн? Или открыл страницу и сразу закрыл браузер, как узнать что он уже не онлайн. Самый простой и наверное самый распространенный способ, это хранить в базе данных точное время последней загрузки любой страницы пользователем и считать, что если это произошло недавно (минут 5 или 10 назад), то пользователь еще активен.
    Для этого создадим плагин, например userLastAction и подключим ему системное событие OnLoadWebDocument (код отчасти взят у Василия Наумкина):
    <?php
    switch ($modx->event->name) {
    	case 'OnLoadWebDocument':
    		// Сохраняем дату открытия любой страницы сайта, если пользователь авторизован
    		if ($modx->user->isAuthenticated($modx->context->key)) {
    			// Здесь мы работаем с текущим пользователем — у него профиль уже загружен
    			$profile = $modx->user->Profile;
    			// Сохраняем дату и время в поле факс (а зачем еще это поле?) профиля пользователя
    			$profile->set('fax', date('Y-m-d H:i:s'));
    			$profile->save();
    		}
    		break;
    }


    Теперь при открытии любой страницы сайта любым пользователем будет сохранятся точное время этого действия, привязанное к профилю пользователя. Остается только при формировании списка проверять, давно ли он пользователь совершал действие на сайте.
    Я например писал такой сниппет userOnline:
    <?php
    $output = '';
    // Если есть ID пользователя
    if ($input) {
        $userId = (int)$input;
        // Если в параметрах не установлено через какое количество секунд считать пользователя "офлайн", то берем 10 минут
        $idleTime = $options ? (int)$options : 600;
        // Получаем объект пользователя по ID
        $user = $modx->getObject('modUser', $userId);
        if (!empty($user)) { // Если пользователь существует, то...
            // Получаем его профиль
            $profile = $user->getOne('Profile');
            // Получаем время его последнего действия
            $userLastAction = $profile->get('fax');
            if (!empty($userLastAction)) {
                // Если есть время в базе, то проверяем меньше ли оно установленного нами времени признания пользователя активным
                if (date('U') - date('U', strtotime($userLastAction)) < $idleTime) {
                    // Если да, будем выводить слово "online"
                    $output = 'online';
                } else {
                    // Если нет, то — время его последнего действия
                    $output = $userLastAction;
                }
            }
        }
    }
    // Выводим результат
    return $output;

    Вам придется это еще переработать под себя.
    Ответ написан
    1 комментарий
  • Как добавить в массив dataTransfer.files еще один файл?

    @zkrvndm
    Софт для автоматизации
    Примерно так:
    var dt = new DataTransfer();
    dt.items.add(file1);
    dt.items.add(file2);
    dt.items.add(file3);
    console.dir(dt.files);
    Ответ написан
    Комментировать
  • Возможно ли создать массив FileList у пустого input[type=file]?

    @zkrvndm
    Софт для автоматизации
    Лайфхак для создания коллекции файлов FileList:
    var info = 'Какой-нибудь текст';
    
    var dt  = new DataTransfer();
    dt.items.add(new File([info], 'primer.txt', {type: 'text/plain'}));
    var file_list = dt.files;
    
    console.log('Коллекция файлов создана:');
    console.dir(file_list);
    
    // Вставим созданную коллекцию в реальное поле:
    document.querySelector('input[type="file"]').files = file_list;

    В переменную info вместо текста, можно положить в том числе и Blob - это особенность функции new File() которая первым параметром может принять как массив из текстов, так и массив из Blob.

    Фактически лайфхак выше позволяет нам JavaScript-ом скачать любой какой угодно файл со своего сайта и вставить его абсолютно в любое поле <input type="file"> - что просто архиполезно для браузерных ботов.

    Также способ выше можно применить для редактирования уже выбранных пользователем файлов. Например, если надо из поля выбора файлов убрать какие-то определенные файлы и при этом сделать не фиктивно, а реально.

    Огромное спасибо пользователю Mmx Symfony, который нарыл это решение где-то в недрах иностранных сайтов. Сам я, в свое время сколько не искал, везде был ответ, что это невозможно, а оказалось, что нихрена подобного =)
    Ответ написан
    Комментировать
  • Как убрать элемент с яндекс.карт?

    @trefferr
    В инициализации конструктора карт, присваиваешь свойству пустой массив.
    controls: []
    ymaps.ready(function(){
            moscow_map = new ymaps.Map("banner_map", {
                center: [56.34820425, 41.30735193],
                controls: [],
                zoom: 17
            });
    Ответ написан
    Комментировать
  • Есть ли способ добавить переносимые файлы drag n drop в input file?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    var theInputFile = $('input[type="file"]'); // Это не 1 элемент. А jquery коллекция.

    Соответственно, чтобы напрямую назначить элементу значение свойства files, нужно выбрать этот элемент.

    Если он у Вас 1, то так:
    theInputFile[0].files = dfiles; // попытка добавить инпут file все переносимые файлы (должна работать)

    Если несколько, то обернуть код выше в $.each
    Ответ написан
    7 комментариев
  • Как переписать простое условие чтобы...?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Не совсем понятно откуда очистить?

    И вот тут вопрос:

    var files = {}; // тут хранятся файлы
    // ...
    files = {}; // сначала очистим массив, так как юзер может перезагрузить файлы n раз

    Так массив или объект?

    А так, если files у Вас всё же массив, то:
    var isSomeFileTooBig = this.files.some(function(file){ return file.size > 10485760 })
    if(isSomeFileTooBig) return;


    А если объект, где названия файлов - его свойства, а файлы - значения, то можно так:
    var isSomeFileTooBig = Object.values(this.files).some(function(file){ return file.size > 10485760 })
    if(isSomeFileTooBig) return;
    Ответ написан
    3 комментария
  • Как сделать скрипт обратного отсчета времени разный для всех пользователей сайта?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    1. Сохраняйте все возможные уникальные данные о данном визите (визитах) госте в таблицу типа: ip, user agent и т д. Всё, что вам нужно.

    2. Далее выбирайте дату последнего визита из базы данных на основе ip. Но учтите, что один IP может быть у нескольких гостей, например, роутер с которого все сидят. Поэтому можно еще и проверять устройство пользователя.

    Дальше, думаю, разберётесь) В куках не удобно. Очистив куки человек может иметь новый таймер на вашем сайте. Более продвинутые будут этим пользоваться. А история визитов вам понадобится может и не только для этих целей. Даже для посещений своих клиентов с аккаунтом на вашем сайье. Например, если человек имеет аккаунт на вашем сайте и авторизован, то в таблице визитов может быть колонка user_id, которая для гостей будет null.
    Ответ написан
    Комментировать
  • Как оптимизировать загрузку изображений в modx revolution?

    mishk0x29A
    @mishk0x29A
    Я для этого случая писал свой плагин для управления изображениями ресурсов.
    Если вкратце, то массив изображений хранится в MIGX, и мой плагин является обёрткой для MIGX. Но вместо блока MIGX на странице редактирования ресурса отображается мой плагин: dropzone.js и список изображений.
    Имя файла генерируется (на основе содержимого плюс немного рандома) на этапе загрузки.
    aliant-multiupload.png
    Ответ написан
    Комментировать
  • Возможно ли запустить свой скрипт на определенном отрезке времени видео YouTube (api v3)?

    @taisp_pro
    Вы можете подписаться на onReady event через конфигурацию YT.Player и внутри этого события запускать setInterval который будет получать значение time пллера через player.getCurrentTime(). Ну и исхоля из этого запускать нужные вам функции.
    Ответ написан
    2 комментария
  • Почему не работает setInterval даже на самом простом примере?

    SPAHI4
    @SPAHI4
    реактовцы - это не девы, а прокидыватели пропсов
    setInterval(alert("1"),4000);
    Первым параметром надо передавать функцию, которая будет выполняться (или ее код).
    Например,
    // так - не лучший вариант
    
    setInterval('alert("1")',4000)
    
    // Либо так 
    
    var func = function() {
      return alert("1");
    }
    setInterval(func,4000);
    
    // Либо так 
    
    setInterval(function() {
      return alert("1");
    }, 4000);
    
    // Либо вообще так (es6) 
    
    setInterval(() => alert("1"), 4000);

    Вы же передаёте результат выполнения функции alert(), а имменно - всегда undefined. При том выполнение кода блокируется до тех пор, когда alert не был принят.
    Ответ написан
    Комментировать
  • Как правильно отправить Ajax запрос на обновление количества товара на странице корзина opencart 3?

    @Nikola_Piterskiy
    Как я понимаю, страница там все таки обновляется контролером и так как значения
    value="{{ product.quantity }}"
    не обновляются на новые после update

    Сам сейчас мучаюсь с этой проблемой, но у меня шаблон на материалайзе и там по своему
    это все работает.
    Если что в телегу обращайтесь помогу, как добью этот вопрос.
    Ответ написан
    1 комментарий
  • Как добавить яндекс почту в программу Почта на Mac OS?

    @Vakan
    0. заходим в аккаунт через браузер
    1. включаем "пароли приложений", как ранее посоветовал Mr_Dr_Pr (пароль переписать на листочек, после успеха съесть)
    2. в "Почта → Все настройки → Почтовые программы" ставим галочки "с сервера imap" и "пароли приложений"
    3. на macOS запускаем программу Почта и открываем настройки / учётные записи
    4. нажимаем на экране + / другая уч.зап. / вводим имя, адрес, пароль из пункта 1
    5. появится ошибка "не удаётся проверить имя учётной записи" и окно с доп.настройками
    6. вводим имя пользователя (ваш логин на почту), тип записи imap, сервер входящий imap.yandex.ru, сервер исходящий smtp.yandex.ru
    7. после долгой проверки введённых данных, если возникает ошибка - дозаполнить пустые поля ввода, сохранить (несмотря на ошибку учётная запись создаётся и теперь можно перейти к её настройкам)
    8. в разделе "настройки сервера": имя пользователя = ваш логин, пароль из пункта 1, хост входящей почты imap.yandex.ru , убрать галочку "параметры автоматически", порт 993, поставить галочку "использовать SSL", аутентификация "пароль", доп.настройки imap (префикс пустой, сертификат TLS "нет", убрать галочку "разрешить небезопасную аутентификацию")
    9. далее здесь же настройки исходящей почты: имя пользователя = ваш логин на почту, пароль из пункта 1, имя хоста smtp.yandex.ru , убрать галочку "настроить автоматически", порт 465, поставить галочку "использовать SSL", аутентификация "пароль"
    10. нажать кнопку "сохранить"
    Ответ написан
    Комментировать
  • Как обернуть div-ом несколько элементов через jQuery?

    @web11
    Для выбора диапазон элементов можно использовать slice
    Ответ написан
    Комментировать
  • Modx pdoMenu как вывести только первый уровень?

    DanArst
    @DanArst
    Гриффиндор в моде при любой погоде!
    Если вывести только меню 1-го уровня, то наверное у них у всех один родитель и скорее всего это 0. Тогда почему бы не сделать

    [[!pdoMenu?
    &parents=`0`
    &level=`1`
    &tplOuter=`BottomMenuTplOuter`
    &tpl = `BottomMenuTpl`
    ]]


    либо через pdoResources с depth=0

    [[pdoResources?
        &parents=`1`
        &depth=`0`
        &tpl=`BottomMenuTpl`
    ]]
    Ответ написан
    2 комментария
  • Как в opencart 3 вывести похожие товары?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    какие товары считать похожими
    - определить признаки "похожести". Например по словам в названии, все товары в названии которых есть слово "кресло" считать похожими. Нужно парсить имена товаров и на основе этого создавать массивы похожих.
    Ответ написан
    4 комментария
  • Проверка строки на присутствие кириллицы?

    @zhainar
    Гуглю за вас
    if( preg_match("/[А-Яа-я]/", $text) ) {}
    Ответ написан
    Комментировать