• Странно виснет ПК. Как диагностировать проблему?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    В браузере Chrome видео смотрите? Помню недавно в нем была проблема, он вешал ОС через некоторое время после начала просмотра видео. Это конечно пальцем в небо, но может попаду.
    Ответ написан
    2 комментария
  • Как понять что не так с валидацией?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Вместо
    var_dump($model->validate());
    поставьте
    var_dump($model->validate());
    var_dump($model->getErrors());
    var_dump($client->validate());
    var_dump($client->getErrors());

    и увидите все ошибки.
    Ответ написан
  • Как правильно сделать seo модуль для Yii2?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    ... в главный layout, т.к. он один на весь фронт, но этот вариант рассматриваю только как крайне запасной.

    Почему? Разве это проблема подключить компонент в единой нужной точке?
    5ac3653b689f4292163369.png

    Дополняю:
    /**
     * Зарегистрировать все тэги метаданных для страницы с правила
     */
    public function applySeoRule ()
    {
        # Не применяем правила если отключен
        if ( ! $this->isEnabled() ) {
            return;
        }
        # Только если есть правило для SEO
        if ( $this->hasSeoRule() ) {
            $view = Yii::$app->controller ?
                Yii::$app->controller->getView() :
                Yii::$app->getView();
            $seoRule = $this->getSeoRule();
            # Параметры индексации
            if ( $seoRule->is_no_index ) {
                $view->registerMetaTag( [
                    'name' => 'robots',
                    'content' => 'noindex',
                ], 'robots' );
            }
            # Основные метаданные
            if ( $seoRule->title !== '' ) {
                $view->title = $seoRule->title;
            }
            if ( $seoRule->description !== '' ) {
                $view->registerMetaTag( [
                    'name' => 'description',
                    'content' => $seoRule->description,
                ], 'description' );
            }
            if ( $seoRule->keywords !== '' ) {
                $view->registerMetaTag( [
                    'name' => 'keywords',
                    'content' => $seoRule->keywords,
                ], 'keywords' );
            }
            # Метаданные OpenGraph
            $opengraphTags = [
                'opengraph_title' => 'og:title',
                'opengraph_site_name' => 'og:site_name',
                'opengraph_url' => 'og:url',
                'opengraph_description' => 'og:description',
            ];
            $registerOpengraph = false;
            foreach ( $opengraphTags as $attribute => $tagName ) {
                if ( isset( $seoRule->$attribute ) && $seoRule->$attribute !== '' ) {
                    $view->registerMetaTag( [
                        'name' => $tagName,
                        'content' => $seoRule->$attribute,
                    ], $tagName );
                    $registerOpengraph = true;
                }
            }
            if ( $seoRule->opengraphImage ) {
                $view->registerMetaTag( [
                    'name' => 'og:image',
                    'content' => $seoRule->opengraphImage->getFileUrlWithDomain(),
                ], 'og:image' );
                $registerOpengraph = true;
            }
            if ( $registerOpengraph ) {
                $view->registerMetaTag( [
                    'name' => 'og:locale',
                    'content' => str_replace( '-', '_', Yii::$app->language ),
                ], 'og:locale' );
                $view->registerMetaTag( [
                    'name' => 'og:type',
                    'content' => 'website',
                ], 'og:type' );
            }
            # Twitter OpenGraph
            $twitterTags = [
                'twitter_url' => 'twitter:url',
                'twitter_title' => 'twitter:title',
                'twitter_description' => 'twitter:description',
                'twitter_site' => 'twitter:site',
                'twitter_creator' => 'twitter:creator',
            ];
            $registerTwitter = false;
            foreach ( $twitterTags as $attribute => $tagName ) {
                if ( isset( $seoRule->$attribute ) && $seoRule->$attribute !== '' ) {
                    $view->registerMetaTag( [
                        'name' => $tagName,
                        'content' => $seoRule->$attribute,
                    ], $tagName );
                    $registerTwitter = true;
                }
            }
            if ( $seoRule->twitterImage ) {
                $view->registerMetaTag( [
                    'name' => 'twitter:image',
                    'content' => $seoRule->twitterImage->getFileUrlWithDomain(),
                ], 'twitter:image' );
                $registerTwitter = true;
            }
            if ( $registerTwitter ) {
                $view->registerMetaTag( [
                    'name' => 'twitter:card',
                    'content' => 'summary',
                ], 'twitter:card' );
            }
        }
    }
    Ответ написан
    9 комментариев
  • Как сделать формат json в api?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Когда браузер делает запрос к серверу, то указывает какие именно типы контента он предпочитает в виде заголовка
    5abd0498d2adf911421268.png

    В фреймворке REST-контроллеры настроены на два типа данных - JSON и XML
    5abd05d00cff0920874352.png

    В вашем случае фреймворк сам выбрал XML, т.к. браузер указал его предпочтительным. Если хотите оставить только JSON, то перенастройте контроллеры. И тогда даже в браузере будет JSON.

    Читайте полное описание: https://github.com/yiisoft/yii2/blob/master/docs/g...
    Ответ написан
    1 комментарий
  • Как исправить ошибку? header("Location:". $_SERVER['PHP_SELF']);?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Заголовки(headers) можно отправлять ДО любого вывода. То есть, если вы сделали echo, то заголовки уже не отправить, о чем вам и сообщает PHP.

    > Предупреждение: не удается изменить информацию заголовка - заголовки уже отправлены (вывод запущен в C:\Server\domains\messbox\config.php:18) in C:\Server\domains\messbox\actions\login.php в строке 12
    Ответ написан
    6 комментариев
  • Зачем так сделано, что дальше можно сделать с кодом?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Я не защищаю этот код и мне он совсем не нравится, но есть вымышленный идеальный мир и есть реальный. В реальном мире подобное происходит очень часто.

    Опыта у меня не очень много, поэтому хотелось бы узнать мнение более опытных людей, что с этим кодом делать?

    Ничего не делать. Вы можете попытаться объяснить клиенту суть проблемы, но скорее всего он откажется переделывать проект. Вы уверены, что вы со своим "не очень много опыта" сможете быстро и качественно переписать? Зачем клиенту нужно платить второй раз, если он не увидит никаких изменений со стороны UI?

    Оставить как есть и вносить мелкие правки или всё таки предложить переписать?

    Сделать свою работу и сообщить клиенту о проблемах, которые в будущем станут еще больше.

    Чего именно хотел добиться предыдущий разработчик таким кодом(отсутствием связей, внешних ключей и т.д.)?

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

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Надежней всего использовать внешние сервисы, к примеру MailChimp. Они на этом не одну "мартышку" съели и умеют делать как надо. Вы лишь отправили запрос на рассылку когда вам нужно и забыли. Ну или можете сами это делать и постоянно проверять, что вы сейчас и делаете.
    Ответ написан
    2 комментария
  • Расчет памяти при работе php gd?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    По своему опыту могу сказать, что вам не хватит памяти. Я не знаю, что там делает GD, но на большие изображения оно выжирает сумасшедшее кол-во памяти. Изображения более 2к на сторону уже становятся проблемой. Используйте ImageMagick.

    ПС. www.dotsamazing.com/ru/labs/phpmemorylimit
    5a9fdd790fc87010529469.png
    Ответ написан
    9 комментариев
  • Как добавить изменения ветки master в свою ветку, не потеряв изменения в последней?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Фичей как правило называют отдельную ветку, которая по методике GitFlow размещается в "папке" с названием "feature/*". Но в вашем случае это может быть что угодно :)
    Сливаете обыкновенно, ветку фичи в свою ветку, разруливаете конфликты, если они есть, и делаете коммит.
    Если даже вы испортили слиянием что-то в своей ветке, вы сможете срезать этот коммит.
    Сделайте копию своей ветки и в ней пробуйте, чтобы не испортить. Вы всегда точно должны понимать, что вы делаете и зачем.
    Ответ написан
    1 комментарий
  • Что нужно изучить для разработки современных веб-приложений?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    В связи с этим вопрос – что ещё нужно знать?

    Бэкенд вам в любом случае нужен.

    Если я правильно понимаю, Angular, Vue и прочие фреймворки – это только фронтенд.

    Все верно.

    Куда не сунься, везде о веб-разработке говорится, как о разработке именно фронтенда, а также это непременно связано с Node.js (дабы что-то написать на ангуляре, без него никак). Каким боком связан фронтенд с Node.js - я не понимаю, т.к. Node.js - это, по сути, способ запустить JS вне браузера.

    Скорее всего вы читаете статьи о фронтенде, потому в них о бэкенде ничего и нет. Как вы знаете фронтенд пишется на JS и многих подкупает то, что можно поднять NodeJS на бэкенде и используя один язык создавать сайты.

    Если я хочу запустить приложение в браузере, то зачем мне node? Это всё меня вводит в ступор, я вижу лишь противоречия.

    Вы не путайте. Есть технологии, которые используются в процессе работы приложения и есть технологии, которые используются в процессе разработки приложения. Все эти Gulp, Grunt, Babel, Webpack и прочие - это инструменты разработки. Они ускоряют, упрощают, повышают качество работы. В то время jQuery, Angular, React - это библиотеки и фреймворки, с помощью которых приложение будет работать.

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

    Здесь я лишь могу предположить, что сервер вместо html должен обмениваться данными с приложением посредством json или чего-то ещё.

    Да, JSON, как самый распространенный. Вам нужен фреймворк для бэкенда, на котором можно развернуть REST API. Насколько мне известно большинство современных фреймворов современных языков программирования, которые используются для веб-разработки, это умеют. Я не могу утверждать точно, я работаю в рамках одного языка.

    Всё-таки сервер - это основа любого сетевого приложения, и в первую очередь нужно разработать серверную часть.

    Однозначно. Современные одностраничные приложения(SPA) состоят из двух раздельных частей - фронтенда и бекенда. Они могут создаваться полностью раздельно разными разработчиками, главное согласовать формат передачи данных и все нюансы.

    Вся прелесть SPA в разделении этих частей. Любая из них может быть заменена на другую без особых последствий. Один бэкенд может обслуживать сайты, мобильные приложения, предоставлять доступ к данным для сторонних партнерских приложений, и все это через единый API.

    Что ещё нужно изучить? Или перечисленных знаний достаточно?

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

    Можно ли не использовать Node.js и, соответственно, npm, если JS (TS) требуется только в браузере? При этом тестирование тоже необходимо.

    Да, вполне. На стороне клиента, к примеру, JS+Angular. А на стороне бэкенда, к примеру, PHP+Laravel. Сейчас очень много языков и еще больше фреймворков под них. Выбирайте то, что для вас проще.
    Ответ написан
    2 комментария
  • Может в yii2 есть другие простые решение?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    $phone = '89274434521';
    
    $formatted = preg_replace(
        '/^(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})$/i',
        '$1 ($2) $3-$4-$5',
        $phone
    );
    
    echo $formatted; # 8 (927) 443-45-21
    Ответ написан
    3 комментария
  • Как должен называться и обязанности класса регистации, авторизации и прочего для пользователя?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Он должен называться UserRegistrationAndLoginAndOther. Круто звучит, правда?

    На самом деле смешивать это все плохая идея. Применяйте принцип единой ответственности.
    Ответ написан
    Комментировать
  • Использовать compact для передачи моделей в вид это хороший прием или наоборот?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    return $this->render('main-view', ['comInfo' => $comInfo, 'SearchingForm' => $SearchingForm,
    'revCompany' => $revCompany, 'modelComment' => $modelComment, 'insuranceType' => $insuranceType]);


    Что-то изменилось? Для вас строка стала длиннее, а для PHP ничего не поменялось. А по поводу кол-ва передаваемых параметров при ренедере, увы это уже зависит от разработчика и его стиля программирования.
    Ответ написан
    1 комментарий
  • Junior PHP, что бы вы спросили на собеседовании?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Джуниор джуниору рознь и в разных конторах разные требования, но в идеале вам нужно знать и уметь:
    - PHPStorm, PSR, чистый самодокументированный код
    - Composer, автозагрузка классов
    - Базовое понимание ООП, статический и динамический контекст, умение применять на практике
    - Git, работа с ветками, мерджи, разруливание конфликтов
    - Индексы в БД, какие, для чего нужны, составные индексы, какие недостатки имеют
    - Джоины в БД, подзапросы, группировка
    - Внешние ключи в БД, минимум по нормализации данных
    - JS, jQuery, HTML, CSS, хоть минимально

    Все остальное индивидуально, в зависимости от требований.
    Ответ написан
    8 комментариев
  • Фреймворк yii2 не видит изменений внесенных в файлы js и css?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    1. Запускаете OpenServer с правами администратора, чтобы у него была возможность создавать симлинки.
    2. В конфигурации настраиваете ассет менеджер:
    'assetManager' => [
        'linkAssets' => true,
        'appendTimestamp' => true,
    ],

    ... и получаете удовольствие.

    Нет смысла одновременно включать linkAssets и forceCopy. Первый параметр публикует ассеты через симлинки, второй делает полную копию файлов ассетов. Я предпочитаю вариант, который вам указал выше. У меня отлично работает.

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

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    > я вообще не работал с PHP фреймворками
    > сам язык знаю не очень хорошо

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

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    > если true тогда обратиться к файлу из этой директории

    Мне кажется вы что-то делаете не так. Что вы хотите сделать? Опишите детально
    Ответ написан
    4 комментария
  • Случайный ряд из таблицы MySql, сейчас пол секунды. А максимально быстро как?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    1. Определите кол-во записей в таблице. Не последний ID, а именно кол-во
    2. Определите рандомное значение между 0 и кол-вом-1 записей, это будет смещение
    3. Получите нужную запись с таблицы:
    select `id` from `localities` offset {$offset} limit 1


    Не сравнивал скорость, но должно быть в разы быстрее.
    Рандомное смещение можно получить как на стороне PHP, так и на стороне MySQL.
    А о RAND() вам уже написали.

    Детально:
    У вас N записей в таблице, вам нужно получить через mt_rand(), к примеру, случайное число от 0 до N-1. Это и будет ваше смещение.
    $count = 100;
    $offset = mt_rand( 0, $count-1 );
    Ответ написан
  • Как правильно прописать путь к файлу через require_once?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Использовать всегда слэши:
    require_once __DIR__ . '/footer.php';

    Использовать абсолютные пути относительно проекта или его папки:
    # Опираемся на текущую папку, относительно ее формируем путь
    require_once __DIR__ . '/../components/database.php';
    
    # Или используем подготовленную константу, которая при старте приложения устанавливается через define
    require_once APP_DIR . '/components/database.php';
    Ответ написан