Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 03-30-2008, 11:52 PM
RetroDreams RetroDreams is offline
 
Join Date: Nov 2002
Posts: 238
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Validating multiple selects?

I'm writing a little script that will allow my members to rank the Top 25 college football teams each week during the season.

I'm not sure how to create the ranking page, so I came up with an idea to have 25 drop down selection menus but I'm wondering what the best way would be to make sure the end user does not select the same team twice? Has anyone done anything similar and what did they use to do this?

If there is a better way to have the end user make the selections, I'm all for it. However, keep in mind there are 120 teams to choose from.
Reply With Quote
  #2  
Old 03-31-2008, 12:01 AM
Adrian Schneider's Avatar
Adrian Schneider Adrian Schneider is offline
 
Join Date: Jul 2004
Posts: 2,528
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Compare array with unique array...
PHP Code:
$values = array(35, ... );
$set_contains_dupes $values === array_unique($values); 
This code I wrote last year might help you with some other automation, but here's what I used to validate a submitted team (quite complex rules) :

PHP Code:
/**
 * Checks a submitted team (create/edit) for validity. 
 * 
 * @return    mixed        true on success; string on failure (error msg)
 */
protected function verifySubmittedTeam()
{
    
$variablePositions = array('batsman''bowler');
    
    
$data = array();
    
$totalPlayers = array();
    
    
$wicketkeepers $this->countWicketKeepers();

    foreach (
$this->Player->positions as $identifier => $bit)
    {
        
####################################################################
        // Main Team
        
        
$data[$identifier] = $this->vb->input->clean_gpc(
            
'p'
            
$identifier
            
TYPE_ARRAY_UINT
        
);
        
        
// Removing Invalid/Empty Players
        
foreach ($data[$identifier] as $index => $playerid)
        {
            
$name $this->availablePlayers[$playerid]['name'];
            
            if (!
$playerid)
            {
                unset(
$data[$identifier][$index]);
            }
            else if (empty(
$this->availablePlayers[$playerid]))
            {
                return 
"$name is not an available player for this game.";
            }
            else if (!(
$this->availablePlayers[$playerid]['positions'] & $bit))
            {
                return 
"$name is not an available $identifier for this game.";
            }
            
            
$totalPlayers[$playerid]++;
        }
    
        
$count    count($data[$identifier]);
        
$required $this->Team->slots[1][$identifier];
        
        
// Check player counts for static positions
        
if (
            
$count != $required and (
                
$this->game['type'] == or (
                    
in_array($this->game['type'], array(13)) and 
                    !
in_array($identifier$variablePositions)
                )
            )
        )
        {
            
$title =  $this->Player->positionText[$identifier];
                
            return 
"You have selected $count players for the $title position.  A valid team
            must contain exactly 
$required.";
        }
        
        
$data['special'][$identifier] = $this->vb->input->clean_gpc(
            
'p'
            
"special_$identifier",
            
TYPE_ARRAY_UINT
        
);
        
        
####################################################################
        // Reserves
        
        
$data["r_$identifier"] = $this->vb->input->clean_gpc(
            
'p'
            
"r_$identifier"
            
TYPE_ARRAY_UINT
        
);    
        
        
// Removing Invalid/Empty Players
        
foreach ($data["r_$identifier"] as $index => $playerid)
        {
            
$name $this->availablePlayers[$playerid]['name'];
            
            if (!
$playerid and !($identifier == 'wicketkeeper' and  $wicketkeepers == and $index == 1))
            {
                unset(
$data["r_$identifier"][$index]);
                return 
"Please select a player for reserve $identifier # " . ($index 1) . ".";
            }
            
            if (
$playerid and empty($this->availablePlayers[$playerid]))
            {
                return 
"$name is not an available player for this game.";
            }
            
            
// Error on Unavailable Position
            
if ($playerid and !($this->availablePlayers[$playerid]['positions'] & $bit))
            {
                return 
"$name is not an available $identifier for this game.";
            }
            
            
$totalPlayers[$playerid]++;
        }
        
        
        
// Incorrect # of Players
        
if (($count count($data["r_$identifier"])) != ($required $this->Team->slots[1]["r_$identifier"]))
        {
            if (!(
                
$identifier == 'wicketkeeper' and 
                
$wicketkeepers == and 
                
$required == and
                
$count == 1
            
))
            {
                
$title 'Reserve ' $this->Player->positionText[substr($identifier2)];

                return 
"You have selected $count players for the $identifier position.  A valid team
                must contain exactly 
$required.";
            }
        }
    }
    
    
// Check variable ODI positions
    
if ($this->game['type'] == or $this->game['type'] == 3)
    {
        
$numBatsmen count($data['batsman']);
        
$numBowlers count($data['bowler']); 
        
        if (
$numBatsmen == 5)
        {
            if (
$numBowlers != 3)
            {
                return 
'With 5 batsmen, you must have <strong>3</strong> bowlers.';
            }
        }
        else if (
$numBatsmen == 4)
        {
            if (
$numBowlers != 4)
            {
                return 
'With 4 batsmen, you must have <strong>4</strong> bowlers.';
            }
        }
        else
        {
            return 
'You must have either 4 or 5 batsmen for your team to be valid.';
        }            
    }
        
    foreach (
$totalPlayers as $playerid => $num)
    {
        if (
$playerid and $num 1)
        {
            
$name $this->availablePlayers[$playerid]['name'];
            
            return 
"You can only use each player once; $name is in $num positions.";
        }
    }
    
    
$bonus = array();
    
    foreach (
$data['special'] as $identifier => $players)
    {
        foreach (
$players as $num => $type)
        {
            if (
$type)
            {
                if (
strpos($identifier'r_') !== false)
                {
                    return 
'You may only select bonuses for main players.';
                }
                
                if (empty(
$data[$identifier][$num]))
                {
                    continue;
                }
                
$bonus[$data[$identifier][$num]] = $type;
            }
        }
    }
    
    
$this->bonusPlayers $bonus;
    unset(
$data['special'], $bonus);
    
    
$expected = array(11112);
    
    
$sorted array_values($this->bonusPlayers);
    
sort($sorted);
    
    if (
$sorted !== $expected)
    {
        
$assoc = array(=> 'bonus players'=> 'captains');
        
$selected array_count_values($sorted) + array(=> 0=> 0);
        
        return 
"You must pick 4 bonus players and one captain; you have
            
$selected[1] $assoc[1] and $selected[2] $assoc[2].";
    }
    


    
$this->submittedTeam $data;
    return 
true;
    

Reply With Quote
  #3  
Old 03-31-2008, 12:06 AM
RetroDreams RetroDreams is offline
 
Join Date: Nov 2002
Posts: 238
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I'm going to be honest and say I have no idea on how to implement something like this. There has got to be a simple solution out there, or maybe a different method of input that wouldn't allow for duplicate choices in the first place?

On another forum, someone pointed me to the site below. Have you ever messed around with anything like that before?

http://tool-man.org/examples/sorting.html
Reply With Quote
  #4  
Old 03-31-2008, 12:10 AM
Adrian Schneider's Avatar
Adrian Schneider Adrian Schneider is offline
 
Join Date: Jul 2004
Posts: 2,528
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

The second part was to help give you some ideas... not really to use it.

Let's say the input name is user[], and then value is the user id. That'll pass it as an array, and then you could pretty simply use my first piece of code.

PHP Code:
$users $vbulletin->input->clean_gpc('p''user'TYPE_ARRAY_UINT);

if (
$users !== array_unique($users))
{
    
// something was submitted twice.

Reply With Quote
  #5  
Old 03-31-2008, 12:15 AM
RetroDreams RetroDreams is offline
 
Join Date: Nov 2002
Posts: 238
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I know that wasn't the code, I was just stating that it was probably too involved. I just googled drag & drop team rankings and came across this. Do you know what it would entain to make something similar?

http://www.faniq.com/poll/2008-MLB-P...ANKINGS-188143
Reply With Quote
  #6  
Old 03-31-2008, 12:17 AM
Adrian Schneider's Avatar
Adrian Schneider Adrian Schneider is offline
 
Join Date: Jul 2004
Posts: 2,528
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

The simplest way, IMO, is put a checkbox by each players name.

HTML Code:
<div><input type="checkbox" name="player[]" value="$playerid" /> $playername</div>
Far easier to implement than custom javascript libraries like that.
Reply With Quote
  #7  
Old 03-31-2008, 12:19 AM
RetroDreams RetroDreams is offline
 
Join Date: Nov 2002
Posts: 238
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Here is another interesting one.

http://sports.espn.go.com/chat/sport...Id=2&listId=22

--------------- Added [DATE]1206927768[/DATE] at [TIME]1206927768[/TIME] ---------------

Quote:
Originally Posted by SirAdrian View Post
The simplest way, IMO, is put a checkbox by each players name.

HTML Code:
<div><input type="checkbox" name="player[]" value="$playerid" /> $playername</div>
Far easier to implement than custom javascript libraries like that.
How will that work? For each "pick" it needs to return teamid, rank and points.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 01:36 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.04103 seconds
  • Memory Usage 2,309KB
  • Queries Executed 13 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (2)bbcode_html
  • (3)bbcode_php
  • (1)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (7)post_thanks_box
  • (7)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (7)post_thanks_postbit_info
  • (7)postbit
  • (7)postbit_onlinestatus
  • (7)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete