如何在jQuery for flatpickr中将日期的关联数组转换为对象

时间:2017-05-26 11:05:23

标签: javascript jquery ajax flatpickr

我一直在努力解决这个问题几个小时,而根本没有去任何地方。

好的,所以我有一个数据库表,可以使用开始和结束日期来节省员工假期,因此它是一个范围。如果是一天,它将是相同的日期,但通常它是一个范围。

我在我的网站上使用Flatpickr来预订特定日期和时间的工作,但我需要禁用所选工作人员不可用的日期。当用户选择一个职员时,会对数据库中的假期表进行ajax调用并获取任何假日日期,将它们放入一个数组中,然后将其返回给JSON中的ajax。这是我的电话($(this).val()是指员工下拉列表,这将在更改时运行):

var staffId = $(this).val();
var dateObj = {};
var parsed;

$.post( '/get-availability', { staff_id: staffId }
).done( function(response) {
    if(response.length > 0) {
        parsed = JSON.parse(response);
        $.each(parsed, function(i, element) {
            console.log("i : " + i);
            dateObj = { from : element['from'], to : element['to'] };
        });

    }

get-availability中的PHP如下:

$staff_id = $request->get('staff_id');
$staff_entity = $this->getDoctrine()->getManager()->getRepository('AppBundle:Staff')->findOneBy(array('id' => $staff_id));
// get all holidays for the staff member
$holiday_repo = $this->getDoctrine()->getManager()->getRepository('AppBundle:Holiday');
$holidays = $holiday_repo->findBy(array('staff' => $staff_entity));
$result = array();
if(!empty($holidays)) {
    $x = 0;
    foreach ($holidays as $row) {
        $result[$x]['from'] = $row->getStartDate()->format('Y-m-d');
        $result[$x]['to'] = $row->getEndDate()->format('Y-m-d');
        $x ++;
    }
}

return new Response(json_encode($result));

回到ajax,我需要按如下方式布置我的flatpickr配置(日期只是示例):

disable: [
    {
        from: "2017-04-01",
        to: "2017-06-01"
    },
    {
        from: "2017-09-01",
        to: "2017-12-01"
    }
]

但是我的dateObj每次都会被覆盖,所以它只会添加最后的日期范围:

var config = {
    disable: [
        dateObj
    ]
};

基本上,我需要知道如何正确地调整$ .each循环以获得像上面第一个例子的结果,但没有任何效果。到目前为止,我已经尝试过:

dateObj += { from : element['from'], to : element['to'] };
dateObj.i = { from : element['from'], to : element['to'] };

然后将其作为一个数组并尝试:

dateObj[i] = { from : element['from'], to : element['to'] };
JSON.stringify(dateObj)

但每一个都失败了。我希望有人可以帮助我!

1 个答案:

答案 0 :(得分:0)

好的,最后我使用了DatePeriod()函数,并将所有日期作为单个数组传回,而不是fromto块。不完全是最优化的版本,但它可以工作。

foreach ($holidays as $row) {
    $start_date = new \DateTime($row->getStartDate()->format('Y-m-d'));
    $end_date = new \DateTime($row->getEndDate()->format('Y-m-d'));
    $date_range = new \DatePeriod($start_date, new \DateInterval('P1D'), $end_date);
    foreach($date_range as $date){
        $date_array[] = $date->format('Y-m-d');
    }
    // Add the end date as this is not included in the date period.
    $date_array[] = $row->getEndDate()->format('Y-m-d');
}

$date_array然后被编码并传递回Ajax,在那里它被解析并添加到flatpickr的配置中。