Webboard

Pełna wersja: Przekazywanie ID poddziałów między wyborem [JS]
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam,
utknąłem w martwym punkcie. Od jakiegoś czasu próbuję utworzyć wybór 'kategorii' (w tym przypadku działu) a zaraz potem 'poddziału', korzystając z tego skryptu: http://www.appelsiini.net/projects/chained
Gdzie tkwię?
Otóż pobrane zostały już główne działy, potrzebuję teraz, aby po wyborze 'głównego' ukazały się jego poddziały. Na chwilę obecną siedzę w tym co widać (patrz niżej: demo). Po wybraniu działu powinno pokazywać jego poddziały, a jest co jest, czyli ukazuje wszystkie poddziały, które nie są rodzicem.
Kod PHP:
if(in_array($forum['pid'], $exp)) 
            {    
                
$forumsOptionChild .= '<option value="' $subforums[$forum['fid']] . '" selected="selected">--' $forum['name'] . '</option>';
                eval(
'$subforums[$forum["pid"]] .= "'.$templates->get('dld_add_subforums').'";'); //niekoniecznie szablon
            
}
            else
            {                              
                if(isset(
$subforums[$forum['fid']]))         
                {
                    
$forumsOptionParent .= '<option value="' $subforums[$forum['pid']] . '" selected="selected">' $forum['name'] . '</option>';
                }                
            }
            
$formularz '<select id="mark" name="mark">
                            <option value="0">wybierz kategorię</option>
                            ' 
$forumsOptionParent '
                            </select>    
                            <select id="series" name="series">
                            <option value="-">wybierz dział</option>
                            ' 
$forumsOptionChild '
                        </select>'

Z czego $subforums tworzy tablicę przed pętlą z rekordami z bazy danych.
Z tego co widzę po tamtym skrypcie, to brakuje Ci w kodzie klas CSS i nie wie on, co do czego przyporządkować.
Dobrze pokazuje to demo z audi i bmw.

Idąc tym tokiem: powinieneś dzieciom dać w klasie css oznaczenie takie samo, jak value przy rodzicu.
Wszystko będzie zbitką numeryczną, polecam wiec coś dorzucić np. aby klasy nazywały się:
- parentFid1
- parentFid2

itp.
Później w skrypcie obrabiającym formularz możesz sobie ten fragment tekstowy wyciąć (pewnie trafi do zapytania, więc i rzutować nie zaszkodzi).
Ja bym całe informacje o działach wysłał json'em i obrobił to wszystko w js.
Tablica w php
Kod PHP:
'działy' => [
'fid1' => 'nazwa działu1'
'fid2' => 'nazwa działu2,
],
'
fid działu 1' => [
'
fid_dziecka1' => 'nazwa dziecka 1',
'
fid_dziecka2' => 'nazwa dziecka 2',
],
'
fid działu 2' => [
'
fid_dziecka1' => 'nazwa dziecka 1',
'
fid_dziecka2' => 'nazwa dziecka 2',
],
]; 
Można byłoby też zrobić to trochę inaczej
Kod PHP:
['działy' =>
'fid1' => [
'forum_name' => 'nazwa działu',
'childs' => [
'fid1' => 'nazwa1'
'fid2' => 'nazwa2',
],
],
]; 
Kto jak woli.
Później tylko sprawdzasz jaki fid został wybrany w pierwszym polu i wtedy wrzucasz dzieci tego działu.
, działy są już w tablicy, a w JS praktycznie nic nie napiszę.
lukasamd napisał(a):Idąc tym tokiem: powinieneś dzieciom dać w klasie css oznaczenie takie samo, jak value przy rodzicu.
Wszystko będzie zbitką numeryczną, polecam wiec coś dorzucić np. aby klasy nazywały się:
- parentFid1
- parentFid2

Dopisałem
Kod PHP:
class="parentFid' . $subforums[$forum['pid']] . '" 
Tylko, że w tym warunku (jak podałem w pierwszym poście) $subforums[$forum['pid']] jest w eval, pod zmienną od dziecka. Czyżby niepoprawnie skonstruowany warunek?
lukasamd napisał(a):itp.
Później w skrypcie obrabiającym formularz możesz sobie ten fragment tekstowy wyciąć (pewnie trafi do zapytania, więc i rzutować nie zaszkodzi).
Co trafi do zapytania? Ten ciąg znaków z class?
Hm.. taką strukturę gorzej w ten sposób obrabiać - robisz dwie rzeczy w jednym przebiegu pętli, lepiej to rozbić albo na dwie osobne, albo zagnieżdżone, bo to nie koliduje z korzystaniem z szablonów.

Z drugiej strony nawet i teraz powinno działać. Jeżeli reszta jest poprawna to np tak:

Kod PHP:
if(in_array($forum['pid'], $exp)) 
            {    
                
$forumsOptionChild .= '<option value="parentFID' $subforums[$forum['fid']] . '" selected="selected">--' $forum['name'] . '</option>';
                eval(
'$subforums[$forum["pid"]] .= "'.$templates->get('dld_add_subforums').'";'); //niekoniecznie szablon
            
}
            else
            {                              
                if(isset(
$subforums[$forum['fid']]))         
                {
                    
$forumsOptionParent .= '<option class="parentFID{TUTAJ-TRZEBA-DODAC-ID-RODZICA}" value="' $subforums[$forum['pid']] . '" selected="selected">' $forum['name'] . '</option>';
                }                
            } 
lukasamd napisał(a):Z drugiej strony nawet i teraz powinno działać. Jeżeli reszta jest poprawna to np tak:

To jest prawie cała zawartość pętli (nie wliczając konstrukcji switch() z podziałem tego pliku na 'główny' i 'odnośnik').

Przed pętlą jest tylko tworzenie tablicy,
Kod PHP:
$subforums = array(); 

Wracając do tego:
lukasamd napisał(a):Później w skrypcie obrabiającym formularz możesz sobie ten fragment tekstowy wyciąć (pewnie trafi do zapytania, więc i rzutować nie zaszkodzi).
Jak byś/byście to widzieli? Nie do końca wiem co masz namyśli 'w skrypcie obrabiającym formularz'.
Teraz wiem, że mogło to nieco niefortunnie wyjść, gdyż wcześniej miałem w zmiennej $formularz po prostu formularz, teraz tylko wybór <select>. Z rzutowaniem sobie poradzę, jednak wyciąć fragment tekstowy... Tutaj powinienem...?

Ewentualnie może ma ktoś jakieś inne rozwiązania, aby uzyskać taki efekt?
No to problem polega na tym, że nie masz rozdzielonych dzieci od rodziców, a musisz mieć informacje o rodzicach, aby skrypt Ci to sensownie rozdzielił. Nie musi być po kolei, ale struktura musi być zachowana, inaczej ta biblioteka z JS nie zrobi tego, czego od niej wymagasz. Można to zrobić np. tak:

Kod PHP:
$forums['parents'] = '';
$forums['childs'] = '';


// Tutaj zapytanie ktore pobiera tylko rodzicow
while($row $db->fetch_array($query))
{
    
// nie jestem pewien warunku - ma sprawdzac, czy dzial ma jakis rodzicow
    
$forums['parents'] .= '<option value="parent' $row['fid'] . '">' $row['name'] . '</option>';
}


// Tutaj zapytanie ktore pobiera tylko dzieci
while($row $db->fetch_array($query))
{
    
// nie jestem pewien oznaczenia, zakladam, ze rodzica trzyma sie w polu pid
    
$forums['childs'] .= '<option value="child' $row['pid'] . '" class="parent' $row['pid'] . '">' $row['name'] . '</option>';
}



$formularz '<select id="mark" name="mark">
                <option value="-">wybierz kategorię</option>
                ' 
$forums['parents'] . '
                </select>    
                <select id="series" name="series">
                <option value="-">wybierz dział</option>
                ' 
$forums['childs'] . '
            </select>'




Uwaga: nie jestem pewien, że rodzice są na pewno w w polu pid (nie pamiętam tego).

Co się zaś tyczy skryptu obrabiającego - no chyba masz to w jakimś <form> i masz zamiar przesyłać?
Jeżeli tak, to potem $_POST będzie zawierało zarówno kategorię jak i kategorię, z tym, że nie będą to wartości numeryczne, tylko np. parent15 i child17.
php
Kod PHP:
<?php
$data 

[
'forums' => [
    [
'fid' => 1'name' => 'Dział Pierwszy'],
    [
'fid' => 2'name' => 'Dział drugi'],
],
'subforum_1' => [
    [
'fid' => 4'name' => 'Child 4'],
    [
'fid' => 5'name' => 'Child 5'],
],
'subforum_2' => [
    [
'fid' => 6'name' => 'Child 6'],
    [
'fid' => 7'name' => 'Child 7'],
],
];

$dataJSON json_encode($data);
?>
js
Kod PHP:
var data = <?php echo $dataJSON ?>;
//pokazanie rodziców
for (var forumKey in data.forums) {
    forumId = data.forums[forumKey].fid;
    forumName = data.forums[forumKey].name;
}

//pokazanie dzieci | ta pętla powinna znajdować się wewnątrz pętli rodziców.
var parentFid = forumId; //dla jakiego rodzica mają zostać pobrane subfora
for (var childKey in eval('data.subforum_'+parentFid)) {
    subforumID = eval('data.subforum_'+parentFid+'['+childKey+'].fid');
    subforumName = eval('data.subforum_'+parentFid+'['+childKey+'].name');

Wystarczy to połączyć z tą biblioteką co podałeś