Show only certain data in a yii2 grid?

1

Edito (08/22/2018): The problem is already solved, I add the corrected code and it works so that it can be used as a guide by those who need it, thanks to the user Sr1871 who was the one who gave the answer.

Well I know that maybe my query may be a bit silly but I've been trying for a while and I just can not do it. Well I'm developing an inventory for a library with the yii2 framework for all its management, well then I already did what I think are all the tables and data to use but in this case I will focus books and adq (thus identify the books in the library since it is an unrepeatable data).

What I need is the following in my book view I can see all the data in the book and below that data I want to show the data of adq these I get from another table, in order to bring that data but I shows all the adq in general not only the book I want to review

This is how my current view looks:

So I want it to look: EDITO (08/21/2018): How can I get it to show me only the ADQs of that book and in case I still do not have one registered, show me the blank list, if you can help me to achieve this, I would be very grateful .

Working:

View:

<?php

use yii\helpers\Html;
use yii\widgets\DetailView;
use yii\helpers\Url;
use yii\grid\GridView;

/* @var $this yii\web\View */
/* @var $model app\models\Libros */
/* @var $searchModel app\models\LibrosSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = $model->lib_titulo;
$this->params['breadcrumbs'][] = ['label' => 'Libros', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="libros-view">

    <h1><?= Html::encode($this->title) ?></h1>

    <p>
        <?= Html::a('Modificar', ['update', 'id' => $model->lib_id], ['class' => 'btn btn-primary']) ?>
        <?= Html::a('Borrar', ['delete', 'id' => $model->lib_id], [
            'class' => 'btn btn-danger',
            'data' => [
                'confirm' => 'Are you sure you want to delete this item?',
                'method' => 'post',
            ],
        ]) ?>
    </p>
<div class="row" align="center">
     <?php
       if ($model->lib_image_web_filename!='') {
         echo '<br /><p><img width="500" src="'.Url::to('@web/', true). '/uploads/libros/'.$model->lib_image_web_filename.'"></p>';
       }    
    ?>
    </div>
<div class="row" style="
text-align: center;
font: normal normal bold 15px/1 'lato';
color: rgba(7,7,7,1);
text-align: center;
">
    <?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'lib_id',
            'lib_titulo',
            'lib_autor',
            //'lib_edicion',
            'editorialNombre',
            'ubicacionNombre',
            'lib_isbn',
            'lib_clasificacion',
            'lib_seccion',
            //'lib_image_src_filename',
            //'lib_image_web_filename',
        ],
    ]) ?>
</div>
<?php
$this->title = 'Libros Disponibles';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="adq-index">

    <h1><?= Html::encode($this->title) ?></h1>
    <?php // echo $this->render('_search', ['model' => $searchModel]); ?>


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

            'adq_id',
            'adq_adq',
            'adq_libro_id',
            'adq_edicion',
            'adq_status',
            'adq_eti_roja',

            ['class' => 'yii\grid\ActionColumn'

        ],
        ],
    ]); ?>
</div>


</div>

Model (Libros.php):

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "libros".
 *
 * @property int $lib_id
 * @property string $lib_titulo
 * @property string $lib_autor
 * @property string $lib_edicion
 * @property int $lib_ubi
 * @property int $lib_editorial_id
 * @property string $lib_isbn
 * @property string $lib_clasificacion
 * @property string $lib_seccion
 * @property string $lib_image_src_filename
 * @property string $lib_image_web_filename
 *
 * @property Adq[] $adqs
 * @property Editorial $libEditorial
 * @property Ubicacion $libUbi
 * @property LibrosCarreras[] $librosCarreras
 * @property Carreras[] $licCarreras
 */
class Libros extends \yii\db\ActiveRecord
{
    const PERMISSIONS_PRIVATE = 10;
      const PERMISSIONS_PUBLIC = 20;  
      public $image;
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'libros';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['lib_titulo', 'lib_autor', 'lib_ubi', 'lib_isbn', 'lib_clasificacion', 'lib_seccion', 'lib_image_src_filename', 'lib_image_web_filename'], 'required'],
            [['lib_ubi', 'lib_editorial_id'], 'integer'],
            [['lib_titulo'], 'string', 'max' => 120],
            [['lib_autor', 'lib_clasificacion'], 'string', 'max' => 64],
            //[['lib_edicion'], 'string', 'max' => 3],
            [['lib_isbn'], 'string', 'max' => 32],
            [['lib_seccion'], 'string', 'max' => 2],
            [['lib_editorial_id'], 'exist', 'skipOnError' => true, 'targetClass' => Editorial::className(), 'targetAttribute' => ['lib_editorial_id' => 'edi_id']],
            [['lib_ubi'], 'exist', 'skipOnError' => true, 'targetClass' => Ubicacion::className(), 'targetAttribute' => ['lib_ubi' => 'ubil_id']],
            [['lib_image_src_filename', 'lib_image_web_filename'], 'string', 'max' => 100],
            [['image'], 'safe'],
            [['image'], 'file', 'extensions'=>'jpg, gif, png'],
            [['image'], 'file', 'maxSize'=>'1000000'],
             [['lib_image_src_filename', 'lib_image_web_filename'], 'string', 'max' => 255],        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
             'lib_id' => 'lib_id',
            'lib_titulo' => 'lib_titulo',
            'lib_autor' => 'lib_autor',
            //'lib_edicion' => 'Edicion',
            'lib_editorial_id' => 'lib_editorial_id',
            'lib_isbn' => 'lib_isbn',
            'lib_clasificacion' => 'lib_clasificacion',
            'lib_ubi' => 'lib_ubi',
            'lib_seccion' => 'lib_seccion',
            'image' => 'Captura',
            'lib_image_src_filename' => Yii::t('app', 'Nombre de Archivo'),
            'lib_image_web_filename' => Yii::t('app', 'Nombre del Directorio'),
            'editorialNombre' => 'Editorial',
            'ubicacionNombre' => 'Ubicacion',
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getAdqs()
{
    return $this->hasMany(Adq::className(), ['adq_libro_id' => 'lib_id'])->where(['<>', 'lib_id', $this->id]);
}

    /**
     * @return \yii\db\ActiveQuery
     */


    /**
     * @return \yii\db\ActiveQuery
     */
    public function getLibrosCarreras()
    {
        return $this->hasMany(LibrosCarreras::className(), ['lic_libros_id' => 'lib_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */

    public function getEditorial0()
    {
        return $this->hasOne(Editorial::className(), ['edi_id' => 'lib_editorial_id']);
    }
    public function getEditorialNombre()
    {
        return $this->editorial0->edi_nombre;
    }

    public function getLibUbi()
    {
        return $this->hasOne(Ubicacion::className(), ['ubil_id' => 'lib_ubi']);
    }

        public function getUbicacionNombre()
    {
        return $this->libUbi->ubil_nombre;    }
}

Controller (LibrosController):

<?php

namespace backend\controllers;

use Yii;
use app\models\Libros;
use app\models\LibrosSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\web\UploadedFile;
use app\models\Adq;
use app\models\AdqSearch;
use yii\data\ActiveDataProvider;

/**
 * LibrosController implements the CRUD actions for Libros model.
 */
class LibrosController extends Controller
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
        ];
    }

    /**
     * Lists all Libros models.
     * @return mixed
     */
    public function actionIndex()
    {
        $searchModel = new LibrosSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

    /**
     * Displays a single Libros model.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionView($id)
    {
    $model = $this->findModel($id);
$dataProvider = new ActiveDataProvider([
        'query' => Adq::find()->where(['adq_libro_id' => $model->lib_id])
]);

return $this->render('view', [
    'dataProvider' => $dataProvider,
    'model' => $model
]);
}
    /**
     * Creates a new Libros model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Libros();

        if ($model->load(Yii::$app->request->post())) {
          $image = UploadedFile::getInstance($model, 'image');
           if (!is_null($image)) {
             $model->lib_image_src_filename = $image->name;
             $ext = end((explode(".", $image->name)));
              // generate a unique file name to prevent duplicate filenames
              $model->lib_image_web_filename = Yii::$app->security->generateRandomString().".{$ext}";
              // the path to save file, you can set an uploadPath
              // in Yii::$app->params (as used in example below)                       
              Yii::$app->params['uploadPath'] = Yii::$app->basePath . '/web/uploads/libros/';
              $path = Yii::$app->params['uploadPath'] . $model->lib_image_web_filename;
               $image->saveAs($path);
            }
            if ($model->save()) {             
                return $this->redirect(['view', 'id' => $model->lib_id]);             
            }  else {
                var_dump ($model->getErrors()); die();
             }
              }
              return $this->render('create', [
                  'model' => $model,
              ]);     
    }

    /**
     * Updates an existing Libros model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post())) {
          $image = UploadedFile::getInstance($model, 'image');
           if (!is_null($image)) {
             $model->lib_image_src_filename = $image->name;
             $ext = explode(".", $image->name);
             $ext_final = end($ext);
              // generate a unique file name to prevent duplicate filenames
              $model->lib_image_web_filename = Yii::$app->security->generateRandomString().".{$ext_final}";
              // the path to save file, you can set an uploadPath
              // in Yii::$app->params (as used in example below)                       
              Yii::$app->params['uploadPath'] = Yii::$app->basePath . '/web/uploads/libros/';
              $path = Yii::$app->params['uploadPath'] . $model->lib_image_web_filename;
               $image->saveAs($path);
            }
            if ($model->save()) {             
                return $this->redirect(['view', 'id' => $model->lib_id]);             
            }  else {
                var_dump ($model->getErrors()); die();
             }
              }
              return $this->render('create', [
                  'model' => $model,
              ]);     
    }

    /**
     * Deletes an existing Libros model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

        return $this->redirect(['index']);
    }

    /**
     * Finds the Libros model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Libros the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = Libros::findOne($id)) !== null) {
            return $model;
        }

        throw new NotFoundHttpException('The requested page does not exist.');
    }
}

Search (LibroSearch.php):

<?php

namespace app\models;

use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use app\models\Libros;

/**
 * LibrosSearch represents the model behind the search form of 'app\models\Libros'.
 */
class LibrosSearch extends Libros
{
    public $editorialNombre;
    public $ubicacionNombre;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['lib_id', 'lib_ubi', 'lib_editorial_id'], 'integer'],
            [['lib_titulo', 'lib_autor', 'lib_isbn', 'lib_clasificacion', 'lib_seccion', 'lib_image_src_filename', 'lib_image_web_filename'], 'safe'],
              [['editorialNombre'],'safe'],
              [['ubicacionNombre'],'safe'],
        ];
    }

    /**
     * @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 = Libros::find();

        // add conditions that should always apply here

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

        $dataProvider->setSort([
            'attributes'=>[
                'editorialNombre'=>[
                    'asc'=>['editorial.edi_nombre'=>SORT_ASC],
                    'desc'=>['editorial.edi_nombre'=>SORT_DESC],
                    'label'=>'Editorial Nombre'
                ]
            ]
        ]);

        $dataProvider->setSort([
            'attributes'=>[
                'ubicacionNombre'=>[
                    'asc'=>['ubicacion.ubil_nombre'=>SORT_ASC],
                    'desc'=>['ubicacion.ubil_nombre'=>SORT_DESC],
                    'label'=>'Ubicacion Nombre'
                ]
            ]
        ]);

        $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;
        }

        // grid filtering conditions
        $query->andFilterWhere([
            'lib_id' => $this->lib_id,
            'lib_ubi' => $this->lib_ubi,
            'lib_editorial_id' => $this->lib_editorial_id,
        ]);

        $query->andFilterWhere(['like', 'lib_titulo', $this->lib_titulo])
            ->andFilterWhere(['like', 'lib_autor', $this->lib_autor])
            //->andFilterWhere(['like', 'lib_edicion', $this->lib_edicion])
            ->andFilterWhere(['like', 'lib_isbn', $this->lib_isbn])
            ->andFilterWhere(['like', 'lib_clasificacion', $this->lib_clasificacion])
            ->andFilterWhere(['like', 'lib_seccion', $this->lib_seccion])
            ->andFilterWhere(['like', 'lib_image_src_filename', $this->lib_image_src_filename])
            ->andFilterWhere(['like', 'lib_image_web_filename', $this->lib_image_web_filename]);

            $query->joinWith(['editorial0'=>function($q)//creamos un nuevo filtro
        {
            $q->where('editorial.edi_nombre LIKE "%' . $this->editorialNombre . '%"');
        }]);

            $query->joinWith(['libUbi'=>function($q)//creamos un nuevo filtro
        {
            $q->where('ubicacion.ubil_nombre LIKE "%' . $this->ubicacionNombre . '%"');
        }]);

        return $dataProvider;
    }
}
    
asked by genesis96 14.08.2018 в 19:56
source

2 answers

0

EDITO

If you are going to put them in a gridView you need to generate the dataProvider in the controller, the one you are trying to put in is a provider of Books and not Adq, change that part to this in the action of View

$model = $this->findModel($id);
$dataProvider = new ActiveDataProvider([
        'query' => Adq::find()->where(['adq_libro_id' => $model->id])
]);

return $this->render('view', [
    'dataProvider' => $dataProvider,
    'model' => $model
]);
    
answered by 22.08.2018 / 18:53
source
0

To show only certain data in a GridView you need to configure the columns parameter link

    
answered by 05.09.2018 в 17:43