From 688ad538fe749e55f851ddb5d4a5ababefe32ce7 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Thu, 29 May 2014 16:28:36 -0700 Subject: [PATCH] CRM-14765 - CRM_Utils_System::createDefaultCrudLink Add helper for creating hyperlinks to entities based on the entity-type/entity-id/desired-action. The link is determined by the entity's BAO or by hook. --- CRM/Contact/BAO/Contact.php | 36 +++++++++++++++++++++++++ CRM/Utils/Hook.php | 23 ++++++++++++++++ CRM/Utils/System.php | 54 +++++++++++++++++++++++++++++++++++-- 3 files changed, 111 insertions(+), 2 deletions(-) diff --git a/CRM/Contact/BAO/Contact.php b/CRM/Contact/BAO/Contact.php index 54fb90afb5..6dddca06da 100644 --- a/CRM/Contact/BAO/Contact.php +++ b/CRM/Contact/BAO/Contact.php @@ -509,6 +509,42 @@ WHERE civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer'); return NULL; } + /** + * @param array $crudLinkSpec with keys: + * - action: int, CRM_Core_Action::UPDATE or CRM_Core_Action::VIEW [default: VIEW] + * - entity_table: string, eg "civicrm_contact" + * - entity_id: int + * @return array|NULL NULL if unavailable, or an array. array has keys: + * - path: string + * - query: string + * - title: string + * @see CRM_Utils_System::createDefaultCrudLink + */ + public function createDefaultCrudLink($crudLinkSpec) { + switch ($crudLinkSpec['action']) { + case CRM_Core_Action::VIEW: + return array( + 'title' => $this->display_name, + 'path' => 'civicrm/contact/view', + 'query' => array( + 'reset' => 1, + 'cid' => $this->id, + ), + ); + case CRM_Core_Action::UPDATE: + return array( + 'title' => $this->display_name, + 'path' => 'civicrm/contact/add', + 'query' => array( + 'reset' => 1, + 'action' => 'update', + 'cid' => $this->id, + ), + ); + } + return NULL; + } + /** * * Get the values for pseudoconstants for name->value and reverse. diff --git a/CRM/Utils/Hook.php b/CRM/Utils/Hook.php index 26bdc2bdc6..e16be4805b 100644 --- a/CRM/Utils/Hook.php +++ b/CRM/Utils/Hook.php @@ -1694,4 +1694,27 @@ abstract class CRM_Utils_Hook { 'civicrm_caseChange' ); } + + /** + * Generate a default CRUD URL for an entity + * + * @param array $spec with keys: + * - action: int, eg CRM_Core_Action::VIEW or CRM_Core_Action::UPDATE + * - entity_table: string + * - entity_id: int + * @param CRM_Core_DAO $bao + * @param array $link to define the link, add these keys to $link: + * - title: string + * - path: string + * - query: array + * - url: string (used in lieu of "path"/"query") + * Note: if making "url" CRM_Utils_System::url(), set $htmlize=false + * @return mixed + */ + static function crudLink($spec, $bao, &$link) { + return self::singleton()->invoke(3, $spec, $bao, $link, + self::$_nullObject, self::$_nullObject, self::$_nullObject, + 'civicrm_crudLink' + ); + } } diff --git a/CRM/Utils/System.php b/CRM/Utils/System.php index 76a2c1dfab..aa4a70617f 100644 --- a/CRM/Utils/System.php +++ b/CRM/Utils/System.php @@ -977,7 +977,7 @@ class CRM_Utils_System { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // lets capture the return stuff rather than echo - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE ); return curl_exec($ch); } @@ -1164,7 +1164,7 @@ class CRM_Utils_System { return (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && - strtolower($_SERVER['HTTPS']) != 'off') ? true : false; + strtolower($_SERVER['HTTPS']) != 'off') ? TRUE : FALSE; } /** @@ -1852,4 +1852,54 @@ class CRM_Utils_System { return FALSE; } } + + /** + * Determine the standard URL for viewing or editing the specified link + * + * This function delegates the decision-making to (a) the hook system and + * (b) the BAO system. + * + * @param array $crudLinkSpec with keys: + * - action: int, CRM_Core_Action::UPDATE or CRM_Core_Action::VIEW [default: VIEW] + * - entity_table: string, eg "civicrm_contact" + * - entity_id: int + * @return array|NULL NULL if unavailable, or an array. array has keys: + * - path: string + * - query: array + * - title: string + * - url: string + */ + static function createDefaultCrudLink($crudLinkSpec) { + $crudLinkSpec['action'] = CRM_Utils_Array::value('action', $crudLinkSpec, CRM_Core_Action::VIEW); + $daoClass = CRM_Core_DAO_AllCoreTables::getClassForTable($crudLinkSpec['entity_table']); + if (!$daoClass) { + return NULL; + } + + $baoClass = str_replace('_DAO_', '_BAO_', $daoClass); + if (!class_exists($baoClass)) { + return NULL; + } + + $bao = new $baoClass(); + $bao->id = $crudLinkSpec['entity_id']; + if (!$bao->find(TRUE)) { + return NULL; + } + + $link = array(); + CRM_Utils_Hook::crudLink($crudLinkSpec, $bao, $link); + if (empty($link) && is_callable(array($bao, 'createDefaultCrudLink'))) { + $link = $bao->createDefaultCrudLink($crudLinkSpec); + } + + if (!empty($link)) { + if (!isset($link['url'])) { + $link['url'] = self::url($link['path'], $link['query'], TRUE, NULL, FALSE); + } + return $link; + } + + return NULL; + } } -- 2.25.1