2016-12-21 5 views
1

Я хотел бы иметь таблицу CRUD, и, чтобы быть конкретным, мне не нужно редактировать/удалять записи, только часть с результатами фильтрации, которая появляется в верхней части таблицы, сгенерированной CRUD, является часть, которую я хочу иметь. Моя таблица содержит данные из 1 таблицы в базе данных, но у меня есть один столбец, который не связан с этой или любой другой таблицей в базе данных (это автоматический автогенератор, основанный на одном столбце из таблицы). Я создаю таблицу вручную, но хочу добавить часть с фильтрацией. Я не знаю, как это сделать. Возможно ли в Yii2 сделать это вручную или мне нужно использовать CRUD-генератор?Yii2 CRUD сгенерировано вручную

+0

ли вы имеете в виду GridView? – Yupik

ответ

1

Я не использую генератор CRUD, поскольку он не генерирует код, который я хочу (и я думаю, что он также не генерирует фильтры?). Я использую базовый шаблон, который подходит для почти всех gridviews, которые мне нужно отображать. Вот один пример, который может дать вам фильтр:

use yii\grid\GridView; 

/** @var array $userTypes All user types (classes) */ 
// ... 

echo GridView::widget([ 
    'dataProvider' => $modelProvider, 
    'filterModel' => $model, 
    'columns' => [ 
     [ 
      'attribute' => 'id', 
      'format' => 'raw', 
      'filter' => Html::input('text', 'User[id]', $model->id, ['class' => 'form-control', 'placeholder' => 'Filter ID']), 
     [ 
      'attribute' => 'type', 
      'format' => 'raw', 
      'filter' => Html::activeDropDownList($model, 'type', $userTypes, ['class' => 'form-control', 'prompt' => 'All types']), 
     ], 
]); 

В здесь я использую 2 различных типов входных полей (текст и выпадающие).

Для Html::input, сначала введите (текст), затем полное имя атрибута (название модели + имя атрибута), затем значение по умолчанию и, наконец, другие параметры.

Для модели Html::activeDropDownList у нас есть модель сначала, а затем имя атрибута (только), список элементов (массив) и, наконец, другие параметры.

+0

Если я неправильно понял ваш вопрос, просьба дать некоторые разъяснения. –

0

Я думаю, вы говорите о GridView, если да, тогда у вас могут быть свои собственные столбцы, без проблем. позволяет называть этот столбец comment как вы упомянули

Если вы используете основной шаблон, генерируемый Gii, и вы также генерировать класс поиска для этой модели, то вам comment в безопасные атрибуты и добавить код для этого кода, чтобы иметь возможность фильтровать ,

Если бы вы могли быть более подробно о упомянутой колонке, возможные значения или Algorythm вы можете получить более подходящие ответы ...

принять Также обратите внимание на Yii 2.0: Displaying, Sorting and Filtering Model Relations on a GridView

Допустим, ваш model называется Xyz, как вы делали не предусмотрено. Кроме того, я назвал столбец из таблицы, как column_from_your_table и ваш виртуальный столбец в comment

В модели Xyz вы добавите связь (метод с определенным именем, чтобы определить его)

public function getComment() 
{ 
    $column_from_your_table = $this->column_from_your_table; 
    $comment = ''; 

    // your code to specify the relation 
    // ... 

    // this is value dislpayed in column grid 
    return $comment; 
} 

и в файле XyzSearch.php в \app\models\

вы будете иметь что-то вроде этого (редактировать для ваших нужд Ofcourse)

<?php 

namespace app\models; 

use Yii; 
use yii\base\Model; 
use yii\data\ActiveDataProvider; 
use yii\db\Expression; 

/** 
* XyzSearch represents the model behind the search form about `app\models\Xyz`. 
*/ 
class XyzSearch extends Xyz 
{ 
    public $comment; // your virtual column 

    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      // add it to safe attributes 
      [['comment'], 'safe'], 
      // you will have more rules for your other columns from DB probably 
     ]; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function scenarios() 
    { 
     // bypass scenarios() implementation in the parent class 
     return Model::scenarios(); 
    } 

    /** 
    * Creates data provider instance with search query applied 
    * 
    * @param array $params 
    * 
    * @return ActiveDataProvider 
    */ 
    public function search($params) 
    { 
     $query = Xyz::find(); 

     // add conditions that should always apply here 

     $dataProvider = new ActiveDataProvider([ 
      'query' => $query, 
     ]); 

     // I dont know your how it is your comment column autogenerated 
     // or what is the relation, so I give you just basic idea 
     // your algorythm needs to be able to be rewritten in SQL 
     // otherwise I dont know how you could possibly sort it 
     $dataProvider->sort->attributes['comment'] = [ 
      'asc' => [Xyz::tableName().'.column_from_your_table' => SORT_ASC], 
      'desc' => [Xyz::tableName().'.column_from_your_table' => SORT_DESC], 
      'default' => SORT_ASC, 
     ]; 

     $this->load($params); 

     if (!$this->validate()) { 
      // uncomment the following line if you do not want to return any records when validation fails 
      // $query->where('0=1'); 
      return $dataProvider; 
     } 

     // again, you will have more filtering conditions from your generated code 

     // then you will add your custom filtering condition 
     // I dont know your how it is your comment column autogenerated 
     // or what is the relation, so I give you just basic idea 
     $query->andFilterWhere(['like', Xyz::tableName().'.column_from_your_table', $this->comment]); 


     return $dataProvider; 
    } 
} 

, наконец, в файле view добавить свой virutal столбец

<?php echo GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 

     // other columns from database 
     // ... 

     'comment', 

     ['class' => 'yii\grid\ActionColumn'], 
    ] 
]); ?> 
Смежные вопросы