Виджет таблицы для сохранения в одно поле

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Виджет таблицы для сохранения в одно поле

Сообщение Grazio »

Всем привет!

Пробую сделать виджет, не получается, помогите = )

Назначение виджета: таблица инпутов для введения\сохранения\редактирования\просмотра текстовых данных юзером. Полагаю логичным сделать это через создание инпутов в ячейках этой таблицы, и сохранение данных из инпутов в json'е в единственную ячейку записи бд.

У меня почему-то данные сохраняются, но не выводятся в таблицу.

Как делаю.
Контроллер:

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

    public function actionCreate()
    {
        $model = new Testtable();

        if ($model->load(Yii::$app->request->post())) {
        	//переводим данные в json перед сохранением
            $model->myfield = isset($_POST['Testtable']['myfield']) ? json_encode($_POST['Testtable']['myfield']) : "" ;

            $model->save();
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }


    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post())) {
        	//переводим данные в json перед сохранением
            $model->myfield = isset($_POST['Testtable']['myfield']) ? json_encode($_POST['Testtable']['myfield']) : "" ;

            $model->save();
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
        	//декодим данные из json перед показом
            $model->myfield = json_decode($model->myfield);

            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }
Вьюха. Содержит мой виджет с понятными настройками :

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

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use frontend\widgets\Test\TestWidget;

?>

<div class="testtable-form">

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

	<?= $form->field($model, 'myfield')->widget(TestWidget::classname(), [
		'pluginOptions' => [
			'tableName' => 'myfield',
			'columns' => 2,
			'columnHeaders' => ['col1', 'col2' ],
			'rows' => 3,
			'rowHeaders' => ['row1', 'row2', 'row3'],
		]
	]) ?>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t('frontend', 'Create') : Yii::t('frontend', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

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

</div>
Вот код моего виджета:

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

<?php

namespace frontend\widgets\Test;
use yii\widgets\InputWidget;


class TestWidget extends InputWidget
{

	public $pluginOptions;

	public function init()
	{
		parent::init();
	}
	public function run()
	{
		return $this->render('view', [
			'pluginOptions' => $this->pluginOptions,
		]);

 	}

}
Вот код рендеримой им вьюхи. Циклом выводятся указанные в настройках виджета нужное количество строк и столбцов с инпутами:

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

<?php
	use yii\helpers\Html;
?>
<table border="1">
<thead>
<tr>

<?php
//добавляем пустое поле перед массивом с заголовками
$shifted_headers = $pluginOptions['columnHeaders'];
array_unshift($shifted_headers, '');
 foreach ($shifted_headers as $columnHeader) { ?>
	<td>
	<?= $columnHeader; ?>
	</td>
<?php } ?>
</tr>
</thead>
	<tbody>

		<?php for ($i=0; $i < $pluginOptions['rows']; $i++) { ?>
			<tr>
				<td>
					<?= $pluginOptions['rowHeaders'][$i] ?>
				</td>
				<?php for ($j=0; $j < $pluginOptions['columns']; $j++) { ?>
					<td>
						<div class='form-group field-<?= Yii::$app->controller->id ?>-<?= $pluginOptions['tableName'] ?>-<?= $pluginOptions['rowHeaders'][$i] ?>-<?= $pluginOptions['columnHeaders'][$j] ?>' >

							<input type ='text' id='<?= Yii::$app->controller->id ?>-<?= $pluginOptions['tableName'] ?>-<?= $pluginOptions['rowHeaders'][$i] ?>-<?= $pluginOptions['columnHeaders'][$j] ?>' name='<?= ucfirst(Yii::$app->controller->id) ?>[<?= $pluginOptions['tableName'] ?>][<?= $pluginOptions['rowHeaders'][$i] ?>][<?= $pluginOptions['columnHeaders'][$j] ?>]' >

						</div>
					</td>
				<?php } ?>
			</tr>
		<?php } ?>

	</tbody>
</table>
Вот так выглядит виджет, вот я ввожу в инпуты текст...
Изображение
Сохраняю, вот как оно выглядит:
Изображение
Если нажать на Update, то я получу пустую таблицу моего виджета.
Что я делаю не так?
Подскажите пожалуйста. :roll:
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Виджет таблицы для сохранения в одно поле

Сообщение futbolim »

Для начала, Вы не выводите значения в инпуты
<input type ='text' id='' name='' value='что тут?' >
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Виджет таблицы для сохранения в одно поле

Сообщение futbolim »

Во-вторых, тут нужен не виджет, а форма.
Посмотрите на frontend\models\SignupForm в advanced шаблоне для примера
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Re: Виджет таблицы для сохранения в одно поле

Сообщение Grazio »

futbolim писал(а): 2017.10.12, 12:54 Для начала, Вы не выводите значения в инпуты
<input type ='text' id='' name='' value='что тут?' >
Как это правильно сделать и правильно ли я подхожу к решению задачи вообще?
Я, признаться, не понимаю механизма работы.
Каким-то непонятным мне образом, когда я сохраняю данные из инпутов - они сохраняются в соответствии с параметрами "name" инпутов.
Я думал и раскладываться они должны так же "сами".
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Re: Виджет таблицы для сохранения в одно поле

Сообщение Grazio »

futbolim писал(а): 2017.10.12, 12:55 Во-вторых, тут нужен не виджет, а форма.
Посмотрите на frontend\models\SignupForm в advanced шаблоне для примера
Что значит "не виджет, а форма" ?
форма про которую ты говоришь - это конкретно взятый контроллер+модель+вьюха,
а виджет - специальный кусок кода чтобы встраивать в различные части сайта для работы поверх любых crud-ов
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Re: Виджет таблицы для сохранения в одно поле

Сообщение Grazio »

Ну, собственно, виджет, который я хотел сделать - уже кем-то сделан, и сделан нормально. :P
Вот оно → unclead/yii2-multiple-input
Ну, я там посмотрел - да, там точно так же параметры сохраняются в соответствии с именем инпута и для раскладывания по инпутам обратно есть специальная функция которая это делает.
Ответить