Я работаю над проектом планирования часов работы Yii, застрявшим на редактируемом рабочем столе-модуле. Я хочу хранить часы планирования персонала в таблице StaffHours
, используя Редактируемый Yii Booster Extension.Как реализовать несколько редактируемых столбцов с помощью yii-booster?
Мой staffhours
стол DB stucture как:
id(pk) user_id(fk) staff_id(int) monday(text) tuesday(text) wednesday(text) thursday(text) friday(text) saturday(text) sunday(text)
Весь день текстовые поля используются для хранения сериализации время как в формате ассоциативно-массива:
array(
'12:00 AM' => 'open',
'12:30 AM' => 'close',
'01:00 AM' => 'close',
'01:30 AM' => 'open',
'02:00 AM' => 'open',
.
.
.
'11:00 PM' => 'close'
'11:30 PM' => 'close'
);
Я реализовал Editable интерфейс с использованием Yii Booster Extension, снимок часов ниже:
Задача - это то, что я не могу узнать, как хранить/обновлять данные о часах работы в БД.
Некоторые из Кодекса я сделал
---- В видовом ----
<?php
$this->breadcrumbs=array(
'Settings'=>array('settings/settings'),
'Staff Hours',
);
$user_id = Yii::app()->user->getId();
$condition = "user_id = '$user_id'";
$data = StaffHours::model()->findAll();
$Monday = unserialize($data[0]['monday']);
$Tuesday = unserialize($data[0]['tuesday']);
$Wednesday = unserialize($data[0]['wednesday']);
$Thursday = unserialize($data[0]['thursday']);
$Friday = unserialize($data[0]['friday']);
$Saturday = unserialize($data[0]['saturday']);
$Sunday = unserialize($data[0]['sunday']);
foreach($data as $data)
{
?>
<div id="settinghead">StaffS Hours </div>
<div id="leftmenu"> <?php $this->widget('application.components.widgets.SettingsMenu.settingsmenuWidget'); ?></div>
<div id="rightcontent">
<div id="pageheding">Staff Hours Detail </div>
<table class="items table table-bordered">
<thead>
<tr><th scope="col">Time</th> <th scope="col">Monday</th> <th scope="col">Tuesday</th><th scope="col">Wednesday</th>
<th scope="col">Thursday</th><th scope="col">Friday</th><th scope="col">Saturday</th><th scope="col">Sunday</th> </tr>
</thead>
<?php
$start = strtotime('12:00am');
$end = strtotime('11:59pm');
for($i = $start; $i <= $end; $i += 900)
{
$time = date('h:i A', $i);
?>
<tr>
<th scope="row"><?php echo $time; ?></th>
<td id="mon<?php echo $time; ?>">
<?php
$this->widget('bootstrap.widgets.TbEditableField', array(
'type' => 'select',
'model' => $data,
'emptytext' => $Monday[$time],
'attribute' => 'monday',
'url' => $this->createUrl('staffhours/updatetime&time='.$time), //url for submit data
'source' => array('Open', 'Close', 'Away'),
'value' => $time,
'enabled' => true
));
?>
</td>
<td id="tue<?php echo date('g:i A', $i); ?>"><?php echo $Tuesday[$time]; ?></td>
<td id="wed<?php echo date('g:i A', $i); ?>"><?php echo $Wednesday[$time]; ?></td>
<td id="thu<?php echo date('g:i A', $i); ?>"><?php echo $Thursday[$time]; ?></td>
<td id="fri<?php echo date('g:i A', $i); ?>"><?php echo $Friday[$time]; ?></td>
<td id="sat<?php echo date('g:i A', $i); ?>"><?php echo $Saturday[$time]; ?></td>
<td id="sun<?php echo date('g:i A', $i); ?>"><?php echo $Sunday[$time]; ?></td>
</tr>
<?php
}
}
?>
</table>
</div>
---- В StaffHoursController контроллер - -
/**
* Update time.
*/
public function actionUpdatetime($time)
{
$user_id = Yii::app()->user->getId();
$pk = $_POST['pk'];
$day = $_POST['name'];
$status = $_POST['value'];
$GetData = StaffHours::model()->findByPk($pk);
$DayTimes = unserialize($GetData->monday);
if(array_key_exists($time, $DayTimes))
{
unset($DayTimes[$time]);
//merge new value
$DayTimes[$time] = $status;
array_push($DayTimes, $DayTimes[$time]);
$attributes = array($day => serialize($DayTimes));
$condition = "id = '$pk' AND user_id = '$user_id'";
StaffHours::model()->updateByPk($pk, $attributes, $condition);
}
}
Если у вас возникнут проблемы или еще один простой способ использовать часы работы персонала с помощью Editable-UI.
Тогда, пожалуйста, предложите лучший способ хранения Staff-Hours с помощью Editable-UI.
Я сделал это от Ajax. Я использовал сериализацию всего времени определенного дня и хранения в db. Спасибо за ваши мысли – Frank
вы добрый – HesamDadafarin