Задать вопрос
  • Как поправить вывод русских символов из базы данных mysql?

    slo_nik
    @slo_nik Куратор тега PHP
    У Вас не очень корректный json, или два раза вставили одно и то же в комментарий.
    $json = '[{"id":"398",.....}]';
    var_dump(json_decode($json, true));

    Результат
    array (size=2)
      0 => 
        array (size=6)
          'id' =>  '398' (length=3)
          'name' => 'цупывапывап' (length=22)
          'description' => 'Дочь свергнутого короля Семи Королевств из династии Таргариенов Эйриса Безумного. ' (length=153)
          'reason_murder' => 'Неприязнь' (length=18)
          'killer' => 'Враждебный воин' (length=29)
          'weapon' => 'Меч' (length=6)
      1 => 
        array (size=6)
          'id' => '398' (length=3)
          'name' => 'цупывапывап' (length=22)
          'description' => 'Дочь свергнутого короля Семи Королевств из династии Таргариенов Эйриса Безумного. ' (length=153)
          'reason_murder' => 'Неприязнь' (length=18)
          'killer' => 'Враждебный воин' (length=29)
          'weapon' => 'Меч' (length=6)
    Ответ написан
    9 комментариев
  • Как поместить блок в yii2 ссылку?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    $html = '<div>block</div>';
    echo Html::a($html, []);
    Ответ написан
    2 комментария
  • Как заполнить FormData всеми файлами?

    slo_nik
    @slo_nik
    Добрый вечер.
    Как-то так
    $(function() {
            $('#form-data').on('submit', function(e){
                e.preventDefault()
                var form = $(this); // Предположу, что этот код выполняется в обработчике события 'submit' формы
                var data = new FormData();  // Для отправки файлов понадобится объект FormData. Подробнее про него можно прочитать в документации - https://developer.mozilla.org/en-US/docs/Web/API/FormData
    
                // Сбор данных о файлах 
                var filesField = form.find('input[type="file"]');
                var fileName = filesField.attr('name');
                for(var i = 0; i < filesField.prop('files').length; i++){
                  var file = filesField.prop('files')[i];
                  data.append(fileName, file) ;
                }
    
                // Отправка данных
                var url = 'upload.php';
    
                $.ajax({
                    url: url,
                    type: 'POST',
                    data: data,
                    contentType: false,
                    cache: false, 
                    processData:false, 
                    success: function(response) {
                        console.log(response)
                    }           
                });  
            })          
        });

    И выкиньте стили из формы, перенесите их куда положено.
    Ответ написан
  • Как с помощью регулярного выражения добавить домен перед абсолютным путём к изображению?

    slo_nik
    @slo_nik Куратор тега PHP
    Вы разрабатываете сайт на YII2.
    Чтобы добавить домен в пути к файлу не нужны регулярные выражения, даже если не пользоваться framework.
    А в Вашем случае, с использованием YII,2 достаточно применить Url::to().
    Вот два примера.
    <img src="<?= Url::to('@web/' . '/' . $model->images[0]->path . '/' . $model->images[0]->file, true) ?>" alt="">
    // and
    echo Html::img(Url::to('@web' . '/' . $model->images[0]->path . '/' . $model->images[0]->file, true))

    В итоге в путь к изображения будет подставлено доменное имя. Это достигается передачей второго параметра для Url::to();
    http://site.ru/uploads/image.jpg
    Если не передавать второй параметр или не использовать Url::to(), то путь к изображению будет без доменного имени
    /uploads/image.jpg
    Подробности в документации.
    Ответ написан
    Комментировать
  • Как вставить переменную в mb_eregi_replace?

    slo_nik
    @slo_nik Куратор тега PHP
    Непонятно, зачем mb_eregi_replace() если можно использовать mb_substr();?
    echo mb_substr($metka, $col);
    Ответ написан
    Комментировать
  • Как осуществить сортировку по связанным полям в YII2?

    slo_nik
    @slo_nik Куратор тега Yii
    $query->orderBy([
         '{{%table_name}}.name'  => SORT_ASC,
         'objectName' => SORT_ASC
    ]);
    Ответ написан
    8 комментариев
  • Выборка данных rest api на yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Тут полно информации.
    Ответ написан
    Комментировать
  • Почему не срабатывает preg_replace?

    slo_nik
    @slo_nik Куратор тега PHP
    $str = 'мой-сайт.рф';
    $pattern = '/([-а-яё.]+)/iu';
    echo preg_replace_callback($pattern, function($matches){
            return idn_to_ascii( $matches[0], IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
          }, $str );
    // на выходе 
    // xn----8sbzclmxk.xn--p1ai


    Для обязательного прочтения:
    1) idn_to_ascii()
    2) idn_to_utf8()
    3) Предопределённые константы.
    4) preg_replace_callback()
    Ответ написан
    Комментировать
  • Как сделать выборку из промежуточной таблицы?

    slo_nik
    @slo_nik Куратор тега Yii
    yura_born, ну тогда должно быть как-то так
    Сотрудники:
    id - primaryKey
    name - имя сотрудника
    surname - фамилия сотрудника

    SotrRank
    id - primaryKey
    id_employee - id сотрудника из таблицы Sotrudnik
    id_position - id должности

    RankList
    id - primaryKey
    name - название должности

    Вам надо получить когда и какую должность занимал сотрудник. В модели Sotrudnik делаем связь на SotrRank
    public function getSotrRank()
    {
         return $this->hasMany(SotrRank::class, ['id_employee' => 'id');
    }

    Но так получите только id должности, вместо названия. Поэтому в модели SotrRank делаете связь на RankList
    public function getRank()
    {
         return $this->hasOne(Rank::class, ['id' => 'id_position');
    }

    И выводите в цикле
    // действие
    public function actionSql($code)
        {
            $employee = Sotrudniki::find()->where(['code' => $code])->all();
    
            return $this->render('sql', [
                'employee' => $employee
            ]);
        }
    // вид sql
    foreach($employee as $value){
        echo $value->name; // имя сотрудника
        // ещё один цикл для получения данных по связи SotrRank
        foreach($value as $sotrRank){
        // получить название должности через связь Rank
         echo $sotrRank->rank->name;
        }
    
    }

    Вот как-то так.

    p.s. Обязательно будут ошибки, но Вы их сами исправите, я уверен.
    Ответ написан
    2 комментария
  • Поменять конфиг приложения из компонента?

    slo_nik
    @slo_nik Куратор тега Yii
    Вариантов может быть несколько.
    Через модуль.
    например есть какой-то модуль. Пусть он установлен или через composer или вручную в приложение.
    В конфигурационном файле надо прописать подключение этого модуля.
    Например так
    'modules' => [
            'support' => [
                'class' => ModuleTicket::class,
               // далее могут быть настройки самого модуля.
            ],
        ],

    В самом модуле есть файл ModuleTicket.php и Bootstrap.php
    Сам Bootstrap.php может выглядеть так
    class Bootstrap implements BootstrapInterface
    {
        /**
         * @inheritdoc
         */
        public function bootstrap($app)
        {
            if ($app->hasModule('support') && ($module = $app->getModule('support')) instanceof ModuleTicket) {
    
                $app->urlManager->addRules(
                    [
                        '<_m:support>/new-ticket' => '<_m>/ticket/create',
                        '<_m:support>/<id:\w+>' => '<_m>/ticket/view',
                        '<_m:support>' => '<_m>/ticket/index',
                    ]
                );
    
                if (!$app->has($this->getModule()->queueComponent)) {
                    $app->set($this->getModule()->queueComponent, [
                        'class' => Queue::class,
                        'handle' => true, // whether tasks should be executed immediately
                    ]);
                }
            }
    
            // Add module I18N category.
            if (!isset($app->i18n->translations['slo-nik/*'])) {
                $app->i18n->translations['slo-nik/*'] = [
                    'class' => PhpMessageSource::class,
    
                ];
            }
        }
    }

    Тут настраиваются и очереди и urlManager и переводы модуля. Всё налету и по условиям может быть настроено.
    Можно настроить через компонент
    В конфигурационном файле приложения, в секции 'components' подключаете свой компонент.
    'siteSettings' => [
            'class' => SiteSettings::class
          ],

    Все данные для настройки сайта у Вас хранятся в базе данных. Например, настройки smtp у Вас в базе.
    Как подключить свои настройки для mailer в yii?
    Вот так
    'mailer'       => function () {
            return Yii::createObject([
              'class'            => 'yii\swiftmailer\Mailer',
              'useFileTransport' => true,
    
              'transport'     => [
                'class'      => 'Swift_SmtpTransport',
                'host'       => Yii::$app->siteSettings->get('SITE.MAIL_HOST'),
                'port'       => Yii::$app->siteSettings->get('SITE.MAIL_PORT'),
                'username'   => Yii::$app->siteSettings->get('SITE.MAIL_USER'),
                'password'   => Yii::$app->siteSettings->get('SITE.MAIL_PASS'),
                'encryption' => Yii::$app->siteSettings->get('SITE.MAIL_ENCR')
              ],
              'messageConfig' => [
                'to'   => [ Yii::$app->siteSettings->get('SITE.EMAIL_ADMIN') ],
                'from' => [ Yii::$app->siteSettings->get('SITE.MAIL_USER') ]
              ]
            ]);

    Все данные берутся из базы.
    В общем тут можно по разному действовать.
    Вот тут создаётся магазин на примере yii2. И в этом же мастер-классе рассказано, как работать с контейнером зависимостей.
    Ну а компонент настроек сайта делайте по примеру этой статьи. Статья для первой версии yii, но переделать для второй версии не составит труда.
    Ответ написан
    Комментировать
  • Как при вызове hasOne/hasMany вызывать функцию класса с которого мы берем данные?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Не надо никаких своих методов, всё уже придумали за Вас.
    https://www.yiiframework.com/doc/guide/2.0/ru/db-a...
    Ответ написан
    Комментировать
  • Как в ActionColumn добавить свой идентификатор?

    slo_nik
    @slo_nik Куратор тега Yii
    'columns' => [
        // ...
        [
            'class' => ActionColumn::className(),
            'buttons' => [
                'view' => function($url, $model, $key){
                    return Html::a('View', ['sotrudniki/view', 'code' => $model->id);
                }
            ]
        ],
    ]

    До рабочего состояния доведёте сами.
    Ответ написан
    2 комментария
  • Как в yii2 вывести данные из БД в конфиг?

    slo_nik
    @slo_nik Куратор тега Yii
    'SMSCenter' => function(){
        return Yii::$app->createObject( [
                'class' => 'integready\smsc\SMSCenter',
                'login' => '',
                'password' => '',
                'useSSL' => false,
                'options' => [
                ],
            ]);
    }

    Теперь останется только добавить в настройки нужные значения.
    Можно через статический метод попробовать, а можно сделать компонент "Настройки" и уже через него получать нужные значения.
    Есть пример такого компонента, написанный для YII1, но переписать на вторую версию большого труда не составит.
    Тогда добавить параметр из базы сведётся к следующему
    'login' => Yii::$app->settings->get('password),
    Сам компонент подключить в том же конфигурационном файле.
    'components' => [
        'settings' => [
            // настройки компонента
        ]
    ]

    p.s.
    Так же можно перенести настройки для mailer в базу.
    Ответ написан
    2 комментария
  • Почему не работают валидаторы Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Здесь Вы не загружаете модель.
    if(Yii::$app->request->post('Registration'))
    Замените на
    if($reg->load(Yii::$app->request->post()))
    Или как вариант, в своём коде попробуйте добавить строку после if()
    $reg->attributes = Yii::$app->request->post('Registration');
    Ответ написан
    Комментировать
  • Как все-таки запустить консольную команду Yii через cron?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    /usr/local/bin/php /home/webko/project.webko.net/project/yii hello/test
    Ответ написан
    3 комментария
  • YII2 Подключение JS с привязкой к PHP переменной?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Задайте кнопкам какой-либо css класс.
    В js обращайтесь к этому классу и не мешайте php с html.
    <?php
    while ( $i <= $categoryCount) {
    ?>
    <button id="btn<?= $i ?>" >
    <?php
    }
    
    // регистрируете js код
    $this->registerJs("
       $('button.className').on('click', function(){
             console.log($(this).attr('id'))
       })
    ", yii\web\View::POS_END);
    ?>

    Или выносите в отдельный файл.

    P.S.
    Есть Модуль выводящий на форму N кнопок с объектами.

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

    P.S.S.
    Либо браузер либо YII уже не хочет принимать php переменные в JS коде.

    Если js в отдельном файле, то засунуть туда php переменную никак не получится.
    Ответ написан
    1 комментарий
  • Как вывести из цифры - месяц?

    slo_nik
    @slo_nik Куратор тега PHP
    Нужен ещё php-intl
    $date = '2003-08-12';
    echo (new IntlDateFormatter('ru_RU', null, null, null, null, 'd MMM Y'))
          ->format(new DateTime($date));

    Результат при формате 'd MMMM Y'
    12 августа 2003
    При формате 'd MMM Y'
    12 авг. 2003
    Ответ написан
    Комментировать
  • Как выбрать целое предложение с нужным вхождением регулярным выражением PHP?

    slo_nik
    @slo_nik Куратор тега PHP
    Добрый вечер.
    $text = 'Длина и ширина магниевого корпуса ноутбука равны 320x202 мм. <br><br>
    Это почти как лист бумаги формата A4. Толщина устройства не превышает 14,9 мм. 
    Весит же оно всего 880 граммов. <br>';
    
    preg_match_all('#.*?бумаги.*?[.?!](?:\s|$)#', $text, $match);
    print_r($match);

    Результат
    Array
    (
        [0] => Array
            (
                [0] => Это почти как лист бумаги формата A4. 
            )
    
    )
    Ответ написан
    Комментировать
  • Yii2 model form как создать вручную поле?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Вы хотите сделать что-то вроде Slug?
    Тогда используйте встроенный класс SluggableBehavior.
    При использовании класса всё делается автоматически и не надо будет лепить "ржавый лисапет")))
    public function normalizeUrl($value)
    {
        return strtr($value, array(' ' => '-', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'j', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'shch', 'ы' => 'y', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'ъ' => '', 'ь' => ''));
    }
    Ответ написан
    1 комментарий