<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#60;?blog &#187; formularz</title>
	<atom:link href="https://blog.visionsoftware.pl/tag/formularz/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.visionsoftware.pl</link>
	<description>...nie tylko o programowaniu</description>
	<lastBuildDate>Sun, 23 Mar 2014 19:23:43 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Dynamiczne formularze z Jeditable i jQuery</title>
		<link>https://blog.visionsoftware.pl/java-script-jquery/dynamiczne-formularze-z-jeditable-i-jquery.html</link>
		<comments>https://blog.visionsoftware.pl/java-script-jquery/dynamiczne-formularze-z-jeditable-i-jquery.html#comments</comments>
		<pubDate>Wed, 30 Mar 2011 21:47:07 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[Java Script/jQuery]]></category>
		<category><![CDATA[formularz]]></category>
		<category><![CDATA[jeditable]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=240</guid>
		<description><![CDATA[Ciekawym sposobem na edycję danych przez użytkownika jest dynamiczne tworzenie pola formularza w momencie, gdy klika on w wyświetlany tekst. Możemy w taki sposób uprościć wygląd szczególnie, gdy pól mogłoby być dużo. Taką edycję bardzo prosto wykonać za pomocą gotowej biblioteki jQuery o nazwie Jeditable, dzięki której otrzymamy gotowe narzędzie do tworzenia dynamicznych formularzy. W niniejszym poradniku wykorzystamy uproszczony przykład tabeli z danymi, które będzie można edytować poprzez dynamiczne tworzenie pola formularza w wybranej komórce. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ciekawym sposobem na edycję danych przez użytkownika jest dynamiczne tworzenie pola formularza w momencie, gdy klika on w wyświetlany tekst. Możemy w taki sposób uprościć wygląd szczególnie, gdy pól mogłoby być dużo. Taką edycję bardzo prosto wykonać za pomocą gotowej biblioteki jQuery o nazwie Jeditable, dzięki której otrzymamy gotowe narzędzie do tworzenia dynamicznych formularzy.<span id="more-240"></span></p>
<p>W niniejszym poradniku wykorzystamy  uproszczony przykład tabeli z danymi, które będzie można edytować poprzez dynamiczne tworzenie pola formularza w wybranej komórce. Tabela zawiera 3 kolumny: osoba, stanowisko, oraz uwagi. Po kliknięciu w wybraną komórkę pojawi się odpowiednie pole formularza (text, select lub textarea) umożliwiające edycję. Przykładowy wynik opisanych poniżej działań można zobaczyć <a href="http://blog.visionsoftware.pl/przyklady/240/" title="Przykład" target="_blank">tutaj</a>.</p>
<p>Potrzebną bibliotekę można pobrać ze strony projektu <a href="http://www.appelsiini.net/projects/jeditable" title="" target="_blank">Jeditable</a>. Kod tabeli może wyglądać następująco:</p>
<pre class="brush: xml; title: ; notranslate">
  &lt;table&gt;
    &lt;tr&gt;
      &lt;th&gt;Lp.&lt;/th&gt;
      &lt;th&gt;Osoba&lt;/th&gt;
      &lt;th&gt;Stanowisko&lt;/th&gt;
      &lt;th&gt;Uwagi&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td class=&quot;edit text&quot; id=&quot;person_1&quot;&gt;Jan Kowlaski&lt;/td&gt;
      &lt;td class=&quot;edit select&quot; id=&quot;occupation_1&quot;&gt;Informatyk&lt;/td&gt;
      &lt;td class=&quot;edit textarea&quot; id=&quot;info_1&quot;&gt;Na urlopie do 2 stycznia&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td class=&quot;edit text&quot; id=&quot;person_2&quot;&gt;Tomasz Nowak&lt;/td&gt;
      &lt;td class=&quot;edit select&quot; id=&quot;occupation_2&quot;&gt;Handlowiec&lt;/td&gt;
      &lt;td class=&quot;edit textarea&quot; id=&quot;info_2&quot;&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td class=&quot;edit text&quot; id=&quot;person_3&quot;&gt;Anna Dąbrowska&lt;/td&gt;
      &lt;td class=&quot;edit select&quot; id=&quot;occupation_3&quot;&gt;Księgowy/a&lt;/td&gt;
      &lt;td class=&quot;edit textarea&quot; id=&quot;info_3&quot;&gt;Idzie na szkolenie 5-6 luty&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td class=&quot;edit text&quot; id=&quot;person_4&quot;&gt;Marcin Wiśniewski&lt;/td&gt;
      &lt;td class=&quot;edit select&quot; id=&quot;occupation_4&quot;&gt;Spec. ds. marketingu&lt;/td&gt;
      &lt;td class=&quot;edit textarea&quot; id=&quot;info_4&quot;&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
</pre>
<p>Będziemy potrzebowali teraz określić, które pola będą edytowane i w jaki sposób. Dla poszczególnych komórek zmiany będą dokonywane przy pomocy różnych typów formularza. Rozróżnienia dokonamy po nazwach klas poszczególnych komórek tabeli, co widać na powyższym kodzie HTML.</p>
<p>Edycja zawartości pola &#8222;Osoba&#8221; będzie się odbywała przez zwykłe pole tekstowe, które tworzymy w następujący sposób:</p>
<pre class="brush: jscript; title: ; notranslate">
  $('.text').editable('save.php', { 
    type      : 'text',
    cancel    : 'Anuluj',
    submit    : 'Zapisz',
    indicator : '&lt;img src=&quot;img/indicator.gif&quot; alt=&quot;&quot; /&gt;',
    width     : '100px'
  });
</pre>
<p>Stworzenie formularza w Jeditable polega na użyciu metody editable, odwołującej się do określonego obiektu (w tym wypadku klasy HTML text). Wymaga ona dwóch parametrów. Pierwszym jest plik, jaki zostanie wywołany przy akceptacji formularza i do którego zostanie przesłana wartość z pola. Drugim parametrem jest tablica zawierająca zmienne konfiguracyjne. W tym przypadku posiadają one następujące znaczenie:</p>
<ul>
<li>type &#8211; typ pola formularza, możliwe wartości to text, select lub textarea</li>
<li>submit &#8211; napis na przycisku akceptującego formularz</li>
<li>cancel &#8211; napis na przycisku anulowania edycji, jeśli nie jest podany przycisk nie wyświetli się (wyjście z trybu edycji jest możliwe poprzez kliknięcie poza formularzem)</li>
<li>indicator &#8211; tekst jaki pojawi się w momencie zapisywania danych, może to być także kod HTML wyświetlający animację postępu poprzez znacznik img</li>
<li>width &#8211; długość pola formularza, domyślnie automatycznanie dobierana</li>
</ul>
<p>Kolejnym polem w formularzu będzie &#8222;Stanowisko&#8221;. Będzie on wybierany z listy rozwijanej, posłużymy się więc następującą definicją:</p>
<pre class="brush: jscript; title: ; notranslate">
  $('.select').editable('save.php', { 
    type      : 'select',
    data      : &quot;{'1':'Informatyk','2':'Księgowy/a',
'3':'Spec. ds. marketingu', '4':'Handlowiec', 'selected':'1'}&quot;,
    submit    : 'Zapisz',
    cancel    : 'Anuluj',
    indicator : '&lt;img src=&quot;img/indicator.gif&quot; alt=&quot;&quot; /&gt;',
    width     : '100px',
    submitdata: {field: 'select'}
  }); 
</pre>
<p>Pojawią się tu dodatkowe zmienne:</p>
<ul>
<li>submitdata &#8211; dodatkowe wartości, jakie można przesłać do pliku wynikowego (w tym przypadku rodzaj pola, który przyda się przy zapisie danych)</li>
<li>data &#8211; zawiera ona tablicę zawodów w układzie klucz:wartość. Jej ostatnim elementem jest oznaczenie wybranej wartości, czego dokonujemy poprzez ‘selected’:’klucz’</li>
</ul>
<p>Innym sposobem na załadowanie wartości do pola select oraz innych typów, jest skorzystanie z parametru loadurl zawierającego nazwę pliku</p>
<pre class="brush: jscript; light: true; title: ; notranslate">
loadurl  : 'load.php'
</pre>
<p>Plik ten Powinien zwrócić dane w formacie json o następującej strukturze:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$data = array(
        1 =&gt; ‘Informatyk’,
        2 =&gt; ‘Księgowy/a’,
        3 =&gt; ‘Spec. ds. marketingu’,
        4 =&gt; ‘Handlowiec’,
'selected' =&gt; 1
);
echo json_encode($data);
?&gt;
</pre>
<p>Dzięki temu możemy wczytać odpowiednie wartości z bazy danych lub dodatkowo je zmodyfikować. Możemy z takiego rozwiązania skorzystać także w przypadku pól text lub textarea. Domyślnie ładowana jest do nich wartość z edytowanego obiektu, jednak możemy to zmienić przy pomocy loadurl.</p>
<p>Na koniec pozostały nam &#8222;Uwagi&#8221;, które będziemy edytowali poprzez pole typu textarea:</p>
<pre class="brush: jscript; title: ; notranslate">
  $('.textarea').editable('save.php', { 
    type      : 'textarea',
    cancel    : 'Anuluj',
    submit    : 'Zapisz',
    indicator : '&lt;img src=&quot;img/indicator.gif&quot; alt=&quot;&quot; /&gt;',
    rows	    : '4',
    cols      : '20',
    placeholder: ''
  }); 
</pre>
<p>W tym przypadku dochodzą kolejne nowe zmienne:</p>
<ul>
<li>rows – liczba wierszy w textarea</li>
<li>cols &#8211; liczba kolumn w textarea</li>
<li>placeholder – tekst, jaki pojawi się w przypadku pustej wartości. W tym przypadku pusty, gdyż nie będzie on potrzebny (domyślnie &#8222;Click to edit&#8221;).</li>
</ul>
<p>Po zatwierdzeniu pola formularza możemy dokonać zapisu danych w wywoływanym pliku save.php. Wartość oraz dodatkowe parametry będą dostępne w zmiennej POST. Można to zmienić poprzez parametr metod, o czym będzie mowa później. Domyślnie wartość będzie dostępna pod zmienną value, a identyfikator pola (o ile został zdefiniowany) pod zmienną id.</p>
<p>Wynikiem przedstawionego wywołania powinna być wartość zmienionego pola (odpowiedni klucz w przypadku select). Plik save.php powinien zwracać wartość pola po zmianie. Dzięki temu po zapisie w tabeli pojawi się zaktualizowana wartość.</p>
<p>Przykładowy plik save.php może w uproszczeniu wyglądać następująco:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// pod zmienna POST[id] znajduje sie id pola formularza
// np. id=&quot;person_1&quot;, czyli nazwa pola z bazy i id rekordu 
list($field, $id) = explode(&quot;_&quot;, $_POST[&quot;id&quot;]);

// uwaga na bezpieczenstwo zmiennych!
$dbh = mysql_connect(...);

$sql = &quot;update table
set {$_POST[&quot;field&quot;]} = $value
where id=$id&quot;;

mysql_query($sql);

// pod zmienna POST[value] znajduje sie wartsc z formularza 
// dla pola select trzeba zwrocic tekstm pod value jest ide rekordu!
if($_POST['field'] == 'select'){
  // te dane nalezy wczytac z bazy
  $occupation = array(
    1 =&gt; &quot;Informatyk&quot;,
    2 =&gt; &quot;Księgowy/a&quot;,
    3 =&gt; &quot;Spec. ds. marketingu&quot;,
    4 =&gt; &quot;Handlowiec&quot;
  );
  $value = $occupation[$_POST['value']];
}
else{
  $value = $_POST['value'];
}

// dzięki temu w tabeli pojawi się zmieniona wartość
echo $value;
?&gt;
</pre>
<p>Tworząc pole formularza możemy skorzystać z dość dużej liczby dodatkowych parametrów. Warto się z nimi zapoznać:</p>
<p>method &#8211; sposób przekazywania danych do pliku wynikowego: POST (domyślnie) lub PUT (kompatybilnie z Rails)</p>
<p>callback &#8211; funkcja która zostanie wywołana po zatwierdzeniu formularza. Używa dwóch parametrów: wartości z pola oraz ustawień wtyczki. Wewnątrz funkcji można się odwoływać do poszczególnych elementów poprzez this.</p>
<pre class="brush: jscript; title: ; notranslate">
$('.editable').editable('save.php', {
   type     : 'textarea',
   submit   : 'OK',
   callback : function(value, settings) {
       console.log(this);
       console.log(value);
       console.log(settings);
   }
});
</pre>
<p>name &#8211; nazwa zmiennej, zawierająca wartość wpisaną w formularzu, domyślnie value</p>
<p>id &#8211; nazwa zmiennej, która przechowuje id edytowanego elementu, domyślnie id</p>
<p>height &#8211; wysokość pola formularza w pikselach, domyślnie auto</p>
<p>loadtype &#8211; typ żądania używany przez loadurl: GET lub POST. Domyślnie jest wykorzystywany pierwszy z nich.</p>
<p>data &#8211; dane z formularza przesłane jako parametr. Może być stringiem lub funkcją zwracającą string. Przydatny, gdy chcemy dokonać zmian w tekście przed edycją w formularzu. Przykładowo, możemy w ten sposób zmienić HTMLowe znaczniki &#8222;br&#8221;  na końce linii widoczne w polu edycji:</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;.editable&quot;).editable(&quot;save.php&quot;;, {
  data: function(value, settings) {
    var retval = value.replace(/&lt;br[\s\/]?&gt;/gi, '\n');
    return retval;
  }
});
</pre>
]]></content:encoded>
			<wfw:commentRss>https://blog.visionsoftware.pl/java-script-jquery/dynamiczne-formularze-z-jeditable-i-jquery.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
