Hallo, Gast! (Registrieren)

Letzte Ankündigung: MyBB 1.8.38 veröffentlicht (30.04.24)


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste
Multivote-Funktion
#1
Hallo,
in den Umfragen stört es die User gemein, dass es nur zwei Möglichkeiten für Abstimmungen gibt.
Entweder jeder kann eine Stimme abgeben, oder jeder kann alle Optionen abstimmen.

Hat jemand für mich ein paar Ansätze, wie ich ein Plugin basteln kann, in dem der User, der die Umfrage erstellt, die Abstimmungsanzahl selektieren kann.

Das würde bspw. bedeuten, man erstellt eine Umfrage mit 10 Antwortmöglichkeiten, aber nur 5 sind erlaubt.

Ich will kein komplettes Plugin, mir würde es bestimmt reichen, wenn ich ein paar Ansätze bekommen könnte.

Vielen Dank vorab.
Zitieren
#2
Hallo tomtom,

bei deinem Problem kann ich dir leider nicht helfen, aber dafür habe ich habe ein neues für dich, sorry Big Grin

Als Gast wollte ich deine Forensuche benutzen und bekam folgende Fehlermeldung:
Zitat:Parse error: syntax error, unexpected ',' in /www/htdocs/w00c0878/forum/addfiles/seite.php on line 108

Gruß
Loone

p.s. Ich sehe gerade, du hast 2 "Suche" Links. Ich meine den zwischen "Nutzungsbedingungen" und "Haftpflicht".
Zitieren
#3
Du müsstest vermutlich auf Javascript ausweichen um die ausgewählten Boxen zu überprüfen. z.b. so

PHP-Code:
function CheckCheckboxes(j){
    var 
elLength document.getElementsByTagName('input').length;
    var 
max 3;
    var 
first 0;
    var 
checks 0;
    for (
i=0elLengthi++)
    {
        var 
type document.getElementsByTagName('input')[i].type;
        if (
type=="checkbox")
        {
            
first=i;
            
i=elLength;
        }
    }
    for (
i=0elLengthi++)
    {
        var 
type2 document.getElementsByTagName('input')[i].type;
        if (
type2=="checkbox" && document.getElementsByTagName('input')[i].checked)
        {
            
checks checks 1;
            if(
type2=="checkbox" && checks >= max)
            {
                
1;
                
document.getElementsByTagName('input')[j].checked false;
            }
        }
    }
                


Ich bin ein absoluter js Anfänger und man kann das sicher auch eleganter lösen. Soviel zur Auswahl. Zusätzlich müsstest du bei der poll-erstellung ein neues Feld einbauen, bei der man eine max Anzahl an Antworten vorgeben kann. Diese müsstest du dann ebenfalls in die js-funktion übergeben und dann als max-wert nehmen.

Außerdem bräuchtest du vermutlich ein neues Template, welches die die checkboxen anpasst. Dieses Template könnte etwa so aussehen.

PHP-Code:
<tr>
<
td class="trow1" width="1%"><input type="checkbox" class="checkbox" name="option[{$number}]" id="option_{$number}value="1" onClick="CheckCheckboxes($number);" /></td>
<
td class="trow2" colspan="3">{$option}</td>
</
tr


Dann musst man vermutlich noch die showthread.php anpassen und die neue "semi-multi" dort auch irgendwie bekannt machen. Die entsprechende Stelle sieht im Moment noch so aus

PHP-Code:
if($poll['multiple'] == 1)
                {
                    eval(
"\$polloptions .= \"".$templates->get("showthread_poll_option_multiple")."\";");
                }
                else
                {
                    eval(
"\$polloptions .= \"".$templates->get("showthread_poll_option")."\";");
                } 

dort müsste man halt dann noch eine Abfrage auf die von dir festgelegte Variable machen
PHP-Code:
also if($poll['semi'] == 1)
                    eval(
"\$polloptions .= \"".$templates->get("showthread_poll_option_semi")."\";");
                } 

Aber wie gesagt, dass habe ich alles nicht selber ausgetestet (bis auf das js). So würde ich halt vorgehen und mich rantasten. Vermutlich muss man auch in der poll.php Anpassungen durchführen. Leider fehlt mir hier noch die Erfahrung. Aber das js hat zumindest in meiner Testumgebung funktioniert. Sollte ein User aber kein JS erlauben, dann hast du auch wieder ein Problem und müsstest diese irgendwie abfangen.

Fazit: Meiner Meinung nach sehr viel Aufwand, vor allem im Hinblick auf eventuelle Updates bei mybb. Daher würde ich lieber weiter ein fertiges plugin suchen Smile
Zitieren
#4
So, mal ein kleines Update. Ich habe das ganze nun erfolgreich in der Testumgebung eingespielt. jedoch habe ich dafür
- einen weiteren DB-Eintrag in der poll Tabelle (maxvotes)
- diverse Templates anpassen müssen
- die poll.php und showthread.php anpassen müssen.


testen kannst du es hier http://theandroidblog.de/index.php

benuter: mybb
passwort: 12345678

Wenn du dir den Aufwand wirklich machen willst, dann kann ich dir später mal die Änderungen bzw. die geänderten Files raus suchen. Wie bereits im ersten Beitrag erwähnt, geht das ganze auch nur mit aktiviertem js. Du müsstest daher überprüfen, ob der User js aktiviert hat und nur in diesem Fall die Umfrage anzeigen lassen. Wenn er es nicht aktiviert hat, dann müsstes du ihm eine entsprechende Meldung ausgeben.
Zitieren
#5
(22.01.2011, 13:44)Loone schrieb: bei deinem Problem kann ich dir leider nicht helfen, aber dafür habe ich habe ein neues für dich, sorry Big Grin

Hallo Loone,
vielen Dank für den Hinweis, das muss beim letzten Update auf 1.6.1 passiert sein. Habe es sofort geändert.

Hallo RedParkz,
hey, das ist schon fast mehr als ich wollte Big Grin

Nein, wirklich vielen Dank, dass sieht gut aus.

Mit der Anpassung wird kein Problem, da ich mir daraus ein Plugin basteln will.
Die Problem bei den Updates/Upgrades sind einfach zu groß und viel zu aufwendig.

Wenn Du mir die Inhalte für die Template- und Dateiänderungen gibst, würde das sehr helfen.

(23.01.2011, 12:44)RedParkz schrieb: testen kannst du es hier http://theandroidblog.de/index.php

Vielen Dank nochmals, klappt einwandfrei, wie ich mir das vorgestellt habe Smile

Je mehr ich mich damit beschäftige desto mehr finde ich auch, wie wichtig diese Funktion ist. Finde gar, dass es Standard sein sollte.

Zitieren
#6
Änderungen an der SQL
in der polls-datenbank muss ein neues Feld mit der Bezeichnung maxvotes eingefügt werden

Javascript für polls
Code:
<script type="text/javascript" language="javascript">
<!-- //
function CheckCheckboxes(j, maxvotes){
    var elLength = document.getElementsByTagName('input').length;
    var max = maxvotes;
    var first = 0;
    var checks = 0;
    for (i=0; i < elLength; i++)
    {
        var type2 = document.getElementsByTagName('input')[i].type;
        if (type2=="checkbox" && document.getElementsByTagName('input')[i].checked)
        {
            checks = checks + 1;
            if(type2=="checkbox" && checks > max)
            {
                j = j + 1;
                document.getElementsByTagName('input')[j].checked = false;
            }
        }
    }
                
}

Template-Änderungen:

polls_editpoll

PHP-Code:
<html>
<
head>
<
title>{$mybb->settings['bbname']} - {$lang->edit_poll}</title>
{
$headerinclude}
</
head>
<
body>
{
$header}
{
$preview}
<
form action="moderation.php" method="post">
<
input type="hidden" name="my_post_key" value="{$mybb->post_code}/>
<
table border="0" cellspacing="{$theme['borderwidth']}cellpadding="{$theme['tablespace']}class="tborder">
<
tr>
<
td class="thead" colspan="3"><strong>{$lang->delete_poll}</strong></td>
</
tr>
<
tr>
<
td class="trow1" style="white-space: nowrap"><input type="checkbox" class="checkbox" name="delete" value="1" tabindex="9" /><strong>{$lang->delete_q}</strong></td>
<
td class="trow1" width="100%">{$lang->delete_note}<br /><span class="smalltext">{$lang->delete_note2}</span></td>
<
td class="trow1" style="white-space: nowrap"><input type="submit" class="button" name="submit" value="{$lang->delete_poll}tabindex="10" /></td>
</
table>
<
input type="hidden" name="action" value="do_deletepoll" />
<
input type="hidden" name="tid" value="{$tid}/>
</
form>
<
br />
<
form action="polls.php" method="post">
<
input type="hidden" name="my_post_key" value="{$mybb->post_code}/>
<
table border="0" cellspacing="{$theme['borderwidth']}cellpadding="{$theme['tablespace']}class="tborder">
<
tr>
<
td class="thead" colspan="2"><strong>{$lang->edit_poll}</strong></td>
</
tr>
{
$loginbox}
<
tr>
<
td class="trow2"><strong>{$lang->question}</strong></td>
<
td class="trow2"><input type="text" class="textbox" name="question" size="40" maxlength="240" value="{$question}/></td>
</
tr>
<
tr>
<
td class="trow1" valign="top"><strong>{$lang->num_options}</strong><br /><span class="smalltext">{$lang->max_options} {$mybb->settings['maxpolloptions']}</span></td>
<
td class="trow1"><input type="text" class="textbox" name="numoptions" size="10" value="{$numoptions}/>&nbsp;&nbsp;<input type="submit" class="button" name="updateoptions" value="{$lang->update_options}/></td>
</
tr>
<
tr>
<
td class="trow2" valign="top"><strong>{$lang->poll_options}</strong></td>
<
td class="trow2"><span class="smalltext">{$lang->poll_options_note}</span>
<
table border="0" cellspacing="0" cellpadding="0">
{
$optionbits}
</
table>
</
td>
</
tr>
<
tr>
<
td class="trow1" valign="top"><strong>{$lang->options}</strong></td>
<
td class="trow1"><span class="smalltext">
<
label><input type="checkbox" class="checkbox" name="postoptions[multiple]" value="1" {$postoptionschecked['multiple']} />&nbsp;{$lang->option_multiple}</label><br />
<
label><input type="checkbox" class="checkbox" name="postoptions[public]" value="1" {$postoptionschecked['public']} />&nbsp;{$lang->option_public}</label><br />
<
label><input type="checkbox" class="checkbox" name="postoptions[closed]" value="1" {$postoptionschecked['closed']} />&nbsp;{$lang->option_closed}</label>
</
span>
</
td>
</
tr>
<
tr>
<
td class="trow2" valign="top"><strong>Maximale Antworten</strong><br /><span class="smalltext">Begrenzen der maximalen Auswahlmöglichkeiten</span></td>
<
td class="trow2"><input type="text" class="textbox" name="maxvotes" value="{$maxvotes}/> Antworten</td>
</
tr>
<
tr>
<
td class="trow2" valign="top"><strong>{$lang->poll_timeout}</strong><br /><span class="smalltext">{$lang->timeout_note}</span></td>
<
td class="trow2"><input type="text" class="textbox" name="timeout" value="{$timeout}/> {$lang->days_after} {$polldate}</td>
</
tr>
</
table>
<
br />
<
div align="center">
<
input type="submit" class="button" name="submit" value="{$lang->update_poll}/>
</
div>
<
input type="hidden" name="action" value="do_editpoll" />
<
input type="hidden" name="pid" value="{$pid}/>
</
form>
{
$footer}
</
body>
</
html

polls_newpoll:
PHP-Code:
<html>
<
head>
<
title>{$mybb->settings['bbname']} - {$lang->post_new_poll}</title>
{
$headerinclude}
</
head>
<
body>
{
$header}
{
$preview}
<
form action="polls.php" method="post">
<
input type="hidden" name="my_post_key" value="{$mybb->post_code}/>
<
table border="0" cellspacing="{$theme['borderwidth']}cellpadding="{$theme['tablespace']}class="tborder">
<
tr>
<
td class="thead" colspan="2"><strong>{$lang->post_new_poll}</strong></td>
</
tr>
{
$loginbox}
<
tr>
<
td class="trow2"><strong>{$lang->question}</strong></td>
<
td class="trow2"><input type="text" class="textbox" name="question" size="40" maxlength="240" value="{$question}/></td>
</
tr>
<
tr>
<
td class="trow1" valign="top"><strong>{$lang->num_options}</strong><br /><span class="smalltext">{$lang->max_options} {$mybb->settings['maxpolloptions']}</span></td>
<
td class="trow1"><input type="text" class="textbox" name="polloptions" size="10" value="{$polloptions}/>&nbsp;<input type="submit" class="button" name="updateoptions" value="{$lang->update_options}/></td>
</
tr>
<
tr>
<
td class="trow2" valign="top"><strong>{$lang->poll_options}</strong></td>
<
td class="trow2"><span class="smalltext">{$lang->poll_options_note}</span>
<
table border="0" cellspacing="0" cellpadding="0">
{
$optionbits}
</
table>
</
td>
</
tr>
<
tr>
<
td class="trow1" valign="top"><strong>{$lang->options}</strong></td>
<
td class="trow1"><span class="smalltext">
<
label><input type="checkbox" class="checkbox" name="postoptions[multiple]" value="1" {$postoptionschecked['multiple']} />&nbsp;{$lang->option_multiple}</label><br />
<
label><input type="checkbox" class="checkbox" name="postoptions[public]" value="1" {$postoptionschecked['public']} />&nbsp;{$lang->option_public}</label><br />
</
td>
<
tr>
<
td class="trow2" valign="top"><strong>Maximale Antworten</strong><br /><span class="smalltext">Begrenzen der maximalen auswahlmöglichkeiten</span></td>
<
td class="trow2"><input type="text" class="textbox" name="maxvotes" value="{$maxvotes}/> Antworten</td>
</
tr>
</
td>
</
tr>
<
tr>
<
td class="trow2" valign="top"><strong>{$lang->poll_timeout}</strong><br /><span class="smalltext">{$lang->timeout_note}</span></td>
<
td class="trow2"><input type="text" class="textbox" name="timeout" value="{$timeout}/> Tage</td>
</
tr>
</
table>
<
br />
<
div align="center"><input type="submit" class="button" name="submit" value="{$lang->post_new_poll}/></div>
<
input type="hidden" name="action" value="do_newpoll" />
<
input type="hidden" name="tid" value="{$tid}/>
</
form>
{
$footer}
</
body>
</
html

neues Template - showthread_poll_option_maxvotes
PHP-Code:
<tr>
<
td class="trow1" width="1%"><input type="checkbox" class="checkbox" name="option[{$number}]" id="option_{$number}value="1" onClick="CheckCheckboxes($number$maxvotes);" /></td>
<
td class="trow2" colspan="3">{$option}</td>
</
tr

showthread.php

suche nach
PHP-Code:
if($poll['multiple'] == 1)
                {
                    eval(
"\$polloptions .= \"".$templates->get("showthread_poll_option_multiple")."\";");
                }
                else
                {
                    eval(
"\$polloptions .= \"".$templates->get("showthread_poll_option")."\";");
                } 
und ersetze es durch:
PHP-Code:
                if($poll['multiple'] == 1)
                {
                    if(
$poll['maxvotes'] != 0)
                    {
                        eval(
"\$polloptions .= \"".$templates->get("showthread_poll_option_maxvotes")."\";");
                    }
                    else
                    {
                        eval(
"\$polloptions .= \"".$templates->get("showthread_poll_option_multiple")."\";");

                    } 
polls.php am besten eine Differenzanalyse mit notepad ++ machen. Dann siehst du die Änderungen sofort. Das sind viele kleinere die ich hier nicht alle raussuchen will. Bitte zuerst in einer Testumgebung testen Wink Ich hoffe, ich habe nichts vergessen.


Angehängte Dateien
.php   polls.php (Größe: 23,33 KB / Downloads: 5)
Zitieren
#7
Hallo RedParkz,
das sieht gut aus, werde mich da die Woche ran machen, das Plugin zu erstellen.

Vielen Dank für Deine Hilfe!!!
Zitieren
#8
Hallo RedParkz,
leider habe ich nun doch ein Problem.
Alles installiert, der Wert wird in der Datenbank eingetragen und eine Fehlermeldung bekomme ich auch nicht.
Nur leider funktioniert es bei mir nicht.

Ich vermute dass es an dem js Script liegt, finde aber den Fehler nicht.

Das Script habe ich versucht an unterschiedlichen Stellen zu intigrieren, unter anderem auch im "headerinclude", aber immer ohne Erfolg.

Hast Du eine Idee, woran es liegen kann?
Zitieren