Задать вопрос
  • Почему нужно дважды нажать кнопку чтобы вызвать действие?

    @5465
    Проблема заключается в том, что при первом нажатии кнопки вы не вызываете метод checkAnswer(), который обновляет текущий индекс в QuizViewModel и вызывает метод result(). Поэтому при первом нажатии кнопки вы переходите на следующий вопрос, но не обновляете результат и не выводите сообщение об ответе. При втором нажатии кнопки происходит вызов метода checkAnswer(), который уже устанавливает правильный результат и вызывает result().

    Для решения этой проблемы вы можете добавить вызов метода checkAnswer() внутри блоков if в обработчиках нажатия кнопок trueButton и falseButton. Также вы можете вызвать метод result() сразу после нажатия кнопки backButton для обновления результата после перехода на предыдущий вопрос.

    Пример исправленного кода MainActivity.kt:

    trueButton.setOnClickListener { view: View ->
        checkAnswer(true)
        quizViewModel.moveToNext()
        updateQuestion()
        result()
    }
    
    falseButton.setOnClickListener { view: View ->
        checkAnswer(false)
        quizViewModel.moveToNext()
        updateQuestion()
        result()
    }
    
    backButton.setOnClickListener { view: View ->
        if (quizViewModel.currentIndex > 0) {
            quizViewModel.moveToPrevious()
            backQuestion()
            result()
        }
    }
    Ответ написан
    Комментировать
  • Как записать данные в google таблицу по скрипту?

    @5465
    В коде присутствует вызов SpreadsheetApp.flush(), который сохраняет все несохраненные изменения в таблице. Однако, я не вижу в коде вызова метода save() для сохранения изменений в таблице. Возможно, это может быть причиной того, что изменения не сохраняются.

    Попробуйте добавить следующую строку после вызова setValue():

    sheet.save();

    Также убедитесь, что у вашего скрипта есть права на редактирование таблицы. Если скрипт не имеет необходимых прав, он не сможет сохранить изменения в таблице.
    Ответ написан
  • Как получить все товары из вишлиста плагина YITH WooCommerce Wishlist?

    @5465
    Проблема заключается в том, что в цикле, где вы получаете товары для каждого вишлиста, вы используете wishlist_id => 'all'. Это означает, что вы получаете все товары из всех вишлистов вместо конкретного вишлиста, связанного с текущей итерацией цикла.

    Чтобы исправить эту проблему, замените 'wishlist_id' => 'all' на 'wishlist_id' => $wish_id:

    foreach ($wishlist_ids as $wishlist_id) {
        $wish_id = $wishlist_id['id'];
                    
        $wish_products = YITH_WCWL()->get_products( [ 'wishlist_id' => $wish_id ] );
    
        foreach ($wish_products as $wish_product) {
            $product_id = $wish_product['prod_id'];
            print($product_id . ',');
        }
    }


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

    @5465
    Проблема заключается в том, что при каждом нажатии на кнопку график создается заново и перерисовывается, а не обновляется. В данном случае вам нужно создать график только один раз и использовать его для обновления данных.

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

    Вот обновленный код, который реализует эти изменения:

    # importing various libraries
    import sys
    from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
    import matplotlib.pyplot as plt
    import random
    
    
    # main window
    # which inherits QDialog
    class Window(QDialog):
    
        # constructor
        def __init__(self, parent=None):
            super(Window, self).__init__(parent)
    
            # a figure instance to plot on
            self.figure = plt.figure()
    
            # create an axis
            self.ax = self.figure.add_subplot(111)
    
            # create a list of lines
            self.lines = []
    
            # this is the Canvas Widget that
            # displays the 'figure'it takes the
            # 'figure' instance as a parameter to __init__
            self.canvas = FigureCanvas(self.figure)
    
            # this is the Navigation widget
            # it takes the Canvas widget and a parent
            self.toolbar = NavigationToolbar(self.canvas, self)
    
            # Just some button connected to 'plot' method
            self.button = QPushButton('Plot')
    
            # adding action to the button
            self.button.clicked.connect(self.plot)
    
            # creating a Vertical Box layout
            layout = QVBoxLayout()
    
            # adding tool bar to the layout
            layout.addWidget(self.toolbar)
    
            # adding canvas to the layout
            layout.addWidget(self.canvas)
    
            # adding push button to the layout
            layout.addWidget(self.button)
    
            # setting layout to the main window
            self.setLayout(layout)
    
        # action called by the push button
        def plot(self):
            # random data
            data = [random.random() for i in range(10)]
    
            # create a line
            line, = self.ax.plot(data, '*-')
    
            # add line to the list
            self.lines.append(line)
    
            # set data for each line
            for line in self.lines:
                line.set_ydata(data)
    
            # set the y limits of the axis to fit the data
            ymin, ymax = min(data), max(data)
            self.ax.set_ylim(ymin - 0.1, ymax + 0.1)
    
            # refresh canvas
            self.canvas.draw()
    
    
    # driver code
    if __name__ == '__main__':
        # creating apyqt5 application
        app = QApplication(sys.argv)
    
        # creating a window object
        main = Window()
    
        # showing the window
        main.show()
    
        # loop
        sys.exit(app.exec_())


    Здесь мы создаем список self.lines для хранения ссылок на линии графика. В методе plot мы создаем новый график, добавляем его в список и устанавливаем данные для линий в соответствии с новыми данными, переданными в метод. Затем мы перерисовываем канву, чтобы отобразить новые данные.

    В итоге, весь код класса Window должен выглядеть так:

    class Window(QDialog):
        def __init__(self, parent=None):
            super(Window, self).__init__(parent)
    
            self.figure = plt.figure()
            self.canvas = FigureCanvas(self.figure)
            self.toolbar = NavigationToolbar(self.canvas, self)
    
            self.button = QPushButton('Plot')
            self.button.clicked.connect(self.plot)
    
            layout = QVBoxLayout()
            layout.addWidget(self.toolbar)
            layout.addWidget(self.canvas)
            layout.addWidget(self.button)
    
            self.setLayout(layout)
    
            # список для хранения ссылок на линии графика
            self.lines = []
    
        def plot(self):
            for _ in range(10):
                data = [random.random() for i in range(10)]
    
                # если линия графика уже существует, обновляем её данные
                if len(self.lines) > 0:
                    line = self.lines.pop(0)
                    line.set_data(range(len(data)), data)
                # иначе создаем новую линию графика
                else:
                    line, = self.canvas.ax.plot(range(len(data)), data, '*-')
                    self.lines.append(line)
    
            # перерисовываем канву, чтобы отобразить новые данные
            self.canvas.draw()


    Теперь при нажатии на кнопку график будет обновляться на каждой итерации.
    Ответ написан
    Комментировать
  • Исправить код не работает счётчик съеденных яблок?

    @5465
    Для того, чтобы работал счетчик съеденных яблок, необходимо убрать объявление переменной score внутри функции Tick(), так как при каждом вызове функции переменная будет обнуляться. Вместо этого, можно объявить ее глобально в начале программы и использовать в функции Tick().

    Также необходимо изменить отображение счетчика на экране, чтобы при каждом вызове функции Tick() значение счетчика выводилось на экран.

    Вот исправленный код:

    #include <SFML/Graphics.hpp>
    #include <time.h>
    
    using namespace sf;
    
    int N = 30, M = 20; //N - длина, M - ширина
    int ts = 25; //Размер каждого плитки
    
    int dir = 2, num = 4; //переменная dir отвечает за поворот, переменная num отвечает за длину змейки
    /*Как поварачивается змейка при помощи переменной dir
    dir = 1 -> лево
    dir = 2 -> право
    dir = 3 -> вверх
    dir = 0 -> вниз*/
    
    bool game = true; //переменная game отвечает за режима игры
    
    //Структура змейки отвечает за её длину
    struct Snake {
        int x, y;
        //В структуре указаны переменные x, y
        //они отвечают за координаты плитки
    } s[600];
    
    //s[] - это каждая плитка змейки
    
    //Структура яблоки
    struct Fruct
    {
        int x, y;
        //Задаём координаты яблоки
    } f;
    
    //Функция Tick отвечает за саму игру
    void Tick() {
        //Здесь находятся первичные координаты
        //Просто рисуется сама змейка
        for (int i = num; i > 0; i--) {
            s[i].x = s[i - 1].x;
            s[i].y = s[i - 1].y;
        }
    
        if (dir == 0)
            s[0].y += 1; //вниз
        if (dir == 1)
            s[0].x -= 1; //влево
        if (dir == 2)
            s[0].x += 1; //право
        if (dir == 3)
            s[0].y -= 1; //вверх
    
        //Здесь отвечает, если змейка уходит через стенку экрана
        //то она возращается на через другую
        if (s[0].x > N)
            s[0].x = 0;
        if (s[0].x < 0)
            s[0].x = N;
        if (s[0].y > M)
            s[0].y = 0;
        if (s[0
    Ответ написан
    Комментировать
  • Rbac видит права в контроллере но не видеть их в views?

    @5465
    Проверьте, что вы используете ту же самую инстанцию authManager в вашем приложении. Для того чтобы ваше приложение использовало DbManager, вы должны указать его в конфигурации вашего приложения:

    'components' => [
        'authManager' => [
            'class' => 'yii\rbac\DbManager',
        ],
        // ...
    ],


    Также проверьте, что роль 'admin' существует в вашей базе данных, и что ей назначены соответствующие разрешения.

    Если вы все еще испытываете проблемы, попробуйте отладить Yii::$app->authManager->checkAccess($userId, $permissionName, $params) для убедитесь, что ваш пользователь имеет необходимые права. Вы можете использовать третий параметр $params для передачи дополнительной информации, которую вы можете использовать для оценки разрешения.
    Ответ написан
    Комментировать
  • Как заполнить AJAX запросом (1С Битрикс)?

    @5465
    Чтобы отправить AJAX-запрос на сервер в 1С Битрикс, можно использовать функцию BX.ajax, которая предоставляется фреймворком. Например, можно использовать следующий код, чтобы отправить запрос после изменения первого select:

    BX.ready(function(){
      BX.bind(BX('marka_avto'), 'change', function() {
        var marka_avto = BX('marka_avto').value;
        BX.ajax({
          url: '/ajax/get_models.php', // путь к файлу, который будет обрабатывать запрос
          method: 'POST',
          data: {'marka_avto': marka_avto}, // данные, которые будут отправлены на сервер
          dataType: 'json', // ожидаемый тип данных в ответе
          onsuccess: function(data) {
            // здесь обрабатываем полученный ответ
            var modelsSelect = BX('models');
            modelsSelect.innerHTML = ''; // очищаем select
            data.forEach(function(model) {
              var option = new Option(model.NAME, model.ID);
              modelsSelect.add(option); // добавляем option в select
            });
          }
        });
      });
    });


    Здесь BX('marka_avto').value получает значение выбранного option в первом select. Далее отправляется AJAX-запрос на сервер, в котором передается выбранное значение как параметр marka_avto. В ответ на запрос сервер должен вернуть массив объектов в формате JSON, каждый из которых содержит ID и NAME для второго select. После получения ответа select с ID "models" заполняется новыми option в соответствии с данными, полученными из ответа.

    В файле "/ajax/get_models.php" необходимо написать код, который будет обрабатывать запрос и возвращать нужный ответ. Например, можно использовать следующий код:

    <?php
    require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
    
    $marka_avto = intval($_POST['marka_avto']);
    
    // запрос на получение моделей для выбранной марки авто
    $arFilter = array('IBLOCK_ID' => 13, 'ACTIVE'=>"Y", 'SECTION_ID'=>$marka_avto); 
    $arSelect = array('IBLOCK_ID', 'ID', 'NAME','CODE');
    $rsSect = CIBlockSection::GetList(Array("SORT"=>"ASC"), $arFilter, false, $arSelect);
    
    $result = array();
    while ($arSect = $rsSect->GetNext()) {
      $result[] = array('ID' => $arSect['ID'], 'NAME' => $arSect['NAME']);
    }
    
    echo json_encode($result);
    ?>


    Здесь после получения значения параметра marka_avto выполняется запрос на получение моделей из базы данных и формируется массив $result с данными для заполнения второго select. После этого массив преобразуется в JSON и отправляется в ответ на AJAX-запрос.
    Ответ написан
    Комментировать
  • Как в NativeScript можно использовать *.so зависимости?

    @5465
    Для использования .so библиотек в NativeScript для Android, необходимо создать директорию app/src/main/jniLibs в корне проекта NativeScript, если ее еще нет, и поместить туда нужные библиотеки.

    Вы можете создать папку jniLibs в корне проекта NativeScript с помощью следующей команды в консоли:

    mkdir -p app/src/main/jniLibs

    Затем вы можете разместить библиотеки .so в этой папке. Ваш файловый путь должен выглядеть так:

    app/src/main/jniLibs/armeabi/libname.so

    где libname.so - это имя библиотеки, которую вы хотите использовать. Обратите внимание, что armeabi может быть заменено на другую архитектуру, например, arm64-v8a для устройств на базе ARM64.

    После этого вы можете запустить ваше приложение NativeScript на устройстве Android, и библиотеки .so будут использоваться автоматически.

    Обратите внимание, что если вы используете NativeScript с Angular, вам нужно создать директорию jniLibs внутри директории app вашего проекта Angular, а не в корневой директории вашего проекта NativeScript.
    Ответ написан
    Комментировать
  • Почему не доходит письмо nodemailer на nodejs?

    @5465
    Если у вас нет никаких ошибок в консоли, то проблема может быть связана с настройками безопасности вашей почты. Некоторые почтовые провайдеры, такие как Google и Yandex, могут блокировать доступ к вашей почте из-за низкого уровня безопасности. Для того чтобы разрешить отправку писем, вы можете настроить "доступ к устаревшим приложениям" в настройках вашей почты.

    Для Gmail вам необходимо:

    Перейдите на страницу "Безопасность" в вашей учетной записи Google.
    Прокрутите вниз до раздела "Доступ к устаревшим приложениям" и нажмите на "Включить доступ".
    Создайте пароль для приложения. В качестве имени приложения введите "Node.js", например.
    Используйте новый пароль вместо вашего обычного пароля при отправке письма.
    Если проблема не в этом, вы можете попробовать использовать другой сервис отправки писем, например, SendGrid или Mailgun. Также убедитесь, что вы правильно указали параметры для подключения к серверу, такие как порт и протокол (secure).

    Пример кода для отправки письма через SendGrid:

    const sgMail = require('@sendgrid/mail');
    sgMail.setApiKey(process.env.SENDGRID_API_KEY);
    
    const msg = {
      to: 'получатель@почта.com',
      from: 'отправитель@почта.com',
      subject: 'Тема письма',
      text: 'Текст письма',
      html: '<p>HTML версия письма</p>',
    };
    
    sgMail.send(msg)
      .then(() => console.log('Письмо успешно отправлено'))
      .catch((error) => console.error(error));


    Вам нужно установить библиотеку @sendgrid/mail через npm и создать API ключ в вашей учетной записи SendGrid. Затем вы можете использовать метод send для отправки письма с заданными параметрами.
    Ответ написан
    Комментировать
  • Как выдернуть определенное значение из cookie по ключу из WebView в Xamarin для Android?

    @5465
    В Xamarin.Android вы можете использовать нативные классы CookieContainer и CookieCollection из пространства имен System.Net.

    Для того чтобы получить CookieCollection из WebView вы можете использовать следующий код:

    // Получаем экземпляр класса CookieManager
    var cookieManager = Android.Webkit.CookieManager.Instance;
    // Получаем все куки
    var cookieString = cookieManager.GetCookie(url);
    // Создаем новый экземпляр CookieContainer
    var cookieContainer = new CookieContainer();
    // Парсим куки и добавляем их в CookieContainer
    var cookies = cookieString.Split(';');
    foreach (var cookie in cookies)
    {
        cookieContainer.SetCookies(new Uri(url), cookie);
    }
    // Получаем CookieCollection
    var cookieCollection = cookieContainer.GetCookies(new Uri(url));


    Здесь мы используем метод GetCookie из CookieManager для получения куков в виде строки. Затем мы создаем новый экземпляр CookieContainer, разбиваем строку с помощью Split и добавляем каждую куку в CookieContainer. И наконец, мы получаем CookieCollection с помощью метода GetCookies у CookieContainer.

    Теперь вы можете получить значение куки по ключу, используя следующий код:

    var cookie = cookieCollection["key"];
    var cookieValue = cookie?.Value;


    Где "key" - это имя куки, значение которой вы хотите получить. Обратите внимание, что значение куки может быть null, если такой куки не существует.
    Ответ написан
    Комментировать
  • Как отправить видео в телеграм бот без загрузки на компьютер и в режиме стриминга?

    @5465
    Для отправки видео в телеграм бота без загрузки на компьютер и в режиме стриминга, вы можете использовать модуль requests и метод post из библиотеки python-telegram-bot для отправки видео на сервер телеграма.

    Вам необходимо изменить код таким образом, чтобы он читал видео блоками и отправлял их на сервер телеграма. Для этого вам понадобится использовать метод requests.post с параметрами для отправки частей файла.

    Пример кода, который может помочь вам реализовать задачу:

    import telebot
    import requests
    
    TOKEN = 'YOUR_TOKEN'
    bot = telebot.TeleBot(TOKEN)
    
    @bot.message_handler(commands=['start'])
    def start(message):
        stream_url = 'https://cdn-r4-cache.soap4youand.me/adad6ec937715da5d9d34f907c2b873f1ac57303/5548/ad29d13d480c8f2455ef747283e10f52/'
    
        with requests.get(stream_url, stream=True) as r:
            total_size = int(r.headers.get('content-length', 0))
            if total_size == 0:
                bot.send_message(message.chat.id, 'Failed to retrieve video from URL')
                return
    
            headers = {'Content-Type': 'video/mp4'}
            url = f'https://api.telegram.org/bot{TOKEN}/sendVideo'
    
            for chunk in r.iter_content(chunk_size=1024*1024):
                if chunk:
                    try:
                        response = requests.post(url, data={'chat_id': message.chat.id}, headers=headers, files={'video': chunk}, timeout=30)
                        response.raise_for_status()
                    except Exception as e:
                        print(f'Error sending chunk: {e}')
                        bot.send_message(message.chat.id, 'Error sending video chunk')
                        break
    
    bot.polling()


    В этом примере мы отправляем видео блоками размером 1 МБ, используя метод requests.post для отправки каждого блока на сервер телеграма. Мы также добавляем параметр timeout, чтобы прервать отправку, если что-то идет не так. Вы можете настроить размер блока (chunk_size) в соответствии с вашими потребностями.
    Ответ написан
    Комментировать
  • PHPMailer не отправляет письма на почту?

    @5465
    Возможно, есть несколько причин, по которым PHPMailer не отправляет письма:

    Не правильно настроены параметры SMTP. Проверьте параметры SMTP-сервера в настройках PHPMailer. Возможно, нужно установить другой порт или проверить правильность имени пользователя и пароля.

    Необходимо проверить, не заблокирован ли SMTP-сервер или IP-адрес, с которого вы пытаетесь отправить письмо. Некоторые SMTP-сервера блокируют запросы с некоторых IP-адресов для защиты от спама.

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

    Чтобы понять, на какую кнопку нажал пользователь, можно использовать атрибут "name" у каждой кнопки и проверять его значение в PHP:

    <button class="btn btn-primary m-t-30 m-r-20" type="submit" name="action" value="buy">Купить участок</button>
    <button class="btn btn-primary m-t-30" type="submit" name="action" value="sell">Продать участок</button>


    Затем в PHP можно проверить значение этого атрибута:

    if ($_POST['action'] == 'buy') {
      // кнопка "Купить" нажата
    } elseif ($_POST['action'] == 'sell') {
      // кнопка "Продать" нажата
    }
    Ответ написан
    Комментировать
  • Не могу понять почему не запускается сайт?

    @5465
    Похоже, что проблема в отсутствии файла или сборки "Test_Vitacor_Web_CLinic" либо одной из их зависимостей. Судя по сообщению об ошибке, эта сборка не была найдена, возможно, из-за ее отсутствия или неправильного пути к ней. Проверьте, существует ли файл или сборка и правильно ли указан путь к ней. Также, возможно, необходимо проверить наличие всех зависимостей, которые требуются для запуска этой сборки. Если это не поможет, попробуйте выполнить трассировку загрузки сборки, чтобы выяснить, какие зависимости отсутствуют.

    Ниже приведен пример кода на языке C#, который показывает, как выполнить трассировку загрузки сборки:

    using System.Diagnostics;
    
    namespace MyNamespace
    {
        class MyClass
        {
            static void Main(string[] args)
            {
                // Имя сборки, которую не удается найти
                string assemblyName = "Test_Vitacor_Web_CLinic";
    
                try
                {
                    // Загрузка сборки
                    var assembly = System.Reflection.Assembly.Load(assemblyName);
    
                    // Вывод информации о загруженной сборке
                    Console.WriteLine("Assembly Name: {0}", assembly.FullName);
                    Console.WriteLine("Location: {0}", assembly.Location);
                }
                catch (Exception ex)
                {
                    // Вывод сообщения об ошибке
                    Console.WriteLine("Error: {0}", ex.Message);
    
                    // Выполнение трассировки загрузки сборки
                    var trace = new StackTrace(ex, true);
                    Console.WriteLine("Stack Trace:");
                    for (int i = 0; i < trace.FrameCount; i++)
                    {
                        var frame = trace.GetFrame(i);
                        Console.WriteLine("{0}: {1}", i, frame.ToString());
                    }
                }
    
                Console.ReadLine();
            }
        }
    }


    Этот код попытается загрузить сборку с именем "Test_Vitacor_Web_CLinic". Если загрузка не удалась, будет выведено сообщение об ошибке и выполнена трассировка загрузки сборки. Результаты трассировки будут выведены на консоль в формате стека вызовов.
    Ответ написан
    Комментировать
  • Как добавить фото из input на одной html странице, в блок div на другой html странице?

    @5465
    Для того, чтобы добавить фото из input на одной HTML странице в блок div на другой HTML странице с помощью JavaScript, вам нужно выполнить следующие шаги:

    В admin.html после успешной загрузки файла, сохраните имя загруженного файла в локальном хранилище с помощью localStorage.setItem(). Например:

    localStorage.setItem('imageName', file.name);

    Перейдите на страницу index.html с помощью window.location.href или window.location.replace(). Например:

    window.location.replace("index.html");

    В index.html, используйте JavaScript для получения значения имени файла из локального хранилища с помощью localStorage.getItem(). Например:

    var imageName = localStorage.getItem('imageName');

    Затем, используйте полученное имя файла, чтобы создать новый элемент img и добавить его в блок div с идентификатором uploaded-image. Например:

    var img = document.createElement('img');
    img.src = 'assets/img/' + imageName;
    document.getElementById('uploaded-image').appendChild(img);


    Важно отметить, что вы должны сохранить загруженный файл в папку на сервере, а затем использовать правильный путь к этому файлу при создании элемента img. Например, если вы сохраните загруженный файл в папку assets/img, то путь к файлу будет assets/img/имя_файла.
    Ответ написан
  • Почему YII2 API test не видит изменения в базе?

    @5465
    Проблема, вероятно, связана с кэшированием в Yii2. Одна из возможных причин заключается в том, что модель User кэшируется в процессе выполнения теста, поэтому изменения, внесенные в базу данных, не отражаются в объекте модели, полученном тестом.

    Вы можете попробовать использовать метод refresh() модели User, чтобы обновить ее свойства из базы данных перед проверкой значения auth_key.

    Ваш код в конце теста может выглядеть так:

    // checking auth_key clearing
    $lastRecord->refresh(); // добавить эту строку
    $this->assertSame('', $lastRecord->auth_key, 'Auth key is not cleared after otp submission');


    Если это не поможет, попробуйте добавить следующие строки в начало теста, чтобы убедиться, что модели User не кэшируются:

    // Clearing cache for User model
    Yii::$app->cache->flush();
    Yii::$app->db->close();
    Yii::$app->db->open();


    Эти строки очистят кэш модели User и переоткроют соединение с базой данных.

    Если вы все еще не можете получить ожидаемое значение auth_key, может быть полезно проверить, выполняется ли изменение значения auth_key на стороне сервера API, чтобы исключить возможность ошибки в вашем коде.
    Ответ написан
    Комментировать
  • Как правильно сохранить значение поля selected при использовании ($user_id)?

    @5465
    Чтобы сохранить значение поля выбора количества часов при использовании $user_id, вам нужно получить значение этого поля из массива $_POST и сохранить его в мета-поле пользователя с помощью функции update_user_meta(). Для того, чтобы получить значение поля, вы можете использовать $_POST['global_ex_hour_vendor'], так как имя поля в HTML-коде задано как name="global_ex_hour_vendor". Вот как вы можете изменить функцию save_field_delivery_express():

    //save the field in database
    add_action('mvx_save_custom_store', 'save_field_delivery_express', 10, 1);
    function save_field_delivery_express($user_id){
        
        $vendor_delivery_express = $_POST['_vendor_delivery_express'];
        update_user_meta($user_id, '_vendor_delivery_express', $vendor_delivery_express);
        
        $express_delivery_hour_vendor = isset($_POST['global_ex_hour_vendor']) ? sanitize_text_field($_POST['global_ex_hour_vendor']) : '';
        update_user_meta($user_id,'global_ex_hour_vendor', $express_delivery_hour_vendor);
    
    }


    В этом коде мы получаем значение поля global_ex_hour_vendor с помощью $_POST['global_ex_hour_vendor'], затем используем функцию sanitize_text_field() для очистки этого значения от потенциально опасных символов и сохраняем его в мета-поле пользователя с помощью update_user_meta(). Обратите внимание, что мы сначала проверяем, установлено ли значение global_ex_hour_vendor в $_POST, используя isset(), чтобы избежать ошибки, если значение не установлено.

    Надеюсь, это поможет вам сохранить значение поля при использовании $user_id.
    Ответ написан
    1 комментарий
  • Почему не работает responsive в slick slider?

    @5465
    Проблема может быть связана с тем, что вы используете относительную ширину min(750px, 85%) для элемента с классом .slider, а не задаете ему явно ширину в пикселях. Slick slider может иметь проблемы с вычислением правильной ширины элемента при использовании относительных единиц измерения.

    Попробуйте задать явно ширину для элемента .slider в пикселях, например:

    .slider{
        width: 750px;
        margin: 0 auto;
        ...
    }


    Если это не поможет, попробуйте добавить в настройки responsive параметр slidesToShow, чтобы явно указать количество слайдов, отображаемых при разных ширинах экрана. Например:

    responsive: [
        {
            breakpoint: 768,
            settings: {
                arrows: false,
                dots: true,
                slidesToShow: 1
            }
        }
    ]


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

    @5465
    Для реализации такой функциональности, вам необходимо добавить обработчик событий on_guild_join, который будет вызываться каждый раз, когда ваш бот присоединяется к новому серверу. В обработчике событий вы можете проверить наличие роли с нужным именем в сервере и, если ее нет, создать новую роль.

    Вот пример кода на основе вашего скрипта, который реализует эту функциональность:

    import os
    import disnake
    from disnake.ext import commands
    from func import *
    
    token = "токен"
    
    activity = disnake.Activity(
        name="v!help",
        type=disnake.ActivityType.watching,
    )
    
    bot = commands.Bot(command_prefix="v!", help_command=None, intents=disnake.Intents.all(), activity=activity)
    
    # Функция для создания роли, если ее не существует
    async def create_role(guild):
        role_name = "Название роли"
        role = disnake.utils.get(guild.roles, name=role_name)
        if role is None:
            role = await guild.create_role(name=role_name, reason="Роль создана ботом")
        return role
    
    if not os.path.exists("guilds.json"):
      with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/guilds.json", "w") as file:
        file.write("{}")
        file.close()
    if not os.path.exists("mutedroles.json"):
      with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/mutedroles.json", "w") as file:
        file.write("{}")
        file.close()
    
    
    @bot.event
    async def on_ready():
      for guild in bot.guilds:
        with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/guilds.json", "r") as file:
          data = json.load(file)
          file.close()
    
        with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/guilds.json", "w") as file:
          data[str(guild.id)] = str(guild.name)
          json.dump(data, file, indent=4)
          file.close()
    
        # Вызов функции создания роли
        role = await create_role(guild)
        print(f"Роль {role.name} создана в сервере {guild.name}.")
    
      print(f"Бот {bot.user} к вашим услугам!!!")
    
    
    # Обработка ошибок
    @bot.event
    async def on_command_error(ctx, error):
      print(error)
    
      if isinstance(error, commands.MissingPermissions):
        await ctx.send(f"{ctx.author}, у вас не достаточно прав!")
      elif isinstance(error, commands.UserInputError):
        await ctx.send(embed=disnake.Embed(
          description=f"Правильное использование команды: `{ctx.prefix}{ctx.command.name}` ({ctx.command.brief})\nExample: {ctx.prefix}{ctx.command.usage}"
        ))
    
    
    @bot.slash_command()
    async def load(ctx, extension):
      if ctx.author.id == 623446417268277268:
        bot.load_extension(f"cogs.{extension}")
        await
    Ответ написан
    Комментировать
  • Как автоматизировать печать xls без ошибок?

    @5465
    Проблема возникает из-за того, что скрипт перемещает файлы из папки "G:\Мой диск\Печать" в ту же папку с измененным именем. При этом, если Excel не успевает закрыть файл до следующей попытки печати, то скрипт снова перемещает файл, прибавляя к нему еще одно ".xls".

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

    Option Explicit : Dim objWord, objDoc, wssh, objFS, objShell, objPath, objFolder, objItem
    
    Set wssh = CreateObject("WScript.Shell")
    Set objFS = CreateObject("Scripting.FileSystemObject")
    Set objPath = objFS.GetFolder("G:\Мой диск\Печать") 'Папка, из которой производится печать
    Set objTempFolder = objFS.CreateFolder("G:\Мой диск\Temp") 'Временная папка для файлов перед печатью
    
    Do
    PrintDelInFolder objPath
    WScript.Sleep 3000
    Loop
    
    Sub PrintDelInFolder(objFolder)
    For Each objItem In objFolder.Files
    If StrComp(objFS.GetExtensionName(objItem.Name), "xls", vbTextCompare) = 0 Then
    With wssh
    WScript.Sleep 1000
    On Error Resume Next
    dim f
    f = Cstr(objTempFolder.Path & "" & objItem.Name)
    objFS.MoveFile objItem.Path, f
    If err.number=0 then
    Set objShell = CreateObject("Shell.Application")
    objShell.ShellExecute f, "vbHide", "", "print", 0
    set objShell = nothing
    err.Clear
    Do
    WScript.Sleep 9000
    objFS.DeleteFile f ,true
    Loop While objFS.FileExists(f)
    err.Clear
    End If
    On Error Goto 0
    End With
    End If
    Next
    End Sub
    WScript.Quit 0


    В этом коде создается новая папка "G:\Мой диск\Temp", в которую перемещаются файлы перед печатью. После печати файлы удаляются из этой папки. Попробуйте использовать этот код и проверить, решает ли это вашу проблему.
    Ответ написан
    3 комментария
  • Как исправить ошибку в регулярных выражениях fail2ban-regex?

    @5465
    В файле конфигурации sasl.conf у вас неправильно указано регулярное выражение failregex. Вместо вы должны указать группу захвата, чтобы fail2ban мог правильно определить IP-адрес. Попробуйте заменить строку

    warning: (.*)\[\]: SASL LOGIN (.*)authentication failed:


    на

    warning: (.*)\[<HOST>\]: SASL LOGIN (.*)authentication failed:


    Также убедитесь, что путь к файлу конфигурации указан правильно в fail2ban.conf. По умолчанию путь выглядит как /etc/fail2ban/jail.conf, но может отличаться в зависимости от вашей системы.
    Ответ написан
    Комментировать