class UserController extends ActiveController
{
const TOKEN = 'secret';
public $modelClass = 'backend\models\User';
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator']['class'] = QueryParamAuth::className();
$behaviors['authenticator']['tokenParam'] = 'token';
return ArrayHelper::merge(parent::behaviors(), [
'access' => [
'class' => AccessControl::className(),
'user' => false,
'rules' => [
[
'allow' => true,
'matchCallback' => function ($rule, $action) {
$data = \Yii::$app->request->get('token');
return $data === self::TOKEN;
},
],
],
'denyCallback' => function ($rule, $action) {
throw new \yii\web\ForbiddenHttpException('Доступ запрещен');
}
],
]
);
}
}
[['phone'], 'string'],
['phone', 'match', 'pattern' => '/^(8)[(](\d{3})[)](\d{3})[-](\d{2})[-](\d{2})/', 'message' => 'Телефона, должно быть в формате 8(XXX)XXX-XX-XX'],
if ($model->load(Yii::$app->request->post()) && $client->load(Yii::$app->request->post())) {
$arr = ArrayHelper::map($model->tags, 'id', 'id');
foreach (Yii::$app->request->post('Zakaz')['tags_array'] as $one){
if (!in_array($one, $arr)){
$tag = new ZakazTag();
$tag->zakaz_id = $id;
$tag->tag_id = $one;
$tag->save();
}
if (isset($arr[$one])){
unset($arr[$one]);
}
}
ZakazTag::deleteAll(['tag_id' => $arr]);
}
use app\models\User;
use frontend\components\TelegramComponent;
use yii\db\Exception;
use yii\filters\AccessControl;
use yii\web\Controller;
use frontend\models\Telegram;
class TelegramController extends Controller
{
public function beforeAction($action)//Обязательно нужно отключить Csr валидацию, так не будет работать
{
$this->enableCsrfValidation = ($action->id !== "webhook");
return parent::beforeAction($action);
}
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['webhook'],
'rules' => [
[
'allow' => true,
'roles' => ['?'],
],
],
],
];
}
public function actionWebhook()
{
$data = json_decode(file_get_contents('php://input'), true);//Обязательно json формат
if(isset($data['message']['chat']['id']))
{
$chatId = $data['message']['chat']['id'];//Получаем chat_id
$message = isset($data['message']['text']) ? $data['message']['text'] : false;
$send = false;
if (strpos($message, '/start') !== false) {//Возвращает позицию
$explode = explode(' ', $message);//Разбивает строку на подстроки
$token = isset($explode[1]) ? $explode[1] : false;//Получаем токен
$data = [
'raw' => $token,
'chat_id' => $chatId,
];
$send = Telegram::start($data);//Сравниваем токен и если имеется схожесть то сохраняем telegram_chat_id в бд
} else {
$send = 'Комманда не найдена. Если Вы уверены в том, что ошибка, обратитесь в тех поддержку';
}
$send = $send ? '' : 'Что-то пошло не по плану. Обратитесь в тех.поддержку';
}
}
}
<?php
namespace frontend\models;
use common\models\User;
class Telegram
{
public static function start($data){
return self::login($data);
}
public static function login($data)
{
$token = $data['raw'];//берем токен который отправляем
if ($token && $user = User::findOne(['token' => $token])) {//сравниваем
if ($user->telegram_chat_id) {
return "Уважаемый $user->name, Вы уже авторизованы в системе. ";
}
$user->telegram_chat_id = $data['chat_id'];//сохраняем chat_id в бд
$user->save();
return "Добро пожаловать, $user->name. Вы успешно авторизовались!";
} else {
return "Извините, не удалось найти данный токен!";
}
}
}
<?= $form->field($client, 'phone')->widget(Select2::className(), [
'data' => ArrayHelper::map(Client::find()->all(), 'id', 'phone'),
'options' => ['placeholder' => 'Введите номер телефона'],
'pluginOptions' => [
'allowClear' => true,
'language' => [
'noResults' => new JsExpression('function () { return "<button type=\"button\" class=\"btn btn-primary btn-xs\">Добавить клиента</button>"; }'),
],
'escapeMarkup' => new JsExpression('function (markup) {
return markup;
}')
],
])?>
if ($model->load(Yii::$app->request->post())) {
$model->file = UploadedFile::getInstance($model, 'file');
if(isset($model->file))
{
$model->file->saveAs('maket/Maket_'.$model->id_zakaz.'.'.$model->file->extension);
$model->maket = 'Maket_'.$model->id_zakaz.'.'.$model->file->extension;
$model->status = 4;
}
$model->save();
return $this->redirect(['view', 'id' => $model->id_zakaz]);
[['file'], 'file', 'skipOnEmpty' => true],