[3.2] Sortieren nach Liste aus den custom profile fields

In diesem Forum gibt es Starthilfe zum neuen Extension-System von phpBB 3.1/3.2. Fragen zur Entwicklung von Extensions und zur Konvertierung von phpBB 3.0.x MODs sind ebenfalls willkommen.
cpg
Mitglied
Beiträge: 388
Registriert: 24.11.2007 12:43
Kontaktdaten:

Re: [3.2] Sortieren nach Liste aus den custom profile fields

Beitragvon cpg » 02.12.2017 18:38

Moin,

versprochen ist versprochen :)

Ich poste erst einmal die veränderte memberlist.php

Vorher werde ich noch einmal kurz beschreiben, warum ich das gemacht habe. Es geht mir darum, ein custom_profile_field sortierbar zu machen, weil Mitglieder des Forums u.U. ein Interesse daran haben, sich persönlich zu treffen - und da scheint eine Sortierung nach Plz/Wohnort sinnvoll zu sein.
Wenn das mit den code-Änderungen "zu wild" ist, dann gebt bitte Bescheid. Ansonsten werde ich auch noch die zugehörige Änderungen an der html-Datei posten und beschreiben, was ich noch gemacht habe.

Ach ja: ohne Gewähr und Gewehr :) In meinem Forum funktioniert es.

Gruß und schönen 1. Advent
cpg

phpBB3/memberlist.php

suche

Code: Alles auswählen

case 'livesearch':

      $username_chars = $request->variable('username', '', true);

      $sql = 'SELECT username, user_id, user_colour
         FROM ' . USERS_TABLE . '
         WHERE ' . $db->sql_in_set('user_type', $user_types) . '
            AND username_clean ' . $db->sql_like_expression(utf8_clean_string($username_chars) . $db->get_any_char());
      $result = $db->sql_query_limit($sql, 10);
      $user_list = array();

      while ($row = $db->sql_fetchrow($result))
      {
         $user_list[] = array(
            'user_id'      => (int) $row['user_id'],
            'result'      => $row['username'],
            'username_full'   => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
            'display'      => get_username_string('no_profile', $row['user_id'], $row['username'], $row['user_colour']),
         );
      }
      $db->sql_freeresult($result);
      $json_response = new \phpbb\json_response();
      $json_response->send(array(
         'keyword' => $username_chars,
         'results' => $user_list,
      ));

   break;




ersetze mit


Code: Alles auswählen

   case 'livesearch':

      $username_chars = $request->variable('username', '', true);

      $sql = 'SELECT username, user_id, user_colour, location_mysearch
         FROM ' . USERS_TABLE . ' u         
         LEFT JOIN " . PROFILE_FIELDS_DATA_TABLE . " fd ON (u.user_id = fd.user_id)
            WHERE ' . $db->sql_in_set('user_type', $user_types) . '
            AND username_clean ' . $db->sql_like_expression(utf8_clean_string($username_chars) . $db->get_any_char());
      $result = $db->sql_query_limit($sql, 10);
      $user_list = array();

      while ($row = $db->sql_fetchrow($result))
      {
         $user_list[] = array(
            'user_id'      => (int) $row['user_id'],
            'result'      => $row['username'],
            'location_mysearch'      => $row['location_mysearch'],
            'username_full'   => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
            'display'      => get_username_string('no_profile', $row['user_id'], $row['username'], $row['user_colour']),
         );
      }
      
      $db->sql_freeresult($result);
      $json_response = new \phpbb\json_response();
      $json_response->send(array(
         'keyword' => $username_chars,
         'results' => $user_list,
         
      ));
      

   break;


suche

Code: Alles auswählen

$user_list = array();

      while ($row = $db->sql_fetchrow($result))
      {
         $user_list[] = array(
            'user_id'      => (int) $row['user_id'],
            'result'      => $row['username'],
            'username_full'   => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
            'display'      => get_username_string('no_profile', $row['user_id'], $row['username'], $row['user_colour']),
         );
      }


ersetze mit

Code: Alles auswählen

      $user_list = array();

      while ($row = $db->sql_fetchrow($result))
      {
         $user_list[] = array(
            'user_id'      => (int) $row['user_id'],
            'result'      => $row['username'],
            'location_mysearch'      => $row['location_mysearch'],
            'username_full'   => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
            'display'      => get_username_string('no_profile', $row['user_id'], $row['username'], $row['user_colour']),
         );
      }


suche

Code: Alles auswählen

$sort_key_text = array('a' => $user->lang['SORT_USERNAME'], 'c' => $user->lang['SORT_JOINED'], 'd' => $user->lang['SORT_POST_COUNT']);
      $sort_key_sql = array('a' => 'u.username_clean', 'c' => 'u.user_regdate', 'd' => 'u.user_posts');


ersetze mit

Code: Alles auswählen

$sort_key_text = array('a' => $user->lang['SORT_USERNAME'], 'c' => $user->lang['SORT_JOINED'], 'd' => $user->lang['SORT_POST_COUNT'], 'n' => $user->lang['SORT_LOCATION_MYSEARCH']);
      $sort_key_sql = array('a' => 'u.username_clean', 'c' => 'u.user_regdate', 'd' => 'u.user_posts', 'n' => 'u.location_mysearch');

 $sort_key_text['n'] = $user->lang['LOCATION_MYSEARCH'];
 $sort_key_sql['n'] = 'pf_location_mysearch';


suche

Code: Alles auswählen

$search_params = array('username', 'email', 'jabber', 'search_group_id', 'joined_select', 'active_select', 'count_select', 'joined', 'active', 'count', 'ip');


ersetze mit

Code: Alles auswählen

$search_params = array('username', 'location_mysearch', 'email', 'jabber', 'search_group_id', 'joined_select', 'active_select', 'count_select', 'joined', 'active', 'count', 'ip');


suche

Code: Alles auswählen

$username   = $request->variable('username', '', true);
         $email      = strtolower($request->variable('email', ''));



ersetze mit

Code: Alles auswählen

$username   = $request->variable('username', '', true);
         $location_mysearch        =  $request->variable('location_mysearch', '', true . '*');
         $email      = strtolower($request->variable('email', ''));


suche

Code: Alles auswählen

$sql_where .= ($username) ? ' AND u.username_clean ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($username))) : '';
         


ersetze mit

Code: Alles auswählen

$sql_where .= ($username) ? ' AND u.username_clean ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($username))) : '';
         //next cpg
         $sql_where .= mb_strtolower($location_mysearch) ? ' AND LOWER(pf_location_mysearch) ' . $db->sql_like_expression(str_replace('*', $db->any_char, mb_strtolower($location_mysearch,'utf-8'))) . ' ' : '';
         


suche

Code: Alles auswählen

$sql_where .= ($search_group_id) ? " AND u.user_id = ug.user_id AND ug.group_id = $search_group_id AND ug.user_pending = 0 " : '';


ersetze mit

Code: Alles auswählen

}
         
         $sql_where .= mb_strtolower($location_mysearch) ? ' AND LOWER(pf_location_mysearch) ' . $db->sql_like_expression(str_replace('*', $db->any_char, mb_strtolower($location_mysearch,'utf-8'))) . ' ' : '';
         

         $sql_where .= ($search_group_id) ? " AND u.user_id = ug.user_id AND ug.group_id = $search_group_id AND ug.user_pending = 0 " : '';


suche

Code: Alles auswählen

'username'      => array('username', '', true),
         'email'         => array('email', ''),


ersetze mit

Code: Alles auswählen

'username'      => array('username', '', true),
         'location_mysearch'   => array('location_mysearch', '', true. '*'),
         'email'         => array('email', ''),


suche

Code: Alles auswählen

'USERNAME'   => $username,
            'EMAIL'      => $email,



ersetze mit

Code: Alles auswählen

'USERNAME'   => $username,
            'LOCATION_MYSEARCH'   => $location_mysearch,
            'EMAIL'      => $email,


suche

Code: Alles auswählen

'S_INACTIVE'      => $row['user_type'] == USER_INACTIVE,
 'U_VIEW_PROFILE'   => get_username_string('profile', $user_id, $row['username']),
 
 


ersetze mit

Code: Alles auswählen

'S_INACTIVE'      => $row['user_type'] == USER_INACTIVE,
                    'S_LOCATION_MYSEARCH'   => (isset($cp_row['row']) && sizeof($cp_row['row'])) ? true : false,
               'U_VIEW_PROFILE'   => get_username_string('profile', $user_id, $row['username']),


suche

Code: Alles auswählen

'U_SORT_USERNAME'      => $sort_url . '&sk=a&sd=' . (($sort_key == 'a' && $sort_dir == 'a') ? 'd' : 'a'),
         


ersetze mit

Code: Alles auswählen

'U_SORT_USERNAME'      => $sort_url . '&sk=a&sd=' . (($sort_key == 'a' && $sort_dir == 'a') ? 'd' : 'a'),
   'U_SORT_LOCATION_MYSEARCH'      => $sort_url . '&sk=n&sd=' . (($sort_key == 'n' && $sort_dir == 'a') ? 'd' : 'a'),
         


suche

Code: Alles auswählen

'U_LIST_CHAR'         => $sort_url . '&sk=a&sd=' . (($sort_key == 'l' && $sort_dir == 'd') ? 'a' : 'd'),



ersetze mit

Code: Alles auswählen

'U_LIST_CHAR'         => $sort_url . '&sk=a&sd=' . (($sort_key == 'l' && $sort_dir == 'd') ? 'a' : 'd'),
            'LOCATION_MYSEARCH'      => ($data['location_mysearch']) ? $data['location_mysearch'] : '',
   

Benutzeravatar
BNa
Valued Contributor
Beiträge: 2272
Registriert: 12.04.2010 23:51
Kontaktdaten:

Re: [3.2] Sortieren nach Liste aus den custom profile fields

Beitragvon BNa » 02.12.2017 19:18

thx 4 sharing :grin: :geek: :cookie:

cpg
Mitglied
Beiträge: 388
Registriert: 24.11.2007 12:43
Kontaktdaten:

Re: [3.2] Sortieren nach Liste aus den custom profile fields

Beitragvon cpg » 02.12.2017 19:46

Die Änderungen der memberlist_body.html (style prosilver)

memberlist_body.html

suche

Code: Alles auswählen

   <!-- IF U_SORT_ACTIVE --><th class="active"><a href="{U_SORT_ACTIVE}#memberlist">{L_LAST_ACTIVE}</a></th><!-- ENDIF -->


füge danach ein:

Code: Alles auswählen

 <!-- IF U_SORT_LOCATION_MYSEARCH --><th><a href="{U_SORT_LOCATION_MYSEARCH}#memberlist">.{L_LOCATION_MYSEARCH}</a></th><!-- ENDIF -->


suche

Code: Alles auswählen

<!-- IF S_VIEWONLINE --><td>{memberrow.LAST_ACTIVE}&nbsp;</td><!-- ENDIF -->


füge danach ein:

Code: Alles auswählen

<td><!-- IF memberrow.PROFILE_LOCATION_MYSEARCH_VALUE --><div>{memberrow.PROFILE_LOCATION_MYSEARCH_VALUE}</div><!-- ELSE -->&nbsp;<!-- ENDIF --></td>


Automatisch dem Beitrag hinzugefügt nach 7 Minuten 18 Sekunden. Bitte Regel für „Topic-Bumping“ beachten. Danke.

memberlist_search.html

suche

Code: Alles auswählen

<li class="search-result-tpl"><span class="search-result"></span></li>
               </ul>
            </div>
         </div>
         <!-- ENDIF -->
      </dd>
   </dl>
<!-- IF S_EMAIL_SEARCH_ALLOWED -->


ersetze mit

Code: Alles auswählen

<li class="search-result-tpl"><span class="search-result"></span></li>
               </ul>
            </div>
         </div>
         <!-- ENDIF -->
      </dd>
   </dl>
   <dl>
      <dt><label for="location_mysearch">{L_LOCATION_MYSEARCH}:</label></dt>
      <dd><input type="text" name="location_mysearch" id="location_mysearch" value="{LOCATION_MYSEARCH}" class="inputbox" /></dd>
   </dl>
<!-- IF S_EMAIL_SEARCH_ALLOWED -->


Schließlich habe ich in der language/de/common.php an passender Stelle eingefügt:

Code: Alles auswählen

'LOCATION_MYSEARCH'                 => 'Membersuche/Plz',


Weitere Hinweise:

Das von mir verwemdete custom_field hat einen Voreintrag in der Art z.Zt. ----- und dem Hinweis: "bei Eintrag bitte überschreiben".
Das hat den Vorteil, dass die User, die hier nichts eintragen wollen, in der "Suche nach Wohnort" ganz nach hinten wandern.
Ansonsten hätte man in einem großen Forum zuerst (je nach Sortier-Einstellung) lauter UserInnen mit leerem Eintrag.

Weiterhin habe ich für die UserInnen, die schon angemeldet sind und bisher nichts eingetragen haben, in der Datenbank das z.Zt -----
nachgetragen:

Code: Alles auswählen

Update phpbb_profile_fields_data SET pf_location_mysearch = 'z.Zt. ---' WHERE pf_location_mysearch = ""


Gruß
cpg


Zurück zu „Extension Bastelstube“