[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: 397
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: 2362
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: 397
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

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

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

Beitragvon cpg » 27.01.2018 18:28

Moin,

ich habe noch einmal nachgebessert; ein Fehler in der memberlist.php verhinderte die korrekte Ausgabe von Postleitzahl-Ausgaben, bei
denen ein Platzhalter verwendet wurde (z.B. 24*).

Nur der Vollständigkeit halber

suche (nach den oben geposteten Änderungen):

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'))) . ' ' : '';


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->get_any_char(), utf8_clean_string($location_mysearch))) . ' ' : '';
         


Gruß
cpg

Praggle
Mitglied
Beiträge: 32
Registriert: 30.05.2006 10:14

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

Beitragvon Praggle » 20.04.2018 10:19

Hi cpg,

ich habe gerade versucht, das mal unter 3.1.12 auszuprobieren. Statt $request->variable habe ich request_var bei deiner fünften Ersetzung verwendet, aber das scheint da trotzdem nicht zu gehen.

[phpBB Debug] PHP Notice: in file [ROOT]/memberlist.php on line 882: Undefined index: SORT_LOCATION_MYSEARCH
[phpBB Debug] PHP Notice: in file [ROOT]/memberlist.php on line 1618: Undefined variable: data
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 5348: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3937)
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 5348: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3937)
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 5348: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3937)


Bei deiner siebten Ersetzung ist dir vermutlich eine geschweifte Klammer am Anfang rein gerutscht. Auch für 3.2 müsste es wohl heißen:

suche:

Code: Alles auswählen

$username   = request_var('username', '', true);
         $email      = strtolower(request_var('email', ''));


ersetze mit:

Code: Alles auswählen

$username   = request_var('username', '', true);
         $location_mysearch        =  request_var('location_mysearch', '', true . '*');
         $email      = strtolower(request_var('email', ''));


also ohne } am Anfang.

Ich hab leider zu wenig Programmierkenntnisse, um deinen Ansatz auf 3.1.12 übertragen zu können, wollte aber sagen, dass ich die fehlende Sortierfunktion bei den Custom Profile Fields auch für ein ernsthaft fehlendes Feature halte. Mir geht es ebenfalls so, dass ich es gerne für die Postleitzahlen nutzen würde. Insofern: Danke fürs Posten, auch wenn es mir jetzt nicht direkt weitergeholfen hat.

Praggle

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

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

Beitragvon cpg » 23.04.2018 09:41

Moin,

ich schaue noch einmal nach.
Wenn mir Änderungen/Fehler auffallen, dann melde ich mich.

Gruß
CPG


Zurück zu „Extension Bastelstube“