ManageController.php 7.17 KB
<?php

namespace common\modules\relation\controllers;

use common\modules\rubrication\models\TaxOption;
use yii\base\Exception;
use yii\data\ActiveDataProvider;
use yii\db\ActiveRecord;
use yii\web\Controller;
use Yii;
use common\modules\relation\relationHelper;
use common\modules\relation\models\Relation;
use common\modules\relation\models\RelationSearch;
use yii\web\NotFoundHttpException;

/**
 * Default controller for the `relation` module
 */
class ManageController extends Controller
{
    /**
     * Renders the relations view
     * @return string
     */
    public function actionIndex()
    {
        $relations = relationHelper::getRelations();
        $list = [];
        foreach ($relations as $key => $relation) {
            $list[] = [
                'key' => $key,
                'name' => $relation['name'],
                'entity1_label' => $relation['entity1']['label'],
                'entity1_model' => $relation['entity1']['model'],
                'entity2_label' => $relation['entity2']['label'],
                'entity2_model' => $relation['entity2']['model'],
            ];
        }
        return $this->render('relations', [
            'relations' => $list
        ]);
    }
    /**
     * Renders the pars view for
     * @return string
     */
    public function actionPars($relation)
    {
        $relation_key = strtolower($relation);
        $relation = relationHelper::getRelation($relation_key);

        $dataProvider = new ActiveDataProvider([
            'query' => $relation['via']['model']::find(),
        ]);

        return $this->render('pars', [
            'dataProvider' => $dataProvider,
            'relation_key' => $relation_key,
            'relation' => $relation,
        ]);
    }

    public function actionCreate($relation) {
        $relation_key = strtolower($relation);
        $relation = relationHelper::getRelation($relation_key);

        $model = new $relation['via']['model'];

        $query1 = $relation['entity1']['model']::find();
        if (!empty($relation['entity1']['where']))
            $query1->where($relation['entity1']['where']);

        $query2 = $relation['entity2']['model']::find();
        if (!empty($relation['entity2']['where']))
            $query2->where($relation['entity2']['where']);

        if ($model->load(Yii::$app->request->post())) {
            $model->save();
            return $this->redirect(['pars', 'relation' => $relation_key]);
//            return $this->redirect(['update', 'id' => $model->{$relation['entity1']['linked_key']}. ':' .$model->{$relation['entity2']['linked_key']}]);
        } else {
            return $this->render('create', [
                'model' => $model,
                'items1' => $query1->all(),
                'items2' => $query2->all(),
                'relation_key' => $relation_key,
                'relation' => $relation,
            ]);
        }
    }

    /**
     * Updates an existing TaxGroup model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionUpdate($relation, $id) {
        $relation_key = strtolower($relation);
        $relation = relationHelper::getRelation($relation_key);

        list($id1, $id2) = explode(':', $id);

        $model = $this->findModel($relation_key, $id1, $id2);

        $query1 = $relation['entity1']['model']::find();
        if (!empty($relation['entity1']['where']))
            $query1->where($relation['entity1']['where']);

        $query2 = $relation['entity2']['model']::find();
        if (!empty($relation['entity2']['where']))
            $query2->where($relation['entity2']['where']);

        if ($model->load(Yii::$app->request->post())) {
            $connection = Yii::$app->getDb();
            $transaction = $connection->beginTransaction();
            try {
                // Delete links from viaTable
                $connection->createCommand()
                    ->update
                    (
                        $relation['linked_table'],
                        [
                            $relation['entity1']['linked_key'] => $model->getAttribute($relation['entity1']['linked_key']),
                            $relation['entity2']['linked_key'] => $model->getAttribute($relation['entity2']['linked_key'])
                        ],
                        $this->getWhere($relation_key, $id1, $id2)
                    )
                    ->execute();
                $transaction->commit();
            } catch (Exception $ex) {
                $transaction->rollback();
                throw $ex;
            }

            return $this->redirect(['pars', 'relation' => $relation_key]);
        } else {
            return $this->render('update', [
                'model' => $model,
                'items1' => $query1->all(),
                'items2' => $query2->all(),
                'relation_key' => $relation_key,
                'relation' => $relation,
            ]);
        }
    }

    /**
     * Deletes an existing TaxGroup model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
    public function actionDelete($relation, $id)
    {
        $relation_key = strtolower($relation);
        $relation = relationHelper::getRelation($relation_key);

        list($id1, $id2) = explode(':', $id);

        $connection = Yii::$app->getDb();
        $transaction = $connection->beginTransaction();
        try {
            // Delete links from viaTable
            $connection->createCommand()
                ->delete
                (
                    $relation['linked_table'],
                    $this->getWhere($relation_key, $id1, $id2)
                )
                ->execute();
            $transaction->commit();
        } catch (Exception $ex) {
            $transaction->rollback();
            throw $ex;
        }

        return $this->redirect(['pars', 'relation' => $relation_key]);
    }

    /**
     * Finds the based model for relation on its primaries keys value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param string $relation
     * @param integer $id1
     * @param integer $id2
     * @return ActiveRecord the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($relation, $id1, $id2)
    {
        $relation_key = strtolower($relation);
        $relation = relationHelper::getRelation($relation_key);
        if (($model = $relation['via']['model']::findOne($this->getWhere($relation_key, $id1, $id2))) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }

    protected function getWhere($relation_key, $id1, $id2) {
        $relation = relationHelper::getRelation($relation_key);
        // @todo Just think - if you need to search keys in the reverse order
        $where = [
            $relation['entity1']['linked_key'] => $id1,
            $relation['entity2']['linked_key'] => $id2,
        ];
        if (!empty($relation['alias'])) {
            $where[$relation['alias']] = $relation_key;
        }
        return $where;
    }

}