selected pastrat dupa refresh

Discutii si intrebari legate de scripturi si functii JavaScript, jQuery si Ajax, cod JavaScript in general.
bita41
Mesaje:4

selected pastrat dupa refresh

Salut,

Am si eu o problema cu dropdown menu si postez aici in speranta ca cineva imi poate da o idee in legatura cu problema..
Am functia urmatoare care genereaza html categoriile in optgroup si subcategoriile in option

Cod: Selectaţi tot

function genereazahtmlforselect($rows, $valsubcategory = '', $valcategorie = '')
{
   $html = '<select name="subcategori" id="categorii" class="cascading" title="Categorie&nbsp;">&nbsp;';
   $html .= '<optgroup label="Selecteaza">';
   $html .= '<option value="">Alege o Categorie</option></optgroup>';
   
       foreach ($rows as $category) {
          if($category['parinte'] == '0'){
              $html .= '<optgroup id="' . $category['id'] . '" title="&nbsp;Subcategorie&nbsp;" label="' . $category['name'] . '">&nbsp;';
              foreach ($rows as $subcategory) {
                if ($subcategory['parinte'] == $category['id']){
                
                  $html .= '<option value="'.$subcategory['id'].'"';
				  if ($subcategory['id'] === $valsubcategory) {
				    $html .= 'selected = "selected"';
				  }
				  $html .= '>'.$subcategory['name'].'</option>';
                }
              }
              $html .= '</optgroup>';
}
        }
    $html .= '</select>';
   return $html;
}
Pana aici totul este ok.Problema este ca am codul Javascript care preia datele din optgroup si imi creaza douo campuri select ceea ce functioneaza perfect numai ca am incercat in nenumarate moduri sa pastrez ce am in categori la refresh si nu am reusit..Am sa atasez si codul javascript aici

Cod: Selectaţi tot

var CascadingMenu =
{
  init: function()
  {
    var menus = Core.getElementsByClass("cascading");
    
    for (var i = 0; i < menus.length; i++)
    {
      CascadingMenu.convertLabelToFieldset(menus[i]);
      var masterMenu = CascadingMenu.extractMasterMenu(menus[i]);
      CascadingMenu.createLabelFromTitle(masterMenu);
      CascadingMenu.createLabelFromTitle(menus[i]);
      
      CascadingMenu.updateSlaveMenu(masterMenu);
      Core.addEventListener(masterMenu, "change", CascadingMenu.changeListener);
    }
  },
  
  convertLabelToFieldset: function(menu)
  {
    var menuId = menu.id;
    var labels = document.getElementsByTagName("label");
    
    for (var i = 0; i < labels.length; i++)
    {
      if (labels[i].htmlFor == menuId)
      {
        var label = labels[i];
        label.parentNode.removeChild(label);
        
        var legend = document.createElement("legend");
        while (label.hasChildNodes())
        {
          legend.appendChild(label.firstChild);
        }
        
        var fieldset = document.createElement("fieldset");
        fieldset.appendChild(legend);
        
        menu.parentNode.replaceChild(fieldset, menu);
        fieldset.appendChild(menu);
        
        return;
      }
    }
  },
  
  extractMasterMenu: function(menu)
  {
    var masterMenu = document.createElement("select");
    masterMenu.id = menu.id + "master";
    masterMenu.setAttribute("name", masterMenu.id);
    masterMenu.setAttribute("title", menu.getAttribute("title"));
    masterMenu._slave = menu;

    while (menu.hasChildNodes())
    {
      var optgroup = menu.firstChild;
      if (optgroup.nodeType == 1)
      {
        var masterOption = document.createElement("option");
		masterOption.setAttribute("id", optgroup.getAttribute("id"));
		masterOption.setAttribute("value", optgroup.getAttribute("id"));
        masterOption.appendChild(document.createTextNode(optgroup.getAttribute("label")));
        masterMenu.appendChild(masterOption);
        
        var slaveOptions = [];
        while (optgroup.hasChildNodes())
        {
          var option = optgroup.firstChild;
          slaveOptions[slaveOptions.length] = option;
          optgroup.removeChild(option);
        }
        masterOption._slaveOptions = slaveOptions;
  
        menu.setAttribute("title", optgroup.getAttribute("title"));
      }
      menu.removeChild(optgroup);
    }
    
    menu.parentNode.insertBefore(masterMenu, menu);
    
    return masterMenu;
  },
  
  createLabelFromTitle: function(menu)
  {
    var title = menu.getAttribute("title");
    menu.setAttribute("title", "");
    
    var label = document.createElement("label");
    label.htmlFor = menu.id;
    label.appendChild(document.createTextNode(title));
    
    menu.parentNode.insertBefore(label, menu);
  },
  
  updateSlaveMenu: function(masterMenu)
  {
    var selectedOption = masterMenu.options[masterMenu.selectedIndex];
    
    while (masterMenu._slave.hasChildNodes())
    {
      masterMenu._slave.removeChild(masterMenu._slave.firstChild);
    }
    
    for (var i = 0; i < selectedOption._slaveOptions.length; i++)
    {
      masterMenu._slave.appendChild(selectedOption._slaveOptions[i]);
    }
    masterMenu._slave.selectedIndex = 0;
  },
  
  changeListener: function(event)
  {
    CascadingMenu.updateSlaveMenu(this);
  }
};

Core.start(CascadingMenu);
EX: Dupa apasarea butonului submit am introdus intr-o variabila valoarea trimisa si deoarece javascriptul imi genereaza acel select am incercat in fe;lul urmator sa rezolv problema numai ca in alert imi da mereu null
atasez si codul pe care l-am incercat eu

Cod: Selectaţi tot

if (isset( $categori )) {
?>
<script type="text/javascript">
(function () {
	
    var categorieSelectata = <?php echo "'$categori'"; ?>;
    var categorii = document.getElementById("categoriimaster");
   
    alert(categorii);
    
    for ( var i = 1; i < categorii.length; i++ ) {
    	
        if ( categorii.options[i].value === categorieSelectata ) {
        	
            categorii.selectedIndex = i;
            break;
        }
    }
})();
</script>
<?php
} 
Va rog daca este cineva si are o idee care ma poate ajuta... dupa refres-ul paginii ce am la categorii revine la normal implicit si subcategoriile.
Multumesc

MarPlo Mesaje:4343
Ca sa retii in php datele de la o pagina la alta, sau refresh, se adauga in sesiune (si session_start() la inceputul fisierului php).
Mai multe despre lucru cu Sesiuni, la pagina Sesiuni
De ex. in JavaScript ar veni: var categorieSelectata = "<?php echo $_SESSION['categori']; ?>";
Iar in scriptul php se adauga categoria in sesiune, cam asa: $_SESSION['categori']=$_POST['subcategori']; (sau depinde cum preiei valoarea in script).

bita41 Mesaje:4
Salut,

Multumesc pentru raspunsul dat.

Problema insa era alta..
ceea ce am eu aici ( var categorieSelectata = <?php echo "'$categori'"; ?>; ) merge bine..Am retinut si ideea cu sesiunile si pe viitor am sa introduc ce am in $_POST intr-o sesiune..
Uitandu-ma in sursa paginii in locul unde am JS variabila categorieSelectata imi retuneaza ce am la value in selectul generat de js adica un numar care este numarul de id ..Pana la punctul asta mergea bine,problema acum apare pt ca nu imi returneaza nimik din ceea ce extrag cu getElementById din id-ul pe care il am in selectul creat.in plus am incercat sa creez un id si in option cu acelasi nume "categoriimaster" si tot nu merge imi returneaza null..In cazul in care cineva incearca sa introduca ceva in formularul creat pe site ,presupunand ca a uitat sa introduca ceva se face un request la server dupa care tot ce a introdus corect or sa apara in campurile respective..La selectul asta creat cu javascript nu reusesc sa fac ce am facut in functia php ceva similar cu asta

Cod: Selectaţi tot

if ($subcategory['id'] === $valsubcategory) {
                $html .= 'selected = "selected"';
              }
imi pare rau ca nu m-am facut inteles de prima data

multumesc

MarPlo Mesaje:4343
Incearca sa pui scriptul JavaScript cu acea functie la sfarsitul paginii (undeva dupa formular)
Functia sa fie definita cu un nume ( function numeF() { } ) apoi sa fie apelata automat, cu window.onload = numeF; (sau cu functia setTimeout("numeF()", 100); ), ca sa fie executat codul din ea.