Open Journal Systems  3.3.0
QueryString.php
1 <?php
2 
3 namespace Guzzle\Http;
4 
10 
14 class QueryString extends Collection
15 {
17  const RFC_3986 = 'RFC 3986';
18 
20  const FORM_URLENCODED = 'application/x-www-form-urlencoded';
21 
23  const BLANK = "_guzzle_blank_";
24 
26  protected $fieldSeparator = '&';
27 
29  protected $valueSeparator = '=';
30 
32  protected $urlEncode = 'RFC 3986';
33 
35  protected $aggregator;
36 
38  private static $defaultAggregator = null;
39 
47  public static function fromString($query)
48  {
49  $q = new static();
50  if ($query === '') {
51  return $q;
52  }
53 
54  $foundDuplicates = $foundPhpStyle = false;
55 
56  foreach (explode('&', $query) as $kvp) {
57  $parts = explode('=', $kvp, 2);
58  $key = rawurldecode($parts[0]);
59  if ($paramIsPhpStyleArray = substr($key, -2) == '[]') {
60  $foundPhpStyle = true;
61  $key = substr($key, 0, -2);
62  }
63  if (isset($parts[1])) {
64  $value = rawurldecode(str_replace('+', '%20', $parts[1]));
65  if (isset($q[$key])) {
66  $q->add($key, $value);
67  $foundDuplicates = true;
68  } elseif ($paramIsPhpStyleArray) {
69  $q[$key] = array($value);
70  } else {
71  $q[$key] = $value;
72  }
73  } else {
74  // Uses false by default to represent keys with no trailing "=" sign.
75  $q->add($key, false);
76  }
77  }
78 
79  // Use the duplicate aggregator if duplicates were found and not using PHP style arrays
80  if ($foundDuplicates && !$foundPhpStyle) {
81  $q->setAggregator(new DuplicateAggregator());
82  }
83 
84  return $q;
85  }
86 
93  public function __toString()
94  {
95  if (!$this->data) {
96  return '';
97  }
98 
99  $queryList = array();
100  foreach ($this->prepareData($this->data) as $name => $value) {
101  $queryList[] = $this->convertKvp($name, $value);
102  }
103 
104  return implode($this->fieldSeparator, $queryList);
105  }
106 
112  public function getFieldSeparator()
113  {
114  return $this->fieldSeparator;
115  }
116 
122  public function getValueSeparator()
123  {
125  }
126 
134  public function getUrlEncoding()
135  {
136  return $this->urlEncode;
137  }
138 
144  public function isUrlEncoding()
145  {
146  return $this->urlEncode !== false;
147  }
148 
160  public function setAggregator(QueryAggregatorInterface $aggregator = null)
161  {
162  // Use the default aggregator if none was set
163  if (!$aggregator) {
164  if (!self::$defaultAggregator) {
165  self::$defaultAggregator = new PhpAggregator();
166  }
167  $aggregator = self::$defaultAggregator;
168  }
169 
170  $this->aggregator = $aggregator;
171 
172  return $this;
173  }
174 
182  public function useUrlEncoding($encode)
183  {
184  $this->urlEncode = ($encode === true) ? self::RFC_3986 : $encode;
185 
186  return $this;
187  }
188 
196  public function setFieldSeparator($separator)
197  {
198  $this->fieldSeparator = $separator;
199 
200  return $this;
201  }
202 
210  public function setValueSeparator($separator)
211  {
212  $this->valueSeparator = $separator;
213 
214  return $this;
215  }
216 
222  public function urlEncode()
223  {
224  return $this->prepareData($this->data);
225  }
226 
234  public function encodeValue($value)
235  {
236  if ($this->urlEncode == self::RFC_3986) {
237  return rawurlencode($value);
238  } elseif ($this->urlEncode == self::FORM_URLENCODED) {
239  return urlencode($value);
240  } else {
241  return (string) $value;
242  }
243  }
244 
252  protected function prepareData(array $data)
253  {
254  // If no aggregator is present then set the default
255  if (!$this->aggregator) {
256  $this->setAggregator(null);
257  }
258 
259  $temp = array();
260  foreach ($data as $key => $value) {
261  if ($value === false || $value === null) {
262  // False and null will not include the "=". Use an empty string to include the "=".
263  $temp[$this->encodeValue($key)] = $value;
264  } elseif (is_array($value)) {
265  $temp = array_merge($temp, $this->aggregator->aggregate($key, $value, $this));
266  } else {
267  $temp[$this->encodeValue($key)] = $this->encodeValue($value);
268  }
269  }
270 
271  return $temp;
272  }
273 
282  private function convertKvp($name, $value)
283  {
284  if ($value === self::BLANK || $value === null || $value === false) {
285  return $name;
286  } elseif (!is_array($value)) {
287  return $name . $this->valueSeparator . $value;
288  }
289 
290  $result = '';
291  foreach ($value as $v) {
292  $result .= $this->convertKvp($name, $v) . $this->fieldSeparator;
293  }
294 
295  return rtrim($result, $this->fieldSeparator);
296  }
297 }
Guzzle\Common\Collection\$data
$data
Definition: paymethod/paypal/lib/vendor/guzzle/guzzle/src/Guzzle/Common/Collection.php:17
Guzzle\Http\QueryString
Definition: QueryString.php:14
Guzzle\Http\QueryString\__toString
__toString()
Definition: QueryString.php:105
Guzzle\Http\QueryString\prepareData
prepareData(array $data)
Definition: QueryString.php:264
Guzzle\Http\QueryString\BLANK
const BLANK
Definition: QueryString.php:24
Guzzle\Http\QueryString\setFieldSeparator
setFieldSeparator($separator)
Definition: QueryString.php:208
Guzzle\Http\QueryAggregator\PhpAggregator
Definition: PhpAggregator.php:10
Guzzle\Http\QueryString\urlEncode
urlEncode()
Definition: QueryString.php:234
Guzzle\Http\QueryString\fromString
static fromString($query)
Definition: QueryString.php:59
Guzzle\Http\QueryString\$fieldSeparator
$fieldSeparator
Definition: QueryString.php:29
Guzzle\Http\QueryString\FORM_URLENCODED
const FORM_URLENCODED
Definition: QueryString.php:21
Guzzle\Http\QueryString\getUrlEncoding
getUrlEncoding()
Definition: QueryString.php:146
Guzzle\Http\QueryAggregator\QueryAggregatorInterface
Definition: QueryAggregatorInterface.php:10
Guzzle\Http
Definition: AbstractEntityBodyDecorator.php:3
Guzzle\Http\QueryAggregator\DuplicateAggregator
Definition: DuplicateAggregator.php:12
Guzzle\Http\QueryString\useUrlEncoding
useUrlEncoding($encode)
Definition: QueryString.php:194
Guzzle\Http\QueryString\setValueSeparator
setValueSeparator($separator)
Definition: QueryString.php:222
Guzzle\Http\QueryString\isUrlEncoding
isUrlEncoding()
Definition: QueryString.php:156
Guzzle\Http\QueryString\$valueSeparator
$valueSeparator
Definition: QueryString.php:35
Guzzle\Http\QueryString\setAggregator
setAggregator(QueryAggregatorInterface $aggregator=null)
Definition: QueryString.php:172
Guzzle\Http\QueryString\$aggregator
$aggregator
Definition: QueryString.php:47
Guzzle\Http\QueryString\$urlEncode
$urlEncode
Definition: QueryString.php:41
Guzzle\Http\QueryString\RFC_3986
const RFC_3986
Definition: QueryString.php:18
Guzzle\Common\Exception\RuntimeException
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Common/Exception/RuntimeException.php:5
Guzzle\Http\QueryString\getFieldSeparator
getFieldSeparator()
Definition: QueryString.php:124
Guzzle\Http\QueryString\getValueSeparator
getValueSeparator()
Definition: QueryString.php:134
Guzzle\Common\Collection
Definition: paymethod/paypal/lib/vendor/guzzle/guzzle/src/Guzzle/Common/Collection.php:11
Guzzle\Http\QueryString\encodeValue
encodeValue($value)
Definition: QueryString.php:246