<?php
/*
+--------------------------------------------------------------------+
- | CiviCRM version 4.7 |
+ | CiviCRM version 5 |
+--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2018 |
+ | Copyright CiviCRM LLC (c) 2004-2019 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
/**
*
* @package CRM
- * @copyright CiviCRM LLC (c) 2004-2018
+ * @copyright CiviCRM LLC (c) 2004-2019
*/
/**
if (!isset($value) && $abort) {
if ($isThrowException) {
- throw new CRM_Core_Exception(ts("Could not find valid value for %1", array(1 => $name)));
+ throw new CRM_Core_Exception(ts("Could not find valid value for %1", [1 => $name]));
}
- CRM_Core_Error::fatal(ts("Could not find valid value for %1", array(1 => $name)));
+ CRM_Core_Error::fatal(ts("Could not find valid value for %1", [1 => $name]));
}
if (!isset($value) && $default) {
}
// minor hack for action
- if ($name == 'action' && is_string($value)) {
- $value = CRM_Core_Action::resolve($value);
+ if ($name == 'action') {
+ if (!is_numeric($value) && is_string($value)) {
+ $value = CRM_Core_Action::resolve($value);
+ }
}
if (isset($value) && $store) {
* @param array $method - '$_GET', '$_POST' or '$_REQUEST'.
*
* @return mixed
- * The value of the variable
+ * The value of the variable
*/
protected static function getValue($name, $method) {
if (isset($method[$name])) {
// http://www.php.net/manual/en/ini.core.php#ini.request-order
// http://www.php.net/manual/en/ini.core.php#ini.variables-order
- $result = array();
+ $result = [];
if ($_GET) {
$result = array_merge($result, $_GET);
}
return CRM_Utils_Request::retrieve((string) $name, (string) $type, $null, (bool) $isRequired, $defaultValue, $method, TRUE);
}
+ /**
+ * Retrieve the component from the action attribute of a form.
+ *
+ * Contribution Page forms and Event Management forms detect the value of a
+ * component (and therefore the desired tab key) by reaching into the "action"
+ * attribute of a form and reading the final item of the path. In WordPress,
+ * however, the URL may be urlencoded, and so the URL may need to be decoded
+ * before parsing it.
+ *
+ * @see https://lab.civicrm.org/dev/wordpress/issues/12#note_10699
+ *
+ * @param array $attributes
+ * The form attributes array.
+ *
+ * @return string
+ * The desired value.
+ */
+ public static function retrieveComponent($attributes) {
+ $url = CRM_Utils_Array::value('action', $attributes);
+ // Whilst the following is a fallible universal test for urlencoded URLs,
+ // thankfully the "action" URL has a limited and predictable form and
+ // therefore this comparison is sufficient for our purposes.
+ if (rawurlencode(rawurldecode($url)) !== $url) {
+ $value = strtolower(basename(rawurldecode($url)));
+ }
+ else {
+ $value = strtolower(basename($url));
+ }
+ return $value;
+ }
+
}