Сохранение двух значений из справочника в бд через dropdownlist

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
Solutions
Сообщения: 93
Зарегистрирован: 2014.01.09, 13:23
Откуда: Казахстан. ВКО. Усть-Каменогорск

Сохранение двух значений из справочника в бд через dropdownlist

Сообщение Solutions »

Доброе время суток, проблемка следующего характера, есть dropdownlist, в него подгружаться массив из справочника в бд и сохраняются данные в поле др таблицы, но мне необходимо еще и сохранять id выбранного значения из справочника в др поле этой же таблицы. Не подскажите как это можно реализовать? Спасибо!
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение andku83 »

сформулируйте более точно что вам нужно, сейчас вообще ничего не понятно
Solutions
Сообщения: 93
Зарегистрирован: 2014.01.09, 13:23
Откуда: Казахстан. ВКО. Усть-Каменогорск

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение Solutions »

andku83 писал(а): 2018.11.18, 20:06 сформулируйте более точно что вам нужно, сейчас вообще ничего не понятно
Есть таблица: lines, в ней есть поля: id, line, data, nom_id.
Есть таблица: nom, в ней есть поля: id, par_nom_id, data - является справочником.

В dropdownlist выводятся список из поля data таблицы nom и выбранное значение сохраняется в таблицу lines в поле data, но мне надо еще сохранить в таблицу lines в поле nom_id значение поля par_nom_id из таблицы nom, подскажите как это возможно реализовать? Спасибо.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение andku83 »

Если nom является справочной то зачем дублировать из нее информацию в таблицу lines?
Достаточно в nom_id сослаться на id нужного NOM.
и возможно вы неправильно сформировали данные для вашего dropdownlist, возможно это вам поможет:

Код: Выделить всё

$data = Nom::find()->select(['data', 'id'])->indexBy('id')->column();
Solutions
Сообщения: 93
Зарегистрирован: 2014.01.09, 13:23
Откуда: Казахстан. ВКО. Усть-Каменогорск

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение Solutions »

andku83 писал(а): 2018.11.18, 20:38 Если nom является справочной то зачем дублировать из нее информацию в таблицу lines?
Достаточно в nom_id сослаться на id нужного NOM.
и возможно вы неправильно сформировали данные для вашего dropdownlist, возможно это вам поможет:

Код: Выделить всё

$data = Nom::find()->select(['data', 'id'])->indexBy('id')->column();
согласен что дублирование инфы в таблицах дело не очень хорошее, но так надо. А тот код что Вы написали не могли бы пояснить?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение andku83 »

возвращает список из data таблицы nom ключами которого являются id этих строк, обычно такой список используют для dropdownlist
Solutions
Сообщения: 93
Зарегистрирован: 2014.01.09, 13:23
Откуда: Казахстан. ВКО. Усть-Каменогорск

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение Solutions »

andku83 писал(а): 2018.11.18, 22:07 возвращает список из data таблицы nom ключами которого являются id этих строк, обычно такой список используют для dropdownlist
Понятно, а есть идеи по вопросу дублирования данных в таблицах? =)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение andku83 »

а в чем конкретно проблема? приведите свой код и посмотрим что там такое
Solutions
Сообщения: 93
Зарегистрирован: 2014.01.09, 13:23
Откуда: Казахстан. ВКО. Усть-Каменогорск

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение Solutions »

andku83 писал(а): 2018.11.18, 22:54 а в чем конкретно проблема? приведите свой код и посмотрим что там такое
модель

Код: Выделить всё

<?php

namespace app\models;

use Yii;
use himiklab\sortablegrid\SortableGridBehavior;
use yii\data\ArrayDataProvider;
use yii\helpers\Json;
use yii\helpers\ArrayHelper;

/**
 * This is the model class for table "tag_line".
 *
 * @property int $id
 * @property int $line
 * @property int $position_before
 * @property int $position_after
 * @property string $data
 * @property string $created
 * @property string $updated
 */
class Awards extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */

    public static function tableName()
    {
        return 'lines';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['line', 'nom_id'], 'integer'],
            [['data', /*'created', 'updated'*/], 'required'],
            [['data'], 'string'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'nom_id' => Yii::t('app', 'Nom_ID'),
            'line' => Yii::t('app', 'Line'),
            'data' => Yii::t('app', 'Data'),
        ];
    }

    /**
     * @inheritdoc
     * @return AwardsQuery the active query used by this AR class.
     */
    public static function find()
    {
        return new AwardsQuery(get_called_class());
    }

    //читаем из файла json
    public static function readAPI()
    {
        $dataProviderJSON = new ArrayDataProvider([
            'allModels' => Json::decode(file_get_contents('text.json')),
        ]);
        return $dataProviderJSON;
    }

    public function getNominations()
    {
        return $this->hasOne(Nomination::className(), ['nom_id' => 'line']);
    }
}

Контроллер

Код: Выделить всё

<?php

namespace app\controllers;

use app\models\Nomination;
use Yii;
use app\models\Awards;
use app\models\AwardsSearch;
use yii\helpers\ArrayHelper;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use himiklab\sortablegrid\SortableGridAction;


/**
 * AwardsController implements the CRUD actions for Awards model.
 */
class AwardsController extends Controller
{
    public $layout = 'awards';
    /**
     * @inheritdoc
     */

    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
        ];
    }

    /**
     * Lists all Awards models.
     * @return mixed
     */

    //сортировка
    public function actions()
    {
        return [
            'sort' => [
                'class' => SortableGridAction::className(),
                'modelName' => Awards::className(),
            ],
        ];
    }

    public function actionIndex()
    {
        $searchModel = new AwardsSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

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

    public function actionCreatenomination()
    {
        $model = new Awards();
        $data = Nomination::find()->all();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('createnomination', [
            'model' => $model,
            'data' => $data,
        ]);
    }

    public function actionDownload()
    {
        $searchModel = new AwardsSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        //читаем из файла json
        $dataProviderJSON = Awards::readAPI();
        //передаем модель
        $activeData = $dataProvider->models;
        //передаем модель
        $arrayData = $dataProviderJSON->models;
        //склеиваем данные
        $result = Awards::blindData($activeData, $arrayData);
        //создаем csv
        Awards::createFile($result);
    }

    public function actionSynchronization()
    {
        Nomination::exportCSV();
        return $this->redirect('index');
    }

    /**
     * Displays a single Awards model.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionView($id)
    {
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    /**
     * Creates a new Awards model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Awards();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('create', [
            'model' => $model,
        ]);
    }



    /**
     * Updates an existing Awards 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()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('update', [
            'model' => $model,
        ]);
    }

    /**
     * Deletes an existing Awards 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 Awards model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Awards the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = Awards::findOne($id)) !== null) {
            return $model;
        }

        throw new NotFoundHttpException(Yii::t('app', 'The requested page does not exist.'));
    }
}

Представление createnomination

Код: Выделить всё

<?php

use yii\helpers\Html;


/* @var $this yii\web\View */
/* @var $model app\models\Awards */

$this->title = Yii::t('app', 'Создание номинации');
$this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Awards'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="awards-create">

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

    <?= $this->render('_formnomination', [
        'model' => $model,
        'data' => $data,
    ]) ?>

</div>
Представление _formnomination

Код: Выделить всё

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use \yii\helpers\ArrayHelper;

/* @var $this yii\web\View */
/* @var $model app\models\Awards */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="nomination-form">

    <?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'data')->dropDownList(ArrayHelper::map($data, 'data', 'data'),
        ['prompt' => 'Выбирите значение...', 'id' => 'region-selector']); ?>



    <div class="form-group">
        <?= Html::submitButton(Yii::t('app', 'Сохранить'), ['class' => 'btn btn-success']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>
Просто при выборе из dropDownList надо записать par_nom_id из таблицы nom в nom_id из таблицы lines и data из таблицы nom в data таблицы lines
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение someweb »

Странная у вас реализация...
Представление _formnomination

Код: Выделить всё

    <?= $form->field($model, 'nom_id')->dropDownList(ArrayHelper::map($data, 'par_nom_id', 'data'),
        ['prompt' => 'Выбирите значение...', 'id' => 'region-selector']); ?>
В контроллере в edit и create

Код: Выделить всё

if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    $model->data = Nomination::findOne(['par_nom_id' => $model->nom_id])->data;
    $model->save(false);
    ....
}
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Solutions
Сообщения: 93
Зарегистрирован: 2014.01.09, 13:23
Откуда: Казахстан. ВКО. Усть-Каменогорск

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение Solutions »

someweb писал(а): 2018.11.19, 09:16 Странная у вас реализация...
Представление _formnomination

Код: Выделить всё

    <?= $form->field($model, 'nom_id')->dropDownList(ArrayHelper::map($data, 'par_nom_id', 'data'),
        ['prompt' => 'Выбирите значение...', 'id' => 'region-selector']); ?>
В контроллере в edit и create

Код: Выделить всё

if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    $model->data = Nomination::findOne(['par_nom_id' => $model->nom_id])->data;
    $model->save(false);
    ....
}
ERROR
пожалуйста, расскажите как дураку че надо сделать =(((
уже нет надежды =(((

Код: Выделить всё

if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            $model->data = Nomination::findOne(['par_nom_id' => $model->nom_id])->data; //Trying to get property of non-object
            $model->save(false);
        }
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение someweb »

Код: Выделить всё

if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    if (($nom = Nomination::findOne(['par_nom_id' => $model->nom_id])) !== null) {
        $model->data = $nom->data;
    }
    $model->save(false);
    ....
}
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Solutions
Сообщения: 93
Зарегистрирован: 2014.01.09, 13:23
Откуда: Казахстан. ВКО. Усть-Каменогорск

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение Solutions »

someweb писал(а): 2018.11.19, 10:54

Код: Выделить всё

if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    if (($nom = Nomination::findOne(['par_nom_id' => $model->nom_id])) !== null) {
        $model->data = $nom->data;
    }
    $model->save(false);
    ....
}
$nom пустое, соответственно в бд ничего не пишет
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение someweb »

Форму подправили? В $model->nom_id что после load()?
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Solutions
Сообщения: 93
Зарегистрирован: 2014.01.09, 13:23
Откуда: Казахстан. ВКО. Усть-Каменогорск

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение Solutions »

someweb писал(а): 2018.11.19, 11:42 Форму подправили? В $model->nom_id что после load()?
да, поправил. Где этот load()?
Solutions
Сообщения: 93
Зарегистрирован: 2014.01.09, 13:23
Откуда: Казахстан. ВКО. Усть-Каменогорск

Re: Сохранение двух значений из справочника в бд через dropdownlist

Сообщение Solutions »

Solutions писал(а): 2018.11.19, 11:56
someweb писал(а): 2018.11.19, 11:42 Форму подправили? В $model->nom_id что после load()?
да, поправил. Где этот load()?
затупил, сорян

Код: Выделить всё

if ($model->load(Yii::$app->request->post()) && $model->validate())
Закрыто