Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]autmatyzacja generowania formularzy
jolam
post 12.07.2009, 20:08:45
Post #1





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 12.07.2009

Ostrzeżenie: (10%)
X----


Bardzo prosiłabym o pomoc w poniższej sprawie.
Postanowiłam zautomatyzować tworzenie formularzy, żeby nie wpisywać kilka razy input, type, text i innych powtarzających się słów. Użyłam programu EXCEL i plików CSV. Po prostu podzieliłam całe pole input na kolumny, podobnie label. I zamiast wpisywać ileś razy to samo po prostu zaznaczam komórkę i przeciągam w dół. Oczywiście zdefiniowałam input id jako zawartość komórki label for. Po tym wczytuję plik i wyświetlam. I to działa, nie ma błędów z identyfikatorami i jestem bardzo zadowolona z efektu. Ale gorzej jeśli chce mieć w formularzu pole textarea albo opcje: chceckbox i radio. Wtedy wpisywanie do EXCEL trochę się rozjeżdża i nie jest już dla mnie takie wygodne. Chciałam WAS zapytać czy lepiej robić to dalej przy pomocy EXCEL czy zrezygnować z niego i przejść zupełnie do PHP? Trochę obawiam się, że w PHP będzie jeszcze więcej pisania, bo będę musiała sprawdzać czy teraz wyświetlany element formularza to input, czy textarea, czy coś innego. W ogóle bardzo zależałoby mi na tym abym po wypełnieniu formularza miała tabelę z wartościami (to jest w $_POST) i nazwami tych pól formularza. Bo chciałabym aby po niepełnym jego wypełnieniu pokazywał się formularz, a przy niewypełnionych polach informacje, że trzeba je wypełnić. Czyli muszę mieć to połączenie nazwy i wartości. Ale nie mogę wykorzystać indeksów tekstowych z $_POST bo tam nie mogłam używać polskich znaków, a dziwnie tak bez nich wyświetlać napisy. A dwa może w przyszłości chciałabym mieć w tej tablicy poza nazwą i wartością również nazwę odmienioną przez rodzaje/przypadki. Abym mogła wyświetlać tego typu napisy: Nie podałaś Miejscowości z której pochodzisz.

Proszę o radę i pomoc jak mogłabym uzyskać taki efekt najsprawniej i najmniejszym nakładem pracy, tak aby jego modyfikacja nie była czasochłonna i trudna - jednym słowem jak mogłabym to dobrze zautomatyzować?




Jola Mikołowska
Go to the top of the page
+Quote Post
sadistic_son
post 12.07.2009, 20:54:24
Post #2





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Przeczytałem ten teks 2 razy i chyba nie do końca rozumiem niektórych rzeczy blinksmiley.gif

Ogólnie tworzenie dużej ilości pól formularza będzie prostsze w php bo załatwi to 1 pętla, lub ewentualnie jedna do danego typu pola.

I co rozumiesz przez:
Cytat(jolam @ 12.07.2009, 21:08:45 ) *
Ale nie mogę wykorzystać indeksów tekstowych z $_POST bo tam nie mogłam używać polskich znaków
Wartością dla $_POST może być dowolny ciąg znaków, z polskimi znakami równierz. Chyba, że chodzi Ci o nazwę zmiennej $_POST['ąęźżćś'] wywali oczywiście błąd, ale $_POST['nazwa']='ąćśćźżó' nie sprawi żadnego problemu.


Tworzenie dużej ilości input'ów można zrobić np. prostą pętlą for:
  1. <?php
  2. $j=20; //ilość chcianych input'ów (powtórzeń pętli)
  3. $name=0; //nazwa początkowa pierwszego pola (będzie większa o 1)
  4. for($i=0;$i<$j;$i++){
  5. echo '<input type="text" name="';
  6. echo $name++;
  7. echo '"><br />';
  8. }
  9. ?>
I gotowe. Dla $j podajesz ile pól ma się stworzyć. Jeśli chcesz aby nazwy inputów były nie tylko samą cyfrą to musi to wygłądać tak:
  1. <?php
  2. $j=20; //ilość chcianych input'ów (powtórzeń pętli)
  3. $name=0; //nazwa początkowa pierwszego pola (będzie większa o 1)
  4. $t='jakas_Twoja_nazwa_pola_';
  5. for($i=0;$i<$j;$i++){
  6. echo '<input type="text" name="';
  7. $name++;
  8. $name2=$t.$name;
  9. echo $name2;
  10. echo '"><br />';
  11. }
  12. ?>
Wtedy nazwa input będzie wyglądać tak: jakas_Twoja_nazwa_pola_1, jakas_Twoja_nazwa_pola_2 itd.

Ten post edytował sadistic_son 12.07.2009, 21:19:10


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
jolam
post 13.07.2009, 10:12:29
Post #3





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 12.07.2009

Ostrzeżenie: (10%)
X----


Idea jest prosta. W formularzu jest ileś pól input/text. Przykładowo: imię, nazwisko, adres e-mail, ulubiony kolor. I wpisywanie tych wszystkich powtarzających sie ciągów znaków w kodzie html/php uznałam za mało fajne. Chciałam sobie ułatwić życie na przyszłość.
Go to the top of the page
+Quote Post
Darti
post 13.07.2009, 10:15:33
Post #4





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


Napisz sobie prosty importer z plików csv + prosta walidacja. nie ma sensu przeklepywać wszystkiego z excella.


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
Fifi209
post 13.07.2009, 10:25:08
Post #5





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(sadistic_son @ 12.07.2009, 20:54:24 ) *
I co rozumiesz przez:Wartością dla $_POST może być dowolny ciąg znaków, z polskimi znakami równierz. Chyba, że chodzi Ci o nazwę zmiennej $_POST['ąęźżćś'] wywali oczywiście błąd, ale $_POST['nazwa']='ąćśćźżó' nie sprawi żadnego problemu.


Skoro mówiła o indexach to nie o wartościach...

Cytat(jolam @ 13.07.2009, 10:12:29 ) *
Idea jest prosta. W formularzu jest ileś pól input/text. Przykładowo: imię, nazwisko, adres e-mail, ulubiony kolor. I wpisywanie tych wszystkich powtarzających sie ciągów znaków w kodzie html/php uznałam za mało fajne. Chciałam sobie ułatwić życie na przyszłość.


Napisz sobie klasę do generowania formularzy. winksmiley.jpg

Skoro wiesz, że masz np. 3 inputy typu text i znasz ich id/name

to robisz w php taki trick:

  1. <?php
  2. function input($array) {
  3. echo '<input type="'.$array['type'].'" name="'.$array['name'].'" id="'.$array['id'].'">';
  4. }
  5.  
  6. $inputy = array(
  7. array('type' => 'text', 'name' => 'imie', 'id' => 'imie'),
  8. array('type' => 'text', 'name' => 'nazwisko', 'id' => 'nazwisko')
  9. );
  10.  
  11. foreach ($inputy as $value) {
  12. input($value);
  13. }
  14. ?>


(nie wiem czy działa, pisane podczas posta ;d )


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
jolam
post 13.07.2009, 10:52:47
Post #6





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 12.07.2009

Ostrzeżenie: (10%)
X----


Darti Mógłbyś mi napisać co dokładnie masz na myśli? Co trzymać w pliku CSV a co nie? I jak to efektywnie potem przerabiać miałabym na formularz. Bo przecież są różne pola: textarea, input/radio, input/text. Bardzo Cię proszę napisz mi dokładniej jak to powinno według Ciebie funkcjonować?

Ten post edytował jolam 13.07.2009, 10:53:29
Go to the top of the page
+Quote Post
Darti
post 13.07.2009, 11:31:26
Post #7





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


Cytat(jolam @ 13.07.2009, 09:52:47 ) *
Darti Mógłbyś mi napisać co dokładnie masz na myśli? Co trzymać w pliku CSV a co nie? I jak to efektywnie potem przerabiać miałabym na formularz. Bo przecież są różne pola: textarea, input/radio, input/text. Bardzo Cię proszę napisz mi dokładniej jak to powinno według Ciebie funkcjonować?


Zakładam że masz wszystko w excellu i masz możliwość eksportu z niego do csv.
Jeśli tak, to nie ma sensu przeklepywać tego do formularzy w przeglądarce - w końcu nie od tego są komputery.
najprościej coś takiego:
  1. <?php
  2. $row = 1;
  3. $uchwyt = fopen ("test.csv","r");
  4. while (($data = fgetcsv($uchwyt, 1000, ",")) !== FALSE)  {
  5.    if($row == 1) { // w pierwszym wierszu są nazwy kolumn
  6.         for ($c=0; $c < $num; $c++){
  7.             $nazwa_kolumny[] = $data[$c];
  8.         }
  9.    } else {
  10.         for ($c=0; $c < $num; $c++){
  11.             $dane[][$nazwa_kolumny[$c]] = $data[$c];
  12.         }
  13.    }
  14.    row++;
  15. }
  16. fclose ($uchwyt);
  17.  
  18. foreach($dane as $key => $wiersz){ //$key w zasadzie i tak nieistotny
  19.    //operacje na bazie albo + ewentualna walidacja, tutaj wyswietlanie
  20.    echo $wiersz['kolumna1'].' '.$wiersz['kolumna2'].'<br>';
  21. }
  22. ?>


Ten post edytował Darti 13.07.2009, 11:32:42


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
jolam
post 13.07.2009, 20:10:54
Post #8





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 12.07.2009

Ostrzeżenie: (10%)
X----


fifi209 Twoja odpowiedź najbardziej mi pomogła, o czymś takim myślałam. Z pliku CSV odczytuję nazwy pól i potem je umieszczam w tablicy. Mam jeszcze jedną trudność, Co zrobić aby przy takim definiowaniu tabeli odwołać się do któregoś jej elementu

$inputy = array(
array('type' => 'text', 'name' => 'imie', 'id' => funkcja($inputy[]['name']),
);.

Powyższy fragment oczywiści nie działa. Czy da się coś takiego zrobić? Aby odwołać się do elementu przed chwilą zdefiniowanego? Bardzo by mi to pomogło.

Darti coś podobnego napisałam smile.gif Ale teraz zmagam się z tym odwołaniem z postu wyżej. Dziękuję Ci.
Go to the top of the page
+Quote Post
Fifi209
post 13.07.2009, 20:59:36
Post #9





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(jolam @ 13.07.2009, 20:10:54 ) *
fifi209 Twoja odpowiedź najbardziej mi pomogła, o czymś takim myślałam. Z pliku CSV odczytuję nazwy pól i potem je umieszczam w tablicy. Mam jeszcze jedną trudność, Co zrobić aby przy takim definiowaniu tabeli odwołać się do któregoś jej elementu

$inputy = array(
array('type' => 'text', 'name' => 'imie', 'id' => funkcja($inputy[]['name']),
);.

Powyższy fragment oczywiści nie działa. Czy da się coś takiego zrobić? Aby odwołać się do elementu przed chwilą zdefiniowanego? Bardzo by mi to pomogło.

Darti coś podobnego napisałam smile.gif Ale teraz zmagam się z tym odwołaniem z postu wyżej. Dziękuję Ci.


Bo w [] musisz podać index czyli hmm, zamknąć to jakoś w klasie? biggrin.gif
Powiedz mi dokładniej co chcesz zrobić to postaram się pomóc / coś napisać / podpowiedzieć.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
jolam
post 13.07.2009, 21:43:58
Post #10





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 12.07.2009

Ostrzeżenie: (10%)
X----


fifi209 mam:
$inputy = array(
array('type' => 'text', 'name' => 'Imię', 'id' => funkcja($inputy[]['name']),
);.
napisałam funkcję wycinającą polskie litery i chciałabym jej użyć na 'name' aby otrzymać 'id'. I nie wiem jak to zrobić sad.gif Pomożesz mi?
Jeśli będziesz tak miły, to powiedz mi również jak dokładnie działają referencje. Jeśli miałabym:
foreach( $tab as &$item)
{
$item=$item+2;
}
to będzie działać, ale jeśli miałabym:
$zm=4;
foreach( $tab as &$item)
{
$zm=$item+2; // to bez sensu, ale chodziło mi o przykład
}
to $zm nadal będzie równe 4. Jak mogłabym to zmienić?
Mam jeszcze taką sprawę. Dwie tablice $tab1 i $tab2 i chciałabym móc operować na wszystkich parach elementów (jeden z $tab1 i jeden z $tab2). Coś w rodzaju
foreach( $tab1 as $t)
{
$t=$t+$t2 // chodziło mi o element z drugiej tablicy
}
Jak to zrobić? Bardzo Cie proszę pomóż mi.
Go to the top of the page
+Quote Post
Fifi209
post 13.07.2009, 21:58:32
Post #11





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(jolam @ 13.07.2009, 21:43:58 ) *
fifi209 mam:
$inputy = array(
array('type' => 'text', 'name' => 'Imię', 'id' => funkcja($inputy[]['name']),
);.
napisałam funkcję wycinającą polskie litery i chciałabym jej użyć na 'name' aby otrzymać 'id'. I nie wiem jak to zrobić sad.gif Pomożesz mi?

Raczej się tak nie da... ;p Ew. W klasie zapisać po kolei każdą zmienną, i na końcu tworzyć array ale to troszkę bez sensu lepsze będzie ctrl + c, ctrl + v ;p

Cytat(jolam @ 13.07.2009, 21:43:58 ) *
Jeśli będziesz tak miły, to powiedz mi również jak dokładnie działają referencje. Jeśli miałabym:
foreach( $tab as &$item)
{
$item=$item+2;
}
to będzie działać, ale jeśli miałabym:
$zm=4;
foreach( $tab as &$item)
{
$zm=$item+2; // to bez sensu, ale chodziło mi o przykład
}
to $zm nadal będzie równe 4. Jak mogłabym to zmienić?

np.

  1. <?php
  2. $zm=4;
  3. foreach( $tab as &$item)
  4. {
  5. global $zm;
  6. $zm=$item+2;
  7. }
  8. ?>


Cytat(jolam @ 13.07.2009, 21:43:58 ) *
Mam jeszcze taką sprawę. Dwie tablice $tab1 i $tab2 i chciałabym móc operować na wszystkich parach elementów (jeden z $tab1 i jeden z $tab2). Coś w rodzaju
foreach( $tab1 as $t)
{
$t=$t+$t2 // chodziło mi o element z drugiej tablicy
}
Jak to zrobić? Bardzo Cie proszę pomóż mi.


  1. <?php
  2. $tablica1 = array('a', 'b', 'c', 'd');
  3. $tablica2 = array('b', 'c', 'd', 'e');
  4.  
  5. foreach ($tablica1 as $key => $value) {
  6. echo $value . ' - '. $tablica2[$key].'<br/>';
  7. }
  8. ?>


Sprawdź co ten kod wyrzuci. (powinno działać, pod warunkiem że tablice mają te same długości i takie same klucze)

Ten post edytował fifi209 13.07.2009, 22:00:10


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
jolam
post 14.07.2009, 08:02:17
Post #12





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 12.07.2009

Ostrzeżenie: (10%)
X----


Raczej się tak nie da... ;p Ew. W klasie zapisać po kolei każdą zmienną, i na końcu tworzyć array ale to troszkę bez sensu lepsze będzie ctrl + c, ctrl + v ;p
Rozumiem. A jak mając tablice przykładową:
$t1 = array( array( 'a' => 'A'), array( 'b' => 'B'))
mogłabym stworzyć nową tablicę:
$t2 = array( array( 'a2' => funkcja($t1['a']), array( 'b2' => funkcja($t1['b']));
czyli, żeby nowa tablica zawierała tablice, której elementy postały w skutek użycia funkcji na elementach podtablic starej tablicy. I jak później mogłabym połączyć te tablice aby otrzymać:
$t3= array( array( 'a' => 'A', 'a2' => 'A2'),
array( 'b' => 'B', 'b2' => 'B2'));
gdzie te a2, b2 to indeksy z tablicy $t2 a A2, B2 to wartości. Wtedy rozwiązałabym swój problem, gdybym potrafiła to zrobić.

Wiem, że mogę używać global, ale czy da się inaczej, jakoś przez ta referencję? Chciałabym, żeby wartość zmiennej zmienionej w foreach lub funkcji nie była kasowana po jej opuszczeniu. Ale obawiam sie pomyłek zmiennych w czasie użycia global.
Go to the top of the page
+Quote Post
Fifi209
post 14.07.2009, 08:53:07
Post #13





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Naturalnie, można łączyć tablice więcej w manualu: http://pl.php.net/manual/pl/book.array.php ew. "ręcznie" (samemu coś napisać)

Ten post edytował fifi209 14.07.2009, 08:53:46


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
jolam
post 14.07.2009, 13:54:10
Post #14





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 12.07.2009

Ostrzeżenie: (10%)
X----


Nie potrafię tego zrobić:( Jest array merge, ale nie potrafię tego zrobić tak jak napisałam w poscie wyżej. Prosze pomóż mi, napisz po kolei jakich funkcji i jak mam użyć.Pozdrawiam
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 14:59