X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FAction.php;h=f93583590f0fc5511fc88b3823b306afd2b44105;hb=7099e2ce64d746e08d23cf9aec291c15cde75859;hp=bd6ac2c2f703f680ed6b23f65ac125f1f2f43ac0;hpb=a48554e4573dccc22fe68c481db7ba85d1768c81;p=civicrm-core.git diff --git a/CRM/Core/Action.php b/CRM/Core/Action.php index bd6ac2c2f7..f93583590f 100644 --- a/CRM/Core/Action.php +++ b/CRM/Core/Action.php @@ -74,10 +74,10 @@ class CRM_Core_Action { * bit manipulation operations so we can perform multiple * actions on the same object if needed * - * @var array $_names type of variable name to action constant + * @var array * */ - static $_names = array( + public static $_names = [ 'add' => self::ADD, 'update' => self::UPDATE, 'view' => self::VIEW, @@ -95,14 +95,14 @@ class CRM_Core_Action { 'revert' => self::REVERT, 'close' => self::CLOSE, 'reopen' => self::REOPEN, - ); + ]; /** * The flipped version of the names array, initialized when used * * @var array */ - static $_description; + public static $_description; /** * Called by the request object to translate a string into a mask. @@ -216,7 +216,7 @@ class CRM_Core_Action { // make links indexed sequentially instead of by bitmask // otherwise it's next to impossible to reliably add new ones - $seqLinks = array(); + $seqLinks = []; foreach ($links as $bit => $link) { $link['bit'] = $bit; $seqLinks[] = $link; @@ -226,7 +226,7 @@ class CRM_Core_Action { CRM_Utils_Hook::links($op, $objectName, $objectId, $seqLinks, $mask, $values); } - $url = array(); + $url = []; foreach ($seqLinks as $i => $link) { if (!$mask || !array_key_exists('bit', $link) || ($mask & $link['bit'])) { @@ -298,6 +298,65 @@ class CRM_Core_Action { return $result; } + /** + * Given a set of links and a mask, return a filtered (by mask) array containing the final links with parsed values + * and calling hooks as appropriate. + * Use this when passing a set of action links to the API or to the form without adding html formatting. + * + * @param array $links + * The set of link items. + * @param int $mask + * The mask to be used. a null mask means all items. + * @param array $values + * The array of values for parameter substitution in the link items. + * @param null $op + * @param null $objectName + * @param int $objectId + * + * @return array|null + * The array describing each link + */ + public static function filterLinks( + $links, + $mask, + $values, + $op = NULL, + $objectName = NULL, + $objectId = NULL + ) { + if (empty($links)) { + return NULL; + } + + // make links indexed sequentially instead of by bitmask + // otherwise it's next to impossible to reliably add new ones + $seqLinks = array(); + foreach ($links as $bit => $link) { + $link['bit'] = $bit; + $seqLinks[] = $link; + } + + if ($op && $objectName && $objectId) { + CRM_Utils_Hook::links($op, $objectName, $objectId, $seqLinks, $mask, $values); + } + + foreach ($seqLinks as $i => $link) { + if (!$mask || !array_key_exists('bit', $link) || ($mask & $link['bit'])) { + $seqLinks[$i]['extra'] = isset($link['extra']) ? self::replace($link['extra'], $values) : NULL; + + if (isset($link['qs']) && !CRM_Utils_System::isNull($link['qs'])) { + $seqLinks[$i]['url'] = self::replace($link['url'], $values); + $seqLinks[$i]['qs'] = self::replace($link['qs'], $values); + } + } + else { + unset($seqLinks[$i]); + } + } + + return $seqLinks; + } + /** * Given a string and an array of values, substitute the real values * in the placeholder in the str in the CiviCRM format