X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Ftelephone%2Fsrc%2FPlugin%2FField%2FFieldFormatter%2FTelephoneLinkFormatter.php;fp=web%2Fcore%2Fmodules%2Ftelephone%2Fsrc%2FPlugin%2FField%2FFieldFormatter%2FTelephoneLinkFormatter.php;h=60ee25cbc3d91d4cdf028324d364772f7be24db1;hp=afdf54146d660629e51edff9b41f8fa5d9def47a;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hpb=74df008bdbb3a11eeea356744f39b802369bda3c diff --git a/web/core/modules/telephone/src/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php b/web/core/modules/telephone/src/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php index afdf54146..60ee25cbc 100644 --- a/web/core/modules/telephone/src/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php +++ b/web/core/modules/telephone/src/Plugin/Field/FieldFormatter/TelephoneLinkFormatter.php @@ -67,6 +67,21 @@ class TelephoneLinkFormatter extends FormatterBase { $title_setting = $this->getSetting('title'); foreach ($items as $delta => $item) { + // If the telephone number is 5 or less digits, parse_url() will think + // it's a port number rather than a phone number which causes the link + // formatter to throw an InvalidArgumentException. Avoid this by inserting + // a dash (-) after the first digit - RFC 3966 defines the dash as a + // visual separator character and so will be removed before the phone + // number is used. See https://bugs.php.net/bug.php?id=70588 for more. + // While the bug states this only applies to numbers <= 65535, a 5 digit + // number greater than 65535 will cause parse_url() to return FALSE so + // we need the work around on any 5 digit (or less) number. + // First we strip whitespace so we're counting actual digits. + $phone_number = preg_replace('/\s+/', '', $item->value); + if (strlen($phone_number) <= 5) { + $phone_number = substr_replace($phone_number, '-', 1, 0); + } + // Render each element as link. $element[$delta] = [ '#type' => 'link', @@ -74,7 +89,7 @@ class TelephoneLinkFormatter extends FormatterBase { // itself as title. '#title' => $title_setting ?: $item->value, // Prepend 'tel:' to the telephone number. - '#url' => Url::fromUri('tel:' . rawurlencode(preg_replace('/\s+/', '', $item->value))), + '#url' => Url::fromUri('tel:' . rawurlencode($phone_number)), '#options' => ['external' => TRUE], ];