Ответы пользователя по тегу Yii
  • Какой гибкий и приятный text editor посоветуете для Yii2?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    Ответ написан
    Комментировать
  • Как сделать вложенные транзакции в Yii2?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    в какой последовательности запускали транзакции в такой-же последовательности нужно их закрыть, это требования драйвера PDO к БД ( AR работает через PDO, есть вложенные транзакции или нет - это смотреть мануал по СУБД)
    Работать сними нужно вот так:

    транзакция begin 1
    - транзакция begin 2
    - транзакция begin 3
    - транзакция commit/rollback 3
    - транзакция commit/rollback 2
    транзакция commit/rollback 1

    лесенкой, по другому они не работают
    Ответ написан
    Комментировать
  • Почему возникает ошибка 500 в yii2?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    http логи смотрим от сервера, затем от php.
    смотрим также логи от приложения runtime/log/app.log.
    также берем каждый запрос к бд и анализируем через explain наверняка индекса нету на большой таблице.
    можно поставить newrealic или ему подобный мониторинг и найти все что тормозит еще быстрей.
    Ответ написан
    Комментировать
  • Как синглтон превратить в DI в Yii2?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    дополню ответ Decadal

    вам тогда жужно его сделать как component

    class BaseApiClient extend yii\base\Component {
          public $url;
          public $key
     }
    если base класс не нужен лучше убрать если у вас нету фабрики клиентов, ну если еще таковой функционал нужен, то нужно будет сделать интерфейс.
    class ApiClient extend BaseApiClient {
    }


    в конфиге config/web.php
    в  секцию массива добавить components=> [
    'api'=> [
     'class' => 'namespace\вашего\клаccа',
     'url' => '',
     'key' => '',
    ]
    ]


    PS все объекты наследуемые от BaseObject или Component содержат функционал DI контейнер через конструктор
    Ответ написан
    1 комментарий
  • Почему не работает kartik DateTimePicker подтягиваемый ajax-ом?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    После получения html из ajax, js код нужно иницилизировать заново
    Ответ написан
    Комментировать
  • Как в yii2 реализовать несколько последовательных форм через AJAX?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    самый простой вариант это PJAX

    Делаете все также как и без ajax
    выводите форму 1
    отправили форму 1
    отобразили результата в виде формы если ошибка то показываете форму 1 итд.

    В нужном месте между формой ставите
    Pjax::begin
    форма
    Pjax::end
    Ответ написан
    Комментировать
  • Как обойти зависимость от yii\web\Request при unit test?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    немного некропостинга
    конфиг
    paths:
        tests: tests
        output: tests/_output
        data: tests/_data
        support: tests/_support
        envs: tests/_envs
    actor_suffix: Tester
    settings:
        bootstrap: _bootstrap.php
        colors: false
        memory_limit: 1024M
    extensions:
        enabled:
            - Codeception\Extension\RunFailed


    файл
    unit.suite.yml
    # Codeception Test Suite Configuration
    #
    # Suite for unit or integration tests.
    
    class_name: UnitTester
    modules:
        enabled:
            - Asserts
            - Yii2:
                part: [orm, fixtures, email]
                configFile: 'tests/_config/unit.php'

    файл unit.php
    \yii\helpers\FileHelper::createDirectory(\Yii::getAlias('@tests/_output/assets'));
    
    return [
        'id' => 'test-console',
        'class' => 'yii\web\Application',
        'basePath' => \Yii::getAlias('@tests'),
        'runtimePath' => \Yii::getAlias('@tests/_output'),
        'components' => [
            'request' => [
                'cookieValidationKey' => 'wefJDF8s',
                'scriptFile' => \Yii::getAlias('@tests/_output/index.php'),
                'url' => '/',      # задаем  и ошибки не будет
                'scriptUrl' => '/index.php',
            ],
            'assetManager' => [
                'bundles' => [
                    // отрубаем публикацию ассетов
                    'yii\grid\GridViewAsset' => false,
                    'yii\web\JqueryAsset' => false,
                ],
            ],
        ],
    ];
    Ответ написан
    Комментировать
  • При редиректе из контроллера в ссылку попадает "web". Как убрать "web"?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    'id' => 'test_basic',
        'name'=>'Test.App',
        'basePath' => dirname(__DIR__),
        'defaultRoute' => 'home/index',
        'components' => [
               'urlManager' => [
                'enablePrettyUrl' => true,
                'showScriptName' => false,
                'rules' => [],
            ],
         ]


    покажите ваш базовый конфиг web
    и
    конфиг ngnix или апача
    Ответ написан
    Комментировать
  • YII2 Как в выпадающем списке Html::activeDropDownList() задать value для options?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    Html:active*
    значение берется из модели, если значение не берется из модели
    1 модель пуста
    2 у модели не объявлены правила для данного свойства ( достаточно добавить в rules [['имя свойства'],safe']

    upd
    В данном случаи рекомендую сделать так 1)
    'filter' => \yii\helpes\ArrayHelper::map($items,'phone','name');

    что бы значение сохранялось при обновлении грида
    у грида должен быть задан filterModel + свойство также должно быть описано в правилах у модели.
    Ответ написан
  • Как динамический добавить правила валидации в Yii2?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    С клиент вальвацией нужно добавлять js код
    www.yiiframework.com/doc-2.0/guide-input-validatio...

    в моделях можете назначить правила под сценарии
    Ответ написан
    Комментировать
  • Как сделать валидацию через yiiActiveForm?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    В доке вроде есть такое
    www.yiiframework.com/doc-2.0/guide-input-validatio...
    Ответ написан
    Комментировать
  • Как показать полный список select2?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    Комментировать
  • Как управлять отображением label на NavBar widget?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    Создайте 2 списка если авторизованный то список такой, если не авторизован список другой.
    Yii::$app->user->isGuest
    Ответ написан
    Комментировать
  • Почему не работает logout в Yii2?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    я полагаю вы ломитесь по get запросу на logout, а у вас там разрешено только post запросы yii2 должен ответить 405 статусом ответа ( если я верно предположил )

    Уберите или добавьте
    'verbs' => [
                    'class' => VerbFilter::className(),
                    'actions' => [
                        'logout' => ['get','post'],
                    ],
                ],
    Ответ написан
  • Yii2, как создавать новые файлы в views/site?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    Ну генерировать шаблоны это тупо...
    1) Менеджер это не верстальщик а тупое существо, животное, которое может только кудахтать и спрашивать когда задача, когда задача?

    Создайте модель
    page_post страницы
    id
    slug
    content

    Нужна галерее на странице, животное отметило галочку загрузила фоточки

    Если нужно где то между контентом галерею вызвать путь менеджер ставит псевдо плесхолдеры
    выбирает готовые шаблоны
    пример простой реализации плесхолдеров
    $content = strtr($content,[
      '{photos}' => $post->is_photo ? $this->renderPhotosContent($post->photos, $post->photo_template) : '',
      '{related_page}' => $post->is_related_page ? $this->renderRelatedContent($post->id, $post->related_page_template) : '',
    ]);

    все можно запрограммировать....

    Нужны шаблоны берите битрикс Хе.
    Ответ написан
    Комментировать
  • Как загрузить несколько файлов в yii?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    папки нету uploads в директории
    web/uploads
    Ответ написан
  • Nodge - Yii2 EAuth - регистрация, Identity, как делаете вы?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    я делал отдельную таблицу для соц авторизации

    user - создовал тут запись
    +
    user_social - создовал тут запись, если пользовась авторизация через соц сеть
    vendor str (vk fb ya mr tw итд)
    user_id int
    internal_id str

    Таблица user_social использовалась только при входе или регистрации из соц.сетей
    Если нужный данные из соц сетей, я создавал агитирующие поля в таблицах user или user_profile

    UPD
    public function actions()
        {
            return [
                'social' => [
                    'class' => 'yii\authclient\AuthAction',
                    'successCallback' => [$this, 'successCallback'],
                ],
            ];
        }
    
        /**
         * @param $client
         */
        public function successCallback($client)
        {
    	$day = 86400;
            $client_id = Yii::$app->request->get('authclient');  // vk fb mr od etc
            $attributes = $client->getUserAttributes();             // result social data
    
            $userSocial = UserSocial::findOne(['client' => $client_id , 'internal_id' => $attributes['id'] ]);
            if(!$userSocial ){
    
                $user = new User;
                $user->scenario = 'social';
    
                if($user->register()){
                    $userSocial = new UserSocial;
                    $userSocial ->user_id = $user->id;
                    $userSocial ->client  = $client_id;
                    $userSocial ->internal_id = (string)$attributes['id'];
                    $userSocial ->save();
    
                    $prorile = $user->profile;
                    $prorile->first_name = $attributes['first_name'];
                    $prorile->last_name = $attributes['last_name'];
                    $prorile->save();
                }
                Yii::$app->user->login($user, $day * 366 );
                Yii::$app->session->set('auth_social',[
                    'client' => $client_id,
                    'attributes' => $attributes,
                    'token' => ''
                ]);
    
            }
            Yii::$app->user->login($user_social->user , $day * 366 );
        }

    Вот так выводил список кнопок через что авторизоватся
    <?php
            use yii\authclient\widgets\AuthChoice;
            $icons_id = [
                'vkontakte' => 1,
                'facebook' => 2,
                'tw' => 3,
                'mr' => 4,
                'odnoklassniki' => 5
            ];
            $authAuthChoice = AuthChoice::begin([
                'baseAuthUrl' => ['auth/social'],
            ]);?>
            <ul class="social-auth-list">
                <?php foreach ($authAuthChoice->getClients() as $client): ?>
                    <li>
                        <a data-popup-width="500" data-popup-height="430"
                            href="<?= $authAuthChoice->createClientUrl($client)?>"><i class="ico ico-soc-<?=$icons_id[$client->getId()]?>"></i></a>
                    </li>
                <?php endforeach; ?>
            </ul>
            <?php AuthChoice::end(); ?>

    В конфиге
    'authClientCollection' => [
                'class' => 'yii\authclient\Collection',
                'clients' => [
                    'vkontakte' => [
                        'class' => 'yii\authclient\clients\VKontakte',
                        'clientId' => '1',
                        'clientSecret' => 'vW5AYsdsd',
                        'scope' => 'friends,email,offline',
                    ],
                    'facebook' => [
                        'class' => 'yii\authclient\clients\Facebook',
                        'clientId' => '1',
                        'clientSecret' => 'vW5AYsdsd',
                    ],
                    'odnoklassniki' => [
                        'class' => 'app\components\authclient\clients\Odnoklassniki',
                        'clientId' => '1',
                        'clientSecret' => 'F12sdsd',
                        'application_public_key' => 'vW5AYsdsdsdsd',
                        'scope' => 'VALUABLE_ACCESS'
                    ],
    
                ],
            ],


    Для ватосоцсети
    <?php
    namespace app\components\authclient\clients;
    use yii\authclient\OAuth2;
    
    /**
     * Class Odnoklassniki
     * @package app\components\authclient\clients
     * Example application configuration:
     *
     * ~~~
     * 'components' => [
     *     'authClientCollection' => [
     *         'class' => 'yii\authclient\Collection',
     *         'clients' => [
     *             'odnoklassniki' => [
     *                 'class' => 'yii\authclient\clients\odnoklassniki',
     *                 'clientId' => 'app_client_id',
     *                 'clientSecret' => 'application_client_secret',
     *                 'application_public_key' => 'application_public_key',
     *                 'scope' => 'VALUABLE_ACCESS'
     *             ],
     *         ],
     *     ]
     *     ...
     * ]
     */
    class Odnoklassniki  extends OAuth2
    {
        /**
         * @inheritdoc
         */
        public $authUrl = 'http://www.odnoklassniki.ru/oauth/authorize';
        /**
         * @inheritdoc
         */
        public $tokenUrl = 'http://api.odnoklassniki.ru/oauth/token.do';
        /**
         * @inheritdoc
         */
        public $apiBaseUrl = 'http://api.odnoklassniki.ru/fb.do';
    
        public $application_public_key;
    
        /**
         * @inheritdoc
         */
        protected function initUserAttributes()
        {
           return $this->api('','GET',[
               'method' => 'users.getCurrentUser',
               'format' => 'JSON',
               'application_key' => $this->application_public_key,
               'client_id' => $this->clientId,
           ]);
        }
    
        /**
         * @inheritdoc
         */
        protected function apiInternal($accessToken, $url, $method, array $params, array $headers)
        {
            $access_token = $accessToken->getToken();
            if (count($params)) {
                $param_str = '';
                ksort($params);
                foreach ($params as $k => $v)
                {
                    $param_str .= $k . '=' . $v;
                }
                $params['sig'] = md5($param_str . md5($access_token . $this->clientSecret));
            }
            $params['access_token'] = $access_token;
            return $this->sendRequest($method, trim($url,'/'), $params, $headers);
        }
    
        /**
         * @inheritdoc
         */
        protected function defaultName()
        {
            return 'odnoklassniki';
        }
    
        /**
         * @inheritdoc
         */
        protected function defaultTitle()
        {
            return 'Odnoklassniki';
        }
    
        /**
         * @inheritdoc
         */
        protected function defaultNormalizeUserAttributeMap()
        {
            return [
                'id' => 'uid'
            ];
        }
    
    }
    Ответ написан
  • Yii2 jQuery не выполняется, как исправить?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    Создайте свой AssetBundle для сайтов

    namespace app\assets;
    use yii\web\AssetBundle;
    class ThemeDefaultAsset extends AssetBundle
    {
        public $basePath = '@webroot';
        public $baseUrl = '@web';
        public $css = [
            'css/main.css',
        ];
        public $js = [
            'js/file.js'
        ];
    
        public $depends = [
            'yii\web\YiiAsset',
            'yii\bootstrap\BootstrapAsset',
        ];
    }

    layouts
    \app\assets\ThemeDefaultAsset ::register($this);

    Если нечего не работает
    Шаг 2
    Открываем консоль
    В водим $('#header-holder') enter и смотрим что возвращается если пусто проверяем если в исходнике указанный html элемент с id=header-holder

    .click(function(){}
    уже некто не использует ( ну почти )
    используйте новый синтаксис on/off/trigger
    var selectors = {  
        opisivaeSelectorKratko: '#header-holder'
    }
    
    // not live
    $(selectors.opisivaeSelectorKratko).on('click',  function(e){
    
    });
    // live
    $('body').on('click', selectors.opisivaeSelectorKratko, function(e){
    });
    Ответ написан
    Комментировать
  • Какие фреймворки / CMF поддерживают из коробки EAV?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    Реализовывал на своих возможностях

    kazhydromet.kz
    весь сайт это сплошное EAV
    Даже погода хранится в этой структуре... ух были деньки.

    Самое сложное при разработке это создание админки под эту структуру и инструмента для выдачи данных...
    Ответ написан
    Комментировать