• Почему приходит по три писма за раз?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Вы можете случайно нажимать два раза на перезагрузку. Браузер при потере соединения пытается сам перезагрузить. Может быть цикл кто-то есть. Функция mail тут не причём. Вариантов много, данных мало.
    Ответ написан
    3 комментария
  • Как декодировать Base64 с сохранением UTF-8?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    $str = '0K3RgtC+INC30LDQutC+0LTQuNGA0L7QstCw0L3QvdCw0Y8g0YHRgtGA0L7QutCw';
    echo base64_decode($str);
    Ответ написан
    Комментировать
  • Если запретить выполнение php в определенном каталоге, это будет безопасно?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Запретите создание файлов php. Для этого можно использовать возможности сервера, но лучше делать это на уровне кода и в дополнение использовать сервер.
    Ответ написан
  • Как отключить редирект у пользователей?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">

    header('Expires: Sat, 03 Aug 2013 00:00:00 GMT');
    header('Last-Modified: ' . gmdate( 'D, d M Y H:i:s') . ' GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: post-check=0, pre-check=0', false);
    header('Pragma: no-cache');


    Можете углубиться в урок.
    Ответ написан
    Комментировать
  • Как раскодировать строку ASCII?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    $str = 'aHR0cHM6Ly9yb29tYmF6YS5ieS93cC1jb250ZW50L3VwbG9hZHMvbGlzdGluZy11cGxvYWRzL2F2YXRhcnMvMjAyMC8wNi9hYWExLTEwLmpwZw';
    echo base64_decode($str);
    Онлайн проверка.
    Ответ написан
    Комментировать
  • Где найти ссылки на хорошие yii2 проекты, где можно изучить хороший код?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Очень сложных проектов на Yii2 с открытым, да ещё и хорошим кодом очень мало)) Прежде всего, потому что Yii создан для быстрой разработки нарушая все правила сложных архитектур. А учитывая его устарелость, то тем более таких проектов мало. На форуме давно обсуждался этот вопрос. Там есть ссылки на проекты и код. Так же на сайте yiipowered.com есть список проектов, у некоторых с исходным кодом.

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

    Если по теме, то начните изучать или искать DDD, CQRS, SOA, Микросервисы. В принципе это основные архитектурные подходы в разработке. На Yii по DDD есть хороший пример. Однако начинать НОВЫЙ проект на Yii2 используя даже самую сложную архитектуру - путь в никуда. Yii2 создан для других целей. Чтобы понять можно посмотреть ответ на вопрос: Актуален ли Yii2 Фреймворк в 2020?
    Ответ написан
    Комментировать
  • Как вычислить разницу дат в рабочих днях?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Вам нужно создать свой Производственный календарь.

    Производственный календарь – это специальный календарь, который составлен с учетом праздников и выходных дней на текущий год. Он составляется на основе постановлений правительства Российской Федерации. На основании этого календаря специалисты кадровых служб составляют рабочие графики, определяют число рабочих часов за месяц и начисляют заработную плату. Производственный календарь показывает достоверную и точную информацию о том, какие дни являются выходными, праздничными, либо сокращенными рабочими.

    Данные можно хранить в базе данных в виде таблицы holidays (Календарь праздничных и переносимых дней). Пример. Чтобы не придумывать велосипед и каждый раз вбивать эти дни, то в интернете есть много решений, которые предоставляют эти данные:

    1. Открытые данные России. Скачиваете последнюю версию, пишите свой конвектор, записываете к себе в базу. Имеется готовый парсер.
    2. isDayOff() - публичный api по Производственному календарю. Вы можете передать дату и получить всю информацию. Пример: Получение данных за год.
    3. Xmlcalendar - Производственный календарь в виде XML. Имеется готовый парсер 1 и парсер 2.
    4. Консультант плюс - Производственный календарь. Имеется готовый парсер 1, парсер 2 и парсер 3.


    В конечном итоге, на основе этих данных вы можете выводить: календарь, статистику и информацию о нерабочих днях, основываясь на ваших данных. Пример. А так же применять различные фильтры и выборку дней.
    Ответ написан
    Комментировать
  • Как реализовать данную таблицу?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    $courses = [1,2,3,4,5]; // значения из базы или уникальные значения из массива всей колонки курсов.

    Заголовки:
    <?php foreach($courses as $course): ?>
    <th>
      <td><?= $kurs;  ?></td>
    </th>
    <?php endforeach; ?>

    Строки:
    <?php foreach($courses as $course): ?>
    <tr>
      <?php foreach($items as $item): ?>
         <?php if ($course === $item['kurs']): ?>
         <td><?= $item['name_group'];  ?></td>
         <?php else: ?>
         <td><?= $item['name_group'];  ?></td>
         <?php endif; ?>
    </tr>
    <?php endforeach; ?>
    Ответ написан
    Комментировать
  • Как добавить систему модулей в hmvc?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Зачем вам это придумывать, когда это уже есть либо в Yii2 модули, либо на примере Symfony Bundle? В целом вы правильно мыслите. Примерно так и работает Yii2. Поэтому можете посмотреть пример на этом фреймворке.

    А вообще система модулей стараются исключать в современных фреймворках. Например, в Yii3 уже их не будет. Модули в приложении разделяться только по namespace и эти модули не общаются друг к другу на прямую. У вас будут такие папки вроде Blog, Shop, Comment, CRM и так далее.
    Ответ написан
  • Как в php выбрать определенные элементы из массива?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Используйте функцию array_filter() или простой перебор массива foreach и проверяйте в нём условие. В функции array_filter() есть callback в которую можно передать анонимную функцию и в ней сделать условие.

    Чтение файла полностью
    Если нам надо прочитать файл полностью, то мы можем облегчить себе жизнь, применив функцию file_get_contents():
    $str = htmlentities(file_get_contents("auth.txt"));
    echo $str;

    При этом нам не надо открывать явно файл, получать дескриптор, а затем закрывать файл.

    Поблочное считывание
    Также можно провести поблочное считывание, то есть считывать определенное количество байт из файла с помощью функции fread():
    $fd = fopen("auth.txt", 'r') or die("не удалось открыть файл");
    while(!feof($fd)) {
        $str = htmlentities(fread($fd, 600));
        echo $str;
    }
    fclose($fd);


    Конечно, это пример на простых функциях PHP без всякого ООП и инкапсуляции. Если не хотите заморачиваться есть готовая хорошая библиотека для работы с файлами flysystem
    Ответ написан
    Комментировать
  • Как отклонить вход пользователю с определённой ролью на Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Не очень понятно почему в методе actionLogin() Вы используете такую сложную конструкцию, которая, в данном случае, не имеет особого смысла. На вашем примере можно попользоваться функцией:
    Yii::$app->getAuthManager()->checkAccess(32, 'admin')

    Данная функция позволит проверять доступ для остальных пользователей. Хорошая практика — использоовать ошибки в виде исключений с ошибкой 403 и сообщением:
    public function actionLogin()
    {
        $model = new LoginForm();
        $model->password = ''; // перенести в метод rules формы, как default
    
        if($model->load(Yii::$app->request->post()) && $model->login()){
            $user = User::findOne(['username' => $this->username]);
            if(Yii::$app->getAuthManager()->checkAccess($user->getId(), 'admin')){
                throw new ForbiddenHttpException('Ошибка доступа');
            }
    
            return $this->goHome();
        }
    
        return $this->render('login', [
            'model' => $model
        ]);
    }

    Если же вам нужно использовать проверку для текущего пользователя - это вполне можно вынести в поведения:
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'actions' => ['create', 'update'],
                        'allow' => true,
                        'matchCallback' => function ($rule, $action) {
                            /** @var User $identity */
                            $identity = Yii::$app->user->getIdentity();
                            return $identity->isAdmin(); // или другая проверка
                        }
                    ],
                ],
            ],
        ];
    }

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'actions' => ['create', 'update'],
                        'allow' => true,
                        'roles' => ['admin']
                    ],
                ],
            ],
        ];
    }

    Значение опции allow выбранного правила указывает, авторизовывать пользователя или нет. Если ни одно из правил не совпало, то пользователь считается НЕавторизованным, и фильтр ACF останавливает дальнейшее выполнение действия. По умолчанию, когда у пользователя отсутствует доступ к текущему действию, ACF делает следующее:
    • Если пользователь гость, вызывается yii\web\User::loginRequired(), который перенаправляет браузер на страницу входа.
    • Если пользователь авторизован, генерируется исключение yii\web\ForbiddenHttpException.

    Более сложные правила можно выносить в свои фильтры AccessControl

    Ссылки на документацию по теме:
    1. yii\web\User
    2. yii\rbac\ManagerInterface
    3. yii\rbac\CheckAccessInterface
    Ответ написан
    9 комментариев
  • Как в mysql найти запись по номеру телефона?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    В БД имеет смысл хранить просто строку, без дополнительных символов. А уже на клиенте отображать формат. Однако не всегда это требуется. Но я бы предпочёл хранить без пробелов и символов. Особенно, если используется поиск по телефону. Единый и простой формат в базе лучший вариант.
    Ответ написан
    Комментировать
  • Почему в действие контроллера не передается параметр?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Проблема очевидно не в рендеринге и роутах, а в передаче самого параметра. Вы нигде не показали ссылку и какой параметр там передается. Возможно у вас в параметр $id передается null. Посмотрите внимательно. Проверить этом можно очень просто выполнив простую команду не в шаблоне, а контроллере:
    public function actionIndex($id)
    {
         var_dump($id); die();
    }

    Так же не забывайте про return:
    public function actionIndex($id)
    {
        return $this->render('index', array('id'=>$id));
    }
    Ответ написан
    Комментировать
  • Можно ли использовать VueJs вместо Jquery в проектах Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Используйте NUXT (SSR) для СЕО. А Yii используйте как API.
    Ответ написан
    9 комментариев
  • Возможно ли скрыть колонку при помощи js в gridview yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    'headerOptions' => ['class' => 'hidden-xs'],
    'filterOptions' => ['class' => 'hidden-xs'],
    'contentOptions' => ['class' => 'hidden-xs'],
    //'footerOptions' => ['class' => 'hidden-xs'],

    Далее на класс навешивайте обработчик JS. В данном случае, при использовании bootstrap 4 будет столбец скрыт на маленьких версиях экрана.
    Ответ написан
    Комментировать
  • Как передать параметры в url на redirect в Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Да, можно. Пример
    Ответ написан
    Комментировать
  • Какой принцип построения ответа при регистрации пользователя?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Вариантов может быть куча. Вы назвали основные, но все зависит от вашей логики. Например, вам нужна хорошая безопасность и вы устанавливаете срок жизни пароля. Если пароль не поменяли в течении недели, то по нему зайти нельзя. Аналогичная работа с токенами. Может быть вход только под определенным IP. В общем вариантов много. Все зависит от вашей бизнес логики.
    Ответ написан
  • Symfony 3.4 - как исправить cache.WARNING Failed to save key?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Это разрешение папки. На Ubuntu в папке проекта:

    sudo chmod 700 -R var /
    Ответ написан
    6 комментариев
  • Добавление миграции в yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вам нужно запускать команду от исполняемого PHP php yii migrate. При этом у вас должено быть в директории два файла: yii и yii.bat. Важно запускать скрипт именно из той директории, где эти файлы лежат. Если у вас файлы лежать в bin/yii или app/yii, то вам нужно перейти в эту директорию
    cd app
    php yii migrate
    Ответ написан
    3 комментария
  • Как вставить значение по умолчанию Imperavi Redactor?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    echo $form->field($model, 'content')->widget(Widget::className(), [
         'options' => [
             'value' => '123'
         ]
    ])
    Ответ написан
    Комментировать