Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Zend GData解析重复事件?_Php_Calendar_Gdata_Repeat - Fatal编程技术网

Php 如何使用Zend GData解析重复事件?

Php 如何使用Zend GData解析重复事件?,php,calendar,gdata,repeat,Php,Calendar,Gdata,Repeat,关于如何使用Zend GData从Google日历请求和解析事件列表,有很多教程 但所有教程都假设事件永远不会重复。(在某种程度上,它们描述了如何设置重复事件,而不是如何解析/显示它们。) 因此,我编写了一个脚本,将事件从Google日历复制到网站,但它不起作用,因为日历中的一些事件是重复的,教程中描述的方法会导致非常随机的输出 有什么想法吗?我想我终于找到了你真正想要的答案。根据,您需要将'singleevents'参数设置为'true',强制返回的数据自行解析和排序重复事件。因此,您的代码(

关于如何使用Zend GData从Google日历请求和解析事件列表,有很多教程

但所有教程都假设事件永远不会重复。(在某种程度上,它们描述了如何设置重复事件,而不是如何解析/显示它们。)

因此,我编写了一个脚本,将事件从Google日历复制到网站,但它不起作用,因为日历中的一些事件是重复的,教程中描述的方法会导致非常随机的输出


有什么想法吗?

我想我终于找到了你真正想要的答案。根据,您需要将'singleevents'参数设置为'true',强制返回的数据自行解析和排序重复事件。因此,您的代码(基于)将类似于:

function outputCalendarByDateRange($client, $startDate='2007-05-01', $endDate='2007-08-01') {
  $gdataCal = new Zend_Gdata_Calendar($client);
  $query = $gdataCal->newEventQuery();
  $query->setUser('default');
  $query->setVisibility('private');
  $query->setProjection('full');
  $query->setOrderby('starttime');
  $query->setStartMin($startDate);
  $query->setStartMax($endDate);

  $query->setsingleevents('true');

  $eventFeed = $gdataCal->getCalendarEventFeed($query);
  echo "<ul>\n";
  foreach ($eventFeed as $event) {
    echo "\t<li>" . $event->title->text .  " (" . $event->id->text . ")\n";
    echo "\t\t<ul>\n";
    foreach ($event->when as $when) {
      echo "\t\t\t<li>Starts: " . $when->startTime . "</li>\n";
    }
    echo "\t\t</ul>\n";
    echo "\t</li>\n";
  }
  echo "</ul>\n";
}
这很有效。问题是,所有事件都将按下一次发生的顺序“分组”返回。就是说现在是星期一。如果您每周二都有一个重复事件,每周四又有一个重复事件,并且您要求它在接下来的90天内完成所有事件,那么您将得到的列表将首先列出接下来90天内周二事件的每个实例,然后它将继续列出周四事件的每个实例。出于我的目的(听起来也像是你的),我希望列表按照接下来的各个事件的顺序排列

我发现的唯一方法是将每个实例的数据插入到一个临时SQL数据库表中,其中包括一列,指示事件开始的时间戳。然后,一旦它全部输入到数据库中,我就可以请求它返回事件,按时间戳排序

因此,我的循环类似于:

function outputCalendarByDateRange($client, $startDate='2007-05-01', $endDate='2007-08-01') {
  $gdataCal = new Zend_Gdata_Calendar($client);
  $query = $gdataCal->newEventQuery();
  $query->setUser('default');
  $query->setVisibility('private');
  $query->setProjection('full');
  $query->setOrderby('starttime');
  $query->setStartMin($startDate);
  $query->setStartMax($endDate);

  $query->setsingleevents('true');

  $eventFeed = $gdataCal->getCalendarEventFeed($query);
  echo "<ul>\n";
  foreach ($eventFeed as $event) {
    echo "\t<li>" . $event->title->text .  " (" . $event->id->text . ")\n";
    echo "\t\t<ul>\n";
    foreach ($event->when as $when) {
      echo "\t\t\t<li>Starts: " . $when->startTime . "</li>\n";
    }
    echo "\t\t</ul>\n";
    echo "\t</li>\n";
  }
  echo "</ul>\n";
}
mysql\u查询(“创建临时表`temp`(`title`TEXT NOT NULL,`date`TEXT NOT NULL,`timestamp`timestamp NOT NULL)”);
$eventFeed=$gdataCal->getCalendarEventFeed($query);
foreach($eventFeed作为$event){
foreach($event->when as$when){
$start=strottime($when->startTime);
$end=strottime($when->endTime);
mysql_查询(“插入到`temp`(`title`、`date`、`timestamp`)值(''.''.'.''.'.'.'.date(“mdh:ia”、$start)。”)“-”.date(“h:i”、$end)。“,”日期(“Y-M-dh:i:s”、$start)。”);
}
}
$result=mysql\u查询(“按时间戳'ASC'顺序从'mobile\u app\u events'中选择*);
while($row=mysql\u fetch\u assoc($result)){
回音“\n”;
回显“.$row['title']”。\n;
回显“.$row['date']”。\n;
回音“\n”;
}
现在,我要提醒你——我发现这个主题的原因是因为我自己在寻找答案……似乎如果重复发生的事件有任何异常(例如,下周四的事件被取消),那么使用这些代码的输出中不会反映出这一点。虽然下周四的活动将从您的谷歌日历视图中删除,但它仍会显示在此页面上

除此之外,(假设你已经访问了一个数据库),这似乎能起到作用。我确实在流程开始之前添加了几行代码来启动事务,理论上它可能会加快数据的呈现,而不必提交每个插入


我想我终于找到了你真正想要的答案。根据,您需要将'singleevents'参数设置为'true',强制返回的数据自行解析和排序重复事件。因此,您的代码(基于)将类似于:

function outputCalendarByDateRange($client, $startDate='2007-05-01', $endDate='2007-08-01') {
  $gdataCal = new Zend_Gdata_Calendar($client);
  $query = $gdataCal->newEventQuery();
  $query->setUser('default');
  $query->setVisibility('private');
  $query->setProjection('full');
  $query->setOrderby('starttime');
  $query->setStartMin($startDate);
  $query->setStartMax($endDate);

  $query->setsingleevents('true');

  $eventFeed = $gdataCal->getCalendarEventFeed($query);
  echo "<ul>\n";
  foreach ($eventFeed as $event) {
    echo "\t<li>" . $event->title->text .  " (" . $event->id->text . ")\n";
    echo "\t\t<ul>\n";
    foreach ($event->when as $when) {
      echo "\t\t\t<li>Starts: " . $when->startTime . "</li>\n";
    }
    echo "\t\t</ul>\n";
    echo "\t</li>\n";
  }
  echo "</ul>\n";
}
这很有效。问题是,所有事件都将按下一次发生的顺序“分组”返回。就是说现在是星期一。如果您每周二都有一个重复事件,每周四又有一个重复事件,并且您要求它在接下来的90天内完成所有事件,那么您将得到的列表将首先列出接下来90天内周二事件的每个实例,然后它将继续列出周四事件的每个实例。出于我的目的(听起来也像是你的),我希望列表按照接下来的各个事件的顺序排列

我发现的唯一方法是将每个实例的数据插入到一个临时SQL数据库表中,其中包括一列,指示事件开始的时间戳。然后,一旦它全部输入到数据库中,我就可以请求它返回事件,按时间戳排序

因此,我的循环类似于:

function outputCalendarByDateRange($client, $startDate='2007-05-01', $endDate='2007-08-01') {
  $gdataCal = new Zend_Gdata_Calendar($client);
  $query = $gdataCal->newEventQuery();
  $query->setUser('default');
  $query->setVisibility('private');
  $query->setProjection('full');
  $query->setOrderby('starttime');
  $query->setStartMin($startDate);
  $query->setStartMax($endDate);

  $query->setsingleevents('true');

  $eventFeed = $gdataCal->getCalendarEventFeed($query);
  echo "<ul>\n";
  foreach ($eventFeed as $event) {
    echo "\t<li>" . $event->title->text .  " (" . $event->id->text . ")\n";
    echo "\t\t<ul>\n";
    foreach ($event->when as $when) {
      echo "\t\t\t<li>Starts: " . $when->startTime . "</li>\n";
    }
    echo "\t\t</ul>\n";
    echo "\t</li>\n";
  }
  echo "</ul>\n";
}
mysql\u查询(“创建临时表`temp`(`title`TEXT NOT NULL,`date`TEXT NOT NULL,`timestamp`timestamp NOT NULL)”);
$eventFeed=$gdataCal->getCalendarEventFeed($query);
foreach($eventFeed作为$event){
foreach($event->when as$when){
$start=strottime($when->startTime);
$end=strottime($when->endTime);
mysql_查询(“插入到`temp`(`title`、`date`、`timestamp`)值(''.''.'.''.'.'.'.date(“mdh:ia”、$start)。”)“-”.date(“h:i”、$end)。“,”日期(“Y-M-dh:i:s”、$start)。”);
}
}
$result=mysql\u查询(“按时间戳'ASC'顺序从'mobile\u app\u events'中选择*);
while($row=mysql\u fetch\u assoc($result)){
回音“\n”;
回显“.$row['title']”。\n;
回显“.$row['date']”。\n;
回音“\n”;
}
现在,我要提醒你——我发现这个主题的原因是因为我自己在寻找答案……似乎如果重复发生的事件有任何异常(例如,下周四的事件被取消),那么使用这些代码的输出中不会反映出这一点。虽然下周四的活动将从您的谷歌日历视图中删除,但它仍会显示在此页面上

除此之外,(假设你已经访问了一个数据库),这似乎能起到作用。我确实在流程开始之前添加了几行代码来启动事务,理论上它可能会加快数据的呈现,而不必提交每个插入