Профиль пользователя заблокирован сроком с 25 марта 2020 г. и навсегда по причине: нарушение п. 6.6 правил сайта
Ответы пользователя по тегу Yii
  • Как мне статичный токен сдеть не из бд по api?

    @hollanditkzn Автор вопроса
    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('Доступ запрещен');
                        }
                    ],
                ]
            );
        }
    }
    Ответ написан
    Комментировать
  • Почему не фильтруются данные по дате в gridview?

    @hollanditkzn Автор вопроса
    вместо name надо поставить attribute
    Ответ написан
    Комментировать
  • Как сделать валидацию для формата телефона?

    @hollanditkzn Автор вопроса
    Я немного по другому сделал. В базе данных сделал как строка и валидацию сделал сделал по регулярному выражение
    [['phone'], 'string'],
                ['phone', 'match', 'pattern' => '/^(8)[(](\d{3})[)](\d{3})[-](\d{2})[-](\d{2})/', 'message' => 'Телефона, должно быть в формате 8(XXX)XXX-XX-XX'],
    Ответ написан
    Комментировать
  • Почему у меня не сохраняет тэги?

    @hollanditkzn Автор вопроса
    Максим Тимофеев Я решил уйти от afterSave, чтобы не путать меня и пошел по старой проверенной схеме, через контроллер.
    Покапавшись в интернете как получать такие запросы
    Zakaz => [
    'tags_array' => [
    0 => '3'
    1 => '1'
    2 => '2'
    ]
    ]

    наткнулся вот на такой пост Yii::$app->request->post('Zakaz')['tags_array'] и все очень хорошо пошло, все сохраняет и удаляет прекрасно, даже мучиться разбираться не нужно почему в afterSave не сохраняет и почему именно этот массив не обрабатывает, возможно не достаточно опыта или просто не хватает наставника, но как бы прекрасно все работает и для моего восприятие она более понятнее что откуда берется.
    Теперь контроллер постоянно громоздкий получается, потому что там не только одна модель сохраняется а уже 3 модели сохраняет и получается что create и update большой постоянно становится.
    Но вот мой код в контроллере по сохранению тэгов
    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]);
    }
    Ответ написан
    Комментировать
  • Как реализовать на yii2 сохранение chat_id telegram bot?

    @hollanditkzn Автор вопроса
    Решение данного вопроса, в контроллере TelegramController.php
    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 ? '' : 'Что-то пошло не по плану. Обратитесь в тех.поддержку';
            }
        }
    }

    В моделе Telegram.php
    <?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 "Извините, не удалось найти данный токен!";
        	}
        }
    }

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

    @hollanditkzn Автор вопроса
    Решил проблему
    <?= $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;
        }')
                        ],
                ])?>
    Ответ написан
    Комментировать
  • Как сделать так чтобы не выходили данных за страницу в виджете?

    @hollanditkzn Автор вопроса
    .grid-view td {
    white-space: inherit;
    }
    Ответ написан
    Комментировать
  • Не сохраняет файл пишет проблема err_connection_reset?

    @hollanditkzn Автор вопроса
    Да ошибся это фреймворк
    Когда прикрепляешь файл и сохраняешь в базу данных. Идет загрузка и тут выходит страница что соединение сброшено. Соответственно есть подробнее про проблему и то что там описано ничего не подходит. пишет err_connection_reset
    В контроллере
    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],
    Ошибок ничего не возникает, то есть данная проблема возникает при загрузке на сервер
    Началось примерно вчера и прикреплялись изображение
    Ответ написан
    Комментировать
  • Как реализовать запрос?

    @hollanditkzn Автор вопроса
    Решил проблему переписав
    query->andWhere(['status' => [Zakaz::STATUS_DISAIN, Zakaz::STATUS_MASTER, Zakaz::STATUS_SUC_MASTER, Zakaz::STATUS_SUC_DISAIN], 'action' => 1]);
    Ответ написан
    Комментировать