Bitrix: восстановление пароля администратора

Задача: восстановить утерянный пароль администратора

Решение 1: создать в корне сайта файл вида:

<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
global $USER;
$USER->Authorize(1);
LocalRedirect("/bitrix/admin/");

, где вместо цифры 1 можно использовать id вашего пользователя. Но обычно подходит и 1. Далее необходимо его открыть в браузере

Решение 2: если мы помним логин, и есть доступ к БД, то

  1. Ищем id пользователя с правами администратора:
select * from b_user_group where USER_ID IN (select id from b_user where email like "%vasya%") and GROUP_ID=1;

Меняем пароль на любимый:

 UPDATE b_user SET PASSWORD = MD5('test') WHERE ID=3;

PHP: как проверить, вызван ли метод класса из экземпляра, или статически

Задача: при вызове метода класса, использовать разный код в зависимости от того, как вызвана функция: статически или из класса. Т.е. результат выполнения кода:

 $tr=new TRabbit();
 $res= $tr->Producer("ocpi_queue", "Hello!");

и кода:

$res= TRabbit::Producer("ocpi_queue", "Hello!");

, должен быть разным.

Решение:

объявим в классе статическую переменную, которая будет изменять свое значение, если был создан экземпляр класса.

class TRabbit { 
    public static $isInstance=false;                 
    public function __construct(){
        self::$isInstance=true;
    }    
    public static function Producer($queue,$message,$delay=0) {  
      if (self::$isInstance==true) {
          echo "Код один\n";
      } else {
          echo "Код другой\n";
      }
    }
}

RabbitMQ: отложенные сообщения

Задача: организовать доставку сообщения «слушателю» спустя какое-то время, а не сразу

Решение: одним из способов реализации является использование модуля rabbitmq-delayed-message-exchange.

Установка для Ubuntu:

  1. Скачать подходящую версию модуля для версии вашего RabbitMQ в формате *.ez
  2. Положить его в папку (в моём случае) /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.9/plugins
  3. Включить плагин
rabbitmq-plugins enable rabbitmq_delayed_message_exchange

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

Пример постановки в очередь:



define('WUO_ROOT', dirname(__FILE__));

require_once WUO_ROOT.'/../vendor/autoload.php';
// загружаем классы
spl_autoload_register(function ($class_name) {
    require_once WUO_ROOT.'/../class/'.$class_name.'.php';
});

//Необходимые классы
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Wire\AMQPTable;

//Создаем соединение
$connection = new AMQPStreamConnection('22.357.184.20', 5672, 'цсцаучсцу', 'сысыуксыук');

//Берем канал и декларируем в нем новую очередь, первый аргумент - название
$channel = $connection->channel();

// Очередь
$channel->queue_declare('wss_messages', false, true, false, false);

// Отправляю 5 сообщений
for ($i=0;$i<6;$i++){
    $msg = new AMQPMessage("Hello All №".$i, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);		
    $msg->set('application_headers', new AMQPTable(['x-delay' => 5000]));
    $channel->basic_publish($msg, 'main');
};
echo "Messages sended\n";
$channel->close();
$connection->close();

Пример слушателя:



define('WUO_ROOT', dirname(__FILE__));
require_once WUO_ROOT.'/../vendor/autoload.php';
// загружаем классы
spl_autoload_register(function ($class_name) {
    require_once WUO_ROOT.'/../class/'.$class_name.'.php';
});

//Необходимые классы
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Wire\AMQPTable;

//Создаем соединение
$connection = new AMQPStreamConnection('22.53.14.120', 5672, 'уцмцу', 'мцукмцукм');
$channel = $connection->channel();

$channel->queue_declare('wss_messages', false, true, false, false);

$callback = function ($msg) {
        echo $msg->body;
        echo PHP_EOL;
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume('wss_messages', '', false, true, false, false, $callback);

while (count($channel->callbacks)) {
        $channel->wait();
}
$channel->close();
$connection->close();

1С: Узнать позицию в цикле

Задача: узнать текущую позицию для цикла вида

для каждого стр_расчеты из КадастроваяСтоимость цикл
конеццикла

Решение: учить матчасть (с)

для каждого стр_расчеты из КадастроваяСтоимость цикл
  поз=КадастроваяСтоимость.Индекс(стр_расчеты);
конеццикла

JavaScript: создаем и позволяем скачать csv файл

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

Решение: Для создания файла воспользуемся функцией Blob, которая позволяет оперировать с бинарными данными. Далее создадим в DOM элемент <a>, поместим в href бинарные данные и сэмулируем нажатие на ссылку. Примерно так:

  //собираем csv файл
                      csv="OKPU;P1;P2;\n";
                      data.result.forEach(function(entry) {
                        csv=csv+entry.okpu+";"+entry.P1+";"+entry.P2+"\n";  
                      });
                        let a = document.createElement("a");
                        let file = new Blob([csv], {type: 'application/csv'});
                        a.href = URL.createObjectURL(file);
                        a.download = "sender_okpu_data.csv";
                        a.click();

1 72 73 74 75 76 310