PHP array to JavaScript array

In a View File:

  1. I have a php array named $eventsDays with dates.

  2. I have a calendar:




<?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(

     'name'=>'inline_datepicker',

     'flat' => true,

     'options'=> array(

     'async'=>false,

     'beforeShowDay'=>'js:checkEventDay'

   ),

   'htmlOptions'=>array(

        'class'=>'calendar',

   ),

)); ?>



  1. I have a js function that shows the events day on calendar (checkEventDay). It works fine with an ‘explicit array’, but I do not know how it works with my php array ($eventsDays).



<?php

$cs = Yii::app()->getClientScript();


$cs->registerScript('events.script', '

     var $eventsDates = ["2012-07-23","2012-07-21","2012-07-22"];


     function checkEventDay(mydate) {

          $checkdate = $.datepicker.formatDate("yy-mm-dd", mydate);

          if ($.inArray($checkdate, $eventsDates) < 0) {

               return [true,"eventday"];

          } else {

               return [false,"noteventday"];

          }

     }

'); ?>



I read about json_encode, but I couldn’n make it work.

Thanks!!!


	$array = array('one'=>1,'two'=>2);

echo CJSON::encode($array);

gives {"one":1,"two":2}

so you could do


<script>var foo = <?=CJSON::encode($array);?>; alert(foo.one);</script>

Thanks you! But i still have a ¿syntaxis? problem:


     

$cs->registerScript('events.script', "


          function checkEventDay(mydate) {

               var eventsDates=<?=CJSON::encode($eventsDatesArray);?>;

               var checkdate = $.datepicker.formatDate('yy-mm-dd', mydate);


               if ($.inArray(checkdate, eventsDates) < 0) {

                    return [true,'eventday'];

               } else {

                    return [false,'noteventday'];

               }

          }

     ");



In Firebug:

[color="#FF0000"]SyntaxError: invalid XML markup

var eventsDates=<?=CJSON::encode(Array);?>;[/color]

Printing the array in screen:


echo CJSON::encode($eventsDatesArray);


["2013-01-01","2013-01-02","2013-01-03","2013-01-04","2013-01-31"]

I have dizzy using quotes and single quotes!

Thanks you again!




$cs->registerScript('events.script', "


          function checkEventDay(mydate) {

               var eventsDates=".CJSON::encode($eventsDatesArray).";

               var checkdate = $.datepicker.formatDate('yy-mm-dd', mydate);


               if ($.inArray(checkdate, eventsDates) < 0) {

                    return [true,'eventday'];

               } else {

                    return [false,'noteventday'];

               }

          }

     ");




I try but it generates this:


var eventsDates=[];

That just means that your $eventsDatesArray variable is an empty array. Make sure it’s being populated correctly by your PHP code.

Thanks to all!

Finally, my working view file:




<?php

     $events = $this->getEvents($data->id);  // Return an array


     global $eventsDatesArray;  // global... my headache <img src='http://www.yiiframework.com/forum/public/style_emoticons/default/wink.gif' class='bbc_emoticon' alt=';)' /> 

     foreach ($events as $event) {

          $eventsDatesArray[]=$event;

     }


     $cs = Yii::app()->getClientScript();

     $cs->registerScript('events.script', '


          function checkEventDay(mydate) {

               var eventsDates='.CJSON::encode($eventsDatesArray).';


               var checkdate = $.datepicker.formatDate("yy-mm-dd", mydate);

               if ($.inArray(checkdate, eventsDates) < 0) {

                    return [true,"eventday"];

               } else {

                    return [false,"noteventday"];

               }

          }

     ');

?>




EASY MODE ON xD:




<?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(

     'name'=>'inline_datepicker',

     'flat' => true,

     'options'=> array(

           'async'=>false,

           'minDate'=>'date("Y-m-d")',

           'beforeShowDay'=>'js:function (mydate) {

                var eventsDates='.CJSON::encode($this->getEvents($data->id)).';

                var checkdate = $.datepicker.formatDate("yy-mm-dd", mydate);

                if ($.inArray(checkdate, eventsDates) < 0) {

                     return [true,"eventday"];

                } else {

                     return [false,"noteventday"];

                }

            }'                          

      ),

      'htmlOptions'=>array(

           'class'=>'calendar',

            'id'=>'events'.$data->id

      ),

)); ?>