Всем привет. Вот только стал изучать данный фреймворк, он же первый фреймворк который я изучаю. И у меня возник вопрос.
У меня есть 2 таблицы. В первой таблице TABLE_SITY у меня содержаться данные о городах. Во второй таблице TABLE_STREETS у меня содержаться данные об улицах. При добавлении нового города или при редактировании существующего города мне нужно сделать добавление/удаление улиц к нему и сохранение этого в бд. Реализовывал это с помощью виджета https://wbraganca.com/yii2extensions/dy ... ource-code. При добавлении нового города снизу на странице появилась кнопка "Добавить улицу". Все отображается на странице корректно, но вот при нажатии на клавишу "Добавить улицу" ничего не происходит. В чем проблема тут?
Вот код модели TABLE_SITY:
Код: Выделить всё
<?php
namespace backend\models;
use Yii;
/**
* This is the model class for table "TABLE_SITY".
*
* @property integer $ID // Автоматическое заполнение
* @property string $NAME_SITY // Заполняемое поле
* @property string $DESC_SITY // Заполняемое поле
* @property string $LIST_ATTRAC // Заполняемое поле
* @property integer $RAND // Заполняемое поле
*
*/
class TableSity extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'TABLE_SITY';
}
public function rules()
{
return [
[['NAME_SITY'], 'required'],
[['RAND'], 'integer'],
[['NAME_SITY'], 'string', 'max' => 100],
[['DESC_SITY', 'LIST_ATTRAC'], 'string', 'max' => 1000],
[['ID'], 'unique'],
];
}
public function attributeLabels()
{
return [
'ID' => 'ID Города',
'NAME_SITY' => 'Название города',
'DESC_SITY' => 'Описание города',
'LIST_ATTRAC' => 'Список достопримечательностей',
'RAND' => 'Включен в список случайных городов',
];
}
public function getIDSTREETs()
{
return $this->hasMany(TableStreets::className(), ['ID_SITY' => 'ID']);
}
}
Код: Выделить всё
<?php
namespace backend\models;
use Yii;
/**
* This is the model class for table "TABLE_STREETS".
*
* @property integer $ID_STREET // Автоматическое заполнение
* @property integer $ID_SITY // Автоматическое заполнение
* @property string $NAME_STREET // Заполняемое поле
* @property string $DESC_STREET // Заполняемое поле
* @property integer $RAND_STREET // Заполняемое поле
*
*/
class TableStreets extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'TABLE_STREETS';
}
public function rules()
{
return [
[['ID_SITY', 'NAME_STREET'], 'required'],
[['ID_SITY', 'RAND_STREET', 'STATUS'], 'integer'],
[['NAME_STREET'], 'string', 'max' => 100],
[['DESC_STREET'], 'string', 'max' => 1000],
[['ID_STREET'], 'unique'],
[['ID_SITY'], 'exist', 'skipOnError' => true, 'targetClass' => TABLESITY::className(), 'targetAttribute' => ['ID_SITY' => 'ID']],
];
}
public function attributeLabels()
{
return [
'ID_STREET' => 'ID Улицы',
'ID_SITY' => 'ID Города',
'NAME_STREET' => 'Название улицы',
'DESC_STREET' => 'Описание улицы',
'RAND_STREET' => 'Включен в список случайных улиц',
];
}
public function getIDSITY()
{
return $this->hasOne(TABLESITY::className(), ['ID' => 'ID_SITY']);
}
}
Код: Выделить всё
public function actionCreate()
{
$model = new TableSity();
$modelsTs = [new TableStreets];
if ($model->load(Yii::$app->request->post())) {
$modelsTs = Model::createMultiple(TableStreets::className());
Model::loadMultiple($modelsTs, Yii::$app->request->post());
// Validate all models
$valid = $model->validate();
$valid = Model::validateMultiple($modelsTs) && $valid;
if ($valid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $model->save(false)) {
foreach ($modelsTs as $modelTs) {
$modelTs->ID_SITY = $model->ID;
if (! ($flag = $modelTs->save(false))) {
$transaction->rollBack();
break;
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'id' => $model->ID]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
} else {
return $this->render('create', [
'model' => $model,
'modelsTs' => (empty($modelTs)) ? [new TableStreets] : $modelTs,
]);
}
}
public function actionUpdate($id)
{
$model = $this->findModel($id);
$modelsTs = $model->iDSTREETs;
if ($model->load(Yii::$app->request->post()) && $model->save()) {
$oldIDsStreet = ArrayHelper::map($modelsTs, 'ID', 'ID');
$modelsTs = Model::createMultiple(TableStreets::classname(), $modelsTs);
Model::loadMultiple($modelsTs, Yii::$app->request->post());
$deletedIDsStreet = array_diff($oldIDsAnswers, array_filter(ArrayHelper::map($modelsTs, 'ID', 'ID')));
// Validate all models
$valid = $model->validate();
$valid = Model::validateMultiple($modelsTs) && $valid;
if ($valid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $model->save(false)) {
if (!empty($deletedIDsAnswers)) {
TableStreets::deleteAll(['ID' => $deletedIDsStreet]);
}
foreach ($modelsTs as $modelTs) {
$modelTs->ID_SITY = $model->ID;
if (! ($flag = $modelTs->save(false))) {
$transaction->rollBack();
break;
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'id' => $model->ID]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
} else {
return $this->render('create', [
'model' => $model,
'modelsTs' => (empty($modelTs)) ? [new TableStreets] : $modelTs,
]);
}
}
}
Код: Выделить всё
<?php
use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $model backend\models\TableSity */
$this->title = 'Добавление нового Города';
$this->params['breadcrumbs'][] = ['label' => 'Список городов', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="tablesity-create">
<h1><?= Html::encode($this->title) ?></h1>
<?= $this->render('_form', [
'model' => $model,
'modelsTs' => $modelsTs,
]) ?>
</div>
Код формы:
Код: Выделить всё
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use dosamigos\ckeditor\CKEditor;
use wbraganca\dynamicform\DynamicFormWidget;
?>
<div class="tablesity-form">
<?php $form = ActiveForm::begin(['id' => 'dynamic-form']); ?>
<?= $form->field($model, 'NAME_SITY')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'DESC_SITY')->widget(CKEditor::className(), [
'options' => ['rows' => 6],
'preset' => 'basic'
]) ?>
<?= $form->field($model, 'LIST_ATTRAC')->widget(CKEditor::className(), [
'options' => ['rows' => 6],
'preset' => 'basic'
]) ?>
<?= $form->field($model, 'RAND')->checkbox() ?>
<!-- Добавление начато -->
<div class="panel panel-default">
<div class="panel-heading">
<h4> Добавление улиц</h4>
</div>
<div class="panel-body">
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_wrapper',
'widgetBody' => '.container-items',
'widgetItem' => '.item',
'limit' => 4,
'min' => 0,
'insertButton' => '.add-item',
'deleteButton' => '.remove-item',
'model' => $modelsTs[0],
'formId' => 'dynamic-form',
'formFields' => [
'NAME_STREET',
'DESC_STREET',
'RAND_STREET',
'STATUS',
],
]); ?>
<div class="panel-body container-items"><!-- widgetContainer -->
<?php foreach ($modelsTs as $index => $modelTs): ?>
<div class="item panel panel-default"><!-- widgetBody -->
<div class="panel-heading">
<span class="panel-title-street">Улицы: <?= ($index + 1) ?></span>
<button type="button" class="pull-right remove-item btn btn-danger btn-xs"><i class="fa fa-minus"></i></button>
<div class="clearfix"></div>
</div>
<div class="panel-body">
<?php
// necessary for update action.
if (!$modelTs->isNewRecord) {
echo Html::activeHiddenInput($modelTs, "[{$index}]ID_STREET");
}
?>
<?= $form->field($modelTs, "[{$index}]NAME_STREET")->textInput(['maxlength' => true]) ?>
<?= $form->field($modelTs, "[{$index}]DESC_STREET")->textInput(['maxlength' => true]) ?>
<?= $form->field($modelTs, "[{$index}]RAND_STREET")->checkbox() ?>
<?= $form->field($modelTs, "[{$i}]STATUS")->checkbox() ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php DynamicFormWidget::end(); ?>
<!-- Добавление окончено -->
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Добавить город' : 'Применить изменения', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>