Jump to content
php.lv forumi

Divi select (dropdown) bez lapas pārlādes


senters

Recommended Posts

Labvakar, man ir preces pievienošanas forma katalogam. Lai pievienotu preci 1) izvēlās kategoriju 2) izvēlās apakškategoriju ieraksta citas lietas (nosaukums, cena, aprakts utt) un spiež submit. Dati tie insertoti db. Tātad man vajag lai izvēloties pirmajā dropdownā kādu kategoriju tiktu otrajā dropdownā piedāvātas visas tai piederošās apakškategorijas - nepārlādējot lapu. Kā šādu lietu panākt. Esmu izmēģinājies ar js dažādiem skriptiem onchange, bet rezultāta pagaidām nav.

 

Ir divas tabulas iekš db:

KATEGORIJAS

id,

nosaukums

seciba

 

APAKSKATEGORIJAS

id

nosaukums

seciba

kategorija_id

Link to comment
Share on other sites

uzraksti apaksh_kategorijas.php, kuram padod kategorijas id un tas echo atbilstošo dropdown ar apakškategorijām <select><option>...</option>...</select>

 

savukārt kategoriju dropdownam onchange brīdī izpildi js http get pieprasījumu (piemēram, ar jquery) uz to apaksh_kategorijas.php un saņemto html ievieto tajā div, kur atrodas apakškategoriju dropdowns: document.getElementById("subcategory-container").innerHTML = sSanemtaisDropdownHtml;

 

neapvainojies, bet visu kodu priekšā gan nerakstīšu ;)

Link to comment
Share on other sites

$('#categories').change(function(){
 $.get('/sub-cats.php',{catid:$(this).val()},function(h){$('#sub-cats-cont').html(h);},'html');
});

 

es gan drīzāk šādā gadījumā datus sūtītu json formā.

 

$('#categories').change(function(){
 $.get('/sub-cats.php',{catid:$(this).val()},function(h){
   var s='';
   s+='<select>';
   for(var i in h){s+='<option value="'+h[i].id+'">'+h[i].title+'</option>';
   }
   s+='</select>';
   $('#sub-cats-cont').html(s);
 },'json');
});

Link to comment
Share on other sites

"sub-kaķi" :D:D:D

 

es gan uzreiz padodu html, jo man visa html automatizācija ir php pusē :P

un vsp main logic labāk lai centralizējas uz php. visādiem ajax un citai js apstrādei labāk uzticu max vnkāršus darbus, lai tikai uzseto to ko vajag un viss. tas vnk tāds funktieris no web applikācijas arhitektūras viedokļa ;)

Link to comment
Share on other sites

sub-cats.php

$catid=(int)$_GET['catid'];
if ($rez=DB::i()->q('SELECT id,title FROM catid=%s',$catid)){  //DB::i()->q datubāzes singletons, kurš atgriež 2d masīvu no kverija
 echo json_encode($rez);
}

 

js daļa

$('#categories').change(function(){
 $.get('/sub-cats.php',{catid:$(this).val()},function(h){    
   $('#sub-cats-cont').html(HTML.select(h,{value:'id',text:'title'}));  //HTML. funkciju kopa, kas ģenerē html;
 },'json');
});

 

Manuprāt, vienkāršāk un ērtāk vairs nav kur.

Link to comment
Share on other sites

...  //HTML. funkciju kopa, kas ģenerē html;

hehe, saprātīgi izveidojot/pielietojot funkcijas, visu var izdarīt pāris rindiņās ;)

 

Manuprāt, vienkāršāk un ērtāk vairs nav kur.

true ^^

Edited by 2easy
Link to comment
Share on other sites

Diemžēl neizprotu šo kodu.

 

Jaunas preces pievienošanas formas fragments:

<tr>
 <td>Kategorija:</td>
 <td><select name="kategorija"><?php echo $kategorijaslv; ?></select></td>
</tr>
<tr>
 <td>Apakškategorija:</td>
 <td><selectname="apakskategorija"><?php echo $apakskategorijaslv; ?></select></td>
</tr>

 

Šobrīd abos dropdownos rādās visas kategorijas un visas apakškategorijas. Nemāku dabūt lai otrais dropdowns mainītos atkarībā no pirmā - izvēlētās kategorijas.

 

Te tiek iegūtas vērtības:

 

// Kategorijas LV
$sql="select * from kategorijas order by seciba asc";
$qry=mysql_query($sql);
while($row = mysql_fetch_assoc($qry))
{ 
$kategorijaslv.="<option value='".$row['id']."'>".$row['nosaukums_lv']."</option>";
}


// Apakškategorijas LV
$sql="select * from apakskategorijas order by seciba asc";
$qry=mysql_query($sql);
while($row = mysql_fetch_assoc($qry))
{ 
$apakskategorijaslv.="<option value='".$row['id']."'>".$row['nosaukums_lv']."</option>";
}

Edited by senters
Link to comment
Share on other sites

Tu to vari darīt 2 veidos:

1)Iepriekš aprakstītais, kad uz pirmā select-a onchange eventa tiek ar ajax pieprasīti dati no servera un ievietoti otrā select-ā.

Tajos piemēros ir izmantot jquery javascript bibliotēka.

 

2)Ielasīt visas apakškategorijas vienā js masīvā un tad oncgange eventā mainīt otro seletc-u. Šo variantu var izmantot, ja apakškategoriju kopējais skaits ir samērīgs, piemēram, ne vairāk kā daži simti.

 

Otro variantu var realizēt šādi, jāpievieno tik jquery js bibliotēka.

$cats - kategoriju masīvs no db;

$sub_cats - subkategoriju masīvs no db;

 

<?php
$cats=array(
 array("id"=>1,"title"=>"kategorija 1"),
 array("id"=>2,"title"=>"kategorija 2"),
 array("id"=>3,"title"=>"kategorija 3")    
);

$sub_cats=array(
 array("id"=>1,"catid"=>1,"title"=>"Apakškategorija 1.1"),
 array("id"=>2,"catid"=>1,"title"=>"Apakškategorija 1.2"),
 array("id"=>3,"catid"=>2,"title"=>"Apakškategorija 2.1"),
 array("id"=>4,"catid"=>2,"title"=>"Apakškategorija 2.2"),
 array("id"=>5,"catid"=>2,"title"=>"Apakškategorija 2.3"),
 array("id"=>6,"catid"=>3,"title"=>"Apakškategorija 3.1")
);
?>

<select id="cats">
<?php foreach($cats as $cat){ ?> 
 <option value="<?php echo $cat['id']; ?>"><?php echo $cat['title']; ?></option>
<?php } ?>
</select>
<br />
<select id="sub_cats">
</select>

<script>
sub_cats=<?php echo json_encode($sub_cats); ?>;
$(function(){
 set_sub_cats();
 $('#cats').change(function(){
   set_sub_cats();
 });
});

function set_sub_cats(){
 var catid=$('#cats').val();
 var s='';
 for(var i in sub_cats){
   if (catid==sub_cats[i].catid){
     s+='<option value="'+sub_cats[i].id+'">'+sub_cats[i].title+'</option>';
   }
 }
 $('#sub_cats').html(s);
}
</script>

 

Ja kaut kas nav skaidrs, tad raksti tieši kas nav skaidrs.

Link to comment
Share on other sites

codez, sametu visu tavu postoto skriptu iekš viena test.php faila un pieslēdzu jquery bibl. -

<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js" language="javascript" />

joprojām otrais dropdowns neielasa vērtības atkarībā no pirmā.

Edited by senters
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...