Как реализовать несколько редактируемых столбцов с помощью yii-booster?

Я работаю над проектом планирования рабочего времени Yii, застряв на модуле editable-curd-staffhours-module. Я хочу сохранить часы работы персонала в StaffHourstable с помощью редактируемого расширения Yii Booster.

Моя структура БД таблицы staffhours выглядит следующим образом:

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'
);

Я реализовал редактируемый пользовательский интерфейс с помощью расширения Yii Booster, см. снимок ниже:

Проблема в том, что я не могу понять, как хранить/обновлять данные о рабочем времени в БД.

введите здесь описание изображения

Некоторые части кода я сделал

---- В поле зрения ----

<?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.


person Frank    schedule 02.01.2013    source источник


Ответы (1)


Я считаю, что хранить данные массива в текстовом столбце MySql очень непрактично, так как вы потеряете производительность, возможность реализовать правильную технику поиска и т. Д. Лучший дизайн базы данных может быть следующим: у каждого сотрудника много часов, и каждый час может быть назначен многим сотрудникам , простая связь MANY_MANY. Преимущество заключается в том, что вы можете искать любую дату, любое время, любой персонал с помощью очень простого, простого, единого запроса или ActiveRecord:введите здесь описание изображения

person HesamDadafarin    schedule 26.01.2013
comment
Я сделал это с помощью Ajax. Раньше я сериализовал все время определенного дня и сохранял в БД. Спасибо за ваши мысли - person Frank; 31.01.2013