List manager : add email domain in filter box

This commit is contained in:
aina-esokia
2019-03-08 15:39:58 +04:00
parent 099fce3424
commit acc59ec42a
3 changed files with 78 additions and 9 deletions

View File

@@ -547,6 +547,10 @@ class PushController extends Controller
->like($request->get('like_field'), $request->get('query')) ->like($request->get('like_field'), $request->get('query'))
->like_match(\User_Query::LIKE_MATCH_OR); ->like_match(\User_Query::LIKE_MATCH_OR);
} }
if (is_array($request->get('EmailDomain'))) {
$query->haveEmailDomains($request->get('EmailDomain'));
}
if (is_array($request->get('Activity'))) { if (is_array($request->get('Activity'))) {
$query->haveActivities($request->get('Activity')); $query->haveActivities($request->get('Activity'));
} }

View File

@@ -62,6 +62,7 @@ class User_Query
protected $include_phantoms = true; protected $include_phantoms = true;
protected $include_special_users = false; protected $include_special_users = false;
protected $include_invite = false; protected $include_invite = false;
protected $emailDomains = null;
protected $activities = null; protected $activities = null;
protected $templates = null; protected $templates = null;
protected $companies = null; protected $companies = null;
@@ -503,6 +504,38 @@ class User_Query
return $this; return $this;
} }
/**
* Restrict users with provided email domain
*
* @param array $req_emailDomains
* @return $this
*/
public function haveEmailDomains(array $req_emailDomains)
{
$emailDomains = new ArrayCollection();
foreach ($req_emailDomains as $emailDomain) {
if (($emailDomain = trim($emailDomain)) === '') {
continue;
}
// use % for LIKE in SQL
$emailDomain = '%'.$emailDomain;
if ($emailDomains->contains($emailDomain)) {
continue;
}
$emailDomains->add($emailDomain);
}
if (!$emailDomains->isEmpty()) {
$this->emailDomains = $emailDomains;
}
return $this;
}
/** /**
* Restrict users with provided activities * Restrict users with provided activities
* *
@@ -515,7 +548,7 @@ class User_Query
$activities = new ArrayCollection(); $activities = new ArrayCollection();
foreach ($req_activities as $activity) { foreach ($req_activities as $activity) {
if ($activity = trim($activity) === '') { if (($activity = trim($activity)) === '') {
continue; continue;
} }
@@ -545,7 +578,7 @@ class User_Query
$positions = new ArrayCollection(); $positions = new ArrayCollection();
foreach ($req_positions as $position) { foreach ($req_positions as $position) {
if ($position = trim($position) === '') { if (($position = trim($position)) === '') {
continue; continue;
} }
if ($positions->contains($position)) { if ($positions->contains($position)) {
@@ -574,7 +607,7 @@ class User_Query
$countries = new ArrayCollection(); $countries = new ArrayCollection();
foreach ($req_countries as $country) { foreach ($req_countries as $country) {
if ($country = trim($country) === '') { if (($country = trim($country)) === '') {
continue; continue;
} }
if ($countries->contains($country)) { if ($countries->contains($country)) {
@@ -603,7 +636,7 @@ class User_Query
$companies = new ArrayCollection(); $companies = new ArrayCollection();
foreach ($req_companies as $company) { foreach ($req_companies as $company) {
if ($company = trim($company) === '') { if (($company = trim($company)) === '') {
continue; continue;
} }
if ($companies->contains($company)) { if ($companies->contains($company)) {
@@ -631,7 +664,7 @@ class User_Query
$templates = new ArrayCollection(); $templates = new ArrayCollection();
foreach ($req_templates as $template) { foreach ($req_templates as $template) {
if ($template = trim($template) === '') { if (($template = trim($template)) === '') {
continue; continue;
} }
if ($templates->contains($template)) { if ($templates->contains($template)) {
@@ -662,6 +695,33 @@ class User_Query
return $this; return $this;
} }
/**
* Get users email domain
*
* @return array
*/
public function getRelatedEmailDomain()
{
$conn = $this->app->getApplicationBox()->get_connection();
$sql = 'SELECT DISTINCT SUBSTRING_INDEX(Users.email, "@", -1) as emailDomain' . $this->generate_sql_constraints(). 'ORDER BY emailDomain';
$stmt = $conn->prepare($sql);
$stmt->execute($this->sql_params);
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$emailDomain = [];
foreach ($rs as $row) {
if (trim($row['emailDomain']) === '') {
continue;
}
$emailDomain[] = $row['emailDomain'];
}
return $emailDomain;
}
/** /**
* Get users activities * Get users activities
* *
@@ -838,6 +898,10 @@ class User_Query
$sql .= ' AND model_of IS NULL'; $sql .= ' AND model_of IS NULL';
} }
if ($this->emailDomains) {
$sql .= $this->generate_field_constraints('email', $this->emailDomains, 'LIKE');
}
if ($this->activities) { if ($this->activities) {
$sql .= $this->generate_field_constraints('activity', $this->activities); $sql .= $this->generate_field_constraints('activity', $this->activities);
} }
@@ -967,7 +1031,7 @@ class User_Query
return $sql; return $sql;
} }
protected function generate_field_constraints($fieldName, ArrayCollection $fields) protected function generate_field_constraints($fieldName, ArrayCollection $fields, $operator = '=')
{ {
$n = 0; $n = 0;
$constraints = []; $constraints = [];
@@ -975,7 +1039,8 @@ class User_Query
foreach ($fields as $field) { foreach ($fields as $field) {
$constraints[':' . $fieldName . $n ++] = $field; $constraints[':' . $fieldName . $n ++] = $field;
} }
$sql = ' AND (' . $fieldName . ' = ' . implode(' OR ' . $fieldName . ' = ', array_keys($constraints)) . ') ';
$sql = ' AND (' . $fieldName . ' ' . $operator . ' ' . implode(' OR ' . $fieldName . ' ' . $operator . ' ' , array_keys($constraints)) . ') ';
$this->sql_params = array_merge($this->sql_params, $constraints); $this->sql_params = array_merge($this->sql_params, $constraints);

View File

@@ -185,9 +185,9 @@
<tr> <tr>
<td> <td>
<div class="list_editor_selector_filter_holder"> <div class="list_editor_selector_filter_holder">
<select size="5" multiple="multiple" name="Email[]" style="width:100%;"> <select size="5" multiple="multiple" name="EmailDomain[]" style="width:100%;">
<option value="">{{ 'All' | trans }}</option> <option value="">{{ 'All' | trans }}</option>
{% for Email in query.getRelatedActivities() %} {% for Email in query.getRelatedEmailDomain() %}
<option value="{{ Email }}">{{ Email }}</option> <option value="{{ Email }}">{{ Email }}</option>
{% endfor %} {% endfor %}
</select> </select>