Autor Zpráva
jirkass
Profil *
Potřebuji poslat vícenásobný výběr v selectu: Jak jsem se dočetl na jakpsatweb.cz, v tom případě se nepředávají hodnoty, čili zbývá asi jen utilita selectable v jquery, konkrétně standardní provedení serialize, které zobrazuje výčet provedených výběrů. Tohle na stránce rozběhnu, jenže jakékoli další pokusy ty konkrétní výběry poslat do php proměnné, kde s nima musím dál manipulovat nejsem schopen rozběhnout. Konkrétně sem pastnu zdrojový kód z manuálu
 <script>
$(function() {
$( "#selectable" ).selectable({
stop: function() {
var result = $( "#select-result" ).empty();
$( ".ui-selected", this ).each(function() {
var index = $( "#selectable li" ).index( this );
result.append( " #" + ( index + 1 ) );
});
}
});
});
</script>
</head>
<body>
<p id="feedback">
<span>You've selected:</span> <span id="select-result">none</span>.
</p>
<ol id="selectable">
<li class="ui-widget-content">Item 1</li>
<li class="ui-widget-content">Item 2</li>
<li class="ui-widget-content">Item 3</li>
<li class="ui-widget-content">Item 4</li>
<li class="ui-widget-content">Item 5</li>
<li class="ui-widget-content">Item 6</li>
</ol>
nevím, jak uchopit zobrazené hodnoty ve <span id="select-result"> a propasírovat je do php. Pokud se neurazíte za tak triviální dotaz, budu vděčný za pomoc
Chamurappi
Profil
Reaguji na jirkasse:
Jak jsem se dočetl na jakpsatweb.cz, v tom případě se nepředávají hodnoty
Cože? Proč? Kde? Odkaz?
jirkass
Profil *
Formuláře » select
-2.řádek v tabulce
preca1
Profil
Tos to špatně pochopil. Bez hodnoty je onen atribut.
Davex
Profil
jirkass:
V té tabulce je výpis atributů HTML elementu <select> s možnými hodnotami a multiple se zapisuje bez hodnoty.

<select name="vyber[]" multiple>

Nemá to jiný význam.
jirkass
Profil *
Davex: Děkuju za radu, jasně vlastně, že multiple select se musí předat polem. Můj problém ale dál přetrvává: Jak proměnnou propasírovat nikoli klasicky submitovým reloadem, nýbrž bez znovunačítání stránky. Můj problém jsem shrnul do nejtriviálnějšího příkladu, sesmoleného z webu, který už týden marně prolézám, abych našel jakýkoli příklad, který bych dokázal rozběhnout. Tady je soubor process.php:
<?php
// SIMLIEST EXAMPLE EVER php jquery ajax

echo  $_REQUEST['bar']; ?>
<script src="jquery/js/jquery-1.9.1.js"></script>
<form id="foo">
    <input name="bar" type="text" value="" />
    <input type="submit" value="Send" />
</form>   
<script language=javascript>
// variable to hold request
var request;
// bind to the submit event of our form
$("#foo").submit(function(event){
    // abort any pending request
    if (request) {
        request.abort();
    }
    // setup some local variables
    var $form = $(this);
    // let's select and cache all the fields
    var $inputs = $form.find("input, select, button, textarea");
    // serialize the data in the form
    var serializedData = $form.serialize();

    // let's disable the inputs for the duration of the ajax request
    $inputs.prop("disabled", true);

    // fire off the request to /form.php
    var request = $.ajax({
        url: "process.php",
        type: "post",
        data: serializedData
    });

    // callback handler that will be called on success
    request.done(function (response, textStatus, jqXHR){
        // log a message to the console
        console.log("Hooray, it worked!");
    });

    // callback handler that will be called on failure
    request.fail(function (jqXHR, textStatus, errorThrown){
        // log the error to the console
        console.error(
            "The following error occured: "+
            textStatus, errorThrown
        );
    });

    // callback handler that will be called regardless
    // if the request failed or succeeded
    request.always(function () {
        // reenable the inputs
        $inputs.prop("disabled", false);
    });

    // prevent default posting of form
    event.preventDefault();
});
</script>

Firebug po odeslání libovolného textu v inputu zahlásí: 1 požadavek, síť-XHR-POST zahlásí adekvátně proměnná bar=(odesl.hodnota), ale není v mých silách pochopit, jak tu proměnnou chňapnout. Děkuju za jakoukoli radu, s jquery zcela začínám.
Davex
Profil
jirkass:
Nechápu v čem je problém a o jakém chňapání je řeč. Nedělá to něco, co by to mělo dělat? Příklad funguje.

Hodnota z formuláře bude předána metodou POST skriptu process.php a tam bude dostupná v poli $_POST["bar"] (a $_REQUEST["bar"], ale to nedoporučuji, protože se tam v závislosti na verzi a nastavení PHP smíchají všechny vstupy $_GET, $_POST a $_COOKIE dohromady).
jirkass
Profil *
Davex:
v tom je potíž. Mně to nefunguje, proměnnou $bar v echu toho postu (obecněji requestu) nemám. Že b y něco blbě v nastavení serveru? Nebo špatně chápu smysl asynchronního odeslání a proměnná echo $_REQUEST['bar']; se mi nezobrazí, prostože je tam nějak "jindy" než čekám? Zkusil jsem tu proměnnou bar odchytit i do $_SESSION['rgzhj'] = $_REQUEST['bar'];, který jak bych předpokládal, by číhal na moment, kdy se tam proměnná asynchronně objeví, bezvýsledně. Děkuju za trpělivost.
Davex
Profil
jirkass:
proměnnou $bar v echu toho postu (obecněji requestu) nemám
To zjišťuješ jak? Ve Firebugu » Net » XHR » POST process.php » Response?

Nebo špatně chápu smysl asynchronního odeslánía proměnná echo $_REQUEST['bar']; se mi nezobrazí, prostože je tam nějak "jindy" než čekám?
Nevím, kdy je očekávána nebo kde se má vypisovat, ale tento JavaScript AJAXem přijmutá data na stránce s formulářem nezobrazuje. Data se při stisknutí tlačítka jen na pozadí odešlou skriptu process.php (a při úspěchu se do konzole vypíše „Hooray, it worked!“, pokud prohlížeč nezná objekt window.console, tak se skript náhle ukončí - zhavaruje), a to je všechno.

Zkusil jsem tu proměnnou bar odchytit i do $_SESSION['rgzhj'] = $_REQUEST['bar'];
Za předpokladu, že jsi nezapomněl na session_start(), by to také mělo fungovat.
jirkass
Profil *
Davex:
Asi mi něco důležitýho pořád uniká. Pošlu slovo ahoj: V Net » XHR » POST process.php » Response je:
ahoj<script src=.....+celá html+js část příkladu.
Jenže já to z toho soboru process.php na sebe posílám, a tam to echo v první řádce mlčí jak zařezaný, ani ten session nezobrazí. Pro upřesnění, bavím se o začátku výše uvedeného příkladu skriptu v souboru process.php doplněného na:
...
echo $_POST['bar']; 
$_SESSION['neco'] = $_POST['bar']; 
echo $_SESSION['neco'];
...
a session_start(); už tam taky je. V $_SESSION['neco'], kam jsem si ten POST odchytil, skutečně, což považuju za první obrovský úspěch, hodnota "ahoj" je, jenže to jsem si ověřil až zobrazením v jiném souboru. Mým úmyslem je odeslat proměnnou na soubor, ze kterého ji odesílám, aby hned mohla něco zpracovat (třeba jestli je $_POST['bar']; tohle, zobraz tohle, ne-li, udělej tamto). Tímhle myslím to v uvozovkách chňapnutí proměnné. Můžete mi tedy trknout, jak v souboru process.php lze $_POST['bar']; použít, když je vlastně nějak mimo něj? Děkuju
Davex
Profil
jirkass:
ahoj<script src=.....+celá html+js část příkladu
Takže to funguje přesně podle toho, jak je to uvedeno v kódu a po odeslání hodnoty ahoj AJAXem z formuláře je proměnná $_REQUEST['bar'] ve skriptu process.php nastavená, jinak by tam nebylo ahoj na začátku. Je ti doufám jasné, že se ten PHP skript spouští dvakrát - jednou zobrazí formulář a podruhé dělá něco na pozadí po odeslání formuláře (asi by měl jen něco udělat a nevypisovat ten kód jako v prvním případě). Obě spuštění jsou naprosto samostatné a pokud se nepoužije session, tak nejsou navzájem provázané a nepoužívají společné proměnné.

Jenže já to z toho soboru process.php na sebe posílám, a tam to echo v první řádce mlčí jak zařezaný
Pokud voláš skript process.php samostatně, tak v ten okamžik nedochází k odeslání formuláře, není nastavené pole a není co zobrazit.

Mým úmyslem je odeslat proměnnou na soubor, ze kterého ji odesílám, aby hned mohla něco zpracovat (třeba jestli je $_POST['bar']; tohle, zobraz tohle, ne-li, udělej tamto).
Myslel jsem si, že to trochu chápu, ale tímto okamžikem jsem přestal úplně.
jirkass
Profil *
Davex:
...Pokud voláš skript process.php samostatně, tak v ten okamžik nedochází k odeslání formuláře, není nastavené pole a není co zobrazit...
- chápu to tedy správně, že když v takovýmhle příkladu deletnu veškerý javaskript, tak to klasicky submitem reloadne na sebe a zafunguje, ale javaskriptovým submitem se proměnná pošle jiným procesem a v tomhle souboru se nedá použít? Děkuju za trpělivost.
<?php
// SIMLIEST EXAMPLE EVER php jquery ajax
if ( $_POST['bar']=="hu") 
echo "go to left";
else
echo "go to right";
?>
<script src="jquery/js/jquery-1.9.1.js"></script>
<form id="foo" action="process.php" method="post">
    <input name="bar" type="text" value="" />
    <input type="submit" value="Send" />
</form>   
<script language=javascript>
// variable to hold request
var request;
// bind to the submit event of our form
$("#foo").submit(function(event){
    // abort any pending request
    if (request) {
        request.abort();
    }
    // setup some local variables
    var $form = $(this);
    // let's select and cache all the fields
    var $inputs = $form.find("input, select, button, textarea");
    // serialize the data in the form
    var serializedData = $form.serialize();
 
    // let's disable the inputs for the duration of the ajax request
    $inputs.prop("disabled", true);
 
    // fire off the request to /form.php
    var request = $.ajax({
        url: "process.php",
        type: "post",
        data: serializedData
    });
 
    // prevent default posting of form
    event.preventDefault();
});
</script>
Davex
Profil
jirkass:
chápu to tedy správně, že když v takovýmhle příkladu deletnu veškerý javaskript, tak to klasicky submitem reloadne na sebe a zafunguje, ale javaskriptovým submitem se proměnná pošle jiným procesem a v tomhle souboru se nedá použít?
Domníval jsem se, že to víš, a proto to děláš. ([#6] jirkassJak proměnnou propasírovat nikoli klasicky submitovým reloadem, nýbrž bez znovunačítání stránky.“)

Možná, kdybys rovnou napsal, co se s tou odeslanou proměnnou má udělat (kromě propasírovávání a chňapání), tak se pohneš dál. Zobrazit? Kde? Kdy?

V nějakém elementu na stránce s formulářem?

<div id="log"></div>

Po úspěšném odeslání?

request.done(function (response, textStatus, jqXHR){
    // log a message to the console
    $("#log").html(response);
    console.log("Hooray, it worked!");
});

Jen hodnotu bez skriptu?

<?php
// SIMLIEST EXAMPLE EVER php jquery ajax
if (isset($_POST['bar'])) {
  echo htmlspecialchars($_POST['bar'], ENT_QUOTES, 'UTF-8');
  exit;
}
?><!-- atd. -->
jirkass
Profil *
Davex:
Vrátím se na začátek tohohle threadu, kde jsem řešil multiple select, kdy jsem pro libovolně vybraný počet středisek měl zobrazit odpovídající větší množství údajů z db. To je ale případ asi vhodnější řešit normálně submitovým reloadem stránky a ne původně zamýšleným serializovaným selectablem od jquery. Ale už se taky stydím, že v r.2013 teprv s ajaxem začínám, proto jsem to tam chtěl nějak mermomocí vecpat. Zarazilo mě tehdy, že se nějaký hodnoty zobrazí v divu aniž by byly nějak alertovaný nebo echovaný, ale ono to tak prostě je. Musím se s tím nějak vyrovnat a hledat místa, která se pro jejich aplikaci hodí. A tak jsem vděčný za odpovědi, snad mi začíná trochu svítat a tímto děkuju i za trpělivost a přestávám prudit. ;-)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: