Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Profil postaci z gry - proszę o pomoc w zbudowaniu.
Forum PHP.pl > Forum > PHP
QooBooS
Witam.
Stworzyłem dziś stronę, która ma być moim małym prywatnym projektem. Polegać będzie ona na tym, iż użytkownicy będą zakładać konta i oprócz edycji profilu będzie tam także edycja "profilu" postaci w grze. Część formularza takiej edycji zrobiłem, gorzej jest z kilkoma polami, z którymi nie mogę sobie poradzić.

Adres strony: www.conquerpostac.lua.pl/polapostaci.php

Problemem jest pole "Umiejętności". Użyłem przy nim skryptu JS, który, po przyciśnięciu przycisku obok, dodaje poniżej takie samo pole. Jak się za to zabrać, jeśli będą to listy rozwijane, obok nich będą pola tekstowe, z czego każda linijka będzie jakby jedną "wartością" w bazie danych (nazwa umiejętności, poziom jej wytrenowania i procent ukończenia danego poziomu trenowania). Myślałem o tablicy, która do bazy wpisywałaby coś w stylu: {(nazwa1,poziom1,procent1),(nazwa2,poziom2,procent2),...}, a następnie (w innej podstronie) odczytywało by te wartości jako oddzielne umiejętności (każda składowa tablicy byłby jedną umiejętnością, np. w jednym miejscu wyświetlałoby
Kod
echo "$nazwa1 - poziom $poziom1, procent ukończenia: $procent1...";
i tak do każdej umiejętności). Poza tym nie wyobrażam sobie, aby po wysłaniu formularza, rozpoznawało pola (dodane przez przyciśnięcie przycisku dodającego pola) po parametrze name, który jest dla każdego taki sam (skill). Czy w takim razie skrypt JS powinien dodawać identyfikator za nazwą pola (np. skill1 dla pierwszego pola, skill2 dla drugiego,... - mówię tu o liście rozwijanej)? Czy w PHP nie ma takiego problemu i jakoś sobie poradzi?

Proszę o pomoc w stworzeniu tego formularza (o uzupełnienie funkcji na podstawie tej pierwszej, "stałej" linijki w "Umiejętności" (umiejętności na liście będą wszędzie takie same). Proszę, aby w przypadku odwoływania się do bazy danych, pola w tabeli, do których będziecie się odwoływać, nazywały się tak samo jak "name" poszczególnych pól.

Kod pliku polapostaci.php:
Kod
<?php
require_once "maincore.php";
require_once "subheader.php";
require_once "side_left.php";


echo "<script type='text/javascript'>
<!--
function dodaj_element(kontener){
    var znacznik = document.createElement('select');
    znacznik.setAttribute('name', 'skill');
    znacznik.className = 'textbox1';
    var kontener = document.getElementById(kontener);
    kontener.appendChild(znacznik);
}
//-->
</script>";

$result = dbquery("SELECT * FROM polapostaci WHERE user_id='$cookie_1'");
$postac = dbarray($result);

opentable('Postać');
    echo "<form name='inputform' method='post' action='".FUSION_SELF."' enctype='multipart/form-data'>\n";
    echo "<table align='center' cellpadding='0' cellspacing='0'>\n";
    echo"<td class='tbl'>Nick postaci</span></td>
<td class='tbl'><input type='text' name='nick' value='".$postac['nick']."' maxlength='15' class='textbox' style='width:160px;'></td>
</tr>
<tr>
<td class='tbl'>Płeć</td>
<td class='tbl'><input type='radio' name='plec' value='1' ".($postac['plec'] == "1" ? " checked" : "").">Mężczyzna
<input type='radio' name='plec' value='0'".($postac['plec'] == "0" ? " checked" : "").">Kobieta</td>
</tr>
<tr>
<td class='tbl'>Poziom</td>
<td class='tbl'><input type='text' name='poziom' maxlength='3' value='".$postac['poziom']."' class='textbox' style='width:30px;'></td>
</tr>
<tr>
<td class='tbl'>Klasa</td>
<td class='tbl'><select class='textbox' name='klasa' style='width:200px;'>
<optgroup label='Trojan'>
<option>InternTrojan</option>
<option>Trojan</option>
<option>VeteranTrojan</option>
<option>TigerTrojan</option>
<option>DragonTrojan</option>
<option>TrojanMaster</option>
</optgroup>
<optgroup label='Warrior'>
<option>InternWarrior</option>
<option>Warrior</option>
<option>BrassWarrior</option>
<option>SilverWarrior</option>
<option>GoldWarrior</option>
<option>WarriorMaster</option>
</optgroup>
<optgroup label='Archer'>
<option>InternArcher</option>
<option>Archer</option>
<option>EagleArcher</option>
<option>TigerArcher</option>
<option>DragonArcher</option>
<option>ArcherMaster</option>
</optgroup>
<optgroup label='Taoist'>
<option>InternTaoist</option>
<option>Taoist</option>
</optgroup>
<optgroup label='FireTaoist'>





<option>FireTaoist</option>
<option>FireWizard</option>
<option>FireMaster</option>
<option>FireSaint</option>
</optgroup>
<optgroup label='WaterTaoist'>
<option>WaterTaoist</option>
<option>WaterWizard</option>
<option>WaterMaster</option>
<option>WaterSaint</option>
</select></td>
</tr>
<tr>
<td class='tbl'>Partner</td>
<td class='tbl'><input type='text' name='partner' value='".$postac['partner']."' maxlength='15' class='textbox' style='width:160px;'></td>
</tr>
<tr>
<td class='tbl'>Battle Power</td>
<td class='tbl'><input type='text' name='bp' value='".$postac['bp']."' maxlength='3' class='textbox' style='width:30px;'></td>
</tr>
<tr>
<td class='tbl'>Gildia</td>
<td class='tbl'><input type='text' name='gildia' value='".$postac['gildia']."' maxlength='15' class='textbox' style='width:160px;'></td>
</tr>
<tr colspan=2>
<td colspan=2><hr>
</td>
</tr>
<tr>
<td class='tbl'>Umiejętno¶ci</td>
<td class='tbl'>
    <div id='pliki'>
<select name='skill' class='textbox'>
<option>Pierwsza</option>
<option>Druga</option>
<option>Trzecia</option>
</select> - Poziom: <input type='text' maxlength='1' name='skilllevel' value='".$postac['skilllevel1']."' class='textbox' style='width:13px;'>, <input type='text' maxlength='6' name='skillprocent1' value='".$postac['skillprocent1']."' class='textbox' style='width:40px;'>% <input type='button' value='+' onclick=dodaj_element('pliki'); />
    </div>
</td>
</tr>
<tr>
<td colspan=2 align=center><br>
<input type='submit' name='update_profile' value='Wy¶lij' class='button'></td>
</tr>
</table>
</form>\n";
    closetable();

require_once "side_right.php";
require_once "footer.php";
?>


PS: Używam PHP-Fusion w wersji 6.01.15. Zapytałem się o to na forum PF, jednak nikt nie odpowiedział.
pinochet
Cytat(QooBooS @ 15.10.2008, 15:39:44 ) *
Poza tym nie wyobrażam sobie, aby po wysłaniu formularza, rozpoznawało pola (dodane przez przyciśnięcie przycisku dodającego pola) po parametrze name, który jest dla każdego taki sam (skill). Czy w takim razie skrypt JS powinien dodawać identyfikator za nazwą pola (np. skill1 dla pierwszego pola, skill2 dla drugiego,... - mówię tu o liście rozwijanej)?

Polecam sobie wyobrazic ;-) bo raczej w ten sposób trzeba to właśnie zrobic... moze pola nie skill1, skill2 itp tylko skill[1], skill[2] itd dzieki czemu potem przejedziesz sobie tablice foreach i nie bedzie problemu.
Pytanie: Po co formularz tworzony dynamicznie questionmark.gif
QooBooS
Cytat(pinochet @ 15.10.2008, 18:03:37 ) *
Polecam sobie wyobrazic ;-) bo raczej w ten sposób trzeba to właśnie zrobic... moze pola nie skill1, skill2 itp tylko skill[1], skill[2] itd dzieki czemu potem przejedziesz sobie tablice foreach i nie bedzie problemu.
Pytanie: Po co formularz tworzony dynamicznie questionmark.gif


Tworzony będzie dynamicznie, ponieważ nie wiadomo z góry, ile umiejętności wybierze użytkownik. Postać może się nauczyć nawet do 30 umiejętności, a niektórzy umieją tylko kilka...
Zgoda, ale czy potrafiłbyś to w jakiś przystępny dla mnie sposób wyjaśnić lub po prostu odwalić za mnie całą robotę? ;-) Choć osobiście wolałbym się tego nauczyć niż wkleić... Jeśli zdecydujesz się na pomoc, wybierz swój sposób - jeśli pomoże, będę bardzo wdzięczny.

//EDYCJA-------------------------------------------------------------

Można również zrobić coś takiego, że każdy użytkownik będzie miał przypisane wszystkie umiejętności, ale przy tych nie nauczonych będzie 0, co z kolei będzie informować skrypt, że jej jeszcze nie umie. Wydaje mi się, że byłoby to prostsze, ponieważ formularz wykonywałby tylko nadpisywanie wartości poszczególnych umiejętności. Przykładowo:
użytkownik1:
Nazwa umiejętności, poziom, procent ukończenia
Pierwsza, 1, 56.001
Druga, 0, 0
Trzecia, 0, 0
Czwarta, 4, 12.454

I tak ze wszystkimi.
Skrypt mógłby po prostu nadpisywać przykładowo drugą wartość dla umiejętności "Trzecia" (poziom) i wszystko sprowadzałoby się do upgrade'u danej komórki w bazie danych.

Nie jestem pewien, jak to wygląda po stronie programowania, ponieważ jeszcze się na tym aż tak dobrze nie znam.

Kolejna sprawa, w której potrzebuję pomocy, to uzależnienie ilości i typu komórek obok list rozwijanych w zależności od wybranej umiejętności. Być może brzmi to zawile, ale w moim wyobrażeniu sprowadzałoby się to do dodaniu skryptu, który czytałby parametry skryptu podane przy danym polu listy wyboru (coś jak komendy lub jakkolwiek się to nazywa) i w zależności od nich tworzył pola. Jaki parametr należy dodać do <option></option>, aby przy wybraniu danej "linijki" na liście rozwijanej, wykonywał się skrypt? Dla przycisku jest to onClick... Wydaje mi się, że skrypt ten powinien wyglądać podobnie do aktualnego (dodającego pola po przyciśnięciu przycisku), ale powinien wykonywać się po wybraniu umiejętności z listy rozwijanej dodanej przez użytkownika.

Jeśli ktoś jest chętny mi pomóc, a nie do końca rozumie to, co tu napisałem, to proszę pisać na GG:1391614.
Z góry serdecznie dziękuję za wszelką pomoc.
misiek172
na SELECT jest to onChange

http://webmade.org/porady/zdarzenia-events-js-javascript.php

to tworzenia formularza polecam zapoznać się z poleceniami JS appendChild i createElement
QooBooS
Witam.
Poradziłem sobie z tym po prostu zmieniając formularz. Teraz mam inny problem, który z pewnością potraficie rozwiązać. Niestety, ja nie mogę dojść, co jest źle.

Po stworzeniu dwóch formularzy, napisałem polecenia wrzucające dane do bazy, a teraz chcę je odczytać. Chciałbym to zrobić przy pomocy pętli, która tworzyłaby odpowiednie pola tylko wtedy, gdy wartość aktualnie sprawdzanego pola jest różna od ''. Próbowałem na różne sposoby, ale coś nie chce mi to wyjść. Może ktoś ma jakiś pomysł?

Kod
echo "<form name='formularz' method='post' action='sprawdzpp.php?krok=3'>";
//Wczytanie wszystkich skilli
$wczytajskille = dbquery("SELECT * FROM postac_skille WHERE nick='$nick' AND serwer='$serwer'");
$iloscskilli = mysql_num_fields($wczytajskille);
$nazwapola = mysql_field_name($wczytajskille, $i);

//Pętla tworząca pola dla powyższych skilli
for ($i=0;$i<$iloscskilli;$i++) {
    if ($wczytajskille[$i] != '') {
    echo "<input type='text' disabled='yes' name='$nazwapola' value='".$wczytajskille[$i]."'> - Poziom: <input type='text' name='".$nazwapola."L' maxlength='1'>, <input type='text' name='".$nazwapola."P' maxlength='6'>%<br><br>";
    }
}


Kompilator nie potrafi sobie przetłumaczyć $i w parametrach zmiennej $nazwapola. Jak w takim razie ustawić, aby mysql_field_name zawsze sprawdzało nazwę aktualnie przerabianego pola?

Tabela przedstawia się następująco:
Kod
|id|nick|serwer|nazwa_umiejętności|nazwa_umiejętnościL|nazwa_umiejętnościP|nazwa
innej_umiejętności|nazwa_innej_umiejętnościL|nazwa_innej_umiejętnościP|...|


Pole z samą nazwą umiejętności informuje pętlę, czy zaznaczono tą umiejętność w poprzednim formularzu (możliwości są dwie: albo pole zawiera wartość 'on', albo ''). W przypadku, gdy wartość jest 'on', wtedy pętla ma tworzyć trzy pola, jedno zablokowane zawierające nazwę kolumny (czyli nazwę umiejętności), drugie i trzecie mają mieć nazwę [nazwapola]L i [nazwapola]P (poziom umiejętności - L i procent ukończenia danego poziomu - P) i mają być puste.
Czy mógłby ktoś poprawić kod, aby pętla działała, jak należy? Nie mogę sobie z tym dać rady...
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.