• Symfony удаляет лишние связи ManyToMany при использовании фильтра. Как победить?

    @AlexKuznec Автор вопроса
    Решилось очень просто)
    Надо было установить свойство формы 'by_reference' => false, после чего начал использоваться метод удаления из моего Entity (переданного в форму), а не на автомате. Причем данное свойство по документации вроде как должно влиять на использование методов связанной сущности, а не переданной в форму. В трансформер вместо PersistentCollection начала передаваться ArrayCollection, видимо, из моего геттера.

    Вот тут упоминание об этом есть (основная тема, что связи не сохраняются):
    https://afilina.com/doctrine-not-saving-manytomany

    Однако вопрос прикрепления фильтра к запросу DELETE все еще актуален. Чтобы наверняка защитить данные.
    Ответ написан
    Комментировать
  • Почему не работает Codeception на чистом шаблоне Yii2?

    @AlexKuznec Автор вопроса
    Сам протупил, по какой-то инструкции установил Codeception глобально, в отдельной директории.
    Оказывается, всё встроено в шаблон и надо просто запускать
    vendor/bin/codecept run
    Ответ написан
    Комментировать
  • Как тестировать сайт автоматически с уведомлением при проваленном тесте?

    @AlexKuznec
    Вроде бы можно делать имитацию запросов. С ходу в гугле не нашел, но что-то такое попадалось, кажется, в phpMyAdmin. В Yii2 тоже видел какие-то параметры насчет имитации. Я бы копал в эту сторону.
    Теоретически, вручную можно через транзакции с обязательными откатами делать, и в случае ненормального выполнения отправлять себе письмо с ошибкой. И в базе ничего меняться не будет)
    Ответ написан
  • Какие минусы прописать все правила полей в AR модели Yii2?

    @AlexKuznec
    Вроде как ActiveRecord и реализует всё это: проверка поступающих значений, сценарии для контроля, когда какие атрибуты могут быть изменены.
    save(), кажется, тоже сохраняет только изменившиеся значения (можете покопаться в исходниках или документации, так как я в этом месте глубоко не копал).
    Как образец, можете посмотреть реализацию регистрации и логинов (несколько форм и контроллеров) в приложении advanced.
    Ответ написан
    Комментировать
  • MySQL и Yii2 GridView: фильтрация на русском языке становится регистрово-зависимой?

    @AlexKuznec Автор вопроса
    Оказалось, что проблема была в настройках подключения к базе данных, а именно, я закомментировал явную установку кодировки шрифтов.
    'db' => [
                'class' => 'yii\db\Connection',
                ...
                'charset' => 'utf8mb4',
                ...
            ],

    Явная установка кодировки превратила все русские записи из базы в каракули, но экспорт и импорт данных заново (это делалось средствами Yii2) всё решил.
    Ответ написан
    Комментировать
  • Как вывести данные в GridView с динамическим набором колонок?

    @AlexKuznec
    Можно указывать для каждой колонки параметр 'visible', примерно так:
    [
             'attribute' => 'verified',
             'visible' => is_visible('verified'),
    ],

    где is_visible некая функция или метод, или ассоциативный массив со значениями.

    В целом, смотрите исходный код виджетов и других классов, заполняйте данные по аналогии или наследуйте класс и модифицируйте сами функции. Часто это быстрее поиска ответов через гугл (но документацию тоже знать надо). Я уже много чего таким образом подправил)

    Например, чтобы DetailView не выводил пустые значения, достаточно сделать так:
    class NotNullDetailView extends DetailView
    {
        protected function normalizeAttributes()
        {
            parent::normalizeAttributes();
    
            foreach ($this->attributes as $i => $attribute) {
                if ($attribute['value'] === null || $attribute['value'] === '')
                    unset($this->attributes[$i]);
            }
        }
    }
    Ответ написан
    Комментировать
  • Yii2 ошибка триггера при попытке удалить запись?

    @AlexKuznec Автор вопроса
    Как подсказал padlyuck, Yii2 самостоятельно не обрабатывает запреты триггеров в базе на удаление, поэтому пришел в такому варианту экшена удаления:

    public function actionDelete($id)
        {
            try {
                $this->findModel($id)->delete();
                Yii::$app->session->setFlash('success', Yii::t('app', 'controller.Food.deleted'));
            } catch (\Exception $e) {
                Yii::$app->session->setFlash('error', Yii::t('app', 'controller.Food.cannot_delete'));
            }
            
            return $this->redirect(['index']);
        }
    Ответ написан
    Комментировать
  • Как сделать контроллер тонким?

    @AlexKuznec
    Не совсем понял что нужно, но в генераторе моделей Gii галочка "Generate ActiveQuery" не для вашего случая?
    Ответ написан
  • Yii2: Почему не возвращается массив?

    @AlexKuznec
    Если это просто функция, уберите "action" из названия. Экшены должны возвращать ответ сервера в виде строки (обычно html или json).
    Ответ написан
    Комментировать
  • Как отключить логирование в yii2?

    @AlexKuznec
    Чтобы отключить совсем, попробуйте убрать строчку в конфиге
    'bootstrap' => ['log']

    В других ответах так делать не советуют, но можно отключить на время, чтобы оценить, действительно ли проблема в нем.
    Ответ написан
    1 комментарий
  • Безопасно ли работать с decimal из БД?

    @AlexKuznec
    Для вещественных чисел a и b проверка на равенство с учетом погрешности выполняется так:
    abs(a - b) < eps
    где eps - малое число, изображающее погрешность.
    В вашем случае я бы попробовал eps = 0,0001 или меньше.
    Ответ написан
    4 комментария
  • Какую задать длину столбцу типа varchar, для максимально производительности?

    @AlexKuznec
    К примеру, Yii2 в миграциях по умолчанию создает varchar(255)
    Ответ написан
    Комментировать
  • Что писать фрилансеру в графе "Место, адрес работы" на получение туристической шенген визы?

    @AlexKuznec
    Я в Германию по официальному приглашению тети ездил, тоже ужасов начитался)
    Написал, что безработный (что правда), принес распечатку из банка, что на карте имеется необходимая сумма (часть из которой я внес за 5 минут до этого через банкомат, а потом снял обратно). Также принес документ, что владею долей квартиры (это для них важно, что у меня есть повод вернуться обратно в Россию), всякие машины тоже можно предоставить. Ну и благодаря приглашению бронь отеля и билеты не нужны были)
    Главное, документы без ошибок заполнить) На сайте немецкого посольства инструкция была, без нее точно накосячил бы.

    Знакомая безработная в Германию к другу ездила без приглашения. Сначала через агентство заявку подала - ей визу не дали (точно не знаю почему, но агентства периодически косячат в документах). Потом получила визу в Испанию, и этот знакомый ее оттуда забрал.
    Ответ написан
    Комментировать
  • Возможно ли качественное самообучение математике?

    @AlexKuznec
    Я вот тоже хотел заниматься ИИ, поступил и закончил факультет прикладной математики и информатики (думал, что там больше программирования, но скорее, 80% математики).

    Школьная математика по сути "детский сад" по сравнению с там, что изучали даже на первом курсе. Не всегда по сложности, сколько по глубине понимания. Например, в школе говорят, что в аксиомы надо "верить", заставляют учить доказательства теорем, корней из отрицательных чисел не существует, у квадратных уравнений может быть 0, 1 или 2 решения и т.п. В универе говорят, что аксиомы можно придумывать самому и строить из них алгебры и теории, заставляют придумывать свои доказательства теорем (на основе аксиом), рассказывают про корни из отрицательных чисел (комплексные числа), что у квадратного уравнения всегда 2 решения (у кубического - 3, и т.д.). Плюс матрицы, логика, теория вероятности, теория игр (чистая математика, если что), графы, криптография...

    В итоге знания получаются весьма обширные, но не сильно глубокие и нужные конкретно мне. Большая часть из них забывается вскоре после экзамена)

    А вот когда делаешь свой собственный проект, начинается совсем другая история. Появляются вопросы, начинаешь искать ответы, в процессе учебы эти ответы могут появиться даже в неожиданных предметах, оценки "волшебным" образом начинают расти. Но главное, найденный ответ на собственный вопрос запоминается намного лучше, чем выученный ответ на еще не заданный вопрос)

    Поэтому самообучение через разработку собственного проекта и получается намного эффективней "тупо учебы". Об этом ваша цитата про "магистров и бакалавров". А вот практикующего профессора вряд ли кто-то заткнет по умениям и знаниям) Например, модуль сборки сферических панорам из отдельных изображений как раз каким-то профессором написан, и на его основе уже сделаны программы (фактически, графические интерфейсы в нему), многие даже платные) хотя сложное математическое ядро было разработано совершенно отдельным человеком.

    Насчет ИИ - так как большая часть обучения была математикой, то основная часть так называемого "ИИ" формулировалась в виде формул, зачастую не особо сложных. Машинное обучение преподавалось поверхностно, "для случаев, когда вы не можете составить формулы процесса". Например, какой-то фантазер строит робота с ручками и ножками, чтобы он мог защищать граждан от падающего астероида) Большую часть своего труда он потратит на придание ему человеческих функций, способности двигаться, целиться, анализировать происходящее. Потенциальный круг решаемых задач может стать значительно шире изначально задуманных, но скорость разработки будет крайне низкой, и, по большей части, не связанной с поставленной задачей. А "советский инженер" составит формулы движения астероида, формулы движения ракеты, сбивающей этот астероид, вычислит точку их пересечения, области, где эта точка недопустима (населенные пункты, стратегические объекты), исходя из этих данных построит сетку расположения радаров и пусковых установок (каких-нибудь шахтных), в итоге задача решена, "искусственный интеллект" в популярном понимании отсутствует, но вся система функционирует в автоматическом режиме без участия человека (на "чистой математике"), что как бы делает ее интеллектуальной :)
    Ответ написан
    1 комментарий
  • Как передать значение свойства модели внутри её rules()?

    @AlexKuznec Автор вопроса
    Так и не разобрался, почему данные в rules() подгружаются из базы, а не load(), может быть даже разработчикам напишу) ведь код в вопросе значительно красивей того, который работает.

    В итоге добавлено поведение:
    public function behaviors()
        {
            return [
                [
                    'class' => AttributeBehavior::className(),
                    'attributes' => [
                        ActiveRecord::EVENT_BEFORE_INSERT => 'time',
                        ActiveRecord::EVENT_BEFORE_UPDATE => 'time',
                    ],
                    'value' => function ($event) {
                        // время устанавливается исходя из выбранного пользователем часового пояса
                        $model = $event->sender;
                        $datetime = new DateTime($model->usertime, new DateTimeZone($model->timezone));
                        return $datetime->getTimestamp();
                    },
                ],
            ];
        }


    И 'time' убрал из rules():
    public function rules()
        {
            return [
                [['usertime'], 'date', 'type' => 'datetime'],
                [['usertime', 'timezone'], 'required'],
                [['name', 'timezone', 'period'], 'trim'],
                [['name', 'timezone', 'period'], 'string', 'max' => 255],
               ...
            ];
        }
    Ответ написан
    Комментировать
  • Как сверстать такую тень?

    @AlexKuznec
    Мне кажется, это не тень, а градиент.
    Ответ написан
    Комментировать
  • Список часовых поясов для php?

    @AlexKuznec Автор вопроса
    Собрал нужный код, получилась такая функция, возвращающая массив для dropDownList() из Yii2 с элементами вида:

    'Asia/Krasnoyarsk' => '(UTC+07:00) Красноярск'

    Массив с двумерной сортировкой, сначала по сдвигу, потом по имени.
    Локализация пока слабовата, может быть поэтому IntlTimeZone class пока почти не документирован.

    Кстати, внутри функции устанавливается часовой пояс UTC для вычисления сдвига по времени, я не знаю область его действия. Так что используйте с осторожностью. Вообще, часть с вычислением этого сдвига мне не нравится. Если кто знает способ лучше - напишите в комментариях.

    /* robust list of timezones */
    function get_list_of_timezones($locale) {
    
        date_default_timezone_set('UTC');
    
        $identifiers = DateTimeZone::listIdentifiers();
        foreach($identifiers as $i) {
            // create date time zone from identifier
            $dtz = new DateTimeZone($i);
            // create timezone from identifier
            $tz = IntlTimeZone::createTimeZone($i);
            // if IntlTimeZone is unaware of timezone ID, use identifier as name, else use localized name
            if ($tz->getID() === 'Etc/Unknown' or $i === 'UTC') $name = $i;
            else $name =  $tz->getDisplayName(false, 3, $locale);
            // time offset
            $offset = $dtz->getOffset(new DateTime());
            $sign   = ($offset < 0) ? '-' : '+';
    
            $tzs[] = [
                'code'   => $i,
                'name'   => '(UTC' . $sign . date('H:i', abs($offset)) . ') ' . $name,
                'offset' => $offset,
            ];
        }
    
        \yii\helpers\ArrayHelper::multisort($tzs, ['offset', 'name']);
    
        // sort by offset
    //    usort($tzs, function($a, $b){
    //        if ($a['offset'] > $b['offset']) {
    //            return 1;
    //        }
    //        elseif ($a['offset'] < $b['offset']) {
    //            return -1;
    //        }
    //        elseif ($a['name'] > $b['name']) {
    //            return 1;
    //        }
    //        elseif ($a['name'] < $b['name']) {
    //            return -1;
    //        }
    //        return 0;
    //    });
    
        return array_column($tzs, 'name', 'code');
    }
    ?>
    Ответ написан
    3 комментария
  • Аутентификация на Yii?

    @AlexKuznec
    В шаблоне Advanced реализована полноценная регистрация с созданием таблицы и восстановлением пароля через почту.
    Ответ написан
    Комментировать
  • Yii2 bootstrap tabs - как сделать горизонтальную прокрутку вкладок?

    @AlexKuznec Автор вопроса
    Вот это больше подходит:
    https://github.com/mikejacobson/jquery-bootstrap-s...
    Ответ написан
    Комментировать
  • Как сделать приоритет в зависимости от расположения искомой подстроки?

    @AlexKuznec
    если встроенных методов нет, я бы прицепил к найденным строкам "вес" равный позиции искомой подстроки, и по нему сортировал. название функции не знаю, что-нибудь вроде substr(...);
    [
    ["Иваново, Московская область, Россия", 1],
    ["Сидорово, Ивановская область, Россия", 11]
    ]
    Ответ написан
    Комментировать