来自joomla模板的重写组件的Ajax请求

时间:2015-12-16 13:40:23

标签: php jquery ajax joomla

我是joomla的新人,我很多时间都在寻找答案,但没有得到结果。我在joomla 3.4.5中有我的模板,我在其中覆盖了组件com_content和category。我创建了我的文件blog.php,我输出了我的日历。问题是通过clickng适当的按钮发送ajax更改月份。当我尝试发送ajax时出现错误。好像joomla禁止直接请求。我阅读了很多文章,比如如何在模块和组件中使用ajax,但是没有建议如何在覆盖组件中使用它。请给我详细解答我的问题。

JHtml::_('jquery.framework');
  $document = JFactory::getDocument();
  $document->addScript('/space/media/media/js/mainscript.js');

我使用该代码将我的脚本文件包含在blog.php

function getAjaxData()
  {
      echo  'login: ' .$_REQUEST['month'] . '; password: ' . $_REQUEST['year'];
      exit;
  }

创建了在blog.php中处理我的ajax请求的方法

var j = jQuery.noConflict()
j(document).ready(function(){

    j('#next').click(function(){

        var month = j(this).data('month');
        var year = j(this).data('year');

        if(month == 12){
            year +=1;
            month = 1;
        }
        else{
            month++;
        }

        j.post("/space/templates/forte/")

        j.ajax({
         url: "index.php?option=com_content&view=category&task=getAjaxData&format=raw",
         type: "POST",
         data: {
                month: month,
                year: year

         },
         success: function(data){ 
           j('#calendar_wrap').html(data);
          }
        });

        console.log('month: '+month+' year: '+year);
    })

    j('#prev').click(function(){

        var month = j(this).data('month');
        var year = j(this).data('year');

        if(month == 1){
            year -=1;
            month = 12;
        }
        else{
            month--;
        }

        j.ajax({
         url: "index.php?option=com_content&view=category&task=getAjaxData&format=raw",
         type: "POST",
         data: {
                month: month,
                year: year

         },
         success: function(data){ 
            j('#calendar_wrap').html(data);
          }
        });

        console.log('month: '+month+' year: '+year);
    })
});

mainscript.js,包含在blog.php中

  

主线程上的同步XMLHttpRequest因不推荐使用   它对最终用户的体验产生不利影响。如需更多帮助,   检查http://xhr.spec.whatwg.org/

这是输出到浏览器控制台的错误

1 个答案:

答案 0 :(得分:0)

我通过放置该方法来解决该错误的问题:

public function getAjaxData()
{

}

在档案中:/site/components/com_content/controller.php

但是,我现在还有一个问题。 在那个方法中,我的日历再次输出,但现在我们有了新的值,由ajax发送。以下代码:

public function getAjaxData()
  {

        JHtml::_('jquery.framework');

        $document = JFactory::getDocument();
        $document->addScript('/space/media/media/js/mainscript.js');

      function days_in_month($month, $year) 
      { 
        // calculate number of days in a month 
        return $month == 2 ? ($year % 4 ? 28 : ($year % 100 ? 29 : ($year % 400 ? 28 : 29))) : (($month - 1) % 7 % 2 ? 30 : 31); 
      }

      // get number of days in needed month

      $currentYear = date('Y');
      $currentMonth = date('n');
      if(isset($_REQUEST['year']))
        $currentYear = $_REQUEST['year'];
      if(isset($_REQUEST['month']))
        $currentMonth = $_REQUEST['month'];


      $rusmonth = array('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь');

      $dayofmonth = days_in_month($currentMonth, $currentYear);
      // count for days in month
      $day_count = 1;

      // 1. first week
      $num = 0;
      for($i = 0; $i < 7; $i++)
      {
        // get day of week
        $dayofweek = date('w',
                          mktime(0, 0, 0, $currentMonth, $day_count, $currentYear));
        // format our values to 1-monday, 6-saturday
        $dayofweek = $dayofweek - 1;
        if($dayofweek == -1) $dayofweek = 6;

        if($dayofweek == $i)
        {
          // if numbers of week are equal,
          // put values into array $week
          $week[$num][$i] = $day_count;
          $day_count++;
        }
        else
        {
          $week[$num][$i] = "";
        }
      }

      // 2. other weeks of month
      while(true)
      {
        $num++;
        for($i = 0; $i < 7; $i++)
        {
          $week[$num][$i] = $day_count;
          $day_count++;
          // if we got the end of the month exit from loop
          if($day_count > $dayofmonth) break;
        }

        if($day_count > $dayofmonth) break;
      }

      // 3. output array $week

      echo '<div> <span id="prev" data-month="'.$currentMonth.'" data-year="'.$currentYear.'"><</span> '.$rusmonth[$currentMonth-1].' <span id="next" data-month="'.$currentMonth.'" data-year="'.$currentYear.'">></span>  </div>';
      echo '<div id="calendar_wrap">';
        echo '<table border=1>';
        echo '<tr>
                    <th>ПН</th>
                    <th>ВТ</th>
                    <th>СР</th>
                    <th>ЧТ</th>
                    <th>ПТ</th>
                    <th>СБ</th>
                    <th>ВС</th>
                 </tr>';
        for($i = 0; $i < count($week); $i++)
        {
          echo "<tr>";
          for($j = 0; $j < 7; $j++)
          {
            if(!empty($week[$i][$j]))
            {

              if($j == 5 || $j == 6) 
                   echo "<td><font color=red>".$week[$i][$j]."</font></td>";
              else echo "<td>".$week[$i][$j]."</td>";
            }
            else echo "<td>&nbsp;</td>";
          }
          echo "</tr>";
        } 
        echo "</table>";
      echo '</div>';
    exit;
  }

在那种方法中,我无法再次添加我的脚本以获得新的月份。 所以我看到有两种方式:  1.这样做我的方法,所以他变成了blog.php和ajax之间的桥梁。没有产出。

  1. 找到一种方法,我怎样才能将脚本添加到控制器并制作双重代码。
  2. 问题是,我不知道,如何在Joomla中实现它们...... 当然我更喜欢第一种变体。