cf7 Telegram: ошибка 400 при отправке сообщения

Симптомы: При отправке сообщения из контактной формы, сообщение не отправляется в бота, а в логах появляется ошибка вида:

Request has failed with error 400: Bad Request

Изучив чуть плагин, нашел непосредственную функцию отправки сообщения, и чуть её дополнил:

private function request( $url, $args ) {
....
elseif ( $http_code == 400 ) :
  error_log($response['body']);

Ошибка стала чуть вняетнее:

{«ok»:false,»error_code»:400,»description»:»Bad Request: can’t parse entities: Can’t find end of the entity starting at byte offset 289″}

Но ни сколько не понятнее… Стал рыть дальше. Отправка в wordpress осуществляется функцией:

wp_remote_post($url,$args)

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

$params=["chat_id"=>$args["body"]["chat_id"],"text"=>$args["body"]["text"],];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, ($params));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
error_log($result);
curl_close($ch);

И оно заработало.. Ну так и оставил..

PHP Smarty: обработка json массива

Задача: обработать json строку при помощи шаблонизатора Smarty

Решение: необходимо преобразовать json строку в новую переменную:

{assign var="dop_me" value=$tovar.dop_ed_izm|@json_decode}
{foreach $dop_me as $row}
{/foreach}

Никогда не было и вдруг опять..

Или разгаданная загадка почему не вставляется запись в БД с первой строкой взятой из файла. Долго думал, пока наконец не догадался поглядеть этот файл в HEX редакторе. А там…барабанная дробь..символ BOM от создателей блокнота в Windows 😉

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

        $dt = trim($dt, "\xEF\xBB\xBF"); 

YII: Шаблон модели при использовании CRUD генератора

Не понятно почему, но CRUD не создает самостоятельно модель для работы с таблицой БД. По крайне мере у меня. Потому из нескольких разрозненных кусков собрал «рыбу»:

<?php

namespace app\models;

class YandexKeys extends \yii\db\ActiveRecord{

public static function tableName(){
    return 'api_map_keys'; // Имя таблицы в БД в которой хранятся записи
}
 
public function rules(){    
        return [
            [['name', 'key'], 'required'],  // какие поля есть в таблице обязательные для добавления
        ];
    }
 
public function attributeLabels(){  // Зададим имена колонок
        return [
            'id' => 'ID',
            'name' => 'Имя',
            'key' => 'Ключ API'
        ];
 }
 
 public static function getAll(){   // выборка всех значений из БД
    $data = self::find()->all();
    return $data;
 }

}

YII2: Bad Request (#400) Unable to verify your data submissionYII2:

Такая ошибка:

Bad Request (#400) Unable to verify your data submissionYII2

может возникнуть при принудительном вызове формы с POST или GET параметрами со страницы сайта. Например:

    <form id="TheFormRoute" method="post" action="?r=site%2Fls_route_report" target="Маршруты доставки">
        <input type="hidden" id="f_count_ls" name="f_count_ls" value="" />
        <input type="hidden" id="f_route_id" name="f_route_id" value="" />
        <input type="hidden" id="f_route_name" name="f_route_name" value="" />
        <input type="hidden" id="f_period" name="f_period" value="" />
        <input type="hidden" id="f_area" name="f_area" value="" />
        <input type="hidden" id="f_area_name" name="f_area_name" value="" />
        <input type="hidden" id="f_ls_list" name="f_ls_list" value="" />
    </form>

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

    public function actionLs_route_report()    {
      Yii::$app->controller->enableCsrfValidation = false;
      return $this->render('route_report');  
    }

Как раз и приведет к подобной ошибке:

Это своеобразная защита фреймворка от потенциального флуда. Вариантов решения несколько:

Отключить проверку CSRF глобально:

    'components' => [
        'request' => [
            'enableCsrfValidation' => false,
        ],

Отключить проверку для конкретного контроллера:

class SiteController extends Controller
{
    
    public function beforeAction($action){ 
        $this->enableCsrfValidation = false; 
        return parent::beforeAction($action); 
    }    
    
    public function actionLs_route_report()    {
      return $this->render('route_report');  
    }

Или воспользоваться ПРАВИЛЬНЫМ по мнению фреймворка методом:

    <form id="TheFormRoute" method="post" action="?r=site%2Fls_route_report" target="Маршруты доставки">
        <input id="form-token" type="hidden" name="<?=Yii::$app->request->csrfParam?>" value="<?=Yii::$app->request->csrfToken?>"/>
        <input type="hidden" id="f_count_ls" name="f_count_ls" value="" />
        <input type="hidden" id="f_route_id" name="f_route_id" value="" />
        <input type="hidden" id="f_route_name" name="f_route_name" value="" />
        <input type="hidden" id="f_period" name="f_period" value="" />
        <input type="hidden" id="f_area" name="f_area" value="" />
        <input type="hidden" id="f_area_name" name="f_area_name" value="" />
        <input type="hidden" id="f_ls_list" name="f_ls_list" value="" />
    </form>
1 … 3 4 5 6 7 … 24