Задать вопрос
  • Почему при попытке записать значение в Redis через yii\redis\Cache название ключа хэшируется?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    Потому что это кеш... ключи могут быть длинными, для оптимизации ключей длинной >32 байта, или если вдруг там нестандартные символы окажутся, кодируются md5
    https://github.com/yiisoft/yii2/blob/master/framew...
    Если важно не кодировать - отнаследуйте класс yii\redis\Cache переопределите функцию buldKey на свою и используйте его. [но для кеширования результатов запросов лучше этого не делать, или сделать отдельный компонент с таким поведением]
    Но, возможно вам больше подойдёт испльзовать redis напрямую, если так важны ключи (по более весомым причинам, чем удобный просмотр в базе)
    Ответ написан
    Комментировать
  • Phpstorm: обрезается шрифт?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    выберите в Editor->Colors&Fonts дефолтную тему Darсula и убедитесь в присутствии/отсутствии проблемы. За 5 лет такой проблемы точно ни разу не возникало.
    Так же попробуйте какие-то более стандартно-системные шрифты
    Ответ написан
    Комментировать
  • Записная книжка программиста?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    evernote/gist
    Ответ написан
    Комментировать
  • Как в Yii2 внутри шаблона подключить другой шаблон?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    www.yiiframework.com/doc-2.0/guide-structure-views...
    1. Можно отрендерить подшаблон
    $this->render('another_template',['prop'=>$val]);//шаблон в этой же директории
    $this->renderFile('@app/some/path/views/another_template',['prop'=>$val]);//шаблон из другого места

    2. www.yiiframework.com/doc-2.0/guide-structure-views...
    <?php $this->beginContent('@app/views/layouts/base.php'); ?>
     //Some another content - внедрение в вывод контента вызываемого layout 
    <?php $this->endContent(); ?>

    3. Можно использовать блоки в лейаутах для пост-внедрения в структуру
    www.yiiframework.com/doc-2.0/guide-structure-views...
    Ответ написан
    Комментировать
  • Подход к реализации DI в проектах Yii2 - правильно или не очень?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    А чем классический вариант не устраивает?

    Объявите интерфейс который нужен зависимой модели и прямо в конструктор его, можно от ActiveRecordInterface унаследовать
    Пусть ваша модель будет Post с Зависимостью Comments

    interface PostCommentModelInterface // можно extends ActiveRecordInterface
         {
            /**
             * @return ActiveRecord[]|Comment[]
            **/
                public function findForPost();
    
        }
    
         class Model extends yii\base\Model
         {
               protected $commentModel;
               public function __construct(PostCommentModelInterface $commentModel, $config = [])
              {
                    $this->commentModel = $commentModel;
                    parent::__construct($config);
               }
        ]

    А зависимости региструются в начале приложения после запуска конфига, в файле bootstrap.php
    типа Yii::$container->set('\app\modules\posts\PostCommentModelInterface','\app\modules\comments\CommenModel')

    только создавать модель надо будет не new Post(), а Yii::createObject(['class'=>'\app\module\Post']) тогда автоматом зависимость подключит... ну или вручную new Post(new Comment())

    ну или альтернативный, но менее красивый вариант

    ...
         protected $commentModel;
    
          public function __construct(\yii\container\Container $container, $config = [])
          {
             $this->commentModel = $container->get('\app\modules\posts\PostCommentModelInterface'');
              parent::__construct($config);
           }
       ...


    правда смущает ваше $this->hasMany ... при extends yii\base\Model ...
    посмотрите тут про паттерны, особенно в комментах
    https://habrahabr.ru/post/183658/#comment_6392902
    Ответ написан
    4 комментария
  • Docker-compose как правильно делать rebuild?

    Insolita
    @Insolita Автор вопроса
    Отчаянная домохозяйка
    Там много....
    В том то и штука что оно не стабильно глючит, а иногда проканывает, иногда нет
    FROM php:7.0-fpm
    
    ENV DEBIAN_FRONTEND noninteractive
    
    #####################################
    # Add configuration files
    #####################################
    COPY php7/files / 
    
    #####################################
    # Non-Root User:
    #####################################
    
    ARG PUID=1000
    ARG PGID=1000
    RUN groupadd -r -g $PGID udocker && \
        useradd -r -u $PUID -g udocker -m udocker
        
    ENV PHP_USER_ID=33 \
        HOME=/home/udocker \
        PATH=/var/www/App:/var/www/App/vendor/bin:$HOME/.composer/vendor/bin:$PATH \
        TERM=linux
    
    #####################################
    # Install system packages :
    #####################################
    RUN apt-get update && apt-get -y install \
                git \
                openssl\
                libssh2-1-dev\
                libssh2-php\
                libssl-dev \
                libxml2-dev \
                libicu-dev \
                libmcrypt-dev \
                libfreetype6-dev \
                libjpeg-dev \
                libjpeg62-turbo-dev \
                libmcrypt-dev \
                libpng12-dev \
                zlib1g-dev \
                mysql-client \
                openssh-client \
                libxml2-dev \
                libpq-dev \ 
                nano \
                yui-compressor \
                linkchecker \
                librabbitmq-dev \
                nodejs \
            --no-install-recommends
    
    #####################################
    # Install PHP extensions :
    ##################################### 
    RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ && \
        docker-php-ext-configure bcmath && \
        docker-php-ext-install gd \
                               iconv\
                               intl \
                               pdo \
                               pdo_mysql \
                               pdo_pgsql \
                               mbstring \
                               mcrypt \
                               zip \
                               bcmath \
                               soap \
                               opcache
                               
       
    ENV RABBITMQ_C_VERSION 0.7.1
    RUN curl -L -o /tmp/rabbitmq.tar.gz https://github.com/alanxz/rabbitmq-c/releases/download/v$RABBITMQ_C_VERSION/rabbitmq-c-$RABBITMQ_C_VERSION.tar.gz \
     && tar xfz /tmp/rabbitmq.tar.gz \
      && rm -r /tmp/rabbitmq.tar.gz \
       && cd rabbitmq-c-$RABBITMQ_C_VERSION \
        && ./configure \
         && make \
          && make install 
    
    #собссно тоже костыли
    RUN if [ -z `php -m | grep -i "amqp"` ];then  \     
    pecl install amqp && docker-php-ext-enable amqp \
    ;fi
    
    RUN if [ -z `php -m | grep -i "redis"` ]; then \
     pecl install redis && docker-php-ext-enable redis \
    ;fi   
    
        
    #####################################
    # Composer:
    #####################################
     RUN curl -s http://getcomposer.org/installer | php && \
        mv composer.phar /usr/local/bin/composer
    
    COPY php7/composer.json /home/udocker/.composer/composer.json
    COPY php7/auth.json /home/udocker/.composer/auth.json
    
    #ENV GITHUB_API_TOKEN ${GITHUB_API_TOKEN} 
    #RUN sed -i "s/GITHUB_API_TOKEN/$GITHUB_API_TOKEN/g" /home/udocker/.composer/auth.json
    RUN chown -R udocker:udocker /home/udocker/.composer
    USER udocker
    
    RUN composer global install --prefer-dist && composer global dumpautoload --optimize
    
    #####################################
    # Node / NVM:
    #####################################
    USER root
    # Check if NVM needs to be installed
    ARG INSTALL_NODE=true
    ENV INSTALL_NODE ${INSTALL_NODE}
    RUN if [ ${INSTALL_NODE} = true ]; then \
        curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.3/install.sh | bash \
    ;fi
    ENV if [ ${INSTALL_NODE} = true ]; then \
        # Set the ENV
        NVM_DIR=/home/udocker/.nvm \
        # Install NodeJS with NVM
        RUN . ~/.nvm/nvm.sh && \
            nvm install stable && \
            nvm use stable && \
            nvm alias stable && \
            npm install -g gulp bower \
    ;fi
    
    # Wouldn't execute when added to the RUN statement in the above block
    # Source NVM when loading bash since ~/.profile isn't loaded on non-login shell
    RUN if [ ${INSTALL_NODE} = true ]; then \
        echo "" >> ~/.bashrc && \
        echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.bashrc && \
        echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm' >> ~/.bashrc \
    ;fi
    
    
    #####################################
    # CLEAN UP:
    #####################################
    
    USER root
    RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    
    
    WORKDIR /var/www/App
    CMD ["docker-run.sh"]


    docker-compose.yml
    version: '2'
    services:
      app:
        image: php:7.0-fpm
        volumes:
            - ./App:/var/www/App
        command: "true"
        restart: always
      
      nginx:
        build: ./dockerconf/nginx/
        ports:
            - 8001:80
        links:
            - php
        volumes_from:
            - app
      php:
        build:
          dockerfile: php7/Dockerfile-fpm
          context: 'dockerconf'
        links:
          - redis
          - postgres
        environment:
          - GITHUB_API_TOKEN="${GITHUB_API_TOKEN}"
          - INSTALL_NODE="${INSTALL_NODE}"
        expose:
            - 9000
        volumes_from:
            - app
        volumes:
            - ./dockerdata/logs/nginx:/var/log/nginx
      redis:
         image: redis:latest
         ports:
         - "6300:6379"
         volumes:
         - ./dockerdata/redis:/var/lib/redis
         - ./dockerdata/logs/redis:/var/log/redis
         restart: always
      
      postgres:
         build: ./dockerconf/postgres
         volumes:
           - ./dockerdata/pgsql:/var/lib/postgresql
           - ./dockerdata/logs/pgsql:/var/log/postgresql
         ports:
           - "5400:5432"
         environment:
           - POSTGRES_DB=pgdb
           - POSTGRES_USER=pguser
           - POSTGRES_PASSWORD=pgpass
    Ответ написан
    4 комментария
  • Как правильно оформить поиск по сайту?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    А что вы собственно ожидаете получить? www.yiiframework.com/doc-2.0/yii-db-queryinterface...

    like: operand 1 should be a column or DB expression, and operand 2 be a string or an array representing the values that the column or DB expression should be like. For example, ['like', 'name', 'tester'] will generate name LIKE '%tester%'. When the value range is given as an array, multiple LIKE predicates will be generated and concatenated using AND. For example, ['like', 'name', ['test', 'sample']] will generate name LIKE '%test%' AND name LIKE '%sample%'. The method will properly quote the column name and escape special characters in the values. Sometimes, you may want to add the percentage characters to the matching value by yourself, you may supply a third operand false to do so. For example, ['like', 'name', '%tester', false] will generate name LIKE '%tester'.
    or like: similar to the like operator except that OR is used to concatenate the LIKE predicates when operand 2 is an array.
    not like: similar to the like operator except that LIKE is replaced with NOT LIKE in the generated condition.
    or not like: similar to the not like operator except that OR is used to concatenate the NOT LIKE predicates.


    если хотите чтоб по каждому слову из запроса искало - то предварительно разбивайте запрос по пробелам
    public function actionSearch($query)
        {
            $subqueries = preg_split("/\s/u", $query, -1, PREG_SPLIT_NO_EMPTY);
            //Лучше потом отфильровать $subqueries убрав короткие слова или пошаманить с регуляркой что разбивало только если за пробелом слово больше n символов (чтоб Елизавета X так и осталась Елизавета X)
           // например так
           // $subqueries = preg_split("/\s(?=\w{2,})/u", $query, -1, PREG_SPLIT_NO_EMPTY)
    
            $search = Serial::find()->where(['or',['like', 'name_serial', $subqueries],['like', 'description_serial', $subqueries]]); 
            $searchDataprovider = new ActiveDataProvider([
                'query' => $search,
                'pagination' => [
                    'pageSize' => 15,
                ],
            ]);
            return $this->render('search', [
                'searchDataprovider' => $searchDataprovider
            ]);
        }
    Ответ написан
  • Как в Yii ActiveRecord получить имя вызываемого класса наследника?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    owner - это в поведениях, а так - как обычно в php php.net/manual/ru/function.get-called-class.php
    php.net/manual/vote-note.php?id=71064&page=languag...
    Ответ написан
    Комментировать
  • Как правильно вносить изменения в компонентах YII2?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    Есть компонент по типу gridview.
    Весь js находится в vendor/component/panel

    полагаю из этого следует что компонент - не есть yii-шный gridView а аналог
    свой js приложения можно хранить либо в корневой папке проекта
    Для подключения создаётся AssetBundle - наследник от соответствующего класса yii где и прописывается путь, затем бандл регистрируется в лейауте или конкретных вьюхах. www.yiiframework.com/doc-2.0/guide-structure-asset... и указанные в настройках бандла файлы будут скопированы/слинкованы в общую папку assets

    Можно сразу хранить в папке доступной из веба web/js/lib например, и тогда можно скрипт подключить во вьюхе методом registerJsFile но как правило ассетбандлы гибче

    Хотя если компонент грида используется как виджет то возможно в нем уже предусмотрена адаптация для событий поддерживаемых компонентом, и если js-кода не очень много, то можно прямо в вьюхе написать типа
    SomeGridWidget::widget([
        'prop1'=>'val1',
        'prop2'=>'val2',
        'clientOptions'=>[
               'onSomeEventCallback'=>new JsExpression('
                              function(callback_arguments){do_custom_behaviors();}
               '),
        ]
    ]);

    если кода очень немного можно прямо строкой и оставить.
    если много - вынести js-функции в отдельный js-файл а из виджета только функции вызывать.
    так же если очень часто используется с модификацией - можно отнаследовать виджет с уже предзабитыми параметрами по дефолту, и при необходимости дополненную доп.аттрибутами, чтобы не таскать по формам большую конфигурацию.
    Но тимлид однозначно прав - править файлы в вендоре не нужно. Либо наследовать (если ООП), либо на собтия предусмотренные вешаться, либо делать полностью форк с правками. Иначе после обновления пакетным менеджером будет ругаться на изменения постоянно ну и папку вендор в гит обычно не включают, при деплое зависимости подкачиваются пакетным менеджером уже на сервер согласно composer.lock
    Ответ написан
    Комментировать
  • В чем ошибка использования TimeStampBehavior в Yii2?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    return [
        'class' => TimestampBehavior::className(),
         'createdAtAttribute' => 'created_at',
         'updatedAtAttribute' => 'updated_at',
          'value' => function () {
                        return date('Y-m-d H:i:s');
          }
      ];
    Ответ написан
    Комментировать
  • Транзакции в redis?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    [b]rpoplpush
    Ответ написан
    Комментировать
  • Почему не видны методы подключенного класса в Yii2?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    Но почему-то не видит методы find. Не могу понять, почему.

    в каком смысле "не видит" - count($html->find($sel_from)) что возвращает?
    $html = SimpleHTMLDom::file_get_html($url); - вы прямо урл дёргаете? в $html результат есть?
    или не видит методов в том смысле что автокомплит не работает?
    Ответ написан
    Комментировать
  • Как организовать репозитории для разных разработчиков?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    git submodule ?
    Ответ написан
    Комментировать
  • Корпоративная политика для android-смартфонов - реально?

    Insolita
    @Insolita Автор вопроса
    Отчаянная домохозяйка
    https://trashbox.ru/topics/78324/android-for-work-...
    https://www.android.com/work/
    гугл что-то пытается предлагать, но это идёт с позиции что владелец телефона - юзер, а не компания, которая выдаёт устройство для работы.
    Ответ написан
    Комментировать
  • Как правильно работать с layuots (работа с с виджетом dmstr/yii2-adminlte-asset,)?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    передавать данные с моделей в layouts и можно ли создать и как подключить контролер который будет осуществлять передачу данных из базы данных в layouts

    Для этого создаются виджеты
    Ответ написан
  • Yii2 и Codeception: почему не работает Stub для Request компонента?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    а другие функциональные тесты срабатывают? это похоже на ошибку при неверной конфигурации функционального теста
    Ответ написан
    Комментировать
  • Как исправить ошибку тестирования Yii2 (codeception, postgresql)?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    yiiframework.ru/forum/viewtopic.php?t=7768
    там для yii1 решение но смысл тот же... это загрузчики фикстур провоцируют.
    если не используете фикстуры, то просто наследуйтесь от TestCase а не DbTestCase
    или переопределите методы checkIntegrity отнаследовав yii\test\InitDbFixture
    Ответ написан
  • Почему Yii2 не использует defaultSchema в PostgreSQL?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    в конфиге
    'db'=>[
             'class' => 'yii\db\Connection',
             .....
            'schemaMap' => [
                    'pgsql' => [
                    'class' => 'yii\db\pgsql\Schema',
                    'defaultSchema' => 'myschema', //specify your schema here
                    ]
            ],
             'on afterOpen' => function ($event) {
                    $event->sender->createCommand("SET search_path TO myschema")->execute();
             }
    ]
    Ответ написан
    Комментировать
  • Как вывести посты по времени?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    во-первых если вам нужны данные не для gridview\listview нет необходимости возвращать dataProvider в ArchiveSearch модели достаточно вернуть $query->all();
    а чтобы получить по годам - предварительно сгруппируйте массив результатов по годам
    $result = [];
             $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
             foreach($dataProvider->models as $model){
                  $result[$model->year][] = $model;
             }
             return $this->render('index', [
                        'searchModel' => $searchModel,
                        'result' => $result,
            ]);


    <?php foreach($result as $year=>$models):?>
         <h3><?=$year?></h3>
        <?php foreach($models as $model):?>
              <?=$model->data?>
         <?php endforeach?>
    <?php endforeach?>
    Ответ написан
    Комментировать
  • Как обезопасить себя при сотрудничестве с программистами-фрилансерами?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    Программистам нафиг не сдалось воровать ваш сайт. Дизайн и так легко тырится. Базу... разве что мыльники под спам, и то вряд ли. Если конечно вы не храните данные карт клиента (что запрещено по политике безопасности). Если б программист хотел свой интернет-магазин, он бы себе его давно сделал и без вашего. А перед внесением существенных изменений нормальный программист просто обязан стырить весь ваш сайт со всеми потрохами, только это бэкап называется, и в большинстве случаев он просто валяется где-нибудь на винте. Просто смотрите портфолио, отзывы, интересуйтесь наличием опыта для реализации требуемых вами правок.
    Ответ написан
    Комментировать