1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Removing Empty Fields from ARRAY_SIMPLE input

Discussion in 'XenForo Development Discussions' started by Gossamer, Jul 30, 2016.

  1. Gossamer

    Gossamer Active Member

    I'm currently working on an input form that creates an array of urls. However, it's apparently saving a bunch of empty fields into that array that I don't want.

    This is my template code:
    Code:
    <xen:title>{xen:phrase goss_member_awards_of_x, 'username={$user.username}'}</xen:title>
    
    <xen:form action="{xen:adminlink 'member-awards/save', $user}" class="AutoValidator" data-redirect="on">
        <fieldset>
            <xen:controlunit label="{xen:phrase goss_member_award_link}:">
                <ul class="AwardList">
                    <xen:foreach loop="$memberAwardUrls" key="$choice" value="$text">
                        <li>
                            <input type="text" name="goss_memberaward_urls[]" value="{$text}" class="textCtrl" placeholder="{xen:phrase image_url}" size="50" />
                        </li>
                    </xen:foreach> 
                    <li>
                        <input type="text" name="goss_memberaward_urls[]" value="{$text}" class="textCtrl" placeholder="{xen:phrase image_url}" size="50" />
                    </li> 
               
                </ul>
                <input type="button" value="{xen:phrase goss_member_awards_add_additional_url}" class="button smallButton FieldAdder" data-source="ul.AwardList li" />
    
            </xen:controlunit>
        </fieldset>
       
        <xen:submitunit save="{xen:phrase save_field}">
    
        </xen:submitunit>
    </xen:form>
    My ControllerAdmin:
    PHP:
        public function actionUser()
        {
            
    $userId $this->_input->filterSingle('user_id'XenForo_Input::UINT);
           
            
    $userModel $this->_getUserModel();
            
    $user $userModel->getUserById($userId);
           
            
    $urls $user['goss_memberaward_urls'];
           
            if (!
    is_array($urls))
            {
                
    $urls = ($urls XenForo_Helper_Php::safeUnserialize($urls) : array());
            }   
           
            
    $viewParams = array(
                
    'user' => $user,
                
    'memberAwardUrls' => $urls
            
    );
           
            return 
    $this->responseView(null'goss_memberawards_user'$viewParams);
        }
       
        public function 
    actionSave()
        {       
            
    $userId $this->_input->filterSingle('user_id'XenForo_Input::UINT);
           
           
            
    $awardurl $this->_input->filter(array(
                
    'goss_memberaward_urls' => XenForo_Input::ARRAY_SIMPLE
            
    ));
           
            
    $dw XenForo_DataWriter::create('XenForo_DataWriter_User');
           
            
    $dw->setExistingData($userId);
           
            
    $dw->bulkSet($awardurl);
           
            
    $dw->save();
           
            
    //Send a response to the user, so he know that everything went fine with this action
            
    return $this->responseRedirect(
                        
    XenForo_ControllerResponse_Redirect::SUCCESS,
                        
    $this->getDynamicRedirect()
            );
        }
    And this is what it looks like:
    [​IMG]

    How can I make sure it's not saving information from the empty fields?
     
  2. Mike

    Mike XenForo Developer Staff Member

    I think you'd just want to loop through the input and remove the entries that are empty strings (or alternatively, only include those that are valid).

    In terms of your filtering, BTW, ARRAY_SIMPLE isn't technically what you want. You want:
    Code:
    array(XenForo_Input::STRING, 'array' => true)
    Which allows an array of strings.
     
    Gossamer likes this.
  3. Gossamer

    Gossamer Active Member

    Thanks! That worked. Here is my updated code:

    ControllerAdmin
    PHP:
        public function actionUser()
        {
            
    $userId $this->_input->filterSingle('user_id'XenForo_Input::UINT);
           
            
    $userModel $this->_getUserModel();
            
    $user $userModel->getUserById($userId);
           
            
    $urls $user['goss_memberaward_urls'];
           
            if (!
    is_array($urls))
            {
                
    $urls = ($urls XenForo_Helper_Php::safeUnserialize($urls) : array());
            }   
           
            
    $viewParams = array(
                
    'user' => $user,
                
    'memberAwardUrls' => $urls
            
    );
           
            return 
    $this->responseView(null'goss_memberawards_user'$viewParams);
        }
       
        public function 
    actionSave()
        {       
            
    $userId $this->_input->filterSingle('user_id'XenForo_Input::UINT);
           
           
            
    $awardurls $this->_input->filterSingle('goss_memberaward_urls'XenForo_Input::STRING, array('array' => true));
           
           
            
    $dw XenForo_DataWriter::create('XenForo_DataWriter_User');
           
            
    $dw->setExistingData($userId);
           
            
    $dw->setMemberAwardUrls($awardurls);
           
            
    $dw->save();
           
            
    //Send a response to the user, so he know that everything went fine with this action
            
    return $this->responseRedirect(
                        
    XenForo_ControllerResponse_Redirect::SUCCESS,
                        
    $this->getDynamicRedirect()
            );
        }
    DataWriter
    PHP:
        public function setMemberAwardUrls(array $urls)
        {
            
    $cleanUrls array_filter($urls);
           
            foreach (
    $cleanUrls AS $url)
            {
                if (
    $url === '')
                {
                    unset(
    $url[$value]);
                    continue;
                }
               
                if (
    strlen($url) > 200)
                {
                    
    $this->error(new XenForo_Phrase('please_enter_value_using_x_characters_or_fewer', array('count' => 200)));
                    return 
    false;
                }
            }
           
            
    $this->set('goss_memberaward_urls'$cleanUrls);
               
            return 
    true;
        }
    One last question. How can I validate that the value entered is a url?
     
  4. Mike

    Mike XenForo Developer Staff Member

    You can run:
    Code:
    Zend_Uri::check($value)
    And check the boolean return value.
     
    Gossamer likes this.
  5. Gossamer

    Gossamer Active Member

    Thank you!
     

Share This Page