Last active
November 22, 2018 02:26
-
-
Save michaelmcandrew/1f21e95d13b48c2bdf4d0b300a28c298 to your computer and use it in GitHub Desktop.
Proof of concept WP shortcode to display fields from logged in and other contacts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
This is very much WIP / proof of concept / scratching an itch. Lots of stuff missing, like ACL. | |
Just sharing some early attempts at WP plugin development. Feedback welcome. | |
For example... | |
[civicrm_user_fields] | |
Name: {user.display_name} | |
Address {user.address.street_address}} | |
[/civicrm_user_fields] | |
OR you can display data about other contacts by including the contact ID as a url query parameter | |
WARNING: no ACL on the below code! | |
url like https://example.org/about-me/?fid=123 | |
[civicrm_user_fields querymap=friend:fid] | |
Name: {user.display_name} is friends with {friend.display_name} who lives in {friend.address.city} | |
[/civicrm_user_fields] | |
*/ | |
add_shortcode('civicrm_user_fields', 'civicrm_user_fields'); | |
function civicrm_user_fields($attr, $content) | |
{ | |
$contacts['user']['params']['id'] = CRM_Core_Session::singleton()->getLoggedInContactID(); | |
$parsed = $content; | |
while (strlen($parsed)) { | |
$tokenStart = strpos($parsed, '{'); | |
if ($tokenStart !== false) { | |
$tokenEnd = strpos($parsed, '}'); | |
$tokens[] = substr($parsed, $tokenStart, $tokenEnd - $tokenStart + 1); | |
$parsed = substr($parsed, $tokenEnd + 1); | |
} else { | |
$parsed = ''; | |
} | |
} | |
$tokens = array_unique($tokens); | |
foreach ($tokens as $token) { | |
$parts = explode('.', substr($token, 1, -1)); | |
if (count($parts) == 2) { | |
$contacts[$parts[0]]['params']['return'][] = $parts[1]; | |
} elseif (count($parts) == 3) { | |
$contacts[$parts[0]]['related'][$parts[1]]['params']['return'][] = $parts[2]; | |
} | |
} | |
$queryMaps = explode(',', $attr['querymap']); | |
foreach ($queryMaps as $querymap) { | |
$parts = explode(':', $querymap); | |
if (isset($contacts[$parts[0]])) { | |
$contacts[$parts[0]]['params']['id'] = $_GET[$parts[1]]; | |
if (isset($contacts[$parts[0]]['related'])) { | |
foreach ($contacts[$parts[0]]['related'] as &$related) { | |
$related['params']['contact_id'] = $_GET[$parts[1]]; | |
$related['params']['is_primary'] = 1; | |
} | |
} | |
} | |
} | |
foreach ($contacts as &$contact) { | |
$contact['result'] = civicrm_api3('Contact', 'getsingle', $contact['params']); | |
if (isset($contact['related'])) { | |
foreach ($contact['related'] as $entity => &$related) { | |
$related['result'] = civicrm_api3($entity, 'getsingle', $related['params']); | |
} | |
} | |
} | |
foreach ($tokens as $n => $token) { | |
$parts = explode('.', substr($token, 1, -1)); | |
if (count($parts) == 2) { | |
$values[$n] = $contacts[$parts[0]]['result'][$parts[1]]; | |
} elseif (count($parts) == 3) { | |
$values[$n] = $contacts[$parts[0]]['related'][$parts[1]]['result'][$parts[2]]; | |
} | |
} | |
return str_replace($tokens, $values, $content); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment