Editace in place – spolupráce s Jeditable,

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jarks
Člen | 94
+
0
-

Mám složité zobrazení např. skladové položky, které obsahuje spoustu údajů. Data, místa, názvy, osoby, poznámky, atd. Chci uživatelům umožnit co nejjednodušší editaci. Zobrazit obrovský formulář je velmi nepřehledné, tak jsem se nakonec rozhodl využít jQuery plugin Jeditable. Uživatelé velmi vítají, že jim prostě stačí kliknout a editovat. Po nějakém zkoušení jsem to uvedl do provozu a funguje to dobře. Jsem ale začátečník, tak bych prosil, máte-li trochu času, zkouknout řešení:

Jeditable vyžaduje jen adresu scriptu, který zpracuje data předaná POSTem.

Šablona (část) – co se má editovat se obalí <div> s příslušnou třídou a id, kde je název položky:

<tr>
<td>Poznámky:</td>
<td><div class="edit_area" id="info_poznamky*{$polozka->id}">{$polozka->info_poznamky}</div></td>
</tr>

K tomu je javascript:

$(document).ready(function() {
     $('.edit_area').editable('?presenter=Receiver', {
         type      : 'textarea',
         cancel    : 'Zrušit',
         submit    : 'OK',
         indicator : '<img src="img/indicator.gif">',
         tooltip   : 'Editovat...'
     });
 });

Zadanému scriptu se pošle id=element_id&value=text k vložení.

Presenter:

class ReceiverPresenter extends BasePresenter {

    private $Model;
    public function getModel() {
        if ($this->Model === NULL) $this->Model = new Model;
        return $this->Model;}

    public function isAjax() {
    // překryjeme isAjax, jinak se detekuje ajaxový požadavek a vrátí se jen {"state":[]}
        return FALSE;}

    public function renderDefault () {
        $user = Environment::getUser();
        if ($user->isAuthenticated()) {

            $this->setLayout(); //žádný layout se nepoužije

            if($_POST) {
                $arr = array(); //k vložení

                $parts = explode("*", $_POST["id"]); //id pro update máme za hvězdičkou

                if(is_array($parts)) {
                    $arr[$parts[0]]= $_POST["value"]; //toto se vloží do tabulky
                    if(!empty($parts[1])) {$id = $parts[1];
                        $this->getModel()->update($id, $arr); //volání modelu
                        $this->template->odpoved = $arr[$parts[0]]; //toto se zobrazí uživateli
                    }
                    else $this->template->odpoved = "Chyba: ID nelze rozlišit, zápis není možný.";
                } else $this->template->odpoved = "Chyba: žádná data k vložení, zápis není možný.";
            }else $this->template->odpoved = "Chyba: žádná data k vložení, zápis není možný.";
        }
    }
} //class

V šabloně k presenteru Receiver.default je jen

{$odpoved}

Funguje to tak, že uživatel jen klikne na text v poznámce, ten se změní ve formulář, napíše co chce, stiskne [OK], presenter Receiver

  • zpracuje $_POST data, předá modelu, ten je pomocí Dibi updatuje
  • vrátí zpět co se má objevit na místě formuláře

Jakémukoliv volnému textu v šabloně od této chvíle stačí přiřadit class="edit_area" a správné id a editace je hotová. Totéž se dá udělat pro obyčejný text, data, selecty.

Editoval jarks (11. 8. 2009 17:17)

Oggy
Člen | 306
+
0
-

trošku jsem si chtěl také pohrát s jeditable.. ale mám trošku trable..šel jsem na to jinak než ty..

<script>
$('.editable').editable(function(value, settings) {
        $.get({link edit!}, {'id': this.id, 'value': value}, function(payload) {
            // refresh all snippets
            for(var id in payload.snippets) {
                jQuery.nette.updateSnippet(id, payload.snippets[id]);
            }
        });
    });
</script>

krásně to využije nette ajax linků..ale nemůžu se probojovat k tomu abych v id ..dostal id prvku.. to nefunguje.. jen prostě nevím kam šáhnout .. hodnota odeslaného „formuláře“ je ve value.. ale id toho prvku nevím kde..

a samozřejmě pak zpracování

<?php
public function handleEdit($param) {
        $this->getPresenter()->flashMessage('edit', 'info');
        $this->getPresenter()->invalidateControl('flashMessage');
    }
?>

Editoval Oggy (17. 1. 2010 22:38)

Ola
Člen | 385
+
0
-

Zkus

$(this).attr('id');

Editoval Ola (17. 1. 2010 22:50)

Oggy
Člen | 306
+
0
-

Ola napsal(a):

Zkus

$(this).attr('id');

děkuju.. nakopl jsi mě..já nakoukl do kódu jeditable, kde vrací který element byl editován…a když se data neodesílají na url..ale funkci, tak to vypadalo, že ho nikde nepředává..nebo jsem to spiše nenašel. tak jsem to zkusil cestou, kterou jsi psal .. auž jsem to vyřešil:

<script>
$(this).closest("li").get(0).id;
</script>

Editoval Oggy (17. 1. 2010 23:06)

blacksun
Člen | 177
+
0
-

Pokud je hodnota pro editaci obalená divem s id, který je v li a v this je ten div, pak musí fungovat zápis s .attr(‚id‘), případně rovnou .id, než hledat „li“ směrem ven a pak getovat ten div zase zpátky..

Honza Kuchař
Člen | 1662
+
0
-

Hoďte oko sem: http://projekty.mujserver.net/…cument_root/ a taky sem: http://www.extjs.com/…it-grid.html

Editoval honzakuchar (18. 1. 2010 22:20)

Oggy
Člen | 306
+
0
-

blacksun napsal(a):

Pokud je hodnota pro editaci obalená divem s id, který je v li a v this je ten div, pak musí fungovat zápis s .attr(‚id‘), případně rovnou .id, než hledat „li“ směrem ven a pak getovat ten div zase zpátky..

ne ne.. právě že id je li, které obaluje vše, co se týká právě jednoho prvku.. closest se mi jevilo jako nejlepší varianta.

Oggy
Člen | 306
+
0
-

honzakuchar napsal(a):

Hoďte oko sem: http://projekty.mujserver.net/…cument_root/ a taky sem: http://www.extjs.com/…it-grid.html

díky..to vypadá hezky.. a tvůj kód editinplace vypadá tak snadně:-)

Honza Kuchař
Člen | 1662
+
0
-

a tvůj kód editinplace vypadá tak snadně

Vycházel jsem z jiného kódu, ale fakt nemůžu najít kde jsem to našel. Vyžaduje to podporu atributu contenteditable.

radvis
Začátečník | 110
+
0
-

A co když mám „naroutované“ url? domena.cz/editace jak to vyřeším?

Oggy
Člen | 306
+
0
-

a jak řešíte validaci dat odeslaných přes tyto skripty?

Honza Kuchař
Člen | 1662
+
0
-

Oggy napsal(a):

a jak řešíte validaci dat odeslaných přes tyto skripty?

viz http://projekty.mujserver.net/…cument_root/

Editoval honzakuchar (16. 4. 2010 14:15)