[javascript] calendario booking disponibilità

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Buongiorno a tutti ho appena installato uno script per la visualizzazione di un calendario che evidenzia quando una camera non è disponibile.
Il tutto funziona correttamente passandogli tramite ciclo while php una data di arrivo ed una di partenza.
Ora vorrei potergli passare altre variabili all'interno del range così da visualizzare anche l'eventuale nome dell'ospite ed il prezzo da pagare.

Ecco il codice che elabora il tutto:
Codice:
(function ($) {
    var weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
    var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];


    function AvailabilityCalendar(container, bookedDates) {
        this.date = new Date();
        this.date.setDate(1);

        this.container = container;
        this.bookedDates = bookedDates;

        this.createCalendar();
        this.renderMonth();
    }


    AvailabilityCalendar.prototype = {
        /**
         * Setup methods
         */
        __createToolbar: function () {
            var $toolbar = $('<div></div>').appendTo(this.container);
            $toolbar.addClass('availability-calendar-toolbar');

            this.$monthLabel = $('<span></span>').appendTo($toolbar);
            var $inputContainer = $('<span></span>').appendTo($toolbar);

            $inputContainer.append('<input type="button" title="This month" value="This Month">');
            $inputContainer.append('<input type="button" title="Previous month" value="&#10094;">');
            $inputContainer.append('<input type="button" title="Next month" value="&#10095;">');

            var $inputs = $inputContainer.children('input');
            var self = this;

            $inputs.eq(0).on('click', function () {
                self.date = new Date();
                self.date.setDate(1);
                self.renderMonth();
            });

            $inputs.eq(1).on('click', function () {
                self.date.setMonth(self.date.getMonth() - 1);
                self.renderMonth();
            });

            $inputs.eq(2).on('click', function () {
                self.date.setMonth(self.date.getMonth() + 1);
                self.renderMonth();
            });
        },
        __createTable: function () {
            var $table = $('<table></table>').appendTo(this.container);
            $table.addClass('availability-calendar');

            // Weekday headers
            var $tr = $('<tr></tr>').appendTo($table);

            weekdays.forEach(function (day) {
                $('<th></th>').html(day).appendTo($tr);
            });

            // Day cells
            for (var i = 0; i < 6; ++i) {
                $tr = $('<tr></tr>').appendTo($table);
                $tr.append('<td></td><td></td><td></td><td></td><td></td><td></td><td></td>');
            }

            this.$cells = $table.find('td');
        },
        createCalendar: function () {
            this.__createToolbar();
            this.__createTable();
        },


        /**
         * Month rendering methods
         */
        __addPreviousMonthDays: function (date, cellIndexes, dates) {
            var firstWeekdayOfMonth = date.getDay() - 1;
            if (firstWeekdayOfMonth < 0) firstWeekdayOfMonth = 6;

            if (firstWeekdayOfMonth > 0) {
                date.setDate(0);
                var numDays = date.getDate();

                for (var i = numDays - firstWeekdayOfMonth + 1; i <= numDays; ++i) {
                    this.$cells.eq(dates.length).html(i).addClass('ex-month');

                    date.setDate(i);
                    var dateInt = date.valueOf();

                    cellIndexes[dateInt] = dates.length;
                    dates.push(dateInt);
                }
            }
        },
        __addThisMonthDays: function (date, year, month, cellIndexes, dates) {
            date.setFullYear(year, month + 1, 0); // Need to reset year
            var numDays = date.getDate();

            for (var i = 1; i <= numDays; ++i) {
                this.$cells.eq(dates.length).html(i);

                date.setDate(i);
                var dateInt = date.valueOf();

                cellIndexes[dateInt] = dates.length;
                dates.push(dateInt);
            }
        },
        __addNextMonthDays: function (date, month, cellIndexes, dates) {
            if (dates.length < 42) {
                date.setMonth(month + 1, 1);
                var remainingDays = 42 - dates.length;

                for (var i = 1; i <= remainingDays; ++i) {
                    this.$cells.eq(dates.length).html(i).addClass('ex-month');

                    date.setDate(i);
                    var dateInt = date.valueOf();

                    cellIndexes[dateInt] = dates.length;
                    dates.push(dateInt);
                }
            }
        },
        __addEvents: function (cellIndexes, dates) {
            var firstDate = dates[0];
            var lastDate = dates[dates.length - 1];
            var self = this;

            this.bookedDates.forEach(function (date) {
                if (date.start <= lastDate && date.end >= firstDate) {
                    var startIndex = cellIndexes[date.start];
                    var endIndex = cellIndexes[date.end];

                    if (startIndex !== undefined) {
                        self.$cells.eq(startIndex).addClass('unavailable').append('<div class="first"></div>');
                        ++startIndex;
                    }
                    else {
                        startIndex = cellIndexes[firstDate];
                    }

                    if (endIndex !== undefined) {
                        self.$cells.eq(endIndex).addClass('unavailable').append('<div class="last"></div>');
                        --endIndex;
                    }
                    else {
                        endIndex = cellIndexes[lastDate];
                    }

                    self.$cells.slice(startIndex, endIndex + 1).addClass('unavailable').append('<div></div>');
                }
            });
        },
        renderMonth: function () {
            var cellIndexes = {};
            var dates = [];

            var year = this.date.getFullYear();
            var month = this.date.getMonth();
            var date = new Date(year, month, 1);

            this.$monthLabel.html(months[month] + ' ' + year);
            this.$cells.removeClass('ex-month');
            this.$cells.filter('.unavailable').removeClass('unavailable').children().remove();

            this.__addPreviousMonthDays(date, cellIndexes, dates);
            this.__addThisMonthDays(date, year, month, cellIndexes, dates);
            this.__addNextMonthDays(date, month, cellIndexes, dates);

            this.__addEvents(cellIndexes, dates);
        }
    };


    $.fn.availabilityCalendar = function (bookedDates) {
        var dates = [];

        bookedDates.forEach(function (date) {
            var start = new Date(date.start);
            var end = new Date(date.end);

            start.setHours(0, 0, 0, 0);
            end.setHours(0, 0, 0, 0);

            start = start.valueOf();
            end = end.valueOf();

            if (start <= end) {
                dates.push({
                    start: start,
                    end: end
                });
            }
        });

        this.each(function () {
            new AvailabilityCalendar(this, dates);
        });

        return this;
    };
})(jQuery);
Mentre quello che stampa a video il calendario è il seguente:

PHP:
 <?php echo"<script>var unavailableDates = [";
while($result = mysqli_fetch_array($resultSet))        {          

$unixtimearrivo = $result['data_arrivo'];
$unixtimepartenza = $result['data_partenza'];
$nome_ospite= $result['nome_ospite'];
$dataarrivo = date("Y-m-d",$unixtimearrivo);
$datapartenza = date("Y-m-d",$unixtimepartenza);
           
echo"{start: '".$dataarrivo."', end: '".$datapartenza."' },";

}
echo"];$('#calendar').availabilityCalendar(unavailableDates);</script>";

?>
Il calendario evidenzia sauna data di arrivo ed una data di partenza una striscia rossa che specifica lagno disponibilità della camera.
Come potrei aggiungere un'ulteriore variabile tipo nome ospite? non sono esperto di javascript e prototype. Spero qualcuno possa indicarmi il percorso. Grazie!
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, per passare una varibile in più ti basta aggiungerla quando crei l'oggetto
PHP:
echo"{start: '" . $dataarrivo . "', end: '" . $datapartenza . "',nome:'" . $nome_ospite= 
. "' },";
poi la leggi con la sintassi di javascript, non ho provato il codice ma probabilmente la dovrai inserire qui
Codice:
.append('<div class="last">' + data.nome + '</div>');
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Grazie mille per la dritta. Ho trovato un altro calendario che già mi permette di passare infinite variabili. Grazie ancora!!!