Yii сохранение множества чекбоксов
1.Таблица вида
2.view
CREATE TABLE site.a_smena (
id SERIAL,
f_timestamp DATE DEFAULT now() NOT NULL,
smena INTEGER NOT NULL,
value INTEGER,
mine_id INTEGER NOT NULL,
lvl_id INTEGER,
CONSTRAINT a_smena_idx UNIQUE(f_timestamp, smena, lvl_id),
CONSTRAINT a_smena_pkey PRIMARY KEY(id),
CONSTRAINT a_lvl_fk FOREIGN KEY (lvl_id)
REFERENCES site.t_department(id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE,
CONSTRAINT a_mine_fk FOREIGN KEY (mine_id)
REFERENCES site.t_department(id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE
)
WITH (oids = false);
COMMENT ON COLUMN site.a_smena.id
IS 'id';
COMMENT ON COLUMN site.a_smena.f_timestamp
IS 'дата';
COMMENT ON COLUMN site.a_smena.smena
IS 'смена';
COMMENT ON COLUMN site.a_smena.value
IS 'значение';
COMMENT ON COLUMN site.a_smena.mine_id
IS 'шахта';
COMMENT ON COLUMN site.a_smena.lvl_id
IS 'горизонт';
2.view
<?php $form = $this->beginWidget('bootstrap.widgets.TbActiveForm', array( 'id' => 'plan-form', 'enableAjaxValidation' => false, )); ?> <?php /* @var $this QualityController */ /* @var $model Quality */ $menu = []; require(dirname(__FILE__) . DIRECTORY_SEPARATOR . '_menu.php'); ?> <style> .body tr.filters{ display: none;} .mine { background-color: #AAAAAA } .lvl { background-color: #A9BCF5 } .dep { background-color: #DBD7D2 } .table td{padding: 0;} .columns { overflow: hidden; clear: both; width: 100%; } .columns .left, .columns .right { float: left; } .columns .left { width: 80%; } .columns .right { width: 20%; } .modal-body { max-height: 800px; } .bootstrap-widget { margin-bottom: 0px;} form { margin: 0; } .form-actions { margin-bottom: 0px; } .bootstrap-widget-content { padding: 20px 4px 15px; } </style> <script type="text/javascript"> window.onload = function () { document.getElementById('create_time').onchange = function () { window.location.search = "month=" + this.value; }; }; </script> <?php //**************************** Глобальные переменные *************************// //****открываем сессию****// $session = new CHttpSession; $session->open(); //************************// //------------------------Первоначальное опрделение месяца----------------------/ if (isset($_GET['month'])) { $month = Yii::app()->request->getQuery('month'); } else { $month = date('Y-m-d'); $time = strtotime($month); $month = date("Y-m", strtotime("+1 month", $time)); }; ?> <?php $box = $this->beginWidget( 'bootstrap.widgets.TbBox', array( 'title' => ' ' . $month . ' Смены', 'headerIcon' => 'icon- fa fa-tasks', 'headerButtons' => array( array( 'class' => 'bootstrap.widgets.TbButtonGroup', 'type' => 'success', // '', 'primary', 'info', 'success', 'warning', 'danger' or 'inverse' 'buttons' => $this->menu ), ) ) ); ?> <?php $this->widget('bootstrap.widgets.TbAlert', array( 'block' => false, // display a larger alert block? 'fade' => true, // use transitions? 'closeText' => '×', // close link text - if set to false, no close link is displayed 'alerts' => array(// configurations per alert type 'success' => array('block' => true, 'fade' => true, 'closeText' => '×'), //success, info, warning, error or danger 'info' => array('block' => true, 'fade' => true, 'closeText' => '×'), //success, info, warning, error or danger 'warning' => array('block' => true, 'fade' => true, 'closeText' => '×'), //success, info, warning, error or danger 'error' => array('block' => true, 'fade' => true, 'closeText' => '×'), //success, info, warning, error or danger 'danger' => array('block' => true, 'fade' => true, 'closeText' => '×'), //success, info, warning, error or danger ), )); ?> <?php /* ----------------------------Управление---------------------------------- */ $this->widget('bootstrap.widgets.TbDatePicker', array( 'value' => $month, 'name' => 'create_time', 'options' => array( 'language' => 'ru', 'format' => 'yyyy-mm', 'autoclose' => 'true', 'minViewMode' => 1, 'showButtonPanel' => true, 'keyboardNavigation' => true, ), 'htmlOptions' => array( ), )); ?> <?php $myarray = []; $myarray[] = array( 'name' => 'name', 'value' => '($data->name)', 'headerHtmlOptions' => array('style' => 'text-align:center;'), ); $number = cal_days_in_month(CAL_GREGORIAN, date('m', strtotime($month)), date('Y', strtotime($month))); $connection = Yii::app()->db; $sql = " SELECT id, name, id_parent, COMMENT, p_order, hidden, TYPE, mine FROM site.t_department WHERE TYPE = 2 AND mine = 5; "; $dataReader = $connection->createCommand($sql)->query(); $rows = $dataReader->readAll(); function ischecked($month, $lvl_id, $smena, $day) //проверяем есть ли смена { $day = sprintf('%02d', $day); $timestamp = $month . '-' . $day; $value = Yii::app()->db->createCommand() ->select('value') ->from('vgok_site.a_smena') ->where("smena = $smena AND to_char(f_timestamp, 'YYYY-MM-DD') = '$timestamp' AND lvl_id = $lvl_id") ->queryScalar(); return ($value) ? 1 : null; } for($i = 1, $m = 1, $e = $m + 2; $i <= $number; $i++, $m+=3, $e += 3) { $mergeHeaders[] = array( 'name' => $i, 'start' => $m, //начало сложной шапки 'end' => $e, //конец сложной шапки ); for($c = 1; $c <= 3; $c++) { $myarray[] = array( 'name' => '', 'value' => 'CHtml::checkBox("cid[]",ischecked(\'' . $month . '\',$data->id,' . $c . ', ' . $i . '),array("value"=>$data->id,"id"=>"cid[$data->id][' . $i . '][' . $c . ']"))', 'type' => 'raw', 'htmlOptions' => array('width' => 5), 'header' => $c, ); } } ?> <?php $this->widget('ext.HeaderGroupGridView', array( 'id' => 'quality-grid', 'dataProvider' => $model->recsearch('5'), 'template' => "{items}", 'fixedHeader' => true, 'htmlOptions' => array('style' => 'width: 80%'), 'headerOffset' => 30, 'enableSorting' => false, //tag for sorting - true or false 'mergeHeaders' => $mergeHeaders, 'columns' => $myarray, 'rowCssClassExpression' => '$data->getRowCssClass()', )); ?> <?php echo '<div class="column" style="display:none">'; echo CHtml::textField("id_template", 51); echo '</div>'; echo '<div class="column" style="display:none">'; echo CHtml::textField("mine", 5); echo '</div>'; for($i = 1; $i <= $number; $i++) //число дней { for($c = 1; $c <= 3; $c++) //число смен { for($x = 0, $cnt = count($rows); $x < $cnt; $x++) //число горизонтов { $id = $rows[$x]['id']; echo '<div class="column" style="display:none">'; //запоминеам значение echo CHtml::textField("elem[$id][$i][$c]", ischecked("$month", $id, $c, $i), array('id' => "elem_cid[$id][$i][$c]", 'class' => 'span1')); echo '</div>'; ?> <script> var name = "cid[<?php echo $id; ?>][<?php echo $i ?>][<?php echo $c ?>]"; var checkbox = document.getElementById(name); checkbox.onchange = function () { //заносим значение в невидимый textField if (this.checked) { document.getElementById("elem_" + this.id).value = 1; } else { document.getElementById("elem_" + this.id).value = ''; } }; </script> <?php } } } ?> <div class="rowspan"> <?php $this->widget('bootstrap.widgets.TbButton', array( 'buttonType' => 'submit', 'icon' => 'ok', 'type' => 'success', 'label' => ($new) ? 'Создать' : 'Сохранить', )); ?> </div> <?php $this->endWidget(); ?> <?php $this->endWidget(); ?>
3.контролер
public function actionSmen()
{
$model = new Quality('mysearch');
$model->unsetAttributes(); // clear any default values
if (isset($_POST['elem']))
{
$Elems = Yii::app()->request->getParam('elem');
$month = Yii::app()->request->getParam('create_time'); //месяц
$mine = Yii::app()->request->getParam('mine');
$connection = Yii::app()->db;
$sql = "
DELETE FROM
site.a_smena
WHERE
to_char(f_timestamp, 'YYYY-MM') = '$month'
";
$dataReader = $connection->createCommand($sql)->execute(); //удаляем все записи за месяц
$cnt = max(array_keys($Elems));
$min = min(array_keys($Elems));
for($i = $min; $i <= $cnt; $i++) //горизонты
{
$lvlElem = $Elems[$i];
for($c = 0, $cntg = count($lvlElem); $c <= $cntg; $c++) //дни
{
$dayElem = $lvlElem[$c];
$day = sprintf('%02d', $c);
for($x = 0, $cntl = count($dayElem); $x <= $cntl; $x++) //смены
{
$elem = $dayElem[$x];
if ($elem)
{
$timestamp = $month . '-' . $day;
$sql = "
INSERT INTO site.a_smena ( f_timestamp, smena, value, mine_id, lvl_id)
VALUES ( '$timestamp',
$x,
1,
$mine,
$i)
";
$dataReader = $connection->createCommand($sql)->execute();
}
}
}
}
}
$this->render('smen', array(
'model' => $model,
));
}
Комментарии
Отправить комментарий