В настоящее время я работаю над веб-приложением (написанным на PHP, основанном на Yii), которое, среди прочего, позволяет вам устанавливать разные значения цен для продуктов. Каждый продукт может иметь несколько цен, но система построена таким образом, что я могу легко (и правильно) определить тип ценового поля - так что, в то время как каждый продукт может иметь несколько полей цены, он может иметь только один тип каждого типа ценовые поля.Столбец CGridView на основе отношения отображает неверные данные
Часть, в которой я застрял, - это когда я должен отображать сохраненное значение этих полей в списке и заказывать их по списку - я могу их правильно отобразить и отсортировать по одному столбцу, но как только я попробуйте сделать список сортируемым по всем столбцам (не в то же время, конечно), строки начинают отображать неправильные значения.
Вот соответствующие фрагменты кода:
В модели, в отношениях:
'productPriceConnects' => array(Product::HAS_MANY, 'ProductPriceConnect', 'product_id'),
'price1' => array(Product::HAS_ONE, 'ProductPriceConnect', 'product_id',
'joinType' => 'LEFT JOIN',
'on' => 'priceBeszerzesi.product_price_field_id=:product_price_field_id AND priceBeszerzesi.active = 1',
'params' => array(':product_price_field_id' =>ProductPriceField::model()->findByAttributes(array('active' => 1, 'type' => 1, 'category' => 6))->id),
'alias' => 'priceBeszerzesi',
),
'price2' => array(Product::HAS_ONE, 'ProductPriceConnect', 'product_id',
'joinType' => 'LEFT JOIN',
'on' => 'priceEladasi.product_price_field_id=:product_price_field_id AND priceEladasi.active = 1',
'params' => array(':product_price_field_id' => ProductPriceField::model()->findByAttributes(array('active' => 1, 'type' => 1, 'category' => 1))->id),
'alias' => 'priceEladasi'
),
'price3' => array(Product::HAS_ONE, 'ProductPriceConnect', 'product_id',
'joinType' => 'LEFT JOIN',
'on' => 'priceAkcios.product_price_field_id=:product_price_field_id AND priceAkcios.active = 1',
'params' => array(':product_price_field_id' => ProductPriceField::model()->findByAttributes(array('active' => 1, 'type' => 1, 'category' => 5))->id),
'alias' => 'priceAkcios'
),
В модели, при поиске:
...
$criteria->with('price1', 'price2', 'price3);
...
$criteria->compare('price1.price', $this->beszerzesi, true);
$criteria->compare('price2.price', $this->eladasi, true);
$criteria->compare('price3.price', $this->akcios, true);
...
$sort->attributes = array(
'price1' =>array(
'asc' => 'priceBeszerzesi.price ASC',
'desc' => 'priceBeszerzesi.price DESC',
),
'price2' =>array(
'asc' => 'priceEladasi.price ASC',
'desc' => 'priceEladasi.price DESC',
),
'priceAkcios' =>array(
'asc' => 'price3.price ASC',
'desc' => 'price3.price DESC',
),
'*'
);
...
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
'sort' => $sort,
'pagination' => array(
'pageSize' => 10,
),
)
);
данных столбцы в GridView :
'eladasi' => array(
'name' => 'price2',
'header' => 'Eladási ár',
'type' => 'raw',
'headerHtmlOptions' => array('class' => 'auto-width text-center'),
'value' => '!empty($data->price2->price) ? $data->price2->price == "" ? "-" : $data->price2->price : "-"',
'htmlOptions' => array('class' => 'border-right auto-width text-center'),
),
'akcios' => array(
'name' => 'priceAkcios',
'header' => 'Akciós',
'value' => '!empty($data->price3->price) ? $data->price3->price == "" ? "-" : $data->price3->price : "-"',
'headerHtmlOptions' => array('class' => 'auto-width text-center'),
'htmlOptions' => array('class' => 'border-right auto-width text-center'),
),
'beszerzesi' => array(
'name' => 'price1',
'header' => 'Beszerzési ár',
'type' => 'raw',
'value' => '!empty($data->price1->price) ? $data->price1->price == "" ? "-" : $data->price1->price : "-"',
'headerHtmlOptions' => array('class' => 'auto-width text-center'),
'htmlOptions' => array('class' => 'border-right auto-width text-center'),
),
Этот код позволяет отсортировать список по всем трем зависимым от отношения столбцам, но каждый столбец отображает одно и то же значение - значение последнего отношения в массиве with
. Если последний элемент в массиве равен price3
, то в столбцах отображается значение отношения price3
. Когда я удаляю все имена отношений из массива with
, ожидайте один, я могу сортировать список по этому столбцу, но не остальные.
Мой вопрос заключается в следующем: Есть ли способ 1), несомненно, добавить любое количество отношений к модели, подключение к одной и той же БД поле, но в зависимости от условий, 2) и отображать эти значения ПОКА позволяет сортировать на их основе?
разместить Ваш GridView код –
@ChetanAmeta Я добавил данных столбцов из gridview. –
Я заметил, что вы дважды проверяете цену с помощью 'empty()', а затем с '==" "'. Вам не нужно так поступать. Вы можете просто оставить 'empty()', это enougth: ''value' => '! Empty ($ data-> price2-> price)? $ data-> price2-> price: "-" '' – SiZE