31
31
32
32
namespace Phpug \Api \v1 ;
33
33
34
+ use Phpug \ORM \Query \AST \Functions \DistanceFrom ;
34
35
use Zend \Mvc \Controller \AbstractActionController ;
35
36
use Sabre \VObject ;
36
37
use Zend \Json \Json ;
@@ -64,10 +65,16 @@ public function listAction()
64
65
$ em = $ this ->getServiceLocator ()->get ('doctrine.entitymanager.orm_default ' );
65
66
$ result = $ em ->getRepository ('Phpug\Entity\Cache ' )->findBy (array ('type ' => 'event ' ));
66
67
$ calendar = new VObject \Component \VCalendar ();
68
+ $ affectedUGs = $ this ->findGroupsWithinRangeAndDistance ();
67
69
foreach ($ result as $ cal ) {
68
70
if (! $ cal ->getGRoup ()) {
69
71
continue ;
70
72
}
73
+
74
+ if ($ affectedUGs && ! in_array ($ cal ->getGroup ()->getShortname (), $ affectedUGs )) {
75
+ continue ;
76
+ }
77
+
71
78
try {
72
79
$ ical = VObject \Reader::read ($ cal ->getCache ());
73
80
foreach ($ ical ->children as $ event ) {
@@ -81,7 +88,7 @@ public function listAction()
81
88
} catch (\Exception $ e ){}
82
89
83
90
}
84
-
91
+
85
92
$ viewModel = $ this ->getViewModel ();
86
93
87
94
return $ viewModel ->setVariable ('calendar ' , new \Phpug \Wrapper \SabreVCalendarWrapper ($ calendar ));
@@ -114,4 +121,43 @@ protected function setAcceptHeaderAccordingToParameters()
114
121
115
122
return $ this ;
116
123
}
124
+
125
+ protected function findGroupsWithinRangeAndDistance ()
126
+ {
127
+ $ lat = $ this ->params ()->fromQuery ('latitude ' , null );
128
+ $ lon = $ this ->params ()->fromQuery ('longitude ' , null );
129
+ $ distance = $ this ->params ()->fromQuery ('distance ' , null );
130
+ $ number = $ this ->params ()->fromQuery ('count ' , null );
131
+
132
+ if (! $ lat || ! $ lon ) {
133
+ return array ();
134
+ }
135
+ /** @var \Doctrine\ORM\EntityManager $em */
136
+ $ em = $ this ->getServiceLocator ()->get ('doctrine.entitymanager.orm_default ' );
137
+ DistanceFrom::setLatitudeField ('latitude ' );
138
+ DistanceFrom::setLongitudeField ('longitude ' );
139
+ DistanceFrom::setRadius (6367 );
140
+ $ em ->getConfiguration ()->addCustomNumericFunction ('DISTANCEFROM ' , 'Phpug\ORM\Query\AST\Functions\DistanceFrom ' );
141
+
142
+ $ qs = 'SELECT p, DISTANCEFROM( ' . (float ) $ lat . ', ' . (float ) $ lon . ') AS distance FROM \Phpug\Entity\Usergroup p WHERE p.state = 1 ' ;
143
+
144
+
145
+ if ($ distance ) {
146
+ $ qs .= ' AND DISTANCEFROM( ' . (float ) $ lat . ', ' . (float ) $ lon . ') <= ' . (float ) $ distance ;
147
+ }
148
+
149
+ $ qs .= ' ORDER BY distance ' ;
150
+
151
+ $ query = $ em ->createQuery ($ qs );
152
+ if ($ number ) {
153
+ $ query ->setMaxResults ($ number );
154
+ }
155
+
156
+ $ res = array ();
157
+ foreach ($ query ->getResult () as $ result ) {
158
+ $ res [] = $ result [0 ]->getShortname ();
159
+ }
160
+
161
+ return $ res ;
162
+ }
117
163
}
0 commit comments