#1
  1. A Change of Season
    Devshed Loyal (3000 - 3499 posts)

    Join Date
    Mar 2004
    Location
    Next Door
    Posts
    3,189
    Rep Power
    220

    Styling CodieIgniter Calendar


    Edit: This is a bit hard for me to update generate method of CI library (str_replace function). Details below.
    Appreciate help.

    Hello;

    I am using Codeigniter calendar and so far I have got it this far.

    have a very specific requirement I am not sure how to achieve.

    I want to check tasks in my database (already do), and when I build the calandar, wanna change the CSS of that day and highlight the div or td or ....

    Also, I want every single day to be a link (like July 25th on my current code) so I can click and add task etc.I am not that far but I am not sure how to take it from here.

    In the doc they say it's possible to do whatever.

    Here is my code:

    Controller:
    PHP Code:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');

    class 
    Welcome extends CI_Controller {

        
    /**
         * Index Page for this controller.
         *
         * Maps to the following URL
         *         http://example.com/index.php/welcome
         *    - or -
         *         http://example.com/index.php/welcome/index
         *    - or -
         * Since this controller is set as the default controller in
         * config/routes.php, it's displayed at http://example.com/
         *
         * So any other public methods not prefixed with an underscore will
         * map to /index.php/welcome/<method_name>
         * @see https://codeigniter.com/user_guide/general/urls.html
         */
        
    public function index()
              {
                  
    $query $this->db->get_where('tasks', array('user_id' => 1));
                   
    $this->data['tasks'] = $query->result_array();
                   
    $this->calendar();
                   
    $this->load->view('welcome_message'$this->data);
              }
         public function 
    calendar()
              {
                   
    $prefs['template'] = '
                      {table_open}<table border="0" cellpadding="0" cellspacing="0" class = "text-center table" id = "table-calendar" style = "font-size:13px; border:0; font-family:Arial,sans-serif; width:90%">{/table_open}

                      {heading_row_start}<tr>{/heading_row_start}

                      {heading_previous_cell}<th><a href="{previous_url}">&lt;&lt;</a></th>{/heading_previous_cell}
                      {heading_title_cell}<th colspan="{colspan}"><strong style = "font-size:">{heading}</strong><hr /></th>{/heading_title_cell}
                      {heading_next_cell}<th><a href="{next_url}">&gt;&gt;</a></th>{/heading_next_cell}

                      {heading_row_end}</tr>{/heading_row_end}

                      {week_row_start}<tr style = " border:0;">{/week_row_start}
                      {week_day_cell}<td style = "padding:0px; border:none;">{week_day}</td>{/week_day_cell}
                      {week_row_end}</tr>{/week_row_end}

                      {cal_row_start}<tr style = " border:0; ">{/cal_row_start}
                      {cal_cell_start}<td style = "padding:0px; border:none; line-height:2.2">{/cal_cell_start}
                      {cal_cell_start_today}<div class = "div-day"><td style = "background-color:#419dcd">{/cal_cell_start_today}
                      {cal_cell_start_other}<td class="other-month">{/cal_cell_start_other}

                      {cal_cell_content}<a style = "text-decoration:none" href="{content}"><div class = "div-day">{day}</div></a>{/cal_cell_content}
                      {cal_cell_content_today}<div class="highlight"><a href="{content}">{day}</a></div>{/cal_cell_content_today}

                      {cal_cell_no_content}{day}{/cal_cell_no_content}
                      {cal_cell_no_content_today}<div class="highlight">{day}</div>{/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'$prefs);
              }     
    }
    View

    PHP Code:
    <div class="container">
        <div class="row">
              <?php
              $year 
    date('Y');
              
    $month=0;
          
              while(
    $month<12)
                  {
                      
    $data=array();
              
    $days=0;
              
    $month++;
              while(
    $days<32)
                          {
                              
    $days++;
                  foreach(
    $tasks as $row => $val)
                    {
                      if(
    strtotime($year."-".$month."-".$days)==strtotime($val['date_added']))
                        {
                            
    $data[$days] = $days;
                        }
                    }
                }    
              
    ?>
              <div class="col-md-2"><?php echo $this->calendar->generate($year,$month$data);?></div>
                  <?php
                  
    if($month==6)
                      {
                          
    ?></div><div class="row"><?php
                      
    }
                   } 
    ?>

          </div>    
    </div>
    When I get it working I'll remove the php from view.
    Last edited by English Breakfast Tea; August 1st, 2017 at 02:58 PM.
  2. #2
  3. A Change of Season
    Devshed Loyal (3000 - 3499 posts)

    Join Date
    Mar 2004
    Location
    Next Door
    Posts
    3,189
    Rep Power
    220
    I think I need to change to change line 289 of tehir library?
    PHP Code:
    <?php
    /**
     * CodeIgniter
     *
     * An open source application development framework for PHP
     *
     * This content is released under the MIT License (MIT)
     *
     * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy
     * of this software and associated documentation files (the "Software"), to deal
     * in the Software without restriction, including without limitation the rights
     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     * copies of the Software, and to permit persons to whom the Software is
     * furnished to do so, subject to the following conditions:
     *
     * The above copyright notice and this permission notice shall be included in
     * all copies or substantial portions of the Software.
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     * THE SOFTWARE.
     *
     * @package    CodeIgniter
     * @author    EllisLab Dev Team
     * @copyright    Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
     * @copyright    Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
     * @license    http://opensource.org/licenses/MIT    MIT License
     * @link    https://codeigniter.com
     * @since    Version 1.0.0
     * @filesource
     */
    defined('BASEPATH') OR exit('No direct script access allowed');

    /**
     * CodeIgniter Calendar Class
     *
     * This class enables the creation of calendars
     *
     * @package        CodeIgniter
     * @subpackage    Libraries
     * @category    Libraries
     * @author        EllisLab Dev Team
     * @link        https://codeigniter.com/user_guide/libraries/calendar.html
     */
    class CI_Calendar {

        
    /**
         * Calendar layout template
         *
         * @var mixed
         */
        
    public $template '';

        
    /**
         * Replacements array for template
         *
         * @var array
         */
        
    public $replacements = array();

        
    /**
         * Day of the week to start the calendar on
         *
         * @var string
         */
        
    public $start_day 'sunday';

        
    /**
         * How to display months
         *
         * @var string
         */
        
    public $month_type 'long';

        
    /**
         * How to display names of days
         *
         * @var string
         */
        
    public $day_type 'abr';

        
    /**
         * Whether to show next/prev month links
         *
         * @var bool
         */
        
    public $show_next_prev FALSE;

        
    /**
         * Url base to use for next/prev month links
         *
         * @var bool
         */
        
    public $next_prev_url '';

        
    /**
         * Show days of other months
         *
         * @var bool
         */
        
    public $show_other_days FALSE;

        
    // --------------------------------------------------------------------

        /**
         * CI Singleton
         *
         * @var object
         */
        
    protected $CI;

        
    // --------------------------------------------------------------------

        /**
         * Class constructor
         *
         * Loads the calendar language file and sets the default time reference.
         *
         * @uses    CI_Lang::$is_loaded
         *
         * @param    array    $config    Calendar options
         * @return    void
         */
        
    public function __construct($config = array())
        {
            
    $this->CI =& get_instance();
            
    $this->CI->lang->load('calendar');

            empty(
    $config) OR $this->initialize($config);

            
    log_message('info''Calendar Class Initialized');
        }

        
    // --------------------------------------------------------------------

        /**
         * Initialize the user preferences
         *
         * Accepts an associative array as input, containing display preferences
         *
         * @param    array    config preferences
         * @return    CI_Calendar
         */
        
    public function initialize($config = array())
        {
            foreach (
    $config as $key => $val)
            {
                if (isset(
    $this->$key))
                {
                    
    $this->$key $val;
                }
            }

            
    // Set the next_prev_url to the controller if required but not defined
            
    if ($this->show_next_prev === TRUE && empty($this->next_prev_url))
            {
                
    $this->next_prev_url $this->CI->config->site_url($this->CI->router->class.'/'.$this->CI->router->method);
            }

            return 
    $this;
        }

        
    // --------------------------------------------------------------------

        /**
         * Generate the calendar
         *
         * @param    int    the year
         * @param    int    the month
         * @param    array    the data to be shown in the calendar cells
         * @return    string
         */
        
    public function generate($year ''$month ''$data = array())
        {
            
    $local_time time();

            
    // Set and validate the supplied month/year
            
    if (empty($year))
            {
                
    $year date('Y'$local_time);
            }
            elseif (
    strlen($year) === 1)
            {
                
    $year '200'.$year;
            }
            elseif (
    strlen($year) === 2)
            {
                
    $year '20'.$year;
            }

            if (empty(
    $month))
            {
                
    $month date('m'$local_time);
            }
            elseif (
    strlen($month) === 1)
            {
                
    $month '0'.$month;
            }

            
    $adjusted_date $this->adjust_date($month$year);

            
    $month    $adjusted_date['month'];
            
    $year    $adjusted_date['year'];

            
    // Determine the total days in the month
            
    $total_days $this->get_total_days($month$year);

            
    // Set the starting day of the week
            
    $start_days    = array('sunday' => 0'monday' => 1'tuesday' => 2'wednesday' => 3'thursday' => 4'friday' => 5'saturday' => 6);
            
    $start_day    = isset($start_days[$this->start_day]) ? $start_days[$this->start_day] : 0;

            
    // Set the starting day number
            
    $local_date mktime(1200$month1$year);
            
    $date getdate($local_date);
            
    $day  $start_day $date['wday'];

            while (
    $day 1)
            {
                
    $day -= 7;
            }

            
    // Set the current month/year/day
            // We use this to determine the "today" date
            
    $cur_year    date('Y'$local_time);
            
    $cur_month    date('m'$local_time);
            
    $cur_day    date('j'$local_time);

            
    $is_current_month = ($cur_year == $year && $cur_month == $month);

            
    // Generate the template data array
            
    $this->parse_template();

            
    // Begin building the calendar output
            
    $out $this->replacements['table_open']."\n\n".$this->replacements['heading_row_start']."\n";

            
    // "previous" month link
            
    if ($this->show_next_prev === TRUE)
            {
                
    // Add a trailing slash to the URL if needed
                
    $this->next_prev_url preg_replace('/(.+?)\/*$/''\\1/'$this->next_prev_url);

                
    $adjusted_date $this->adjust_date($month 1$year);
                
    $out .= str_replace('{previous_url}'$this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->replacements['heading_previous_cell'])."\n";
            }

            
    // Heading containing the month/year
            
    $colspan = ($this->show_next_prev === TRUE) ? 7;

            
    $this->replacements['heading_title_cell'] = str_replace('{colspan}'$colspan,
                                    
    str_replace('{heading}'$this->get_month_name($month).'&nbsp;'.$year$this->replacements['heading_title_cell']));

            
    $out .= $this->replacements['heading_title_cell']."\n";

            
    // "next" month link
            
    if ($this->show_next_prev === TRUE)
            {
                
    $adjusted_date $this->adjust_date($month 1$year);
                
    $out .= str_replace('{next_url}'$this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->replacements['heading_next_cell']);
            }

            
    $out .= "\n".$this->replacements['heading_row_end']."\n\n"
                
    // Write the cells containing the days of the week
                
    .$this->replacements['week_row_start']."\n";

            
    $day_names $this->get_day_names();

            for (
    $i 0$i 7$i ++)
            {
                
    $out .= str_replace('{week_day}'$day_names[($start_day $i) %7], $this->replacements['week_day_cell']);
            }

            
    $out .= "\n".$this->replacements['week_row_end']."\n";

            
    // Build the main body of the calendar
            
    while ($day <= $total_days)
            {
                
    $out .= "\n".$this->replacements['cal_row_start']."\n";

                for (
    $i 0$i 7$i++)
                {
                    if (
    $day && $day <= $total_days)
                    {
                        
    $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_start_today'] : $this->replacements['cal_cell_start'];

                        if (isset(
    $data[$day]))
                        {
                            
    // Cells with content
                            
    $temp = ($is_current_month === TRUE && $day == $cur_day) ?
                                    
    $this->replacements['cal_cell_content_today'] : $this->replacements['cal_cell_content'];
                            
    $out .= str_replace(array('{content}''{day}'), array($data[$day], $day), $temp);
                        }
                        else
                        {
                            
    // Cells with no content
                            
    $temp = ($is_current_month === TRUE && $day == $cur_day) ?
                                    
    $this->replacements['cal_cell_no_content_today'] : $this->replacements['cal_cell_no_content'];
                            
    $out .= str_replace('{day}'$day$temp);
                        }

                        
    $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->replacements['cal_cell_end_today'] : $this->replacements['cal_cell_end'];
                    }
                    elseif (
    $this->show_other_days === TRUE)
                    {
                        
    $out .= $this->replacements['cal_cell_start_other'];

                        if (
    $day <= 0)
                        {
                            
    // Day of previous month
                            
    $prev_month $this->adjust_date($month 1$year);
                            
    $prev_month_days $this->get_total_days($prev_month['month'], $prev_month['year']);
                            
    $out .= str_replace('{day}'$prev_month_days $day$this->replacements['cal_cell_other']);
                        }
                        else
                        {
                            
    // Day of next month
                            
    $out .= str_replace('{day}'$day $total_days$this->replacements['cal_cell_other']);
                        }

                        
    $out .= $this->replacements['cal_cell_end_other'];
                    }
                    else
                    {
                        
    // Blank cells
                        
    $out .= $this->replacements['cal_cell_start'].$this->replacements['cal_cell_blank'].$this->replacements['cal_cell_end'];
                    }

                    
    $day++;
                }

                
    $out .= "\n".$this->replacements['cal_row_end']."\n";
            }

            return 
    $out .= "\n".$this->replacements['table_close'];
        }

        
    // --------------------------------------------------------------------

        /**
         * Get Month Name
         *
         * Generates a textual month name based on the numeric
         * month provided.
         *
         * @param    int    the month
         * @return    string
         */
        
    public function get_month_name($month)
        {
            if (
    $this->month_type === 'short')
            {
                
    $month_names = array('01' => 'cal_jan''02' => 'cal_feb''03' => 'cal_mar''04' => 'cal_apr''05' => 'cal_may''06' => 'cal_jun''07' => 'cal_jul''08' => 'cal_aug''09' => 'cal_sep''10' => 'cal_oct''11' => 'cal_nov''12' => 'cal_dec');
            }
            else
            {
                
    $month_names = array('01' => 'cal_january''02' => 'cal_february''03' => 'cal_march''04' => 'cal_april''05' => 'cal_mayl''06' => 'cal_june''07' => 'cal_july''08' => 'cal_august''09' => 'cal_september''10' => 'cal_october''11' => 'cal_november''12' => 'cal_december');
            }

            return (
    $this->CI->lang->line($month_names[$month]) === FALSE)
                ? 
    ucfirst(substr($month_names[$month], 4))
                : 
    $this->CI->lang->line($month_names[$month]);
        }

        
    // --------------------------------------------------------------------

        /**
         * Get Day Names
         *
         * Returns an array of day names (Sunday, Monday, etc.) based
         * on the type. Options: long, short, abr
         *
         * @param    string
         * @return    array
         */
        
    public function get_day_names($day_type '')
        {
            if (
    $day_type !== '')
            {
                
    $this->day_type $day_type;
            }

            if (
    $this->day_type === 'long')
            {
                
    $day_names = array('sunday''monday''tuesday''wednesday''thursday''friday''saturday');
            }
            elseif (
    $this->day_type === 'short')
            {
                
    $day_names = array('sun''mon''tue''wed''thu''fri''sat');
            }
            else
            {
                
    $day_names = array('su''mo''tu''we''th''fr''sa');
            }

            
    $days = array();
            for (
    $i 0$c count($day_names); $i $c$i++)
            {
                
    $days[] = ($this->CI->lang->line('cal_'.$day_names[$i]) === FALSE) ? ucfirst($day_names[$i]) : $this->CI->lang->line('cal_'.$day_names[$i]);
            }

            return 
    $days;
        }

        
    // --------------------------------------------------------------------

        /**
         * Adjust Date
         *
         * This function makes sure that we have a valid month/year.
         * For example, if you submit 13 as the month, the year will
         * increment and the month will become January.
         *
         * @param    int    the month
         * @param    int    the year
         * @return    array
         */
        
    public function adjust_date($month$year)
        {
            
    $date = array();

            
    $date['month']    = $month;
            
    $date['year']    = $year;

            while (
    $date['month'] > 12)
            {
                
    $date['month'] -= 12;
                
    $date['year']++;
            }

            while (
    $date['month'] <= 0)
            {
                
    $date['month'] += 12;
                
    $date['year']--;
            }

            if (
    strlen($date['month']) === 1)
            {
                
    $date['month'] = '0'.$date['month'];
            }

            return 
    $date;
        }

        
    // --------------------------------------------------------------------

        /**
         * Total days in a given month
         *
         * @param    int    the month
         * @param    int    the year
         * @return    int
         */
        
    public function get_total_days($month$year)
        {
            
    $this->CI->load->helper('date');
            return 
    days_in_month($month$year);
        }

        
    // --------------------------------------------------------------------

        /**
         * Set Default Template Data
         *
         * This is used in the event that the user has not created their own template
         *
         * @return    array
         */
        
    public function default_template()
        {
            return array(
                
    'table_open'                => '<table border="0" cellpadding="4" cellspacing="0">',
                
    'heading_row_start'            => '<tr>',
                
    'heading_previous_cell'        => '<th><a href="{previous_url}">&lt;&lt;</a></th>',
                
    'heading_title_cell'        => '<th colspan="{colspan}">{heading}</th>',
                
    'heading_next_cell'            => '<th><a href="{next_url}">&gt;&gt;</a></th>',
                
    'heading_row_end'            => '</tr>',
                
    'week_row_start'            => '<tr>',
                
    'week_day_cell'                => '<td>{week_day}</td>',
                
    'week_row_end'                => '</tr>',
                
    'cal_row_start'                => '<tr>',
                
    'cal_cell_start'            => '<td>',
                
    'cal_cell_start_today'        => '<td>',
                
    'cal_cell_start_other'        => '<td style="color: #666;">',
                
    'cal_cell_content'            => '<a href="{content}">{day}</a>',
                
    'cal_cell_content_today'    => '<a href="{content}"><strong>{day}</strong></a>',
                
    'cal_cell_no_content'        => '{day}',
                
    'cal_cell_no_content_today'    => '<strong>{day}</strong>',
                
    'cal_cell_blank'            => '&nbsp;',
                
    'cal_cell_other'            => '{day}',
                
    'cal_cell_end'                => '</td>',
                
    'cal_cell_end_today'        => '</td>',
                
    'cal_cell_end_other'        => '</td>',
                
    'cal_row_end'                => '</tr>',
                
    'table_close'                => '</table>'
            
    );
        }

        
    // --------------------------------------------------------------------

        /**
         * Parse Template
         *
         * Harvests the data within the template {pseudo-variables}
         * used to display the calendar
         *
         * @return    CI_Calendar
         */
        
    public function parse_template()
        {
            
    $this->replacements $this->default_template();

            if (empty(
    $this->template))
            {
                return 
    $this;
            }

            if (
    is_string($this->template))
            {
                
    $today = array('cal_cell_start_today''cal_cell_content_today''cal_cell_no_content_today''cal_cell_end_today');

                foreach (array(
    'table_open''table_close''heading_row_start''heading_previous_cell''heading_title_cell''heading_next_cell''heading_row_end''week_row_start''week_day_cell''week_row_end''cal_row_start''cal_cell_start''cal_cell_content''cal_cell_no_content''cal_cell_blank''cal_cell_end''cal_row_end''cal_cell_start_today''cal_cell_content_today''cal_cell_no_content_today''cal_cell_end_today''cal_cell_start_other''cal_cell_other''cal_cell_end_other') as $val)
                {
                    if (
    preg_match('/\{'.$val.'\}(.*?)\{\/'.$val.'\}/si'$this->template$match))
                    {
                        
    $this->replacements[$val] = $match[1];
                    }
                    elseif (
    in_array($val$todayTRUE))
                    {
                        
    $this->replacements[$val] = $this->replacements[substr($val0, -6)];
                    }
                }
            }
            elseif (
    is_array($this->template))
            {
                
    $this->replacements array_merge($this->replacements$this->template);
            }

            return 
    $this;
        }

    }
  4. #3
  5. A Change of Season
    Devshed Loyal (3000 - 3499 posts)

    Join Date
    Mar 2004
    Location
    Next Door
    Posts
    3,189
    Rep Power
    220
    Anyone?

IMN logo majestic logo threadwatch logo seochat tools logo