Jump to content

cakephp: recursive function not passing variables properly


thewooleymammoth

Recommended Posts

i have a recursive function which takes an array of arrays of data from the database and turns them into a menu of catagories which can be expanded. To accomplish this im using a recursive function that checks if its parent catagory is a catagory that is being expanded if so, it expands the catagory by calling the function again if not it is skipped. The problem is when i pass the new parent variable to the new function, it uses the old parent variable instead.

 

I know my explanation is confusing, but i dont know how to express it any better, i will post my code and an example output and hopefully it will make sense, if it doesnt, please let me know

 

Controller page

<?php
class ProductsController extends AppController {

var $name = 'Products';
    var $uses = array('Product', 'Catagory');
    function index()
    {
        $this->redirect('/Products/browse/');
    }
    function _menu($ex=NULL)
    {
        /*
         *Generate Menu
        */
       // $ex=explode('-', $ex);
        $catss=$this->Catagory->find('all');
        if($ex!=NULL)
            $ex=explode("-", $ex);
        else
        {
          $ex=array();
        }
       foreach($catss as $cats){
          foreach($cats as $key=>$cat)
          {
            $id=$cat['id'];
            $menu[$id]=$cat;
          }
          //$this->set('ex', $ex);
          //$this->set('menu', $menu);
        }
        function disp($menu, $p, $ex=array(), $html='')
        {
              foreach($menu as $key=>$m){
                if(trim($m['parents'])==trim($p) && !empty($p)){
                  $np=$m['parents'].$m['names'].'/';
                  $html.="<div style='margin-left: 10px;'>";
                  if(in_array($m['id'], $ex)){
                    $expand='';
                    foreach($ex as $key=>$e)
                    {
                        if($e != $m['$id'])
                        {
                          $expand.="$e-";
                        }
                        $expand=str_replace($m['id'].'-', '', $expand);
                    }
                    $html.= "<a href='/Products/Browse/$expand/".$m['id']."/'>".$m['names'].'</a> '.$p.' => '.$np.'
                                    <br />
                                    ';

                      $html.=disp($menu, $np, $ex, $html);
                    }
                    else
                    {
                      $expand='';
                      foreach($ex as $key=>$e)
                      {
                            $expand.="$e-";
                      }
                      $expand.=$m['id'];
                      $html.= "<a href='/Products/Browse/$expand/".$m['id']."/'>".$m['names'].'</a>
                                        <br />
                                </div>
                                        ';
                  }
                  $html.= "
                        </div>
                      ";
                      return $html;
                }
              }
        }
    $out=disp($menu, 'root/', $ex);
    $this->set('out', $out);
    }
    function browse($ex=NULL, $prim=NULL){
      $this->_menu($ex);

    }
}
?>

output for /products/browse/

<div style='margin-left: 10px;'>
   <a href='/Products/Browse/1/1/'>flowers</a>
    <br />
</div>

output for /Products/Browse/1/1

<div style="margin-left: 10px;">
   <a href="/Products/Browse//1/">flowers</a> root/ => root/flowers/
   <br/>
   <div style="margin-left: 10px;">
      <a href="/Products/Browse//1/">flowers</a> root/ => root/flowers/
      <br/>
      <div style="margin-left: 10px;">
         <a href="/Products/Browse/1-2/2/">red</a>
         <br/>
      </div>
   </div>
</div>

output for /products/browse/1-2/

<div style="margin-left: 10px;">
   <a href="/Products/Browse/2-/1/">flowers</a> root/ => root/flowers/
   <br/>
   <div style="margin-left: 10px;">
      <a href="/Products/Browse/2-/1/">flowers</a> root/ => root/flowers/
      <br/>
         <div style="margin-left: 10px;">
            <a href="/Products/Browse/1-/2/">red</a> root/flowers/ => root/flowers/red/
            <br/>
            <div style="margin-left: 10px;">
               <a href="/Products/Browse/2-/1/">flowers</a>root/ => root/flowers/
               <br/>
                  <div style="margin-left: 10px;">
                     <a href="/Products/Browse/1-/2/">red</a> root/flowers/ => root/flowers/red/
                     <br/>
                     <div style="margin-left: 10px;">
                        <a href="/Products/Browse/1-2-3/3/">Epic</a>
                        <br/>
                     </div>
                  </div>
               </div>
            </div>

i cant figure out why it will sometimes pass the variable and sometimes it will not. Any help appreciated, i know its confusing so please ask if you dont understand

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.