:: * * The route parameters and options are encoded as query strings. * * @param array $contextual_links * The $element['#contextual_links'] value for some render element. * * @return string * A serialized representation of a #contextual_links property value array for * use in a data- attribute. */ function _contextual_links_to_id($contextual_links) { $ids = []; $langcode = \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_URL)->getId(); foreach ($contextual_links as $group => $args) { $route_parameters = UrlHelper::buildQuery($args['route_parameters']); $args += ['metadata' => []]; // Add the current URL language to metadata so a different ID will be // computed when URLs vary by language. This allows to store different // language-aware contextual links on the client side. $args['metadata'] += ['langcode' => $langcode]; $metadata = UrlHelper::buildQuery($args['metadata']); $ids[] = "{$group}:{$route_parameters}:{$metadata}"; } return implode('|', $ids); } /** * Unserializes the result of _contextual_links_to_id(). * * Note that $id is user input. Before calling this method the ID should be * checked against the token stored in the 'data-contextual-token' attribute * which is passed via the 'tokens' request parameter to * \Drupal\contextual\ContextualController::render(). * * @param string $id * A serialized representation of a #contextual_links property value array. * * @return array * The value for a #contextual_links property. * * @see _contextual_links_to_id() * @see \Drupal\contextual\ContextualController::render() */ function _contextual_id_to_links($id): array { $contextual_links = []; $contexts = explode('|', $id); foreach ($contexts as $context) { [$group, $route_parameters_raw, $metadata_raw] = explode(':', $context); parse_str($route_parameters_raw, $route_parameters); $metadata = []; parse_str($metadata_raw, $metadata); $contextual_links[$group] = [ 'route_parameters' => $route_parameters, 'metadata' => $metadata, ]; } return $contextual_links; }