Drop Down List to Use Item Messed Up

Forum
Last Post
Threads / Messages

Abronsyth

A Headache Embodied
Member
Joined
Aug 25, 2011
Messages
1,012
Points
36
Location
NY
Mysidian Dollar
73,285
Okay, this is weird.

The drop down list, when you go through to use an item, is showing me my adoptables' ID number (1), not name (Snowball), and when I got to use it, I end up with this error:
"Adoptable ID SnowBall does not exist or does not belong to the owner specified..."
As though the name (Snowball) is being selected when the ID (1) should be. It is almost like the two have changed positions.

Here's what I mean:
be9210e64c12fcc3c11849946356b710.gif


So, if someone could help just let me know which files you'd need to see. Here's my class_dropdownlist.php, just in case:
PHP:
<?php

use Resource\Native\String;
use Resource\Collection\Collective;
use Resource\Collection\LinkedList;
use Resource\Collection\LinkedHashMap;

/**
 * The DropdownList Class, extends from abstract GUIContainer class.
 * It specifies a standard single-item dropdown list.
 * @category Resource
 * @package GUI
 * @author Hall of Famer 
 * @copyright Mysidia Adoptables Script
 * @link http://www.mysidiaadoptables.com
 * @since 1.3.3
 * @todo Not much at this point.
 *
 */

class DropdownList extends GUIContainer{
	
	/**
	 * The autofocus property, checks if the input component is autofocused.
	 * @access protected
	 * @var Boolean
    */
	protected $autofocus = FALSE;
	
	/**
	 * The disabled property, checks if the input component is disabled.
	 * @access protected
	 * @var Boolean
    */
	protected $disabled = FALSE;
	
    /**
     * Constructor of SelectList Class, which assigns basic property to this list
	 * @param String  $name
	 * @param ArrayList  $components
	 * @param String  $identity
	 * @param Event  $event
     * @access public
     * @return Void
     */
	public function __construct($name = "", $components = "", $identity = "", $event = ""){
	    if(!empty($name)){
		    $this->setName($name);
			$this->setID($name);
		}
		if(!empty($identity)) $this->select($identity);
		if(!empty($event)) $this->setEvent($event);
		
		parent::__construct($components);
        $this->renderer = new ListRenderer($this);		
	}
	
	/**
     * The isAutofocus method, getter method for property $autofocus.    
     * @access public
     * @return Boolean
     */
	public function isAutofocus(){
	    return $this->autofocus;    
	}

	/**
     * The setAutofocus method, setter method for property $autofocus.
	 * @param Boolean  $autofocus      
     * @access public
     * @return Void
     */
	public function setAutofocus($autofocus = TRUE){
	    $this->autofocus = $autofocus;
		$this->setAttributes("Autofocus");
	}	
	
	/**
     * The isDisabled method, getter method for property $disabled.    
     * @access public
     * @return Boolean
     */
	public function isDisabled(){
	    return $this->disabled; 
	}

	/**
     * The setDisabled method, setter method for property $disabled.
	 * @param Boolean  $disabled       
     * @access public
     * @return Void
     */
	public function setDisabled($disabled = TRUE){
	    $this->disabled = $disabled;
		$this->setAttributes("Disabled");
	}

	/**
     * The add method, sets an Option Object to a specific index.
	 * @param Option|OptGroup  $option
     * @param int  $index	 
     * @access public
     * @return Void
     */	
	public function add($option, $index = -1){
	    if(!($option instanceof Option) and !($option instanceof OptGroup)) throw new GUIException("Cannot add a non-option type component to dropdown list.");
	    parent::add($option, $index);			
	}
	
	/**
     * The select method, determines which option in this list should be set selected.
	 * @param String  $identity   
     * @access public
     * @return Void
     */
	public function select($identity){
	    foreach($this->components as $components){
		    if($components->getValue() == $identity) $components->setSelected(TRUE);
		}		
	}
	
	/**
     * The fill method, fill in this dropdownlist with options from database starting at a given index.
	 * To use it, you need PDO or MySQLi to fetch all rows with one or two properties to serve as collection list or map.
	 * @param Collective $collection
	 * @param String  $identity
     * @param Int  $index	 
     * @access public
     * @return Void
     */
	public function fill(Collective $collection, $identity = "", $index = -1){
		if($index != -1) $this->currentIndex = $index;		
		if($collection instanceof LinkedList) $this->fillList($collection, $identity, $index);
        elseif($collection instanceof LinkedHashMap) $this->fillMap($collection, $identity, $index);
        else throw new GUIException("Cannot fill option objects inside this dropdownlist");
	}

	/**
     * The fillList method, fill in this dropdownlist with elements from a LinkedList.
	 * @param LinkedList  $list
	 * @param String  $identity
     * @param Int  $index	 
     * @access protected
     * @return Void
     */
    protected function fillList(LinkedList $list, $identity = "", $index = -1){
        $iterator = $list->iterator();
        while($iterator->hasNext()){
            $field = (string)$iterator->next();
 		    $option = new Option($field, $field);
			if($option->getValue() == $identity) $option->setSelected(TRUE);
		    $this->add($option, $index);
			if($index != -1) $index++;           
        }        
    }

	/**
     * The fillList method, fill in this dropdownlist with entries from a LinkedHashMap.
	 * @param LinkedHashMap  $map
	 * @param String  $identity
     * @param Int  $index	 
     * @access protected
     * @return Void
     */
    protected function fillMap(LinkedHashMap $map, $identity = "", $index = -1){
        $iterator = $map->iterator();
        while($iterator->hasNext()){
            $field = $iterator->next();
 		    $option = new Option((string)$field->getKey(), (string)$field->getValue()); 
			if($option->getValue() == $identity) $option->setSelected(TRUE);
		    $this->add($option, $index);
			if($index != -1) $index++;           
        }        
    }

	/**
     * Magic method __toString for DropdownList class, it reveals that the object is a dropdown list.
     * @access public
     * @return String
     */
    public function __toString(){
	    return new String("This is an instance of Mysidia DropDownList class.");
	}    
}    
?>
 
On mine it actually shows the name instead of the id. Does this happen with all dropdown lists? Can you post your inventoryview.php and inventory.php files? (just the uses() function for example)
 
It's driving me nuts, haha XD ((Took my 6 months to learn html and css, taken me 3+ years and still haven't learned php...someday I'll be able to solve these issues. Soooome day.)).

Inventoryview.php:
PHP:
	public function uses(){
		$mysidia = Registry::get("mysidia");
		$document = $this->document;	
		if($mysidia->input->post("aid")){
		    $message = (string)$this->getField("message");
		    $document->setTitle($mysidia->lang->global_action_complete);
            $document->addLangvar($message);
            return;		
		}
		
		$petMap = $this->getField("petMap");
		$document->setTitle($mysidia->lang->select_title);
        $document->addLangvar($mysidia->lang->select);		
		$chooseFrom = new Form("chooseform", "uses", "post");
		
		$adoptable = new DropdownList("aid");
		$adoptable->add(new Option("None Selected", "none"));
        if($petMap->size() > 0){
            $iterator = $petMap->iterator();
            while($iterator->hasNext()){
                $adopt = $iterator->nextEntry();
                $adoptable->add(new Option($adopt->getValue(), $adopt->getKey()));
            }
        }		
		$chooseFrom->add($adoptable);
		
		$chooseFrom->add(new PasswordField("hidden", "itemname", $mysidia->input->post("itemname")));
		$chooseFrom->add(new PasswordField("hidden", "validation", "valid"));
		$chooseFrom->add(new Button("Choose this Adopt", "submit", "submit"));
        $document->add($chooseFrom);
	}

Inventory.php:
PHP:
	public function uses(){
		$mysidia = Registry::get("mysidia");
		$document = $mysidia->frame->getDocument();
		$item = new PrivateItem($mysidia->input->post("itemname"), $mysidia->user->username);   
        if($item->iid == 0) throw new ItemException("use_none");
		
		if($mysidia->input->post("aid")){
		    if(!$item->checktarget($mysidia->input->post("aid")) or $mysidia->input->post("validation") != "valid"){
			    throw new ItemException("use_fail");
            }
		    elseif(!$item->randomchance()){
                $item->remove();
				throw new ItemException("use_effect");
            }
            else{ 
			    $message = $item->apply($mysidia->input->post("aid")); 
				$this->setField("message", $message);
			}	
            return;			
		}

        $stmt = $mysidia->db->select("owned_adoptables", array("aid", "name"), "owner = '{$mysidia->user->username}'");
        $map = $mysidia->db->fetchMap($stmt);
		$this->setField("petMap", $map);
	}
 
It's driving me nuts, haha XD ((Took my 6 months to learn html and css, taken me 3+ years and still haven't learned php...someday I'll be able to solve these issues. Soooome day.)).

Haha php is a whole programming language, it's normal to take longer to learn! You gotta go step by step

In this part:

Inventoryview.php
PHP:
$adoptable->add(new Option($adopt->getValue(), $adopt->getKey()));

Do you have any idea why the value and the key are inverted? It's basically creating an option with the text shown to the user as $adopt->getValue() (the adoptable's id) and the text sent to the server as $adopt->getKey() (the adoptable's name).
Doing this should fix it:

PHP:
//to show the id
$adoptable->add(new Option($adopt->getValue(), $adopt->getValue()));

//or to show the name instead
$adoptable->add(new Option($adopt->getKey(), $adopt->getValue()));

But I don't know why it was inverted in the first place, so I don't know if there's any other system associated with that that might break...
 
Last edited:

Similar threads

Users who are viewing this thread

  • Forum Contains New Posts
  • Forum Contains No New Posts

Forum statistics

Threads
4,277
Messages
33,118
Members
1,602
Latest member
BerrieMilk
BETA

Latest Threads

Latest Posts

Top