2

私のデータベースには、製造元とプラスチックの 2 つのテーブルがあります。

CREATE TABLE `manufacturer` (                                                                   
  `id` int(11) NOT NULL AUTO_INCREMENT,                                                                          
  `name` varchar(64) DEFAULT NULL,                                                                               
  PRIMARY KEY (`id`)                                                                                             
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8

CREATE TABLE `plastic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL DEFAULT '',
  `manufacturer_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`,`manufacturer_id`),
  KEY `manufacturer_id` (`manufacturer_id`),
  CONSTRAINT `plastic_ibfk_1` FOREIGN KEY (`manufacturer_id`) REFERENCES `manufacturer` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8

ご覧のとおり、プラスチックには、Yii がメーカーとの BELOGS_TO 関係と呼ぶものがあります。つまり、1 つのメーカーがいくつかの異なるプラスチックを製造することができます。

デフォルトのプラスチック管理ページからメーカー名で検索できるようにしようとしていますが、検索フィールドがメーカーの列に表示されません。私はこのガイドに従いましたが、ほとんどそこにいると思いますが、1つの小さな詳細にこだわっています.

上記のリンクにあるように、私のプラモデルのクラスでは、次のものがあります。

class Plastic extends CActiveRecord
{
public $manufacturer_search; //<-- added per the above link

public function rules()
{
    return array(
        array('manufacturer.name', 'length', 'max'=>64),
        array('name', 'length', 'max'=>64),
        array('name, manufacturer.name, manufacturer_search', 'safe', 'on'=>'search'),
    );
}

public function relations()
{
    return array(
        'manufacturer' => array(self::BELONGS_TO, 'Manufacturer', 'manufacturer_id'),
    );
}

public function search()
{
    $criteria=new CDbCriteria;
    $criteria->with=array('manufacturer');
    $criteria->compare('name',$this->name,true);
    $criteria->compare('manufacturer.name',$this->manufacturer_search, true);

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}

}

管理ページは、CGridView ウィジェットを使用してすべてを表示します (これがデフォルトで、'columns' 属性以外は何も変更していません)。

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'plastic-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'name',
        'manufacturer.name',
        array(
            'class'=>'CButtonColumn',
        ),  
    ),  
)); ?>

腹立たしいことは、検索が実際に機能することです。高度な検索をクリックして、製造元フィールドに何かを入力すると、機能します。しかし、私の人生では、検索ボックスをグリッド ビューに表示することはできません。

ここにいくつかのスクリーンショットがあります: ウィジェットに manufacturer_id を渡したときの管理ページのスクリーンショット、上記のコードのように manufacturer.name を渡したときのスクリーンショット、manufacturer_search を渡したときのスクリーンショット (とにかく動作するとは思っていませんでした) 、最後に高度な検索が適切に機能しているスクリーンショットです。

何か案は?ありがとう。

4

2 に答える 2

5

次のようなfilter専用のものを作成する必要があります。$manufacturer_search

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'plastic-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'name',
        array(
            'name'=>'manufacturer.name',
            'filter'=>CHtml::activeTextField($model,'manufacturer_search'),
        ),
        array(
            'class'=>'CButtonColumn',
        ),  
    ),  
)); ?>
于 2013-03-10T09:37:10.477 に答える