MyBB.de Forum

Normale Version: Mitgliederliste mit Hilfe von Profilfeldern durchsuchen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hi,

dies ist ein Hack für die Erweiterte Mitgliedersuche. Standardmäßig kann man nicht nach Profilfeldern filtern, aber mit dieser einfachen Codemodifikation wird es möglich! Smile

  1. Öffne die Datei memberlist.php mit einem geeigneten Texteditor.
    1. Suche:
      PHP-Code:
      // Showing advanced search page?
      if($mybb->input['action'] == "search")
      {
          eval(
      "\$search_page = \"".$templates->get("memberlist_search")."\";");
          
      $plugins->run_hooks("memberlist_search");
          
      output_page($search_page);    


    2. Ersetze mit:
      PHP-Code:
      // Showing advanced search page?
      if($mybb->input['action'] == "search")
      {
          
      $altbg "trow2";
          
      $query $db->simple_select("profilefields""*""type!='checkbox' AND type!='multiselect' AND type!='textarea' AND editable=1 AND hidden=0", array('order_by' => 'disporder'));
          while(
      $profilefield $db->fetch_array($query))
          {
              
      $profilefield['type'] = htmlspecialchars_uni($profilefield['type']);
              
      $thing explode("\n"$profilefield['type'], "2");
              
      $type $thing[0];
              
      $options $thing[1];
              
      $field "fid{$profilefield['fid']}";
              
      $select '<option value=""></option>';
              
      $userfield $user[$field];
              if(
      $type == "select")
              {
                  
      $expoptions explode("\n"$options);
                  if(
      is_array($expoptions))
                  {
                      foreach(
      $expoptions as $key => $val)
                      {
                          
      $val trim($val);
                          
      $val str_replace("\n""\\n"$val);
                          
      $select .= "<option value=\"{$val}\">{$val}</option>";
                      }
                      if(!
      $profilefield['length'])
                      {
                          
      $profilefield['length'] = 1;
                      }
                      
      $code "<select id=\"{$field}\" name=\"{$field}\" size=\"{$profilefield['length']}\">{$select}</select>";
                  }
              }
              elseif(
      $type == "radio")
              {
                  
      $expoptions explode("\n"$options);
                  if(
      is_array($expoptions))
                  {
                      foreach(
      $expoptions as $key => $val)
                      {
                          
      $code .= "<input type=\"radio\" class=\"radio\" name=\"{$field}\" value=\"{$val}\" /> <span class=\"smalltext\">{$val}</span><br />";
                      }
                  }
              }
              else
              {
                  
      $maxlength "";
                  if(
      $profilefield['maxlength'] > 0)
                  {
                      
      $maxlength " maxlength=\"{$profilefield['maxlength']}\"";
                  }
                  
      $code "<input id=\"{$field}\" type=\"text\" name=\"{$field}\" class=\"textbox\" size=\"{$profilefield['length']}\"{$maxlength} value=\"\" />";
              }
              if(
      $type != "radio")
              {
                  
      $profilefield['name']="<label for=\"{$field}\">{$profilefield['name']}</label>";
              }
              
      $customfields.="<tr><td class=\"{$altbg}\"><strong>{$profilefield['name']}</strong></td><td class=\"{$altbg}\">{$code}</td></tr>";
              
      $altbg alt_trow();
              
      $code "";
              
      $select "";
              
      $val "";
              
      $options "";
              
      $expoptions "";
          }
          eval(
      "\$search_page = \"".$templates->get("memberlist_search")."\";");
          
      $plugins->run_hooks("memberlist_search");
          
      output_page($search_page);    


    3. Suche:
      PHP-Code:
          $query $db->simple_select("users u""COUNT(*) AS users""{$search_query}"); 

    4. Ersetze mit:
      PHP-Code:
          $query $db->query("
              SHOW FULL COLUMNS
              FROM "
      .TABLE_PREFIX."userfields
          "
      );
          
      $columns 1;
          while(
      $rows $db->fetch_array($query))
          {
              if(
      trim($mybb->input['fid'.$columns]))
              {
                  
      $search_query .= " AND f.fid".$columns." LIKE '%".$db->escape_string_like($mybb->input['fid'.$columns])."%'";
                  
      $search_url .= "&fid".$columns."=".urlencode($mybb->input['fid'.$columns]);
              }
              
      $columns++;
          }
          
      $query $db->query("
              SELECT COUNT(*) AS users
              FROM "
      .TABLE_PREFIX."users u
              LEFT JOIN "
      .TABLE_PREFIX."userfields f ON (f.ufid=u.uid)
              WHERE 
      {$search_query}
          "
      ); 
  2. Gehe zum Admin CP und öffne das Template memberlist_search.
    1. Suche:
      Code:
      <tr>
         <td class="trow1" style="vertical-align: top;" width="20%"><strong><label for="username">{$lang->username}</label></strong></td>
         <td class="trow1">
             <select name="username_match">
                 <option value="begins">{$lang->begins_with}</option>
                 <option value="contains">{$lang->username_contains}</option>
             </select>
             &nbsp;
             <input type="text" class="textbox" name="username" id="username" />
         </td>
      </tr>
      <tr>
         <td class="trow2" width="20%"><strong><label for="website">{$lang->search_website}</label></strong></td>
         <td class="trow2">
             <input type="text" class="textbox" name="website" id="website" />
         </td>
      </tr>

    2. Ersetzte mit:
      Code:
      <tr>
         <td class="trow1" style="vertical-align: top;" width="20%"><strong><label for="username">{$lang->username}</label></strong></td>
         <td class="trow1">
             <select name="username_match">
                 <option value="begins">{$lang->begins_with}</option>
                 <option value="contains">{$lang->username_contains}</option>
             </select>
             &nbsp;
             <input type="text" class="textbox" name="username" id="username" />
         </td>
      </tr>
      {$customfields}
      <tr>
         <td class="trow2" width="20%"><strong><label for="website">{$lang->search_website}</label></strong></td>
         <td class="trow2">
             <input type="text" class="textbox" name="website" id="website" />
         </td>
      </tr>
      (oder füge die Variable {$customfields} wo immer du möchtest ein)

Bekannte Einschränkungen:
  • Felder mit Mehrfachauswahl werden nicht unterstützt
  • Textareas werden nicht unterstützt (weil ich finde, dass es sinnlos ist, darin zu suchen)*
  • Es ist kein Plugin*

*Falls du wirklich in Textareas suchen willst, frag danach und ich werde die Modifikation veröffentlichen.

*Es existieren keine geeigneten Hooks um das ganze als Plugin zu gestalten. Natürlich könnte man den ganzen Inhalt von memberlist.php in ein Plugin packen und den Hook memberlist_start verwenden, aber das wäre der blödsinnigste Weg, den ich mir vorstellen kann...

Falls du die Codemodifikation nicht hinbekommst, kannst du auch die angehängte memberlist.php nehmen (wow, wir sind bei MyBB 1.4.11 und die Datei wurde seit 2009-01-31 nicht mehr verändert Big Grin ). Aber du musst trotzdem die Variable {$customfields} zum Template hinzufügen.

Lizenz: GPL

paradox

querschlaeger schrieb:Falls du die Codemodifikation nicht hinbekommst, kannst du auch die angehängte memberlist.php nehmen

Warum die Arbeit machen? So ist viel einfacher Big Grin
Speziell bei mir kann ich jetzt auch nach männlich und weiblich suchen lassen.

Funktioniert einwandfrei. Besten Dank dafür Wink
(26.03.2010, 18:56)paradox schrieb: [ -> ]Warum die Arbeit machen? So ist viel einfacher Big Grin

Ich hätte natürlich einfach nur die Datei hier anhängen können, aber so finde ich die Änderungen etwas transparenter für jederman. Wink
Außerdem kann sich die Datei von Version zu Version verändern, die Anleitung dagegen müsste immer funktionieren.
@querschlaeger, vielen Dank für die ausführliche Anleitung. Ich finde sowas toll, da ich kein Freund von Plugins bin.

Ich wünschte mir, bei den Plugins würde immer so detailiert beschrieben, was geändert wird.
Ja, ich würde sehr gerne auch in Textareas suchen lassen und auch in Feldern mit Mehrfachauswahl.
Hallo querschlaeger,

Danke für die Doku, leider bekomme ich es mit der aktuellen MyBB Version 1.6.3 nicht zum fliegen. Ich erhalte zwar die Profilfelder in der erweiterten Suche, jedoch wird mir kein Ergebnis geliefert, sondern die komplette Mitgliederliste.

Was kann bzw. was muss ich anpassen, dass es auch mit der aktuellen Version funktioniert?

Danke & Gruß
Skreboy

Bei 1.6.9 funktioniert es gar nicht; auch die neuen Felder erscheinen nicht. Was tun? Sad
Funktioniert immer noch einwandfrei. Du nutzt aber schon die "Erweiterte Suche" in der Mitgliederliste?
Öh, äh, wie? Was muss ich wo genau einstellen???
Seiten: 1 2