MyBB.de Forum
Automatische Liste - Anzahlen ausgeben - Druckversion

+- MyBB.de Forum (https://www.mybb.de/forum)
+-- Forum: Anpassungen (https://www.mybb.de/forum/forum-47.html)
+--- Forum: Plugin-Diskussionen (https://www.mybb.de/forum/forum-38.html)
+--- Thema: Automatische Liste - Anzahlen ausgeben (/thread-33772.html)



Automatische Liste - Anzahlen ausgeben - Amaris - 05.10.2016

Hallo zusammen Smile


Ich leite ein Harry Potter Forum und benutze dort eine modifizierte automatische Liste nach dem "avatarlisten addon" von fallen newyork. Es entstand daraus eine "Charakterliste", die alle User in verschiedene Gruppen einteilt (verschiedene Häuser, geordnet nach Geschlecht + Klassenstufen). So entstehen z.B. folgende Gruppen:
- Gryffindor, männlich, 6. Klasse
- Gryffindor, weiblich, 6. Klasse
- Gryffindor, männlich, 7. Klasse
- Gryffindor, weiblich, 7. Klasse

Geordnet werden die Gruppen über Profilfelder gepaart mit einer Gruppen-ID.
Der Code in der zugehörigen .php sieht folgendermaßen aus:


Code:
<?php
define("IN_MYBB", 1);

require("global.php");
   global $db, $mybb, $lang, $templates, $parser, $theme, $userfields, $customfields, $profilefields, $field_hidden, $bgcolor, $alttrow;

require_once MYBB_ROOT."inc/class_parser.php";


//avatarlisten addon by fallen newyork

//edited by risuena

require "./inc/config.php";

add_breadcrumb("Charaliste", "charaliste.php");


// Schüler Gryffindor male 6
$charalist=$db->query("
   SELECT * FROM mybb_users
   LEFT JOIN mybb_userfields
   ON mybb_users.uid = mybb_userfields.ufid
   WHERE fid22 = 'male'
   AND fid26 = 'Sechste Klasse'
   AND usergroup = '4'
   ORDER BY 'username' ASC"
   );

while($result=$db->fetch_array($charalist)) {
$userid = $result['uid'];
$username = $result['username'];

$gryffindor_male_6 .= "$username<br>";
}

// Schüler Gryffindor female 6
$charalist=$db->query("
   SELECT * FROM mybb_users
   LEFT JOIN mybb_userfields
   ON mybb_users.uid = mybb_userfields.ufid
   WHERE fid22 = 'female'
   AND fid26 = 'Sechste Klasse'
   AND usergroup = '4'
   ORDER BY 'username' ASC"
   );

while($result=$db->fetch_array($charalist)) {
$userid = $result['uid'];
$username = $result['username'];

$gryffindor_female_6 .= "$username<br>";
}

// Schüler Gryffindor male 7
$charalist=$db->query("
   SELECT * FROM mybb_users
   LEFT JOIN mybb_userfields
   ON mybb_users.uid = mybb_userfields.ufid
   WHERE fid22 = 'male'
   AND fid26 = 'Siebte Klasse'
   AND usergroup = '4'
   ORDER BY 'username' ASC"
   );

while($result=$db->fetch_array($charalist)) {
$userid = $result['uid'];
$username = $result['username'];

$gryffindor_male_7 .= "$username<br>";
}

// Schüler Gryffindor female 7
$charalist=$db->query("
   SELECT * FROM mybb_users
   LEFT JOIN mybb_userfields
   ON mybb_users.uid = mybb_userfields.ufid
   WHERE fid22 = 'female'
   AND fid26 = 'Siebte Klasse'
   AND usergroup = '4'
   ORDER BY 'username' ASC"
   );

while($result=$db->fetch_array($charalist)) {
$userid = $result['uid'];
$username = $result['username'];

$gryffindor_female_7 .= "$username<br>";
}


eval("\$charaliste = \"".$templates->get("charaliste")."\";");
output_page($charaliste);

?>

Ausgegeben wird das ganze in einem Template, das so aussieht:

Code:
<html>
<head>
<title>Charaliste - {$settings['bbname']}</title>
{$headerinclude}
</head>
<body>
{$header}
<br />
<center>
<table border="0" cellspacing="{$theme['borderwidth']}" cellpadding="{$theme['tablespace']}" class="tborder">
<tr><td align="center"><br>
<div class="headline1">Charaliste</div><br>
<div class="bg_listen-div">
<br /><center>

<div class="headline1"><a name="1">Gryffindor</a></div>
<div class="text_listen" style="margin:auto auto;">
<center>
<table width="450px" style="color:#000000;"><tr><td align="center" width="225px"><stichpunkt>Männlich<hm> A</hm></stichpunkt></td><td align="center" width="225px"><stichpunkt>Weiblich<hm> A</hm></stichpunkt></td></tr>
<tr><td valign="top"class="avaliste_abstand">
    <i>6. Klasse</I><br />
{$gryffindor_male_6}<br />
    <i>7. Klasse</I><br />
{$gryffindor_male_7}<br />
</td>
<td valign="top"class="avaliste_abstand">
    <i>6. Klasse</I><br />
{$gryffindor_female_6}<br />
    <i>7. Klasse</I><br />
{$gryffindor_female_7}<br />
</td></tr></table></center><br />
<br />

<center><br />
<a href="http://lslv.de/showthread.php?tid=24" target="_blank"><span style="font-weight: bold;">zu den reservierten Avataren</span></a><br />
<br>
</div>
<br>
</td></tr>
</table>

</table>
<br><br> &nbsp;
{$footer}

</body>

</html>



Es funktioniert auch soweit ganz wunderbar!

Allerdings möchte ich nun noch die Anzahl der verschiedenen Gruppenmitglieder herauslesen. Ich habe es mit dem Code aus diesem Thread versucht. Allerdings kann ich so ja nur über die Gruppen-ID filtern - ich bräuchte zusätzlich noch den Filter über die Profilfelder.

Ich habe nun verschiedene Varianten ausprobiert, erhalte allerdings immer einen MySQL-Error.. Könnte mir vielleicht jemand weiterhelfen? Ich würde mich über eine Antwort sehr freuen!

Viele Grüße,
Amaris


RE: Automatische Liste - Anzahlen ausgeben - doylecc - 05.10.2016

Wenn ich das richtig verstanden habe, dass du die jeweiligen Gruppenmitglieder nur addieren willst, dann reicht es eigentlich, in den whille Schleifen jeweils eine Zählvariable einzufügen.

zum Beispiel:

PHP-Code:
<?php
define
("IN_MYBB"1);

require(
"global.php");
  global $db$mybb$lang$templates$parser$theme$userfields$customfields$profilefields$field_hidden$bgcolor$alttrow;

require_once 
MYBB_ROOT."inc/class_parser.php";


//avatarlisten addon by fallen newyork

//edited by risuena

add_breadcrumb("Charaliste""charaliste.php");

$gm_6 $gf_6 $gm_7 $gf_7 0;

// Schüler Gryffindor male 6
$charalist=$db->query("
  SELECT * FROM mybb_users
  LEFT JOIN mybb_userfields
  ON mybb_users.uid = mybb_userfields.ufid
  WHERE fid22 = 'male'
  AND fid26 = 'Sechste Klasse'
  AND usergroup = '4'
  ORDER BY 'username' ASC"
  );

while(
$result=$db->fetch_array($charalist)) {
$userid $result['uid'];
$username $result['username'];
++
$gm_6;
$gryffindor_male_6 .= "$username<br>";
}

// Schüler Gryffindor female 6
$charalist=$db->query("
  SELECT * FROM mybb_users
  LEFT JOIN mybb_userfields
  ON mybb_users.uid = mybb_userfields.ufid
  WHERE fid22 = 'female'
  AND fid26 = 'Sechste Klasse'
  AND usergroup = '4'
  ORDER BY 'username' ASC"
  );

while(
$result=$db->fetch_array($charalist)) {
$userid $result['uid'];
$username $result['username'];
++
$gf_6;
$gryffindor_female_6 .= "$username<br>";
}

// Schüler Gryffindor male 7
$charalist=$db->query("
  SELECT * FROM mybb_users
  LEFT JOIN mybb_userfields
  ON mybb_users.uid = mybb_userfields.ufid
  WHERE fid22 = 'male'
  AND fid26 = 'Siebte Klasse'
  AND usergroup = '4'
  ORDER BY 'username' ASC"
  );

while(
$result=$db->fetch_array($charalist)) {
$userid $result['uid'];
$username $result['username'];
++
$gm_7;
$gryffindor_male_7 .= "$username<br>";
}

// Schüler Gryffindor female 7
$charalist=$db->query("
  SELECT * FROM mybb_users
  LEFT JOIN mybb_userfields
  ON mybb_users.uid = mybb_userfields.ufid
  WHERE fid22 = 'female'
  AND fid26 = 'Siebte Klasse'
  AND usergroup = '4'
  ORDER BY 'username' ASC"
  );

while(
$result=$db->fetch_array($charalist)) {
$userid $result['uid'];
$username $result['username'];
++
$gf_7;
$gryffindor_female_7 .= "$username<br>";
}


eval(
"\$charaliste = \"".$templates->get("charaliste")."\";");
output_page($charaliste); 

Dann solltest du die Variablen $gm_6, $gf_6, $gm_7 und $gf_7 im Template für die jeweilige Anzahl der Mitglieder verwenden können.


RE: Automatische Liste - Anzahlen ausgeben - MrBrechreiz - 05.10.2016

Ich hab deinen Code etwas reduziert/optimiert und auch gleich waldo´s Code eingebaut.

Versuch´s bitte bei dir ob es funktioniert.


RE: Automatische Liste - Anzahlen ausgeben - Amaris - 06.10.2016

Oh super, vielen lieben Dank für eure schnellen Antworten!

@ waldo: Das hast du genau richtig verstanden, mir hat nur der richtige Befehl gefehlt. Dass es direkt so einfach geht, hatte ich so gar nicht erwartet, aber ich freu mich! Danke! Smile

@ MrBrechreiz: Danke auch an dich für die Vereinfachung! Ich bin noch ein php-Anfänger und über jeden Tipp dankbar. Vielleicht könntest du mir noch zwei Fragen beantworten?

Zum einen ist mir nicht ganz klar, was sich hinter folgendem Befehl versteckt:
Code:
$fid22 = htmlspecialchars_uni($result['fid3']);
Wie kommst du auf die ID 3? (Ist das das von MyBB voreingestellte Profilfeld für das Geschlecht? Ich meine, das haben wir anfangs rausgelöscht, weil wir zunächst dachten, wir bräuchten es nicht ... )

Wir möchten die Liste außerdem noch erweitern - neben den Gryffindors sollen z.B. auch Hufflepuffs (sagen wir mal mit der Groupid = 5), Ravenclaws (Groupid = 6) usw. in der Liste auftauchen. Dann müsste ich wahrscheinlich diesen Code hier einfach erweitern, oder?

Code:
WHERE f.fid22 = 'Male' AND usergroup IN ('4') OR f.fid22 = 'Female' AND usergroup IN ('4') AND f.fid26 = 'Sechste Klasse' AND usergroup IN ('4') OR f.fid26 = 'Siebte Klasse' AND usergroup IN ('4')

Könntest du mir die Logik dahinter vielleicht kurz erklären? Darüber würde ich mich sehr freuen Smile Bin gerade etwas verwirrt durch die vielen ANDs und ORs und "Istgleichs". Danke dir für deine Antwort!


RE: Automatische Liste - Anzahlen ausgeben - MrBrechreiz - 06.10.2016

fid3 ist bei mir im Test ein Profilfeld, welches ich vergessen hab es wieder umzubenennen.

Mit der Abfrage siehst Du dies richtig, dies müsstest Du demnach weiter anpassen.

Zur Erläuterung:

PHP-Code:
f.fid22 'Male' AND usergroup IN ('4') OR f.fid22 'Female' AND usergroup IN ('4'

es wird das feld 22 ausgelesen ob da Male oder Female steht und ob die User der Gruppe 4 angehörig sind, wenn ja, werden diese ausgegeben, wenn nein, passiert nichts.

Das gleiche trifft auf diesen Code zu.

PHP-Code:
AND f.fid26 'Sechste Klasse' AND usergroup IN ('4') OR f.fid26 'Siebte Klasse' AND usergroup IN ('4'

Wenn Du nun noch weitere Gruppen hinzufügen möchtest, müsstest Du die Gruppen ID bei usergroup IN ('4') mit eintragen. Also etwa so: usergroup IN ('4', 'andere ID')


RE: Automatische Liste - Anzahlen ausgeben - Amaris - 08.10.2016

Super, ich danke dir für diese Erklärung! Smile