We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 11650
    • 15 Posts
    Hey guys,

    So I’m still trying to get the hang of the CMS, although it’s very robust and easy to use.

    The problem I’m having is one of my snippets. In particular, my pagination file. It’s supposed to get the page numbers for large lists of items, but the script is actually stripping the filename from the url.

    for example...

    Let’s say you go to the Bed and Breakfasts page
    http://www.explorethebruce.com/bed-and-breakfasts.php

    Now you go all the way to the bottom and want to go to page 2 of the list. on the paginator at the bottom, the number two link goes to...
    http://www.explorethebruce.com/bed-and-breakfasts.php&page=2&ipp=25

    However, after you get to that page, the pagination links are broken. Any of the page number links now have the filename missing from the url...

    page 1 link...
    http://www.explorethebruce.com/?=&page=1&ipp=25

    page 3 link...
    http://www.explorethebruce.com/?=&page=3&ipp=25

    Both the links above were generated AFTER going to another page in the listing.

    So to sum it up, the paginator works fine until you go to one of the pages, then it screws up.

    Can someone take a look at the operationListing.php and paginator.class.php page I’ve included and tell me what I’ve done wrong? I’ve never done pagination before so I really have no frame of reference or experience to get it right.
      • 28042 ☆ A M B ☆
      • 24,524 Posts
      If you notice, your URL is lacking a ? in the first place. When you generate a URL with a query string, whether or not your first key-value pair starts with a ? depends on whether or not you are using Friendly URLs. If you are, the first one has to start with a ? while if you are not the first one cannot start with a ? since the index.php?id=xx is using the ?
        Studying MODX in the desert - http://sottwell.com
        Tips and Tricks from the MODX Forums and Slack Channels - http://modxcookbook.com
        Join the Slack Community - http://modx.org
        • 11650
        • 15 Posts
        Quote from: sottwell at Jul 29, 2010, 02:10 PM

        If you notice, your URL is lacking a ? in the first place. When you generate a URL with a query string, whether or not your first key-value pair starts with a ? depends on whether or not you are using Friendly URLs. If you are, the first one has to start with a ? while if you are not the first one cannot start with a ? since the index.php?id=xx is using the ?

        I get what you’re saying, but how would I go about fixing that? I didn’t make the operationListing.php page, someone else did. My PHP skill is not terribly high.

        I would be willing to pay anyone who can help me fix this problem. Say $25?
          • 28042 ☆ A M B ☆
          • 24,524 Posts
          Post the code so we can take a look at it. Use the # button above to enclose it in the proper forum tags so it’ll be easier to read.
            Studying MODX in the desert - http://sottwell.com
            Tips and Tricks from the MODX Forums and Slack Channels - http://modxcookbook.com
            Join the Slack Community - http://modx.org
            • 11650
            • 15 Posts
            Here’s the paginator file code. I also attached the operationListing.php and paginator.class.php files in a zip.

            paginator.class.php
            <?php
            
            class Paginator{
            	var $items_per_page;
            	var $items_total;
            	var $current_page;
            	var $num_pages;
            	var $mid_range;
            	var $low;
            	var $high;
            	var $limit;
            	var $return;
            	var $default_ipp = 25;
            	var $querystring;
            	
            	function Paginator()
            	{
            		$this->current_page = 1;
            		$this->mid_range = 7;
            		$this->items_per_page = (!empty($_GET['ipp'])) ? $_GET['ipp']:$this->default_ipp;
            	}
            
            	function paginate()
            	{
            		$newAddress = $_SERVER['REQUEST_URI'];
            			
            			$args = explode("&",$newAddress);
            			foreach($args as $arg)
            			{
            				$keyval = explode("=",$arg);
            				//if($keyval[0] != "page" And $keyval[0] != "ipp") $this->querystring .= "&" . $arg;	
            				//echo "<p>KeyVAL: ".$keyval[0]."</p>";
            				if($keyval[0] == 'page' || $keyval[0] == 'ipp')
            				{
            					$newAddress = changeArgumentValueInRequestURI( "page" ,  false ,$newAddress );
            					$newAddress = changeArgumentValueInRequestURI( "ipp" ,  false ,$newAddress );
            				}
            			}
            		
            		
            		
            		if($_GET['ipp'] == 'All')
            		{
            			$this->num_pages = ceil($this->items_total/$this->default_ipp);
            			$this->items_per_page = $this->default_ipp;
            		}
            		else
            		{
            			if(!is_numeric($this->items_per_page) OR $this->items_per_page <= 0) $this->items_per_page = $this->default_ipp;
            			$this->num_pages = ceil($this->items_total/$this->items_per_page);
            		}
            		$this->current_page = (int) $_GET['page']; // must be numeric > 0
            		if($this->current_page < 1 Or !is_numeric($this->current_page)) $this->current_page = 1;
            		if($this->current_page > $this->num_pages) $this->current_page = $this->num_pages;
            		$prev_page = $this->current_page-1;
            		$next_page = $this->current_page+1;
            
            		if($_GET)
            		{	
            		/*
            			$args = explode("&",$_SERVER['PHP_SELF']);
            			foreach($args as $arg)
            			{
            				
            				$keyval = explode("=",$arg);
            				//if($keyval[0] != "page" And $keyval[0] != "ipp") $this->querystring .= "&" . $arg;
            				
            				//echo "<p>KeyVAL: ".$keyval[0]."</p>";
            			}
            		*/
            		}
            
            		
            		if($_POST)
            		{
            			foreach($_POST as $key=>$val)
            			{
            				if($key != "page" And $key != "ipp") $this->querystring .= "&$key=$val";
            			}
            		}
            
            		if($this->num_pages > 10)
            		{
            			$this->return = ($this->current_page != 1 And $this->items_total >= 10) ? "<li class=\"btn_prev\"><a class=\"paginate\" href=\"$newAddress&page=$prev_page&ipp=$this->items_per_page$this->querystring\">« Previous</a></li> ":"<li>« Previous</li> ";
            
            			$this->start_range = $this->current_page - floor($this->mid_range/2);
            			$this->end_range = $this->current_page + floor($this->mid_range/2);
            
            			if($this->start_range <= 0)
            			{
            				$this->end_range += abs($this->start_range)+1;
            				$this->start_range = 1;
            			}
            			if($this->end_range > $this->num_pages)
            			{
            				$this->start_range -= $this->end_range-$this->num_pages;
            				$this->end_range = $this->num_pages;
            			}
            			$this->range = range($this->start_range,$this->end_range);
            
            			for($i=1;$i<=$this->num_pages;$i++)
            			{
            				if($this->range[0] > 2 And $i == $this->range[0]) $this->return .= " ... ";
            				// loop through all pages. if first, last, or in range, display
            				if($i==1 Or $i==$this->num_pages Or in_array($i,$this->range))
            				{
            					$this->return .= ($i == $this->current_page And $_GET['page'] != 'All') ? "<a title=\"Go to page $i of $this->num_pages\" class=\"current\" href=\"#\">$i</a> ":"<a class=\"paginate\" title=\"Go to page $i of $this->num_pages\" href=\"$newAddress&page=$i&ipp=$this->items_per_page$this->querystring\">$i</a> ";
            				}
            				if($this->range[$this->mid_range-1] < $this->num_pages-1 And $i == $this->range[$this->mid_range-1]) $this->return .= " ... ";
            			}
            			$this->return .= (($this->current_page != $this->num_pages And $this->items_total >= 10) And ($_GET['page'] != 'All')) ? "<li><a class=\"btn_next\" href=\"$newAddress&page=$next_page&ipp=$this->items_per_page$this->querystring\">Next »</a>\n":"<li>» Next</li>\n";
            			$this->return .= ($_GET['page'] == 'All') ? "<li><a class=\"current\" href=\"#\">All</a></li>":"<li><a class=\"paginate\" href=\"$newAddress&page=1&ipp=All$this->querystring\">All</a></li>";
            		}
            		else
            		{
            			for($i=1;$i<=$this->num_pages;$i++)
            			{
            				$this->return .= ($i == $this->current_page) ? "<li><a class=\"current\" href=\"#\">$i</a></li>":"<li><a href=\"$newAddress&page=$i&ipp=$this->items_per_page$this->querystring\">$i</a></li> ";
            			}
            			$this->return .= "<li><a class=\"paginate\" href=\"$newAddress&page=1&ipp=All$this->querystring\">All</a></li>";
            		}
            		$this->low = ($this->current_page-1) * $this->items_per_page;
            		$this->high = ($_GET['ipp'] == 'All') ? $this->items_total:($this->current_page * $this->items_per_page)-1;
            		$this->limit = ($_GET['ipp'] == 'All') ? "":" LIMIT $this->low,$this->items_per_page";
            	}
            
            	function display_items_per_page()
            	{
            		$newAddress = $_SERVER[REQUEST_URI];
            		
            		$newAddress = changeArgumentValueInRequestURI( "page" ,  false ,$newAddress );
            		$newAddress = changeArgumentValueInRequestURI( "ipp" ,  false ,$newAddress );
            		
            		$items = '';
            		$ipp_array = array(10,25,50,100,'All');
            		foreach($ipp_array as $ipp_opt)	$items .= ($ipp_opt == $this->items_per_page) ? "<option selected value=\"$ipp_opt\">$ipp_opt</option>\n":"<option value=\"$ipp_opt\">$ipp_opt</option>\n";
            		return "<span class=\"paginate\">Items per page:</span><select class=\"paginate\" onchange=\"window.location='$newAddress&page=1&ipp='+this[this.selectedIndex].value+'$this->querystring';return false\">$items</select>\n";
            	}
            
            	function display_jump_menu()
            	{
            		$newAddress = $_SERVER[REQUEST_URI];
            		
            		$newAddress = changeArgumentValueInRequestURI( "page" ,  false ,$newAddress );
            		$newAddress = changeArgumentValueInRequestURI( "ipp" ,  false ,$newAddress );
            		
            		for($i=1;$i<=$this->num_pages;$i++)
            		{
            			$option .= ($i==$this->current_page) ? "<option value=\"$i\" selected>$i</option>\n":"<option value=\"$i\">$i</option>\n";
            		}
            		return "<span class=\"paginate\">Page:</span><select class=\"paginate\" onchange=\"window.location='$newAddress&page='+this[this.selectedIndex].value+'&ipp=$this->items_per_page$this->querystring';return false\">$option</select>\n";
            	}
            
            	function display_pages()
            	{
            		return $this->return;
            	}
            	
            	
            
            }
            
            /**********************/
            function changeArgumentValueInRequestURI( $sArgumentName, $sNewArgumentValue , $sRequestUri )
            {
            /**
                * Three alternatives
                * 1. The only parameter.        E.g. start.php?parameter=value
                * 2. Parameter at the end.      E.g. start.php?id=1&parameter=value
                * 3. Parameter in the middle    E.g. start.php?id=1&parameter=value&number=2
             */
                $sScriptUrl = substr($sRequestUri, 0 , strpos($sRequestUri , "?") );
            	//echo 'Script URL: '.$sScriptUrl.'<br>';
                $sQueryString = substr( $sRequestUri , strpos($sRequestUri , "?")+1 );
            	//echo 'Query URL: '.$sQueryString.'<br>';
                $aArguments = explode("&" , $sQueryString );
            	//echo 'Query URL: '.$aArguments.'<br>';
            
                if(isset( $aArguments ) && count( $aArguments ) > 0 )
                {
                    foreach( $aArguments AS $sArgumentString )
                    {
            		//echo 'Arguments: '.$aArgumentString.'<br>';
                        preg_match( "/^(.*)=(.*)$/" , $sArgumentString , $aMatches );
                        $aArgumentValues[$aMatches[1]] = $aMatches[2];
                    }
                }
            
                //Replace value
                if ( $sNewArgumentValue !== false )
                {
                    if ( array_key_exists( $sArgumentName , $aArgumentValues ) )
                    {
                        $aArgumentValues[ $sArgumentName ] = $sNewArgumentValue;
                    }
                }
                else//Remove value
                {
                    if ( array_key_exists( $sArgumentName , $aArgumentValues ) )
                    {
                        unset( $aArgumentValues[$sArgumentName] );
                    }
                }
            
                $sQueryString = "";
                //Build new query string
                if(isset( $aArgumentValues ) && count( $aArgumentValues ) >0 )
                {
                    $sQueryString = "?";
            
                    foreach( $aArgumentValues AS $key => $value )
                    {
                        $sQueryString .= $key."=".$value."&";
                    }
                    $sQueryString = substr( $sQueryString , 0 , strlen( $sQueryString ) -1 ) ;
                }
            
                return $sScriptUrl.$sQueryString;
            
            }
            
            ?>
            



            @sottwell...
            If you help me fix this, I with either donate $25 to modx to send it directly to you. Your choice.
              • 11650
              • 15 Posts
              Any luck with this?

              $25 via PayPal to whoever can help fix this.
                • 3749
                • 24,544 Posts
                Do you have friendly URLs turned on?

                If so, do all the pages have aliases?
                  Did I help you? Buy me a beer
                  Get my Book: MODX:The Official Guide
                  MODX info for everyone: http://bobsguides.com/modx.html
                  My MODX Extras
                  Bob's Guides is now hosted at A2 MODX Hosting
                  • 11650
                  • 15 Posts
                  Yes, SEO is on and all pages have aliases.
                    • 11650
                    • 15 Posts
                    Please, anyone that can help? I will now offer $50. I really need this fixed asap.
                      • 18913
                      • 654 Posts
                      You have
                          $sScriptUrl = substr($sRequestUri, 0 , strpos($sRequestUri , "?") );
                      	//echo 'Script URL: '.$sScriptUrl.'<br>';
                          $sQueryString = substr( $sRequestUri , strpos($sRequestUri , "?")+1 );
                      	//echo 'Query URL: '.$sQueryString.'<br>';
                          $aArguments = explode("&" , $sQueryString );
                      	//echo 'Query URL: '.$aArguments.'<br>';
                      
                          if(isset( $aArguments ) && count( $aArguments ) > 0 )
                          {
                              foreach( $aArguments AS $sArgumentString )
                              {
                      		//echo 'Arguments: '.$aArgumentString.'<br>';
                                  preg_match( "/^(.*)=(.*)$/" , $sArgumentString , $aMatches );
                                  $aArgumentValues[$aMatches[1]] = $aMatches[2];
                              }
                          }
                      
                          //Replace value
                          if ( $sNewArgumentValue !== false )
                          {
                              if ( array_key_exists( $sArgumentName , $aArgumentValues ) )
                              {
                                  $aArgumentValues[ $sArgumentName ] = $sNewArgumentValue;
                              }
                          }
                          else//Remove value
                          {
                              if ( array_key_exists( $sArgumentName , $aArgumentValues ) )
                              {
                                  unset( $aArgumentValues[$sArgumentName] );
                              }
                          }
                      
                          $sQueryString = "";
                          //Build new query string
                          if(isset( $aArgumentValues ) && count( $aArgumentValues ) >0 )
                          {
                              $sQueryString = "?";
                      
                              foreach( $aArgumentValues AS $key => $value )
                              {
                                  $sQueryString .= $key."=".$value."&";
                              }
                              $sQueryString = substr( $sQueryString , 0 , strlen( $sQueryString ) -1 ) ;
                          }
                      
                          return $sScriptUrl.$sQueryString;


                      Is $sScriptUrl returning the correct value, i.e. "bed-and-breakfasts" (or whatever its supposed to be)?
                      MattC