Чтобы установить аватарку для ранее созданного вами бота Telegram, необходимо предпринять несколько простых шагов.

  1. Открыть час с @BotFather (где вы создавали своего бота)
  2. Отправить в чат команду /setuserpic
  3. Выбрать бота из предложенного списка
  4. Загрузить в чат фото

Через несколько секунд картинка обновится. 

Бывают ситуации, когда с конца строки необходимо обрезать какой-либо символ.

Для этого подойдет функция  rtrim 

 $url = 'http://podelitsa.ru/';
$result = rtrim($url, '/');
// результат - http://podelitsa.ru

первый параметр - сама строка, второй - символы, которые необходимо удалить. Если второй параметр не указан - будут удаляться пробелы, табуляция и тд. 

Простой код, позволяющий отправить документ  в чат Телеграм (от бота):

public function sendDocument($chatID, $file){
$apiKey = 'ваш ключ';
$url = "https://api.telegram.org/bot" .
$apiKey . "/sendDocument?chat_id=" . $chatID;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);


$cFile = new CURLFile($file);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
"document" => $cFile
]);

$result = curl_exec($ch);
curl_close($ch);
}

Где {api-key} - это api ключ, который вы получили при регистрации бота.

{chat-id} - id чата с пользователем. Для того, чтобы получить этот id пользователь должен сам инициировать разговор с ботом, отправив ему /start (сейчас мы подразумеваем, что этот id у вас есть).

$file - путь до файла, который необходимо отправить.

Если у вас есть Telegram  бот и вам необходимо отправить сообщение в чат пользователю, то для этого используется метод sendMessage.

Простейший запрос будет выглядеть так:

https://api.telegram.org/bot{api-key}/sendMessage?chat_id={chat-id}&text=test

Где {api-key} - это api ключ, который вы получили при регистрации бота.

{chat-id} - id чата с пользователем. Для того, чтобы получить этот id пользователь должен сам инициировать разговор с ботом, отправив ему /start (сейчас мы подразумеваем, что этот id у вас есть).

text - отправляемый текст сообщения. 

И {api-key} и  {chat-id} указываются без скобок. Между /bot и ключом не нужно никаких разделителей или слешей.

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

function sendMessage($chatID, $message = 'тест')
{
$apiKey = 'ваш ключ';

$url = "https://api.telegram.org/bot" .
$apiKey . "/sendMessage?chat_id=" .
$chatID . '&text=' . urlencode($message);

$ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);

return $result;
}

Как параметры в функцию подаются $chatID - ID чата с пользователем, $message - текст отправляемого сообщения

Бывает такая ситуация, когда вы применяете к элементу отступ margin… но визуально ничего не меняется. 

Самая простая причина, почему отступ может не срабатывать - это потому что вы пытаетесь применить его к inline элементу (к примеру к span или к ссылке a). Бывают и другие причины, но проверить сначала лучше эту.

Как исправить : достаточно применить к элементу display: inline-block или display:  block  

Пример: 

Отступ не сработает:
<a style="margin-top: 20px;" href="#">Ссылка</a>
Сработает:
<a style="display: inline-block; margin-top: 20px;" href="#">Ссылка</a>

Сделать это достаточно просто, для этой цели в PHP предусмотрена стандартная функция ucwords

$string  = "это тестовая строка";
$result = ucwords($string);
echo $result; // Это Тестовая Строка

Чтобы прибавить или отнять у объекта в формате DateTime несколько часов (PHP), можно использовать modify.

Отнять 2 часа (от текущего времени):

$result = (new DateTime('now'))->modify('-2 hours');

Прибавить час:

$result = (new DateTime('now'))->modify('+1 hours');

Отнять день:

$result = (new \DateTime())->modify('-1 day');

Полный пример: 

$date = new DateTime('2021-09-09');
$date->modify('+1 day');
echo $date->format('Y-m-d');

Выведет результат 2021-09-10

Для получения готовой корочки вида на жительство (когда все документы уже поданы и приняты, и надо лишь забрать результат) будет необходим:

  1. Паспорт и нотариальный перевод паспорта (его не забирают т.к. другой перевод был уже предоставлен ранее)
  2. Бумага, которую вам выдали в момент принятия заявления, подтверждающая что документы были поданы
  3. Старый ВНЖ (при замене, если замена была по причине окончания сроков действия / замены на бессрочный)

Предварительная запись не требуется (если получаете в Сахарово). Перед получением лучше уточнить готовность на сайте МВД.

Бывает и так, что документы давно готовы, но на портале МВД нет сведений о готовности (не обновили статус). В таком случае необходимо также ехать лично и узнавать (лучше сразу с документами на получение - в случае готовности сможете сразу и получить документ). 

Как известно, у обладателей вида на жительства в России есть обязанность по истечению каждого года с момента его получения проходить процедуру подтверждения. 

На эту процедуру дается 2 месяца от даты получения ВНЖ (первое подтверждение нужно делать спустя год после получения). 

Бывает, что эта дата выпадает на очень не удобный участок времени. 

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

Если поменять книжку ВНЖ - то дата выдачи уже будет стоять другой, и теперь уже отсчет пойдет именно от этой даты выдачи нового документа. Так ответили в МВД, но на всякий случай уточняйте данную информацию и у своих инспекторов.  

Бывают ситуации, когда есть файл в формате pdf и его необходимо отобразить в браузере (без мгновенного скачивания в виде файла, именно открыть браузером). 

Сделать это можно с помощью данного кода:

$fileContent = //содержимое pdf  предполагается, что у вас есть готовый pdf файл 
$filename = 'myFileName.pdf';
header('Content-Type: application/pdf');
header('Content-Length: '.strlen( $fileContent ));
header('Content-disposition: inline; filename="' . $filename . '"');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
echo $fileContent;

Примечания:

  1. Код должен быть выведен в браузер до отправки каких-либо заголовков или html
  2. $fileContent - это готовый pdf файл, который загружен в переменную или из файла / из базы / создан. В рамках этой статьи не будем углубляться в подробности, откуда у вас этот файл.
  3. $filename - как будет называться по умолчанию файл, если пользователь захочет его сохранить

Если не задать в Libphonenumber регион по умолчанию, как это приведено в документации, то может вылезти ошибка “missing or invalid default region”. 

Но иногда мы не знаем, какой регион могут ввести и у нас нет региона по умолчанию. 

В этом случае ошибку легко устранить, подавая на проверку телефон в международном формате (к примеру, добавив в начало номера “+”).

К примеру:

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$numberStr = "+79885211311"; //сработает
//$numberStr = "79885211311"; //не сработает
try {
$res = $phoneUtil->parse($numberStr);
var_dump($res);
} catch (\libphonenumber\NumberParseException $e) {
var_dump($e);
}

При создании DataTable если не указать иначе, то автоматически колонки будут сортироваться по содержимому первой колонки.

Иногда это не удобно и необходимо оставить изначальную сортировку в том виде, в каком данные у нас есть.

Для этого при инициализации  DataTable нужно просто добавить пустой массив order, к примеру:

$("#myTable").DataTable(
{
order: []
}
);

Если необходимо в одной строке заменить все вхождения другой строки, то это можно сделать с помощью одной строчки кода с применением функции replaceAll:

var result = "Строка, в которой нужно заменить".replaceAll("что заменить", "на что заменить");

Пример:

 var myString = "av ggg av";
 var result = myString.replaceAll("av", "123");
 console.log(result); // выведет "123 ggg 123"

Есть 2 варианта, как это можно сделать с помощью чистого JavaScript. 

Первый вариант - если необходимо симулировать поведение HTTP редиректа (не будет записи в истории браузера):

window.location.replace("http://mysite.com");

Второй вариант - если необходим редирект, как будто кто-то перешел по ссылке (будет работать кнопка “Назад” т.к. создастся запись в истории браузера):

window.location.href = "http://mysite.com";

Перенаправление  на другую страницу также можно сделать и с помощью jQuery, но нет смысла подключать эту библиотеку только ради этого:

$(location).attr('href', 'http://mysite.com')

Иногда есть случаи. когда нужно обработать поступающую в заголовках запроса информацию. 

Если название нужного вам заголовка известно, то будет достаточно обратиться к переменной $_SERVER со значением HTTP_ + название заголовка в верхнем регистре:

$test = $_SERVER['HTTP_MYVALUE'];

В переменную $test  будет записано значение заголовка.

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

var_dump($_SERVER);

Примечание - в  $_SERVER хранятся не только все заголовки, но и другая информация о сервере. 

 Если необходимо пройтись по всем заголовкам:

foreach ($_SERVER as $name => $value){

//todo: если нужны только заголовки, то необходимо отсеить лишнее, не начинающееся с HTTP_
print_r($name); //название заголовка
print_r($value); //его значение
}

Можно написать функцию, которая вернет true/false:

function isJsonString($string) {
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
}

Смысл в том, что если ошибок при конвертировании не было - то тогда строка была в формате JSON. 

Для того, чтобы сохранить файл, который загружается с помощью cURL, подойдет такой PHP код:

$ch = curl_init();

$url = 'http://www.test.ru/'
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$out = curl_exec($ch);
curl_close($ch);


$filePath = 'myFile.txt';
$fp = fopen($filePath, 'w');
fwrite($fp, $out);
fclose($fp);

$filePath - путь файла с его названием, куда сохранять данные. 

В CentOS 8 используется новый менеджер пакетов, который поддерживает модульный формат пакетов DNF

Первоначальная настройка  

Суперадмин: 

sudo -i

Добавляем репозитории:

dnf -y install epel-release

Обновляем систему:

dnf update

Добавляем автообновление:

dnf install dnf-automatic

Устатанвливаем yum:

dnf install yum

 

Помочь в поиске ошибок при отправке в Laravel может следующее:

1. В настройках почты в файле ENV установить:

MAIL_DRIVER=log

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

2. Вывести данные конфигурации для отправки email:

dd(config('mail'));