Form redirect & $_GET

Bálint képe

Sziasztok!

Az lenne a kérdésem, hogy ha egy form-ot a submit-elés után redirect-tel szeretnék másik oldalra küldeni, akkor hogyan tudok átadni GET-tel értékeket ennek a következő oldalnak? Átolvastam elég sok idevágó részt a drupal.org-on, de sajnos nem találtam megfelelő megoldást. Tud valaki segíteni?

Pasqualle képe

es miert $_GET-tel akarsz erteket atadni?

0
0
Bálint képe

Nem tudom megindokolni. Ha mondasz más, jobb alternatívát, nagyon szívesen veszem, és elfogadom.

0
0
Pasqualle képe

ha egy vagy ket erteket akarsz atadni ket form kozott akkor a legegyszerubb a menu path hasznalata

pelda:

function test_menu() {
  $items['elso'] = array(
    'title' => 'Elso form',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('test_elso_form'),
    'access callback' => 'user_access',
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['masodik/%'] = array(
    'title' => 'Masodik form',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('test_masodik_form', 1),
    'access callback' => 'user_access',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}
 
function test_elso_form() {
  $form['adat'] = array(
    '#type' => 'textfield',
    '#default_value' => '',
    '#title' => 'Ertek',
    '#description' => 'Irj ide valamilyen erteket amit atadsz a masodik formnak.',
    '#size' => 50,
    '#maxlength' => 255,
  );
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
 
  return $form;
}
 
function test_elso_form_submit($form, &$form_state) {
  $form_state['redirect'] = 'masodik/'. $form_state['values']['adat'];
}
 
function test_masodik_form(&$form_state, $adat) {
 
  $form['adat'] = array(
    '#type' => 'textfield',
    '#title' => 'Ezt az erteket irtad be az elozo formon',
    '#default_value' => $adat,
    '#size' => 50,
    '#attributes' => array('disabled' => 'disabled'),
  );
 
  return $form;
}

ha tobb erteket akarsz atadni, akkor valoszinuleg valami multistep formot akarsz csinalni.
Itt volt rola szo http://drupal.hu/node/4380

ha valami mast akarsz, akkor jo lenne tudni mi a konkret celod..

0
0
Bálint képe

Köszönöm szépen, nagyon tanulságos volt a leírásod, biztosan fogom is használni majd valamikor.
De most sajnos nem erre van szükségem. Nem formnak szeretném átadni az értéket, sőt, még csak nem is olyan értéket, amit a form-ból kapok. Egy másik oldalra szeretnék visszatérni a submit után, viszont ez az oldal úgy áll össze, hogy kell hozzá egy id, ez alapján változik a tartalom. Erre az oldalra vissza is tudok térni a redirect segítségével, de nem tudok adatot átadni.
Röviden:
Annyit szeretnék megvalósítani, hogy egy másik oldal töltődjön be a submit után, és ennek az oldalnak tetszőleges (egy darab) változó tartalmát át tudjam adni.

0
0
Illyés Edit képe

ennek az oldalnak tetszőleges (egy darab) változó tartalmát át tudjam adni

Erre a célra a "value" típusú form elemet használhatod:

<?php
$form['tetszoleges'] = array(
  '#type' => value,
  '#value' => 'valami tetszőleges érték, amit átadsz, ezt nem látja a látogató a formon, csak a forráskódban',
);
?>

Ha azt akarod, hogy a forráskódban se látszódjon az érték, arra van a "hidden" típus.

0
0
Bálint képe

Nagyon köszönöm Neked is. :) De ezek még mennek, nem ezzel van a bajom
Írom másképpen. Van egy linkem:

l('linkfelirat', 'valami/elérésiút', NULL, 'id='.$id);

Ezzel eljutok egy oldalra, és átadok neki egy id-t. Egy sima oldal, nincs form. Az oldal tartalma az id-től függ. Egy táblázatot kapok, ami egy adatbázislekérdezés, de csak a megadott id-jú dolgokat listázza. Itt minden sorban van egy link, ide kattintva egy másik oldalra jutok, ezen van a form-om, aminek a submit-je után vissza szeretnék jutni a táblázatos oldalra. Még ez is megy, mert megadom az elérési útvonalát, és kész. De szükségem van az id-ra, mert ugyanazt a táblázatot szeretném látni, mint amit az előbb.
Remélem, most már leírtam mindent, amit tudnotok kell ahhoz, hogy segítsetek!
Előre is köszi!
0
0
Illyés Edit képe

Itt minden sorban van egy link, ide kattintva egy másik oldalra jutok

Minden sorban a link végén átadod az $id-t a linkben:

<?php
l('linkszöveg', 'valami/eleresiut', NULL, $query = $id);
?>

egy másik oldalra jutok, ezen van a form-om, aminek a submit-je után vissza szeretnék jutni a táblázatos oldalra

A formos oldalon kiszeded az URL-ből a query-t, és beteszed egy value vagy hidden típusú mezőbe. A _submit() függvényben ezt kiolvasod a $form_values-ból, összeállítod az útvonalat, és return-nel visszaküldöd az értékét. A _submit() lefutás után a látogató át lesz dobva a _submit()-ból visszaadott útvonalra.

... vagy nem értem a kérdést.

0
0
Bálint képe

... vagy nem értem a kérdést.

De, igen, Edit, megértetted a kérdést, pontosan ezt szeretném, amit itt leírtál.
És én is pontosan így próbáltam csinálni először.

összeállítod az útvonalat, és return-nel visszaküldöd az értékét

Azt hiszem, itt ronthatok el valamit. Két darab értéket szeretnék átadni. A felhasználó id-ját és a nevét. Ezek már két változóban meg is vannak.
Írnál egy mintát, hogy hogyan kell összeállítani az útvonalat? Így próbálkozok:

$path='valami/eleresiut&uid='.$uid.'&username='.$username;

De ekkor a linkbe bekerül pár százalékjel és számok, és nem lesz jó.
0
0
Illyés Edit képe

Minek vacakolni &uid= és hasonlókkal? (Ha ragaszkodsz hozzá, akkor az urlencode() környékén nézz szét, ott lesz a hiba.)

<?php
$url = 'valami/eleresiutvonal';
$query = $uid .'/'. $username;
$url = l($linktext, $url, NULL, $query);
?>

Ebből csinál neked az l() egy ilyen útvonalat: valami/eleresiutvonal?122/pistike. Ha pedig a másik oldalon kellenek az adatok, akkor szétrobbantod a kérdőjelnél:

<?php
$url = request_uri();
$query = explode('?', $url);
$data = explode('/', $query[1]);
$uid = $data[0];
$username = $data[1];
?>
0
0
Illyés Edit képe

Persze az $uid-t és a $username-et ellenőrizni, mielőtt bármire felhasználod. De ezt gondolom nem kell ragozni :)

0
0
Bálint képe

De itt az $url-lel kellene visszatérnem? Mert abban az esetben bekerül a linkbe az, amit az l generál nekem, de az nagyon nem lesz jó.

0
0
Illyés Edit képe

Azt hiszem nem tettem neked jó szolgálatot ezzel az ötlettel. Elég komoly biztonsági kérdéseket vet fel, ha nem látod át, inkább ne használd. Inkább írd le, hogy mit csinálna az alkalmazás, hátha meg lehet kerülni a problémát.

0
0
Pasqualle képe

szoval pelda:
van egy listad gyumolcsokrol, raklikkelsz az almara, es a kerdes az hogyan kerulsz vissza a gyumolcsokhoz mert sehol sem mondtad meg az almanak, hogy o egy gyumolcs

tegyuk fel, hogy ilyen utvonalaid vannak
/list/fruits
/product/apple

a product uvonal a kerdeses, hogy mit csinalj vele
vagy modositod /product/fruits/apple es akkor ott van, hogy o egy gyumolcs

vagy csinalsz /product/%product utvonalat amihez irsz egy load fuggvenyt ahol megmondod, hogy az alma az gyumolcs, es akkor a formod mar tudni fogja

function product_load($product_name) {
  $product_category = /* valahogy megmondod, hogy a termek melyik kategoriaba tartozik, ezt egy adatbazis select-el vagy mas modon tuti, hogy meg tudod mondani */
  $product['name'] = $product_name;
  $product['category'] = $product_category;
  return $product;
}
 
function product_form(&$form_state, $product) {
  /* igy itt mar nem csak az almarol tudsz, hanem azt is tudod, hogy gyumolcs, mert a product_name valtozod helyett mar egy product tombod van
  termek neve: $product['name']
  termek kategoriaja: $product['category']
  beteszed a formba, es a submit-nal is latni fogod..
  */
}

persze a formon belul is megmondhatod az almanak, hogy gyumolcs, de az volt a cel, hogy atadjuk a formnak ezt az erteket..

0
0
Bálint képe

Csak hogy lássuk a végét is ennek a témának...
Hátha valakinek a hasznára válik rajtam kívül.

http://api.drupal.org/api/function/url/5

Erre lettem volna kíváncsi.

0
0
Illyés Edit képe

Hogy tényleg másnak is hasznára váljon, indokold meg kérlek, hogy miért jobb neked az url() mint az l() függvény?

0
0
Bálint képe

Jó, akkor megindoklom. Remélem, nem baj, ha a Drupal API Reference-ből idézgetek.

l() dokumentációjából:

Format an internal Drupal link.

Nekem nem link kellett, hanem egy elérési útvonal, egy path.

If you provide only the path (e.g. "admin/content/node"), it is considered an internal link. In this case, it must be a system URL as the url() function will generate the alias.

Szóval innen jutottam el a url()-hez, éppen emiatt.

url() dokumentációjából:

Generate a URL from a Drupal menu path.

Tehát, ez kell nekem.

When creating links in modules, consider whether l() could be a better alternative than url().

Szóval, ha linkekről van szó, jobb az l(). De nekem nem link kellett, mint említettem.

0
0