1 | <?php |
||
2 | declare(strict_types=1); |
||
3 | |||
4 | use SKien\Google\GClient; |
||
5 | use SKien\Google\GContact; |
||
6 | use SKien\Google\GContactGroups; |
||
7 | use SKien\Google\GContacts; |
||
8 | use SKien\Google\GSecrets; |
||
9 | |||
10 | require_once 'autoloader.php'; |
||
11 | require_once 'displayApiError.php'; |
||
12 | |||
13 | /** |
||
14 | * This example is only intended to demonstrate the use of the package. The UI |
||
15 | * is only coded 'quick and dirty', contains no validations and should only be |
||
16 | * used as a starting point for your own implementation. |
||
17 | * |
||
18 | * @author Stefanius <[email protected]> |
||
19 | * @copyright MIT License - see the LICENSE file for details |
||
20 | */ |
||
21 | |||
22 | $oSecrets = new GSecrets(-1, GSecrets::TOKEN_FILE); |
||
23 | $oClient = new GClient(); |
||
24 | $oClient->setAccessToken($oSecrets->getAccessToken()); |
||
25 | if ($oClient->isAccessTokenExpired()) { |
||
26 | // try to refresh the accesstoken |
||
27 | $strRefreshToken = $oSecrets->getRefreshToken(); |
||
28 | if (empty($strRefreshToken)) { |
||
29 | // no refresh token available - redirect to google login |
||
30 | header('Location: ./GoogleLogin.php'); |
||
31 | exit; |
||
32 | } |
||
33 | $oClient->setOAuthClient($oSecrets->getClientSecrets()); |
||
34 | $oSecrets->saveAccessToken($oClient->refreshAccessToken($strRefreshToken)); |
||
35 | } |
||
36 | |||
37 | $oContacts = new GContacts($oClient); |
||
38 | $oContacts->addPersonFields(GContacts::DEF_DETAIL_PERSON_FIELDS); |
||
39 | // Full data |
||
40 | /* |
||
41 | $oContacts->addPersonFields([ |
||
42 | GContact::PF_AGE_RANGES, |
||
43 | GContact::PF_CALENDAR_URLS, |
||
44 | GContact::PF_CLIENT_DATA, |
||
45 | GContact::PF_COVER_PHOTOS, |
||
46 | GContact::PF_EVENTS, |
||
47 | GContact::PF_EXTERNAL_IDS, |
||
48 | GContact::PF_IM_CLIENTS, |
||
49 | GContact::PF_INTERESTS, |
||
50 | GContact::PF_LOCALES, |
||
51 | GContact::PF_LOCATIONS, |
||
52 | GContact::PF_MISC_KEYWORDS, |
||
53 | GContact::PF_OCCUPATIONS, |
||
54 | GContact::PF_RELATIONS, |
||
55 | GContact::PF_SIP_ADDRESSES, |
||
56 | GContact::PF_SKILLS, |
||
57 | GContact::PF_USER_DEFINED, |
||
58 | ]); |
||
59 | */ |
||
60 | $strResourceName = rawurldecode($_GET['res'] ?? ''); |
||
61 | |||
62 | if (empty($strResourceName)) { |
||
63 | $oContact = GContact::createEmpty(); |
||
64 | } else { |
||
65 | $oContact = $oContacts->getContact($strResourceName); |
||
66 | if ($oContact === false) { |
||
67 | displayApiError( |
||
68 | 'reading contact', |
||
69 | $strResourceName, |
||
70 | $oClient->getLastResponseCode(), |
||
71 | $oClient->getLastError(), |
||
72 | $oClient->getLastStatus() |
||
73 | ); |
||
74 | exit; |
||
75 | } |
||
76 | } |
||
77 | $uxtsLastModified = $oContact->getLastModified(); |
||
78 | |||
79 | $oGroups = new GContactGroups($oClient); |
||
80 | $aGroups = $oGroups->list(GContactGroups::GT_ALL_CONTACT_GROUPS, GContactGroups::DATA_LIST); |
||
81 | if ($aGroups === false) { |
||
0 ignored issues
–
show
introduced
by
![]() |
|||
82 | displayApiError( |
||
83 | 'list contact groups', |
||
84 | '', |
||
85 | $oClient->getLastResponseCode(), |
||
86 | $oClient->getLastError(), |
||
87 | $oClient->getLastStatus() |
||
88 | ); |
||
89 | exit; |
||
90 | } |
||
91 | |||
92 | /* |
||
93 | $strGroups = ''; |
||
94 | foreach ($oContact['memberships'] as $aMembership) { |
||
95 | if (isset($aMembership['contactGroupMembership'])) { |
||
96 | $strGroupRes = $aMembership['contactGroupMembership']['contactGroupResourceName']; |
||
97 | if (isset($aGroups[$strGroupRes])) { |
||
98 | $strGroups .= ' <li>' . $aGroups[$strGroupRes] . '</li>' . PHP_EOL; |
||
99 | } |
||
100 | } |
||
101 | } |
||
102 | */ |
||
103 | |||
104 | if (file_exists('data')) { |
||
105 | // this is just for debugging/testing to easy lock at the complete response data... |
||
106 | file_put_contents('./data/' . str_replace(' ', '_', $oContact->getDisplayName()) . '.json', json_encode($oContact, JSON_PRETTY_PRINT)); |
||
107 | } |
||
108 | |||
109 | $strTitle = $oContact->getDisplayName(); |
||
110 | if ($oContact->isStarred()) { |
||
111 | $strTitle = '⭐ ' . $strTitle; |
||
112 | } |
||
113 | |||
114 | ?> |
||
115 | <html> |
||
116 | <head> |
||
117 | <style> |
||
118 | body, form { |
||
119 | font-family: Sans-Serif; |
||
120 | font-size: 12px; |
||
121 | } |
||
122 | form fieldset { |
||
123 | line-height: 200%; |
||
124 | } |
||
125 | form label { |
||
126 | display: inline-block; |
||
127 | width: 150px; |
||
128 | } |
||
129 | form input[type=text] { |
||
130 | width: 400px; |
||
131 | } |
||
132 | form span img { |
||
133 | float: right; |
||
134 | } |
||
135 | form label.ptype { |
||
136 | width: 80px; |
||
137 | text-align: right; |
||
138 | } |
||
139 | for, input[type=tel] { |
||
140 | width: 236px; |
||
141 | } |
||
142 | form input.ptype { |
||
143 | width: 80px; |
||
144 | } |
||
145 | form input.mail { |
||
146 | width: 236px; |
||
147 | } |
||
148 | form input.city { |
||
149 | width: 316px; |
||
150 | } |
||
151 | form textarea { |
||
152 | width: 552px; |
||
153 | } |
||
154 | form ul { |
||
155 | margin: -10px 0 -5px 0; |
||
156 | } |
||
157 | </style> |
||
158 | <script> |
||
159 | function onPhotoFileSelected() |
||
160 | { |
||
161 | // var file = document.getElementById('photoFile').files[document.getElementById('photoFile').files.length - 1]; |
||
162 | // alert(file.name); |
||
163 | document.getElementById('photoForm').submit(); |
||
164 | } |
||
165 | function loadPhoto() |
||
166 | { |
||
167 | document.getElementById('photoFile').click() |
||
168 | } |
||
169 | function deletePhoto(strResourceName) |
||
170 | { |
||
171 | if (confirm("Delete the photo?")) { |
||
172 | window.location = './DoAction.php?action=deleteContactPhoto&res=' + encodeURI(strResourceName); |
||
173 | } |
||
174 | } |
||
175 | </script> |
||
176 | </head> |
||
177 | <body> |
||
178 | <a href="./ContactList.php">back to the overview</a><br/><br/> |
||
179 | <form id="photoForm" action="./DoAction.php?action=setContactPhoto" enctype="multipart/form-data" method="post"> |
||
180 | <input type="file" id="photoFile" name="photoFile" onchange="onPhotoFileSelected()" style="display: none"> |
||
181 | <input type="hidden" name="resourceName" value="<?=$strResourceName?>"> |
||
182 | </form> |
||
183 | <form action="./DoAction.php?action=saveContact" method="post"> |
||
184 | <input type="hidden" name="resourceName" value="<?=$strResourceName?>"> |
||
185 | <input type="hidden" name="metadataType" value="<?=$oContact['metadata']['sources'][0]['type']?>"> |
||
186 | <input type="hidden" name="metadataId" value="<?=$oContact['metadata']['sources'][0]['id']?>"> |
||
187 | <input type="hidden" name="metadataEtag" value="<?=$oContact['metadata']['sources'][0]['etag']?>"> |
||
188 | <h2><?=$strTitle?></h2> |
||
189 | <p>Letzte Änderung: <?php if ($uxtsLastModified > 0) echo date('d.m.Y - H:i:s', $uxtsLastModified); ?></p> |
||
190 | <div> |
||
191 | <?php |
||
192 | $iVisibleGroups = 0; |
||
193 | $strGroups = ''; |
||
194 | foreach ($aGroups as $aGroup) { |
||
195 | $strChecked = ($oContact->belongsToGroup($aGroup['resourceName']) ? ' checked' : ''); |
||
196 | if ($aGroup['groupType'] == GContactGroups::GT_SYSTEM_CONTACT_GROUPS) { |
||
197 | $strGroups .= ' <input type="checkbox" name="memberships[]" value="' . $aGroup['resourceName'] . '"' . $strChecked . ' style="display: none;">' . PHP_EOL; |
||
198 | } else { |
||
199 | $strGroups .= ' <input type="checkbox" name="memberships[]" value="' . $aGroup['resourceName'] . '"' . $strChecked . '>'; |
||
200 | $strGroups .= ' ' . $aGroup['formattedName'] . '<br/>' . PHP_EOL; |
||
201 | $iVisibleGroups++; |
||
202 | } |
||
203 | } |
||
204 | if ($iVisibleGroups > 0) { |
||
205 | echo ' <fieldset>' . PHP_EOL; |
||
206 | echo ' <legend>Member of</legend>' . PHP_EOL; |
||
207 | echo $strGroups; |
||
208 | echo ' </fieldset>' . PHP_EOL; |
||
209 | } else { |
||
210 | echo $strGroups; |
||
211 | } |
||
212 | ?> |
||
213 | <fieldset> |
||
214 | <legend>Names</legend> |
||
215 | <div style="float: right; padding: 10px;"> |
||
216 | Photo |
||
217 | <a href="javascript: loadPhoto()" title="Select photo" style="font-size: 20px; text-decoration: none; padding: 0 8px;">🖉</a> |
||
218 | <a href="javascript: deletePhoto('<?=$strResourceName?>')" title="Remove photo" style="font-size: 20px; text-decoration: none; padding: 0 8px;">🗑</a> |
||
219 | <br/> |
||
220 | <img onclick="loadPhoto()" src="<?php echo $oContact['photos'][0]['url'] ?? ''?>"> |
||
221 | </div> |
||
222 | <label for="honorificPrefix">honorificPrefix:</label> |
||
223 | <input type="text" id="honorificPrefix" name="names_0_honorificPrefix" value="<?php echo $oContact['names'][0]['honorificPrefix'] ?? ''?>"> |
||
224 | <br/> |
||
225 | <label for="familyName">familyName:</label> |
||
226 | <input type="text" id="familyName" name="names_0_familyName" value="<?php echo $oContact['names'][0]['familyName'] ?? ''?>"> |
||
227 | <br/> |
||
228 | <label for="givenName">givenName:</label> |
||
229 | <input type="text" id="givenName" name="names_0_givenName" value="<?php echo $oContact['names'][0]['givenName'] ?? ''?>"> |
||
230 | <br/> |
||
231 | <label for="middleName">middleName:</label> |
||
232 | <input type="text" id="middleName" name="names_0_middleName" value="<?php echo $oContact['names'][0]['middleName'] ?? ''?>"> |
||
233 | <br/> |
||
234 | <label for="honorificSuffix">honorificSuffix:</label> |
||
235 | <input type="text" id="honorificSuffix" name="names_0_honorificSuffix" value="<?php echo $oContact['names'][0]['honorificSuffix'] ?? ''?>"> |
||
236 | <br/> |
||
237 | <?php |
||
238 | $i = 0; |
||
239 | foreach ($oContact['nicknames'] as $aNickname) { |
||
240 | $strName = 'nicknames_' . $i . '_value'; |
||
241 | $strField = 'nickName' . ++$i; |
||
242 | echo ' <label for="' . $strField . '">' . $strField . ':</label>' . PHP_EOL; |
||
243 | echo ' <input type="text" id="' . $strField . '" name="' . $strName . '" value="' . $aNickname['value'] . '">' . PHP_EOL; |
||
244 | echo ' <br/>' . PHP_EOL; |
||
245 | } |
||
246 | ?> |
||
247 | <label for="birthday">birthday:</label> |
||
248 | <input type="date" id="birthday" name="birthday" value="<?=$oContact->getDateOfBirth(GContact::DT_STRING)?>"> |
||
249 | <label class="ptype" for="gender">gender:</label> |
||
250 | <select id="gender" name="genders_0_value"> |
||
251 | <option value=""></option> |
||
252 | <option value="male"<?php echo ($oContact['genders'][0]['value'] ?? '') == 'male' ? ' selected' : '';?>>male</option> |
||
253 | <option value="female"<?php echo ($oContact['genders'][0]['value'] ?? '') == 'female' ? ' selected' : '';?>>female</option> |
||
254 | <option value="unspecified"<?php echo ($oContact['genders'][0]['value'] ?? '') == 'unspecified' ? ' selected' : '';?>>unspecified</option> |
||
255 | </select> |
||
256 | <br/> |
||
257 | </fieldset> |
||
258 | <fieldset> |
||
259 | <legend>Phone numbers</legend> |
||
260 | <?php |
||
261 | $i = 0; |
||
262 | foreach ($oContact['phoneNumbers'] as $aPhone) { |
||
263 | $strFieldName = 'phoneNumbers_' . $i . '_value'; |
||
264 | $strTypeName = 'phoneNumbers_' . $i . '_type'; |
||
265 | $strField = 'phoneNumber' . ++$i; |
||
266 | $strType = 'phoneType' . $i; |
||
267 | $strPrimary = $oContact->isPrimaryItem($aPhone) ? ' checked' : ''; |
||
268 | echo ' <label for="' . $strField . '">' . $strField . ':</label>' . PHP_EOL; |
||
269 | echo ' <input type="tel" id="' . $strField . '" name="' . $strFieldName . '" value="' . ($aPhone['value'] ?? '') . '">' . PHP_EOL; |
||
270 | echo ' <label class="ptype" for="' . $strType . '">type:</label>' . PHP_EOL; |
||
271 | echo ' <input class="ptype" type="text" id="' . $strType . '" name="' . $strTypeName . '" value="' . ($aPhone['type'] ?? 'other') . '">' . PHP_EOL; |
||
272 | echo ' <input type="radio" name="phoneNumbers" value="' . ($i-1) . '"' . $strPrimary . '> primary phone' . PHP_EOL; |
||
273 | echo ' <br/>' . PHP_EOL; |
||
274 | } |
||
275 | ?> |
||
276 | </fieldset> |
||
277 | <fieldset> |
||
278 | <legend>Mailaddresses</legend> |
||
279 | <?php |
||
280 | $i = 0; |
||
281 | foreach ($oContact['emailAddresses'] as $aMail) { |
||
282 | $strFieldName = 'emailAddresses_' . $i . '_value'; |
||
283 | $strTypeName = 'emailAddresses_' . $i . '_type'; |
||
284 | $strField = 'emailAddress' . ++$i; |
||
285 | $strType = 'emailType' . $i; |
||
286 | $strPrimary = $oContact->isPrimaryItem($aMail) ? ' checked' : ''; |
||
287 | echo ' <label for="' . $strField . '">' . $strField . ':</label>' . PHP_EOL; |
||
288 | echo ' <input class="mail" type="text" id="' . $strField . '" name="' . $strFieldName . '" value="' . ($aMail['value'] ?? '') . '">' . PHP_EOL; |
||
289 | echo ' <label class="ptype" for="' . $strType . '">type:</label>' . PHP_EOL; |
||
290 | echo ' <input class="ptype" type="text" id="' . $strType . '" name="' . $strTypeName . '" value="' . ($aMail['type'] ?? 'other') . '">' . PHP_EOL; |
||
291 | echo ' <input type="radio" name="emailAddresses" value="' . ($i-1) . '"' . $strPrimary . '> primary email' . PHP_EOL; |
||
292 | echo ' <br/>' . PHP_EOL; |
||
293 | } |
||
294 | ?> |
||
295 | </fieldset> |
||
296 | <fieldset> |
||
297 | <legend>Organization</legend> |
||
298 | <label for="orgName">orgName:</label> |
||
299 | <input type="text" id="orgName" name="organizations_0_name" value="<?php echo ($oContact['organizations'][0]['name'] ?? '')?>"> |
||
300 | <br/> |
||
301 | <label for="orgTitle">orgTitle:</label> |
||
302 | <input type="text" id="orgTitle" name="organizations_0_title" value="<?php echo ($oContact['organizations'][0]['title'] ?? '')?>"> |
||
303 | <br/> |
||
304 | <label for="orgDepartment">orgDepartment:</label> |
||
305 | <input type="text" id="orgDepartment" name="organizations_0_department" value="<?php echo ($oContact['organizations'][0]['department'] ?? '')?>"> |
||
306 | <br/> |
||
307 | </fieldset> |
||
308 | <fieldset> |
||
309 | <legend>Addresses</legend> |
||
310 | <?php |
||
311 | $i = 0; |
||
312 | foreach ($oContact['addresses'] as $aAdr) { |
||
313 | ++$i; |
||
314 | if ($i > 1) { |
||
315 | echo ' <hr>' . PHP_EOL; |
||
316 | } |
||
317 | $strPrimary = $oContact->isPrimaryItem($aAdr) ? ' checked' : ''; |
||
318 | echo ' <label for="adrType' . $i . '">type:</label>' . PHP_EOL; |
||
319 | echo ' <input class="ptype" type="text" id="adrType' . $i . '" name="addresses_' . ($i-1) . '_type" value="' . ($aAdr['type'] ?? 'home') . '">' . PHP_EOL; |
||
320 | echo ' <input type="radio" name="addresses" value="' . ($i-1) . '"' . $strPrimary . '> primary address' . PHP_EOL; |
||
321 | echo ' <br/>' . PHP_EOL; |
||
322 | echo ' <label for="adrStreet' . $i . '">adrStreet:</label>' . PHP_EOL; |
||
323 | echo ' <input class="city" type="text" id="adrStreet' . $i . '" name="addresses_' . ($i-1) . '_streetAddress" value="' . ($aAdr['streetAddress'] ?? '') . '">' . PHP_EOL; |
||
324 | echo ' <input class="ptype" type="text" id="extendedAddress' . $i . '" name="addresses_' . ($i-1) . '_extendedAddress" value="' . ($aAdr['extendedAddress'] ?? '') . '">' . PHP_EOL; |
||
325 | echo ' <br/>' . PHP_EOL; |
||
326 | echo ' <label for="adrPostcode' . $i . '">adrPostcode/adrCity:</label>' . PHP_EOL; |
||
327 | echo ' <input class="ptype" type="text" id="adrPostcode' . $i . '" name="addresses_' . ($i-1) . '_postalCode" value="' . ($aAdr['postalCode'] ?? '') . '">' . PHP_EOL; |
||
328 | echo ' <input class="city" type="text" id="adrCity' . $i . '" name="addresses_' . ($i-1) . '_city" value="' . ($aAdr['city'] ?? '') . '">' . PHP_EOL; |
||
329 | echo ' <br/>' . PHP_EOL; |
||
330 | echo ' <label for="adrCountry' . $i . '">adrCountry/Code:</label>' . PHP_EOL; |
||
331 | echo ' <input class="city" type="text" id="adrCountry' . $i . '" name="addresses_' . ($i-1) . '_country" value="' . ($aAdr['country'] ?? '') . '">' . PHP_EOL; |
||
332 | echo ' <input class="ptype" type="text" id="adrCountryCode' . $i . '" name="addresses_' . ($i-1) . '_countryCode" value="' . ($aAdr['countryCode'] ?? '') . '">' . PHP_EOL; |
||
333 | echo ' <br/>' . PHP_EOL; |
||
334 | echo ' <label for="adrPOBox' . $i . '">adrPOBox:</label>' . PHP_EOL; |
||
335 | echo ' <input type="text" id="adrPOBox' . $i . '" name="addresses_' . ($i-1) . '_poBox" value="' . ($aAdr['poBox'] ?? '') . '">' . PHP_EOL; |
||
336 | echo ' <br/>' . PHP_EOL; |
||
337 | } |
||
338 | ?> |
||
339 | </fieldset> |
||
340 | <fieldset> |
||
341 | <legend>Notes (biographies)</legend> |
||
342 | <textarea name="biographies_0_value" rows="4"><?php echo ($oContact['biographies'][0]['value'] ?? '')?></textarea> |
||
343 | </fieldset> |
||
344 | </div> |
||
345 | <div> |
||
346 | <br/> |
||
347 | <input type="submit" value="Save" /> |
||
348 | </div> |
||
349 | </form> |
||
350 | </body> |
||
351 | </html> |
||
352 |