• Работа с несколькими БД Yii2?

    maksim92
    @maksim92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Для начала Вам необходимо создать по компоненту для каждого подключения:
    return [
    'components' => [
    'db1' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db1name',
        'username' => 'db1username',
        'password' => 'db1password',
    ],
    'db2' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db2name',
        'username' => 'db2username',
        'password' => 'db2password',
        ],
    ],
    ];


    Потом в коде своего приложения в моделях ActiveRecord Вам необходимо переопределить метод getDb().
    public function getDb() {
        return Yii::$app->db1;
    }
    
    //db2
    public function getDb() {
        return Yii::$app->db2;
    }

    Модели, в которых Вы переопределили метод getDb(), указав db1 как соединение с базой, будут получать данные из базы db1, и наоборот:
    ModelName::find()->select('*')->all();
    Ответ написан
  • Как сменить регистр, только у первой буквы в строке?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Используйте функцию ucfirst
    $foo = 'hello world!';
    $foo = ucfirst($foo);             // Hello world!
    Ответ написан
  • Какой подход программирования на PHP выбрать в 2020 году?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Как вы поняли, на этот вопрос сложно ответить кратко. В программировании, на любом языке большой список материалов изучения, который постоянно пополняется. Всё зависит от Ваших задач и задач Ваших клиентов. Для кого-то главный фактор - быстрота разработки. Для кого-то — простота. Для кого-то стоимость разработки. Для кого-то важна развиваемость проекта написаного кода. Например, есть люди, зарабатывающие настройкой и поддержкой проектов на Wordpress. Поэтому я бы выделил такой путь программиста на PHP:
    1. Самописный код
    2. CMS (Wordpress, Joomla)
    3. Разработка на фреймворке
    4. Разработка на микрофреймворке

    Так как Вы раньше использовали подходы CMS Wordpress, то Вам стоит пойти на следующий этап — разработка на фреймворке. В этом Вы совершенно правильно мыслите.

    Фреймворк (framework, «каркас», «конструкция») — это динамически пополняемая библиотека языка программирования, в которой собраны его базовые модули. Фреймворки создаются для упрощения процессов разработки приложений, сайтов, сервисов. Чтобы не писать модуль в приложении с нуля, гораздо проще обратиться к готовым шаблонам фреймворков, которые и формируют рабочую среду разработчика.

    Достоинства PHP-фреймворков:

    • Производительность. Фреймворки ускоряют разработку. Например, PHP-фреймворк избавляет вас от необходимости писать запросы к базам данных. В фреймворках реализованы базовые функции CRUD, которые необходимы для работы с базами данных.
    • Масштабируемость. Написанные на фреймворках приложения легко масштабируются.
    • Удобство. Код фреймворков лаконичный, поэтому с ним просто работать. Поддерживать легче проект на фреймворке, чем на нативном PHP.
    • Простота. В PHP-фреймворках используются шаблоны проектирования (например, MVC). Это значительно упрощает разработку, делая процесс быстрее.
    • Безопасность. Приложения на фреймворках лучше защищены, чем приложения на чистом PHP.
    • Экономичность. В фреймворках реализован принцип DRY. Это позволяет разработчикам писать меньше кода.

    Какие есть PHP фреймворки для новичков?

    Конечно, PHP фреймворков больше, но не все подходят новичкам. Поэтому, можно выделить два популярных фреймворка у новичков:
    1. Laravel
    2. Yii2

    Путь к изучению фреймворка:

    1. Почитать документацию PHP. Начиная изучение с прочтение документации у вас отложится в подсознании какие-то «якоря», которые будут у вас всплывать в процессе изучения и которые помогут быстро находить в документации нужную информацию. Как минимум вы будете знать, что такое есть, а то некоторые узнают о функциях php спустя многие года. Это позволит вам использовать полноценно функционал, а не ограничиваться пару функциями из примеров.
    2. Изучить ООП. Программировать на PHP можно двумя подходами: функциональным и объектно ориентированным. Последний более популярный и распространенный. Фреймворки написаны используя этот паттерн. Поэтому, перед изучением фреймворка нужно иметь понимание этого подхода. Посмотрите «Неделя ООП» от Дмитрия Елисеева и попробуйте написать свой ООП-код
    3. Установить фреймворк. Начните с установки фреймворка и попробуйте разработать что-то простое, например, Блог или Новости. Yii2 совсем не сложный. Читая документацию, даже без знаний программирования можно сделать что-то простое.
    4. Задаваться вопросами и находить на них ответы. Дальше у вас будет возникать много вопросов. Постарайтесь сначала самостоятельно находить на них ответы: гуглите, смотрите документацию, а уже потом спрашивайте у сообщества.
    5. Перепишите сайт на другой фреймворк. Попробуйте созданный на Yii2 проект переписать на другой современный фреймворк: Laravel или Symfony. Вы получите хорошую практику и навык, который Вам так же поможет в будущем.

    Почему Yii2 подойдёт новичку?

    • Потому что в Yii2, за последние 5 лет, ничего не поменялось. С одной стороны — минус, для изучения — плюс. Ответов и решений полно и они не устарелые, а значит рабочие. Вы хоть что-то сделаете без особых знаний и навыков. Для учебы Yii2 хватит, но не для нового проекта. Как подрастете — возьмёте современный фреймворк или перепишите на Yii3 который будет в конце 2020 или начале 2021.
    • Потому что Yii2 — это RAD фреймворк (для быстрой разработки). Это значит, что в этом фреймворке заложены принципы простоты и быстроты разработки. Для сложных проектов это проблема, а для Вас же — плюс.
    • Потому что он монолитный. Вам не придётся устанавливать кучу дополнительных пакетов, включая библиотеку UI на Bootstrap, jQuery . Вы сможете быстро установить и начать пользоваться Yii фреймворком
    • Потому что Yii2 может сгенерировать код по базе данных используя UI. В Yii2 есть Gii генератор, который прямо по схеме базе данных генерирует вам код в визуальном режиме, поэтому программисты работают быстрее, что не только экономит время, но и уменьшает стоимость разработки.
    • Потому что Yii2 имеет большое русскоговорящее сообщество и целую толпу ярых фанатов.
    • Потому что Yii2 быстрый и безопасный. В этом инструменте также заложен принцип Don't repeat yourself, т.е. неповторения кода. А с помощью Ajax и JQuery фреймворк облегчает создание высокомасштабируемых веб-приложений. Хотя и jQuery в 2020 году устарела.

    Критика в сторону Yii2:

    • Тенденции 2020 года — писать чистый код на голом PHP с переносимыми компонентами, не привязываясь к канонам какого-то конкретного фреймворка. Чтобы в итоге не стать заложником одного фреймворка. Yii2 не следует этим канонам. Фреймворк внутри на 99% противоречит SOLID.
    • Yii2 вышел в 2014-ом году как немного переписанная версия Yii1.1 из 2011-го. Он до сих пор ориентируется на PHP 5.4. Все шесть лет он архитектурно не развивался. С 2018-ого его разработка заморожена. Так что сейчас Вы начнёте практиковаться на заброшенном два года назад фреймворке шестилетней давности, написанном по канонам Yii1 девятилетней давности. Если выйдет Yii3, то там многих из этих канонов уже не будет. Если это одноразовый проект, который один раз написали и забыли, то делать можно на чём угодно и как угодно. Но если проект делают надолго, то чтобы обезопасить себя от сложности таких постоянных переписываний выбирают сразу более свободные и независимые подходы.
    • Для классического frontend — фреймворк всюду тащит свои встроенные ассеты с jQuery. И чтобы перейти на WebPack надо это из всех мест вычищать. А если делать отдельный JS-фронт, то для построения API половина фреймворка оказывается не нужна.
    • Если вам хватает технологий Yii, JQuery и PHP 5.4 шестилетней давности, то получайте удовольствие. Если нравится свежий подход с настоящим DI-контейнером, типами PHP 7.4, PSR и свежим JS/TS с WebPack.
    • Версии Yii 2.1 фреймворка не планируется. Всё обратно несовместимое в 2.0 не проходит. Переход на Yii будет очен затруднён или вовсе невозможен.

    Подитожим. Ваши знания находятся примерно на уровне 2015-2016 годов, как мне кажется. И тут Вам придется решать самому: либо пойти по плавному развитию, пробуя сначала Yii2, со старыми подходами, но ближе к вашим знаниям, а потом перейти на Laravel или Symfony, либо сразу пойти в 2020 год и использовать Laravel или Symfony, которые соответствуют современным подходам, но дальше от Ваших знаний. Можете попробовать установить все и решить для себя на каком фреймворке будете проходить изучение.

    Рекомендую к прочтению:
    Ответ написан
  • Как работать с json полями в yii2?

    maksim92
    @maksim92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    После считывания из базы декодируем
    Перед сохранением в базу закодируем

    Работа с формой: https://github.com/Myks92/vmc-event/tree/master/sr...
    Ответ написан
  • Как вынести настройки Swiftmailer из конфига?

    maksim92
    @maksim92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Можете использовать готовый модуль или по примеру сделать свой.
    Ответ написан
  • Как правильно выводить информацию из масива?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    foreach ($datas as $value) {
       echo $value['tg_id'];
    }
    Ответ написан
  • Почему заполняется только id?

    maksim92
    @maksim92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    public $title уберите
    Ответ написан
  • Как вывести timestamp из MySQL + PHP?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    if($existingInfo["RegisterDate"])) {
        echo (new DateTimeImmutable($existingInfo["RegisterDate"]))->format('d.m.Y H:i:s');
    }
    Ответ написан
  • Как отправить pdf файл на почту?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Формируете PDF во время отправки, сохраняете PDF на сервере, затем прикрепляете к сообщению, как вложение. Альтернативой может быть доступ PDF по какой-то ссылке, которую высылаете в сообщении.
    Ответ написан
  • Как сравнить две даты?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    $now = new DateTimeImmutable();
    $date = (new DateTimeImmutable())->setTimestamp(1598300173);
    
    if ($now === $date->modify('+30 days')) {
      ...
    }
    Ответ написан
  • Почему не работают переводы лейблов в форме YII2?

    maksim92
    @maksim92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вам нужно заполнить метод: getAtrributeLabels()
    Ответ написан
  • Какую библиотеку использовать для создания сложного pdf файла?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Верстайте как обычный HTML, а потом с использованием dompdf Переводите из HTML в PDF
    Ответ написан
  • Как выводить прогресс выполнения команды из терминала на сайт?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Пример очередей. Сохраняйте значения в базу данных: id задания, дата, название и статус и на сайте получайте это значение. Можно просто статусы: в очереди, в работе, выполнено. А можно в %. Если %, то можно задействовать websokets для динамики, но только ради этого не стоит их поднимать. Один из примеров подобного есть yii2-queue
    Ответ написан
  • Как в php преобразовать числов в дату?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    $now = new DateTimeImmutable();
    $date = $now->setTimestamp(1597252860);
    $dateFormat = $date->format('d.m.Y');
    echo $dateFormat; //12.08.2020
    Ответ написан
  • Как вывести время видеоролика?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Делайте через duration FFMpeg и сохраняйте продолжительность в бд при загрузке видео. Пробовали это?
    https://www.w3schools.com/tags/av_prop_duration.asp

    Средствами PHP можно с помощью библиотеки
    https://github.com/PHP-FFMpeg/PHP-FFMpeg
    Ответ написан
  • Что означают такие языковые конструкции как Post::class, PostType::class и так далее?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Начиная с PHP версии 5.5 ключевое слово ::class используется для разрешения имени класса. Это означает, что оно возвращает полное имя класса, что особенно полезно, при работе с длинными именами классов. Это тоже самое, что self::class self означает текущий, а Post::class используется для получение имени класса поста.
    Ответ написан
  • Правильно ли делаю сохранение моделей?

    maksim92
    @maksim92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Не понятно что такое $this->category_id откуда оно получается? Если там просто ID, то это ID можно подменить. Правильней сначала запросить категорию и уже, если категория найдена получать её ID $category->id

    2. Посмотрите документацию как сохранять при помощи AR связи. Для этого есть метод link()
    Ответ написан
  • Как решить ошибку Fatal error: Uncaught PDOException: could not find driver?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Неустранимая ошибка: Uncaught PDOException: не удалось найти драйвер. Установите драйвер PHP PDO Mysql и исправьте mysqli на mysql.
    Ответ написан
  • Что за ошибка в логах сервера?

    maksim92
    @maksim92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    $str = preg_replace('/[^a-zA-Z0-9\s\'\:\/\[\]\-\pL]/u', '', $str);
    Ответ написан
  • Как сделать форму без использования ActiveForm?

    maksim92
    @maksim92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    <form action="<?= Url::to(['/site/contact']); ?>" method="post">                        
        <input type="text" name="name" placeholder="Ваше имя*">
        <input type="text" name="phone" placeholder="Ваш телефон*">
    </form>


    Данные из формы получайтеYii::$app->request->post();
    Ответ написан