点火器在 5 次预订后禁用日历日期



我有日历,其日期已预订并保存在数据库中。我正在尝试从数据库中提取预订并在相应的日期下显示。一切都工作正常,除了事情,我希望日期只是文本而不是链接,当该日期有超过 5 个事件时。

我知道日历模板没有内容单元格和内容单元格。但是我希望日期在附加超过 5 个事件时没有链接。

我的模型:

public function bookingcalender($year=null,$month=null)
    {
        if(!$year)
        {
            $y = date('Y');
        }
        else
        {
            $y = $year;
        }
        if(!$month)
        {
            $m = date('m');
        }
        else
        {
            $m = $month;
        }
        $this->config = array(
            'show_next_prev'  => TRUE,
            'next_prev_url'   => 'http://joshuaflinn.com/CI/booking/show',
            'template' => '{table_open}<table class="availability-calendar">{/table_open}          
            {heading_row_start}<tr class="toolbar">{/heading_row_start}        
            {heading_title_cell}<th colspan="{colspan}">{heading}</th>{/heading_title_cell}
            {heading_previous_cell}<th><a href="{previous_url}">&lt;</a></th>{/heading_previous_cell}
            {heading_next_cell}<th><a href="{next_url}">&gt;</a></th>{/heading_next_cell}
            {heading_row_end}</tr>{/heading_row_end}
            {week_row_start}<tr>{/week_row_start}
            {week_day_cell}<td>{week_day}</td>{/week_day_cell}
            {week_row_end}</tr>{/week_row_end}
            {cal_row_start}<tr>{/cal_row_start}
            {cal_cell_start}<td>{/cal_cell_start}
            {cal_cell_start_today}<td>{/cal_cell_start_today}
            {cal_cell_start_other}<td class="other-month">{/cal_cell_start_other}
            {cal_cell_content}<a href="#" data-toggle="collapse" data-target="#bookingform" data="'.$y.'-'.$m.'-{day}">{day}</a><span class="date-data">{content}</span>{/cal_cell_content}
            {cal_cell_content_today}<div class="highlight"><a href="{content}">{day}</a></div>{/cal_cell_content_today}
            {cal_cell_no_content}<a href="#" data-toggle="collapse" data-target="#bookingform" data="'.$y.'-'.$m.'-{day}">{day}</a>{/cal_cell_no_content}
            {cal_cell_no_content_today}<a href="#" data-toggle="collapse" data-target="#bookingform"><div class="highlight">{day}</div></a>{/cal_cell_no_content_today}
            {cal_cell_blank}&nbsp;{/cal_cell_blank}
            {cal_cell_other}{day}{/cal_cel_other}
            {cal_cell_end}</td>{/cal_cell_end}
            {cal_cell_end_today}</td>{/cal_cell_end_today}
            {cal_cell_end_other}</td>{/cal_cell_end_other}
            {cal_row_end}</tr>{/cal_row_end}
            {table_close}</table>{/table_close}'
            );


        $this->load->library('calendar',$this->config);
        $conf_data = $this->get_booked_dates($year,$month);
        return $this->calendar->generate($year,$month,$conf_data);

    }  
    public function get_booked_dates($year,$month)
    {
        $query = $this->db->select('client_name,booking_date')->from('bookings')->like('booking_date',"$year-$month")->get();

        $cal_data = array();
        foreach($query->result() as $row)
        {
            $dt = explode("-", $row->booking_date);
            $dt = $dt[2];
            $k  = ($dt >= 10 ? substr($row->booking_date, 8,2) : substr($row->booking_date, 9,1));
            if( @$cal_data[$k] == '' )
            {
                $cal_data[$k] = $row->client_name;                
            }
            else
            {
                $cal_data[$k] .= ','.$row->client_name;                
            }
        }     
        return $cal_data;
    }

您拥有的选项是有限的,因为 Codeigniters 日历库在模板中只有两个伪变量cal_cell_no_contentcal_cell_content,可以根据您想要显示的内容进行播放。

快速查看门后会发现库使用 isset() 来确定使用两个伪变量中的哪一个。它调用str_replace {content} {day},为一个有点黑客的解决方案打开了大门:

public function bookingcalender($year=null,$month=null)
    {
        if(!$year)
        {
            $y = date('Y');
        }
        else
        {
            $y = $year;
        }
        if(!$month)
        {
            $m = date('m');
        }
        else
        {
            $m = $month;
        }
        $this->config = array(
            'show_next_prev'  => TRUE,
            'next_prev_url'   => 'http://joshuaflinn.com/CI/booking/show',
            'template' => '{table_open}<table class="availability-calendar">{/table_open}          
            {heading_row_start}<tr class="toolbar">{/heading_row_start}        
            {heading_title_cell}<th colspan="{colspan}">{heading}</th>{/heading_title_cell}
            {heading_previous_cell}<th><a href="{previous_url}">&lt;</a></th>{/heading_previous_cell}
            {heading_next_cell}<th><a href="{next_url}">&gt;</a></th>{/heading_next_cell}
            {heading_row_end}</tr>{/heading_row_end}
            {week_row_start}<tr>{/week_row_start}
            {week_day_cell}<td>{week_day}</td>{/week_day_cell}
            {week_row_end}</tr>{/week_row_end}
            {cal_row_start}<tr>{/cal_row_start}
            {cal_cell_start}<td>{/cal_cell_start}
            {cal_cell_start_today}<td>{/cal_cell_start_today}
            {cal_cell_start_other}<td class="other-month">{/cal_cell_start_other}
            {cal_cell_content}{content}{/cal_cell_content}
            {cal_cell_content_today}<div class="highlight">{content}</div>{/cal_cell_content_today}
            {cal_cell_no_content}<a href="#" data-toggle="collapse" data-target="#bookingform" data="'.$y.'-'.$m.'-{day}">{day}</a>{/cal_cell_no_content}
            {cal_cell_no_content_today}<a href="#" data-toggle="collapse" data-target="#bookingform"><div class="highlight">{day}</div></a>{/cal_cell_no_content_today}
            {cal_cell_blank}&nbsp;{/cal_cell_blank}
            {cal_cell_other}{day}{/cal_cel_other}
            {cal_cell_end}</td>{/cal_cell_end}
            {cal_cell_end_today}</td>{/cal_cell_end_today}
            {cal_cell_end_other}</td>{/cal_cell_end_other}
            {cal_row_end}</tr>{/cal_row_end}
            {table_close}</table>{/table_close}'
            );
        $this->load->library('calendar',$this->config);
        $conf_data = $this->get_booked_dates($year,$month);
        return $this->calendar->generate($year,$month,$conf_data);
    }  

    public function get_booked_dates($year,$month)
    {
        $query = $this->db->select('client_name,booking_date')->from('bookings')->like('booking_date',"$year-$month")->get();
        $cal_data = array();
        foreach($query->result() as $row)
        {
            $dt = explode("-", $row->booking_date);
            $k = intval($dt[2]); // MAKE INTEGER OF DAY NUMBER 
            if( @$cal_data[$k] == '' )
            {
                $cal_data[$k] = $row->client_name;                
            }
            else
            {
                $cal_data[$k] .= ','.$row->client_name;                
            }
        }     
        // LOOP THROUGH EACH DAY TO FIND THOSE WITH MORE THAN 5 EVENTS
        foreach($cal_data as $key=>$val){
            // COUNT THE NUMBER OF COMMAS THAT OCCUR IN STRING
            $count = strlen($val) - strlen(str_replace(',','',$val));
            if($count > 4){ // IF MORE THAN 4 COMMAS (> 5 EVENTS) THEN NO LINK... 
                $cal_data[$key] = '{day}<span class="date-data">'.$val.'</span>';   
            } else { // LINKED DAY 
                $cal_data[$key] = '<a href="#" data-toggle="collapse" data-target="#bookingform" data="'.$year.'-'.$month.'-{day}">{day}</a><span class="date-data">'.$val.'</span>';               
            }
        }
        return $cal_data;
    }

注意:我在模板中更改了两行:{cal_cell_content}{content}{/cal_cell_content}{cal_cell_content_today}<div class="highlight">{content}</div>{/cal_cell_content_today}

您现在只需要设置{content}因为{day}是在内容中指定的,内容也包含从查询返回的 html。

更新:我现在已经测试了解决方案,它似乎工作正常!

如果需要更灵活的解决方案,并且不想在查询返回的内容中混合模板 html,则必须操作或扩展日历库。

最新更新