Ответы пользователя по тегу Yii
  • Как вывести подборку похожих товаров?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Напишите отдельный метод, который будет брать из базы похожие товары.
    При этом передайте в запрос все id жанров и тегов, которые необходимо вывести.
    Как-то так:
    public function getSemilarProducts()
    {
        if(($models = Products::find()->where(['in', 'id_genre', [1,4,5])->andWhere(['in', 'id_tags', [2,6,5])->limit(5)->all()) !== null){
          return $models;
       }
       else{
            throw new NotFoundHttpException('The requested page does not exist.');
       }
    }
    Ответ написан
  • Собственный Ajax запрос в yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Тут, как минимум, два варианта.
    Самый простой это сформировать переменную с адресом и передать в js, при этом надо правильно подключить js
    $url = Utl::toRoute(// путь к Вашему контролеру/действию.);
    $this->registerJs(
    "
    $('.month').click(function() {
        var date = $(this).text();
    
        $.ajax({
            url: '".$url."',
            date: date,
            method: 'post',
            dataType: 'json',
            success: function () {
                alert('success');
            },
            error: function (response) {
                console.log(response);
            }
        })
    });
    ", yii\web\View::POS_END)

    Это если js находится в том же файле.
    Если js у Вас вынесен в отдельный файл, то я бы добавил дополнительный параметр, например к ссылке, в котором хранился бы url. При клике по ссылке читал бы этот параметр и формировал из него url для ajax запроса.
    Пример:
    php
    Html::a('Link', $url, ['data' => ['ajaxurl' => Url::toRoute(// путь к контролеру/действию)]])

    js
    $('a').on('click', function(){
      var url = $(this).attr('data-ajaxurl')
     $.ajax({
        url: url
     })
    })
    Ответ написан
    5 комментариев
  • Как реализовать разное поведение по разным Submit в форме, обернутой PJAX?

    slo_nik
    @slo_nik Куратор тега Yii
    Контролер
    public function actionIndex()
        {
            if(Yii::$app->request->isAjax){
                if(Yii::$app->request->post('myParam') == 1){
                    $param = 'Ответ сервера - ' . Yii::$app->request->post('myParam');
                }
                else{
                    $param = 'Ответ сервера - ' . Yii::$app->request->post('myParam');
                }
                return $this->asJson($param);
            }
    
            return $this->render('index');
        }

    Вид
    <?php
    $form = ActiveForm::begin([
        'id' => 'form1',
        'action' => Url::to(['images/index']),
        'options' => [
            'data-pjax' => 'pjax1'
        ]
    ]);
    
    echo Html::submitButton('Добавить', ['data' => ['param' => 1]]);
    
    echo Html::hiddenInput('myParam', false);
    
    echo Html::submitButton('Заменить', ['data' => ['param' => 0]]);
    
    ActiveForm::end();
    ?>
    <div id="result"></div>
    <?php
    $this->registerJs("
      $('button').on('click', function(e){
         e.preventDefault();
         var url = $(this).closest('form').attr('action');
         var param = $(this).attr('data-param')
         $.ajax({
           url: url,
           type: 'POST',
           data: {myParam: param},
           success: function(data){
              $('#result').text(data)
           }
         })
      })
    ")
    ?>
    Ответ написан
    Комментировать
  • Как в urlCreator() передать стороннюю переменную?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Переопределить кнопки в ActionColumn.
    Приблизительно так:
    [
       'class' => 'yii\grid\ActionColumn',
       'buttons' => [
            'view' => function($url, $model, $key){
                return Html::a('view',$url . '/car/' . $model->username ); // в общем подставьте свои параметры.
            },
            'update' => function($url, $model, $key){
                // your code
            },
            'delete' => function($url, $model, $key){
                // your code
            }        
        ]
    ]

    Можно даже добавить свою кнопку))) Только тогда надо переопределить шаблон для кнопок
    Вот как-то так:
    [
       'class' => 'yii\grid\ActionColumn',
       'template' => '{view} {update} {delete} {customButton}',
       'buttons' => [
            'view' => function($url, $model, $key){
                return Html::a('view',$url . '/car/' . $model->username ); // в общем подставьте свои параметры.
            },
            'update' => function($url, $model, $key){
                // your code
            },
            'delete' => function($url, $model, $key){
                // your code
            },
            'customButton' => function($url, $model, $key){
                  return Html::a('CustomButton', ['/site/index']); // параметры, конечно же, подставьте свои.
           }      
        ]
    ]

    А параметр можно передать так:
    'view' => function($url, $model, $key) use ($your_param){
                return Html::a('view',$url . '/car/' . $your_param ); // в общем подставьте свои параметры.
            },
    Ответ написан
    1 комментарий
  • Как правильно настроить роутинг в Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Можно попробовать сделать в правилах urlManager так
    'car' => 'base/index' // укажите своё действие вместо index

    Но, скорей всего, Вам надо будет написать пользовательский класс UrlManager, в котором определить все свои правила. Эта тема отдельная, могу только приблизительный пример дать и ссылки для изучения.
    Ответ написан
    Комментировать
  • Как при foreach вставлять класс active в меню сайта?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Используйте виджеты, которые предоставляет yii2, всё будет работать.
    Например yii\widgets\Menu;
    Получаете из базы данных все необходимые пункты меню, формируете их в массив и "скармливаете" в виджет.
    Menu::widget([
        'items' => $items
    ])

    Так же можно использовать NavBar
    Ответ написан
  • Почему не отправляются письма на Yii2 (ошибка 220)?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Зайдите в свой аккаунт gmail и разрешите "небезопасные приложения".
    Если Вы не ошиблись в "username" и "password", то письма должны отправляться при текущих Ваших настройках.
    Ответ написан
    Комментировать
  • Как сделать редирект с http на https для сайта на YII2 (basic) через .htaccess?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Попробуйте добавить в web/.htaccess
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

    Если Ваш проект лежит в поддиректории, то в https://%{SERVER_NAME}/$1 [R,L] нужно добавить название поддиректории.
    Ответ написан
    Комментировать
  • Научите формировать filter в GridView к связанной модели?

    slo_nik
    @slo_nik Куратор тега Yii
    В gridView установите параметр 'filterModel' => $searchModel для всей таблицы.
    Portfolio::getNames() что возвращает, только имена?
    Я бы переписал параметры фильтра чуть по-другому.
    [
                    'attribute' => 'id_portfolio',
                    'headerOptions' => ['class' => 'col-md-1'],
                    'format' => 'text',
                    'filter' => Portpholio::getAllPortfolio(),
                    'value' => 'portfolio.title'
                ],

    Сам метод getAllPortfolio() может выглядеть так
    public static function getAllPortfolio()
        {
            return ArrayHelper::map(self::find()->orderBy(['name' => SORT_ASC])->all(), 'id', 'name');
        }

    В поисковой модели запрос может выглядеть так(ещё добавить публичное свойство)
    public $id_portfolio;
    
    $query = Order::find()->with('portfolio');
    
    $query->andFilterWhere('{{%portfolio}}.id' => $this->id_portfolio);
    Ответ написан
  • Фиксированные значения для dropdown (больше 2-ух) - в E-NUM или куда?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Я бы сделал немного по другому.
    В модели объявил бы константы, каждая из которых соответствовала бы какому-то статусу.
    Названия не использовать, только числовые значения. Поле в таблице под статус сделать smallint(6), NULL нет, по умолчанию 0.
    Вот как-то так:
    const STATUS_LIVE = 0;
    const STATUS_ERROR = 1;
    /* и так далее */
    
    public function rules()
    {
       return [
                ['status', 'integer'],
                ['status', 'default', 'value' => self::STATUS_LIVE],
                ['status', 'in', 'range' => array_keys(self::getStatusesArray())],
       ];
    }
    
    /* метод использовать при выводе статуса в view.php*/
    public function getStatusName()
    {
       return ArrayHelper::getValue(self::statusesArray(), $this->status);
    }
    
    public static function getStatusesArray()
    {
         return [
            self::STATUS_LIVE => 'Live',
           self::STATUS_ERROR => 'Error',
           /* и так далее */
        ];
    }

    В gridView
    'filter' => YOUR_MODEL_NAME::getStatusesArray()
    В dropDown формы
    $form->field($model, 'status')->dropDownListYOUR_MODEL_NAME::getStatusesArray(), ['prompt' => 'Select'])
    Ответ написан
    2 комментария
  • Как заставить работать robots.txt?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    В .htaccess
    RewriteEngine on
    RewriteBase /
    RewriteCond  %{HTTP_HOST} site.ru$
    Rewriterule ^robots.txt$ web/robots.txt [L]
    Ответ написан
    2 комментария
  • Как организовать поиск по связанным полям Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    В модели
    $query = Specialist::find()->with(['organization', 'user']);
    
    $this->load($params);
    if (!$this->validate()) {
         return $dataProvider;
    }

    В контроллере
    $searchModel = new SpecSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams)
    Ответ написан
    Комментировать
  • Как с помощью ajax подгружать поля формы в зависимости от выбора категории в Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    public function actionPostSpecifics(){
        if(Yii::$app->request->isAjax){
            $model = new Post();
            $model->load(Yii::$app->request->post());
            $category_id = $model-> category_id;   
            
            $form = new \yii\widgets\ActiveForm;
            
          return $this->renderAjax('form_specifics', [
              'model' => $model ,
              'category_id' => $category_id,
              
              'form' => $form
              
          ]);       
        }
    }

    В файле form_specifics используете $form обычным способом
    echo $form->field($model, 'attribute_name')->textInput();
    Ответ написан
    4 комментария
  • Как изменить внешний вид поля в ActiveForm?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброй ночи.
    Если Вы используете yii\widget\ActiveForm, то замените его на yii\bootstrap\ActiveForm
    use yii\bootstrap\ActiveForm;
    $form = ActiveForm::begin(['layout' => 'horizontal'])

    И получите то, что Вы хотите.
    Ответ написан
    4 комментария
  • Как правильно вывести массив в radioList в yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    $arr = [
        [
            "title"=> "Сайт1",
            "link"=> "site1.ru"
        ],
        [
            "title"=> " Сайт2",
            "link"=> "site2.ru"
        ],
        [
            "title"=> "Сайт2",
            "link"=> "site3.ru"
        ]
    ];
    
    <?= $form->field($model, 'email')->radioList(ArrayHelper::map($arr, 'title', 'link'),[
        'item' => function($index, $label, $name, $checked, $value) {
            return '<label class="modal-radio" style="display:block;">
                      <input type="radio" name="' . $name . '" value="' . $value . '" tabindex="3">
                      <i></i>
                      <span>' . ucwords($label) . '</span>
                   </label>';
        }
    ]) ?>
    Ответ написан
  • Как сделать так, чтобы таблицы связывались по ключу?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Замените
    $post = Post::findOne($id);
    На
    $post = Post::find()->with('comments')->where('id=:id', [':id' => $id])->one();
    Ответ написан
    Комментировать
  • Как реализовывать динамические EAV?

    slo_nik
    @slo_nik Куратор тега Yii
    Дмитрий Яковлев, Вам надо познакомиться с табличным вводом.
    И вот ещё есть такой пакет.
    Ответ написан
    Комментировать
  • Как в Yii2 при редактирование модели запретить перезапись полей которые отсутствуют в форме?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Я бы обратил своё внимание на "сценарии".
    Один сценарий для создания новой записи, второй для редактирования существующей.
    Соответствующие правила валидации для каждого сценария.
    https://www.yiiframework.com/doc/guide/2.0/ru/stru...

    p.s.
    Если просто создать форму с 2 полями field_3, field_4, то злоумышленник зная какие еще есть поля, может отправить и поля field_1, field_2 и они перезапишутся.

    А как же RBAC?

    P.S.S
    Не имеет смысла и может привести к ошибкам валидации.
    if (******** && $form->validate()) {
        ******
        if ($model->save(true)) {
            *****
        }
    }

    Тем более, что валидация в методе save() включена по умолчанию.
    public boolean save ( $runValidation = true, $attributeNames = null )
    Ответ написан
    2 комментария
  • Нужно перенастроить форму HTML в ActiveForm yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Немного сократил Ваш код для генерации формы.
    <?php
       $form = ActiveForm::begin([
           'id' => 'appointment_form',
           'fieldConfig' => [
               'options' => [
                   'tag' => 'span',
                   'class' => 'input input--kohana'
               ],
               'template' => '{input}{label}{error}',
               'inputOptions' => ['class' => 'input__field input__field--kohana'],
               'labelOptions' => [
                   'class' => 'input__label input__label--kohana',
               ]
           ]
       ]);
    ?>
    <?= $form->field($model, 'name')->textInput()->label("<i class=\"icon-phone5 icon icon--kohana\"></i><span class=\"input__label-content input__label-content--kohana\">" . $model->getAttributeLabel('name') . "</span>") ?>
    <!-- ОСТАЛЬНЫЕ ПОЛЯ ФОРМЫ  -->
    <?= $form->field($model, 'body')->textInput()->label() ?>
    <?= Html::submitButton('Submit'); ?>
    <?php
      ActiveForm::end();
    ?>

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

    p.s. Перед этой строкой не надо формировать переменную и потом передавать её в шаблон письма.
    Достаточно просто передать модель.
    // Удалить!!!
       /*   $content = "<p>Email: " . $this->email1 . "</p>";
            $content .= "<p>Name: " . $this->name1 . "</p>";
            $content .= "<p>Phone: " . $this->phone . "</p>";
            $content .= "<p>Datepicker: " . $this->datepicker . "</p>";
            $content .= "<p>Body: " . $this->body1 . "</p>";*/
            if ($this->validate()) {
                Yii::$app->mailer->compose("@app/mail/layouts/html", ["content" => $this])

    И уже в самом шаблоне обработать и сформировать html.
    Ответ написан
    6 комментариев
  • Почему yii2 не видит ссылки?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Размещайте файлы в web директории, создайте в ней директорию по названию темы и в созданной директории images.
    Получится такой путь к изображениям
    app\web\themes\name_theme\images
    Выводить можно будет так:
    <?= Html::img('@web/themes/name_theme/images/page4_img1.jpg') ?>

    Возможно в Вашем варианте тоже получится использовать псевдоним @web

    p.s.
    Есть ещё пару вариантов с использованием AssetBundl для темы.
    Например есть тема "Portfolio".
    Файлы изображений располагаете по пути app\themes\portfolio\assets\img
    В директории app\assets создаёте файл PortfolioAsset
    class PortfolioAsset extends AssetBundle
    {
    	//public $basePath = '@app/themes/portfolio/assets';
    	//public $baseUrl = '@app/themes/portfolio';
    	public $sourcePath = '@app/themes/portfolio/assets';
    	public $css = [
                'css/bootstrap.min.css',
                'css/stylish-portfolio.css',
                'font-awesome/css/font-awesome.min.css',
                'http://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700,300italic,400italic,700italic'
    	];
    	public $js = [
               'js/jquery.js',
               'js/bootstrap.min.js',
               'js/local.js'
    	];
    	public $depends = [
    	];
    }

    Подключаете этот файл в layout темы и создаёте вспомогательную переменную
    $image = PortfolioAsset::register($this);
    Теперь получить изображение можно так
    echo Html::img($image->baseUrl.'/img/portfolio-1.jpg');

    Или, в layout темы создаёте такую переменную
    $theme = $this->theme;
    Расскоментируете в PortfolioAsset строку public $baseUrl = '@app/themes/portfolio'; и получаете изображение уже таким способом
    echo Html::img($theme->getUrl('assets/img/portfolio-4.jpg'));

    В итоге все файлы темы находятся в одном месте app\themes\name_theme\assets и не надо раскидывать их по всему проекту.
    Ответ написан
    2 комментария