Как правильно сделать валидацию?

есть модель Products со своими rules от нее наследуется модель Carts сообствено вот её код
Как правильно сделать валидацию?
<?php

namespace frontend\models;

use common\models\Products;
use common\models\Price;
class Carts extends Products
{
    public $price;
    public function rules()
    {
        return [
            [['price'], 'required'],
            [['price'], 'integer'],
        ];
    }
    public function getPrise()
    {
        return $this->hasMany(Price::className(), ['products_id' => 'id']);

    }
}


после этого в контролере я её получаю таким образом
$recomended     =   Carts::find()->where('recomended=1')->with('images','price')->all();

а в представлении следующим образом я его передаю в виджет Cart
<?php foreach($recomended as $rec){ Cart::widget(['model'=>$rec])} ?>

вот собственно сам виджет
<?php
namespace frontend\widgets\cart;

use Yii;
use yii\base\Widget;
use common\models\Product;
use common\models\Price;
use frontend\models\CartPosition;
use yz\shoppingcart\ShoppingCart;
use yii\web\Controller;
class Cart extends Widget
{
    public $model;
    public $idCountry;
    public function init()
    {
        parent::init();

    }

    public function run()
    {
        $product=$this->model;
        $idCountry=$this->idCountry;
        /*$price = array_filter($product->price, function($item)use($idCountry) {
            return $item->countryid == $idCountry;
        });*/
        $post=Yii::$app->request->post();
        if(Yii::$app->request->isPjax){
            $position = Product::findOne($post['productId']);
            $prise= Price::find()->where("price=".$post['Product']['price'])->andWhere("product_id=".$post['productId'])->one();
            $prises=$prise->price;
            $volume=$prise->volume;
            $country=$prise->countryid;
            $cartPosition = new CartPosition($position->id, $prises, $country, $volume);
            if ($position) {
                \Yii::$app->cart->put($cartPosition, 1);
                if (Yii::$app->request->isPjax) {
                    \Yii::$app->controller->renderPartial('_success');
                    /*return $this->render('html',[
                        'model'=>$product,
                        'price'=>$price
                    ]);*/
                }
            }
        }else{
            return $this->render('html',[
                'model'=>$product,
                //'price'=>$price,
                'var'=>$idCountry
            ]);
        }
    }
}

и его вьюха
<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
use yii\helpers\ArrayHelper;
use yii\widgets\Pjax;

Pjax::begin();
$form = ActiveForm::begin(['options' => ['class'=>'customsearch','data-pjax' => true]]);
echo Html::activedropDownList( $model,'price', ArrayHelper::map($model->prise, 'price','volumeName'),['prompt' => 
<?php  ActiveForm::end();?>

и теперь при не выбранном полеprice там на самом деле стоит скрипт который преобразует select в ряд ссылок с конечным текстовым инпутом но импут имеет атрибут name='Carts[pice]' так что наверное лучше сказать при пустом value текстового инпута валидация не проходит не объясните что я делаю не так.
  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ответы на вопрос 2
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Используйте сценарии
Ответ написан
Комментировать
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Сильно не вникал, но видимо то что Вам надо это when
Вот пример немного оторванный от контекста:
public function rules()
    {
        return [
            [['price'], 'required', 'when'=>function($model){
              return ($model->price === null)?false:true;
            }],
            [['price'], 'integer'],
        ];
    }

По сути в зависимости от того вернула связь что-то или нет - мы делаем обязательным или нет аттрибут 'price'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы