Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nieaktywne lub aktywne pole wyboru - Select
Forum PHP.pl > Forum > Przedszkole
18Pawel18
Mam problem z aktywnym, bądź nieaktywnym polem SELECT.

W bazie danych mam wpisane państwa i chcę aby po wybraniu Polski był dostępny SELECT z województwami czyli możliwość wybrania województwa, a po wybraniu innej opcji (innego państwa) zablokowany wybór (z logicznych przyczyn).

Próbowałem dodać przed SELECT-em z województwami: if($wojewodztwo['id'] == 135) ?> ale nie działało. W czym jest problem??

Całość:

Baza danych MySql:

Kod
CREATE TABLE IF NOT EXISTS `panstwo` (
  `id` int(10) unsigned NOT NULL,
  `nazwa` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Zrzut danych tabeli `panstwa`
--

INSERT INTO `panstwo` (`id`, `nazwa`) VALUES
(1, 'Afganistan'),
(2, 'Albania'),
(3, 'Algieria'),
(4, 'Andora'),
(5, 'Angola'),
(6, 'Antigua i Barbuda'),
(7, 'Arabia Saudyjska'),
.....
(165, 'Zumbia');


Docelowy plik PHP:

Kod
<select name="panstwo" id="panstwo">
            <option value="0">Wybierz państwo</option>
            <?php
            
            
            //pobranie listy państw
            $panstwa = pobierzPanstwa();

            if(isset($_POST['panstwo'])) $panstwSel = $_POST['panstwo']; else $panstwSel = '0';
            ?>
            <?php foreach($panstwa as $panstwo): ?>
                <option value="<?php echo $panstwo['id']; ?>" <?php if($panstwo['id'] == $panstwSel) echo 'selected'; ?>><?php echo $panstwo['nazwa']; ?></option>
            <?php endforeach; ?>

        </select>


Kod
<select name="wojewodztwo" id="wojewodztwo">
            <option value="0">Wybierz województwo</option>
            <?php
            
            
            //pobranie listy wojewodztw
            $wojewodztwa = pobierzWojewodztwa();

            if(isset($_POST['wojewodztwo'])) $wojewSel = $_POST['wojewodztwo']; else $wojewSel = '0';
            ?>
            <?php foreach($wojewodztwa as $wojewodztwo): ?>
                <option value="<?php echo $wojewodztwo['id']; ?>" <?php if($wojewodztwo['id'] == $wojewSel) echo 'selected'; ?>><?php echo $wojewodztwo['nazwa']; ?></option>
            <?php endforeach; ?>

        </select>


Znalazłem też takie rozwiązanie(przykład):

Kod
<html>
<head>
    <script language="javascript">
    
    function test()
    {
    var wartosc_pola_xyz;
    var tekst=document.getElementById('abc');
    
    wartosc_pola_xyz = document.getElementById('xyz').value;
    
    if(wartosc_pola_xyz=='0')
    {
    tekst.value="opcja niedostępna";
    document.getElementById('abc').disabled=true;
    }
    
    if(wartosc_pola_xyz=='1')
    {
    tekst.value="opcja niedostępna";
    document.getElementById('abc').disabled=true;
    }
    
    if(wartosc_pola_xyz=='2')
    {
    tekst.value="";
    document.getElementById('abc').disabled=false;
    }
    }
    </script>
</head>
<body>

    <FORM>
    <select name="xyz" id="xyz" onChange="test()">
    <option value=0 selected></option>
    <option value=1>opcja 1</option>
    <option value=2>opcja 2</option>
    </select>
    <input type="text" name="abc" id="abc" disabled value="opcja niedostępna">
    </form>
    

</body>
</html>


ale zabardzo też mi to nie działało.

Co tam można zmienić żeby to zadziałało?
valkirek
Dobrze kombinujesz ale skoro chcesz wylaczyc wojewodztwo to musisz sprawdzac pole panstwo czyli w select wojewodztwo dajesz:
  1. if(isset($_POST['panstwo']) && $_POST['panstwo']==135) { echo 'disabled'; } //wylacz pole gdy istnieje post z id polski


dodatkowo wylacz live przez js:
  1. $("#panstwo").change(function() { //po zmianie
  2. var panstwo = $("#panstwo").val(); //pobierasz value
  3.  
  4. if(panstwo != 135) //rozne od polski
  5. {
  6. $("select#wojewodztwo").attr("disabled","disabled"); //to wylacz
  7. } else {
  8. $("select#wojewodztwo").removeAttr("disabled"); //else wlacz
  9. }
  10. });


Zakladajac, ze 135 to id polski z bazy takie cos powinno dzialac, dodaj oczywiscie id #panstwo i #wojewodztwo do selectow
18Pawel18
Zrobiłem dokładnie jak mówiłeś i nic. Jeśli nie wiesz o co może chodzić to mogę wrzucić przykład na serwer i wtedy konkretnie w kodzie i działaniu zobaczysz.

Kod
<script type="text/javascript">

    $("#panstwo").change(function() { //po zmianie
    var panstwo = $("#panstwo").val(); //pobierasz value
    
    if(panstwo != 135) //rozne od polski
    {
    $("select#wojewodztwo").attr("disabled","disabled"); //to wylacz
    } else {
    $("select#wojewodztwo").removeAttr("disabled"); //else wlacz
    }
    });
</script>


Kod
<select name="panstwo" id="panstwo" >
            <option value="0">Wybierz państwo</option>
            <?php
            
            
            //pobranie listy państw
            $panstwa = pobierzPanstwa();

            if(isset($_POST['panstwo'])) $panstwSel = $_POST['panstwo']; else $panstwSel = '0';
            ?>
            <?php foreach($panstwa as $panstwo): ?>
                <option value="<?php echo $panstwo['id']; ?>" <?php if($panstwo['id'] == $panstwSel) echo 'selected'; ?>><?php echo $panstwo['nazwa']; ?></option>
            <?php endforeach; ?>

        </select>


Kod
<select name="wojewodztwo" id="wojewodztwo" <?php if(isset($_POST['panstwo']) && $_POST['panstwo']==135) { echo 'disabled'; }//wylacz pole gdy istnieje post z id polski ?>>
            <option value="0">Wybierz województwo</option>
            <?php
            
            
            //pobranie listy wojewodztw
            $wojewodztwa = pobierzWojewodztwa();

            if(isset($_POST['wojewodztwo'])) $wojewSel = $_POST['wojewodztwo']; else $wojewSel = '0';
            ?>
            <?php foreach($wojewodztwa as $wojewodztwo): ?>
                <option value="<?php echo $wojewodztwo['id']; ?>" <?php if($wojewodztwo['id'] == $wojewSel) echo 'selected'; ?>><?php echo $wojewodztwo['nazwa']; ?></option>
            <?php endforeach; ?>

        </select>
nospor
&& $_POST['panstwo']==135
No tu to ma byc raczej && $_POST['panstwo']!=135
przeciez disabled robisz dla roznych od Polski a nie dla Polski
18Pawel18
Link do tego z czym jest problem:

http://testowa123.pusku.com/test.php

Dostęp do ftp-a:

Nazwa hosta: testowa123.pusku.com
Użytkownik: u401008114
Hasło: test100

Baza danych wygląda tak:

Kod
CREATE TABLE IF NOT EXISTS `panstwo` (
  `id` int(10) unsigned NOT NULL,
  `nazwa` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Zrzut danych tabeli `panstwa`
--

INSERT INTO `panstwo` (`id`, `nazwa`) VALUES
(1, 'Afganistan'),
(2, 'Albania'),
(3, 'Algieria'),
(4, 'Andora'),
(5, 'Angola'),
(6, 'Antigua i Barbuda'),
(7, 'Arabia Saudyjska'),
(8, 'Argentyna'),
(9, 'Armenia'),
(10, 'Australia'),
(11, 'Austria'),
(12, 'Azerbejdżan'),
(13, 'Bahamy'),

......................

(134, 'Peru'),
(135, 'Polska'),
(136, 'Portugalia'),
(137, 'Republika Południowej Afryki'),
(138, 'Republika Środkowoafrykańska'),
(139, 'Republika Zielonego Przylądka'),
(140, 'Rosja'),
(141, 'Rumunia'),
(142, 'Rwanda'),
(143, 'Saint Kitts i Nevis'),
(144, 'Saint Lucia'),
(145, 'Saint Vincent i Grenadyny'),
(146, 'Salwador'),
(147, 'Samoa'),
(148, 'San Marino'),
(149, 'Senegal'),
(150, 'Serbia'),
(151, 'Seszele'),
(152, 'Sierra Leone'),
(153, 'Singapur'),
(154, 'Słowacja'),
(155, 'Słowenia'),
(156, 'Somalia'),
(157, 'Sri Lanka'),
(158, 'Stany Zjednoczone'),
(159, 'Suazi'),
(160, 'Sudan'),
(161, 'Sudan Południowy'),
(162, 'Surinam'),
(163, 'Syria'),
(164, 'Szwajcaria'),
(165, 'Szwecja'),
(166, 'Tadżykistan'),
(167, 'Tajlandia'),
(168, 'Tanzania'),
(169, 'Timor Wschodni'),
(170, 'Togo'),
(171, 'Tonga'),
(172, 'Trynidad i Tobago'),
(173, 'Tunezja'),
(174, 'Turcja'),
(175, 'Turkmenistan'),
(176, 'Tuvalu'),
(177, 'Uganda'),
(178, 'Ukraina'),
(179, 'Urugwaj'),
(180, 'Uzbekistan'),
(181, 'Vanuatu'),
(182, 'Watykan'),
(183, 'Wenezuela'),
(184, 'Węgry'),
(185, 'Wielka Brytania'),
(186, 'Wietnam'),
(187, 'Włochy'),
(188, 'Wybrzeże Kości Słoniowej'),
(189, 'Wyspy Marshalla'),
(190, 'Wyspy Salomona'),
(191, 'Wyspy Świętego Tomasza i Książęca'),
(192, 'Zambia'),
(193, 'Zimbabwe'),
(194, 'Zjednoczone Emiraty Arabskie');

CREATE TABLE `wojewodztwa` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nazwa` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 AUTO_INCREMENT=19;

--
-- Zrzut danych tabeli `wojewodztwa`
--

INSERT INTO `wojewodztwa` VALUES (1, 'wielkopolskie');
INSERT INTO `wojewodztwa` VALUES (2, 'zachodnio-pomorskie');
INSERT INTO `wojewodztwa` VALUES (3, 'dolnośląskie');
INSERT INTO `wojewodztwa` VALUES (4, 'kujawsko-pomorskie');
INSERT INTO `wojewodztwa` VALUES (5, 'lubelskie');
INSERT INTO `wojewodztwa` VALUES (6, 'lubuskie');
INSERT INTO `wojewodztwa` VALUES (7, 'łódzkie');
INSERT INTO `wojewodztwa` VALUES (8, 'małopolskie');
INSERT INTO `wojewodztwa` VALUES (9, 'mazowieckie');
INSERT INTO `wojewodztwa` VALUES (10, 'opolskie');
INSERT INTO `wojewodztwa` VALUES (11, 'podkarpackie');
INSERT INTO `wojewodztwa` VALUES (12, 'podlaskie');
INSERT INTO `wojewodztwa` VALUES (13, 'pomorskie');
INSERT INTO `wojewodztwa` VALUES (14, 'śląskie');
INSERT INTO `wojewodztwa` VALUES (15, 'świętokrzyskie');
INSERT INTO `wojewodztwa` VALUES (16, 'warmińsko-mazurskie');
INSERT INTO `wojewodztwa` VALUES (17, 'wielkopolskie');
INSERT INTO `wojewodztwa` VALUES (18, 'zachodnio-pomorskie');

nospor
No dobra, ale o to:
$("#panstwo").change(function()
masz wywolac dopiero po utworzeniu pola panstwo a nie przed...
18Pawel18
Nie kumam o co chodzi. Zmienisz mi to na serwerze już?
valkirek
Nie zartuj sobie, w konsoli js jak byk masz blad. Nie widzisz , ze masz 2 razy <script type="text/javascript"> i 2 razy </script> ?

Wystarczy troche wysilku bo dostales praktycznie gotowca
18Pawel18
Widziałem, już dawno to zmieniłem. Przy przenoszeniu źle wkleiłem.
valkirek
No ale zeby jquery dzialalo to musisz jeszcze dac linka do jquery ech np w head na poczatku
  1. <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>


nie wiem teraz jaki byl link do najnowszej wersji zawsze ale ten powinien dzialac
18Pawel18
Wszystko zmieniłem jak mowiłeś. Logicznie patrząc wszystko powinno już działać, ale nie działa.

Zastanawiam się nad tym fragmentem, czy jest dobry:

Kod
<select name="wojewodztwo" id="wojewodztwo" <?php if(isset($_POST['panstwo']) && $_POST['panstwo']!=135) { echo 'disabled'; }//wylacz pole gdy istnieje post z id polski ?>>
            <option value="0">Wybierz województwo</option>
            <?php
valkirek
Nie jest dobrze:/ pomysl masz ten select z wojewodztwami wylaczyc gdy panstwo to polska czyli ma byc
  1. $_POST['panstwo']==135


Po drugie jak ma dzialac $_POST skoro nie masz submit?
18Pawel18
Cytat(nospor @ 25.07.2013, 17:32:25 ) *
&& $_POST['panstwo']==135
No tu to ma byc raczej && $_POST['panstwo']!=135
przeciez disabled robisz dla roznych od Polski a nie dla Polski


Tak wcześniej gość napisał, więc już nie wiem jak powinno byc poprawnie.


Jeśli panstwo nie jest równe Polsce czyli id 135 to blokuje select. Więc jest dobrze.
nospor
Cytat
pomysl masz ten select z wojewodztwami wylaczyc gdy panstwo to polska czyli ma byc
Co ty bredzisz..... ma wylaczyc gddy panstwo to nie Polska....wkoncu wojewodztwa ma dla Polski a nie dla nie Polski....
18Pawel18
Widzi ktoś w czym jest problem??
nospor
Napisalem ci przeciez wyraznie....o to:
<script type="text/javascript">

$("#panstwo").change(function() { //po zmianie
var panstwo = $("#panstwo").val(); //pobierasz value

if(panstwo != 135) //rozne od polski
{
$("select#wojewodztwo").attr("disabled","disabled"); //to wylacz
} else {
$("select#wojewodztwo").removeAttr("disabled"); //else wlacz
}
});

</script>

ma byc po utworzeniu pol a nie przed. Czyli masz to przeniesc na sam dol, juz po utworzeniu pol a bedzie dzialac. Tu naprawde nie ma nic trudnego, tylko ttrzeba chciec pomyslec a nie lenia miec.
18Pawel18
Wybacz, jest ok. Dzieki za pomoc.

Zrobiłem jeszcze coś takiego do walidacji pól:

Kod
<script type="text/javascript">

function validateForm(){

if($("#wojewodztwo").next().attr('class') == 'error') $("#wojewodztwo").next().remove();

if(($("#wojewodztwo option:selected").val() == '0')) $("#wojewodzwto").after('<div class="error">Wybierz województwo</div>');

      var iloscBledow = $('.error').length;
        if(iloscBledow > 0)return false;
        else return true;
    }

</script>


Jak mam to ugryźć, żeby przeszło walidację jak wybiorę inne państwo niż Polska?

Zrobiłem tak, ale nie chwyta:

Kod
if(($("#wojewodztwo option:selected").val() == '0') || ($("#panstwo option:selected").val() == '135')) $("#wojewodztwo").after('<div class="error">Wybierz województwo</div>');

nospor
No ale jak ma chwytac? Podpiales to pod wyslanie formularza? Bo nie widze
18Pawel18
Tak, wszystko jest podpięte i działa, wkleiłem tylko fragment, który odpowiada za walidację województw. Ale chodzi o to że chce to tak przerobić, żeby wyświetlało błąd gdy jest wybrane państwo Polska, a nie wybrane województwo, a nie wyświetlało błędu jak inne Państwo i nie trzeba wybierać województwa.
nospor
No to pokaz jak wyglada podpieta calosc, bo w linku co podales nie ma nic podpietego.
18Pawel18
Już zaktualizowałem na serwerze. Możesz zobaczyć na stonie o co chodzi.

Cały kod:

Kod
<script type="text/javascript">
function validateForm(){

     if($("#panstwo").next().attr('class') == 'error') $("#panstwo").next().remove();
        if($("#wojewodztwo").next().attr('class') == 'error') $("#wojewodztwo").next().remove();
        
            if(($("#panstwo option:selected").val() == '0')) $("#panstwo").after('<div class="error">Wybierz państwo</div>');
        if(($("#wojewodztwo option:selected").val() == '0')) $("#wojewodztwo").after('<div class="error">Wybierz województwo</div>');
        
            var iloscBledow = $('.error').length;
        if(iloscBledow > 0)return false;
        else return true;
    }
</script>
    

</head>
<body>

<form method="post" onsubmit="return validateForm();">
             <div class="tabright"><label for="panstwo">Państwo:</label> </div>
       <div class="tableft">
    <select name="panstwo" id="panstwo" >
            <option value="0">Wybierz państwo</option>
            <?php
            
            
            //pobranie listy państw
            $panstwa = pobierzPanstwa();

            if(isset($_POST['panstwo'])) $panstwSel = $_POST['panstwo']; else $panstwSel = '0';
            ?>
            <?php foreach($panstwa as $panstwo): ?>
                <option value="<?php echo $panstwo['id']; ?>" <?php if($panstwo['id'] == $panstwSel) echo 'selected'; ?>><?php echo $panstwo['nazwa']; ?></option>
            <?php endforeach; ?>

        </select>
        </div>
        
        <br/>
        
        <div class="tabright"><label for="wojewodztwo">Wojewodztwo:</label> </div>
       <div class="tableft">
          
    <select name="wojewodztwo" id="wojewodztwo" <?php if(isset($_GET['panstwo']) && $_GET['panstwo']!=135) { echo 'disabled'; }//wylacz pole gdy istnieje post z id polski ?>>
            <option value="0">Wybierz województwo</option>
            <?php
            
            
            //pobranie listy wojewodztw
            $wojewodztwa = pobierzWojewodztwa();

            if(isset($_POST['wojewodztwo'])) $wojewSel = $_POST['wojewodztwo']; else $wojewSel = '0';
            ?>
            <?php foreach($wojewodztwa as $wojewodztwo): ?>
                <option value="<?php echo $wojewodztwo['id']; ?>" <?php if($wojewodztwo['id'] == $wojewSel) echo 'selected'; ?>><?php echo $wojewodztwo['nazwa']; ?></option>
            <?php endforeach; ?>

        </select>
        
         <input type="submit" name="zapisz" value="Zapisz" />
        </form>
        
        </div>
<script type="text/javascript">

    $("#panstwo").change(function() { //po zmianie
    var panstwo = $("#panstwo").val(); //pobierasz value
    
    if(panstwo != 135) //rozne od polski
    {
    $("select#wojewodztwo").attr("disabled","disabled"); //to wylacz
    } else {
    $("select#wojewodztwo").removeAttr("disabled"); //else wlacz
    }
    });
    
</script>


freemp3
Kod
if(($("#wojewodztwo option:selected").val() == '0')) $("#wojewodztwo").after('<div class="error">Wybierz województwo</div>');

To nie zadziała tak jak chcesz ponieważ sprawdzasz tylko województwo. Należy dodać do warunku sprawdzenie czy wybranym państwem jest Polska.
freemp3
Bład pojawia się ponieważ przy wysyłaniu pola formularza oznaczone jako "disabled", są pomijane przy wysyłce. Dlatego przed wczytaniem id województwa z POST-a sprawdź id państwa. Jeśli jest to id Polski to w zmiennej zapisz 0 lub inną wartość, która u Ciebie oznacza "brak".
Ewentualnie zmień w strukturze tabeli, aby województwo mogło mieć wartość NULL.
18Pawel18
Działa idealnie, zmieniłem w strukturze tabeli, dzieki.

Temat do zamknięcia, wszystko działa.

Temat do zamknięcia, wszystko działa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.