public function buildFilterQuery($filter, &$joins, array &$where, Register $parameter_output) { $filter = $this->processFilter($filter); $filter_join = DataSource::FILTER_OR; $db = Symphony::Database(); // Boolean searches: if ($filter->type == 'boolean-search') { $handle = $this->buildFilterJoin($joins); $value = DataSource::replaceParametersInString(trim($filter->value), $parameter_output); $mode = preg_match('/^not(\\W)/i', $value) ? '-' : '+'; // Replace ' and ' with ' +': $value = preg_replace('/(\\W)and(\\W)/i', '\\1+\\2', $value); $value = preg_replace('/(^)and(\\W)|(\\W)and($)/i', '\\2\\3', $value); $value = preg_replace('/(\\W)not(\\W)/i', '\\1-\\2', $value); $value = preg_replace('/(^)not(\\W)|(\\W)not($)/i', '\\2\\3', $value); $value = preg_replace('/([\\+\\-])\\s*/', '\\1', $mode . $value); $statement = $db->prepareQuery("MATCH ({$handle}.value) AGAINST ('%s' IN BOOLEAN MODE)", array($value)); $where[] = "(\n\t{$statement}\n)"; return true; } return parent::buildFilterQuery($filter, $joins, $where, $parameter_output); }
public function buildFilterQuery($filter, &$joins, array &$where, Register $parameter_output = null) { $filter = $this->processFilter($filter); $db = Symphony::Database(); $statements = array(); if (!is_array($values)) { $values = array(); } // Exact matches: switch ($filter->type) { case 'is': $operator = '='; break; case 'is-not': $operator = '!='; break; case 'earlier-than': $operator = '>'; break; case 'earlier-than-or-equal': $operator = '>='; break; case 'later-than': $operator = '<'; break; case 'later-than-or-equal': $operator = '<='; break; } if (empty($this->last_handle)) { $this->join_handle = $this->buildFilterJoin($joins); } $handle = $this->join_handle; $value = DataSource::replaceParametersInString(trim($filter->value), $parameter_output); if ($filter->gmt == 'yes') { $value = strtotime($value); } else { $value = DateTimeObj::fromGMT($value); } $value = date('Y-m-d H:i:s', $value); $statements[] = $db->prepareQuery("'%s' {$operator} {$handle}.value", array($value)); if (empty($statements)) { return true; } if ($filter_join == DataSource::FILTER_OR) { $statement = "(\n\t" . implode("\n\tOR ", $statements) . "\n)"; } else { $statement = "(\n\t" . implode("\n\tAND ", $statements) . "\n)"; } $where[] = $statement; return true; }
public function render(Register $parameter_output) { $document = new XMLDocument(); $root = $document->createElement($this->parameters()->{'root-element'}); $addresses = DataSource::replaceParametersInString(trim($this->parameters()->{'addresses'}), $parameter_output); $addresses = preg_split('%,\\s*%', $addresses); $params = array('s' => $this->parameters()->{'size'}, 'r' => $this->parameters()->{'rating'}, 'd' => $this->parameters()->{'default'}); foreach ($params as $key => $value) { $value = DataSource::replaceParametersInString($value, $parameter_output); if ($key == 's') { $value = (int) $value; } $params[$key] = $value; } if ($params['s'] < 1 or $params['s'] > 512) { unset($params['s']); } if (!in_array($params['r'], array('g', 'pg', 'r', 'x'))) { unset($params['r']); } if (is_null($params['d'])) { unset($params['d']); } foreach ($addresses as $address) { $address = trim($address); if (empty($address)) { continue; } $hash = md5($address); $url = new URLWriter('http://www.gravatar.com/avatar/' . $hash, $params); $element = $document->createElement('avatar'); $element->setAttribute('email', $address); $element->setAttribute('url', (string) $url); $root->appendChild($element); } $document->appendChild($root); return $document; }