Dátumok kezelése

kkwx képe

Hellósztok

Már napok óta keresgélek neten, meg könyveket is olvasgatok, de egyszerűen nem találok megoldást a problémámra (pedig valszeg nem bonyolult :) ). Az lenne a kérdésem, hogyan lehet a dátumokat kezelni Drupal modulokban? Csak az érdekelne, hogyan olvasom ki az űrlapelemből, alakítom számmá, hasonlítom össze a mai/holnapi/más... dátummal (vagy elég, hogyan kérem le a mai dátumot, és azt már tudnám kezelni), töltöm fel/le adatbázisba (ez mondjuk elvileg menni fog :) ), és végül, hogyan alakítom a számot dátummá? Tudom kicsit sok kérdés egy témában, de tényleg nem találtam hasznos érthető leírást :(. Leírom kicsit részletesebben a problémát hátha segít a válaszadásban :).

Van egy űrlapom, amiben van egy dátum mező:

function modulom_myform() {
 
  $form = array();
  $form['#submit'] = array('room_reserver_myform_submit');
 
$form['datum'] = array(
    '#type'=> 'date',
    '#title' => t('Dátum'),
    '#required' => $field->required,
    '#description' => t('Adja meg az érkezés dátumát!'),    
  );
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Foglalás elküldése'),
  );
 
  return $form;
}

Ezt a mezőt szeretném átalakítani számmá (timestamp, ha jól tudom), és azt kezelni a "validate" részben (hogy egy bizonyos intervallumot fogadjon csak el, mondjuk a mai naptól 3 nappal később lehet legelőször és mondjuk 3 hónap múlva legkésőbb).

function modulom_myform_validate($form, &$form_state) {
  // ???
}

A mai dátumot így ki tudtam íratni elvileg, de nem tudtam mit kezdeni vele :(:

print '<br>'.format_date(time(), 'custom', 'Y F j - l');

Próbálkoztam ilyen kódokkal:

$haromnap = mktime(0,0,0,date("m"),date("d")+3, date("Y"));
drupal_set_message($haromnap);
$hdate = format_date($timestamp, "datum");
drupal_set_message($hdate);

és az eredmény ez lett :( :
- 1286928000
- cs, 1970-01-01 02:00

Ha valaki esetleg tudja, hogyan lehet olyan dátum mezőt csinálni, amiben nem külön kell megadni az évet, hónapot, napot, hanem ha bele-klikkelek megjelenik egy naptár és onnan kell választani, akkor az is jól jönne, de ez nem annyira fontos :).

Előre is kösz minden segítséget :).

Drupal verzió: 
Nagy Gusztáv képe

kkwx képe

kösz, hasznos linkek, tanulmányozom őket :)

0
0
fgabor képe

Hello!

Rakd fel mindeképp a Date API-t. Utána itt van, hogy kell összeállítani a formot: http://drupal.org/node/292667
Ha jquery-s naptárválasztót akarsz, akkor date_select helyett, date_popup.

A Date modul datetime fieldje az adatbázisba datetime-ként tölti fel a dátumokat, ami az adatbázisba is datetime mezőként van definiálva. Azonban így ezen keresztül pl a Calendar modul naptárjába nem tudod felhasználni, mert ott külön datetime handler-t kell csinálni, mert a Views Apiba ez gyárilag nincs benne.

0
0
kkwx képe

a "date_popup" az amit akartam, kösz :), csak sajnos a "date_select" és "date_popup"-nál így megjelenik az idő is a dátum mellett, pedig nekem csak a dátum kellene :(, azt hogyan vehetném ki, mert ha csak sima "date"-t írok akkor nincs, viszont akkor a "select"-hez hasonló jelenik meg.

Akkor ezek szerint datetime mezőként kezeli az adatbázisban a dátumot a Drupal? mert egy másik fórumban azt írták nekem, hogy int mezőt csináljak, mert számként kezeli a dátumokat a Drupal.

0
0
kkwx képe

Valójában engem elsősorban az érdekelne, hogyan kezelhetem a dátumot? Emiatt gondoltam a számmá alakításra, mert ott könnyedén adhatok hozzá és vehetek el belőle és hasonlíthatom össze másik számokkal, mert akármit próbáltam eddig, nem működött :S.

pl kiirattam a megadott adatot:

drupal_set_message($form_state['values']['datum']);

ez lett az eredmény:
2010-10-23 00:00:00

de a 3 nappal későbbi értéket nem tudom, hogyan érhetném el mert ha hozzáadok 3-at:

drupal_set_message($form_state['values']['datum']+3);

akkor azt az évhez adja hozzá:
2013
:(

még a "time()"-al kikért mai dátumhoz se lehet hozzáadni 3-at mert akkor meg semmi változás nem történik :(

0
0
kkwx képe

kikészülök ezektől a dátum mezőktől :S, egyszerűen képtelen vagyok egy formátumra hozni két külömböző forrásból származó dátumot :(, már napok óta ezzel bénázok és nagyon megköszönném ha valaki segítene megoldani a problémát.

Emellett a "date_popup" típusnál nem csak dátumot kér, hanem időt is, amit nagyon fontos lenne kivennem, és attól félek ha nem tudom kivenni és vissza kell majd állítanom sima "date"-re akkor megint máshogyan kell majd kezelni kapott értéket :(.

// először kikérem a dátumot az űrlapból:
$gotdate = $form_state['values']['datum'];
// erre ezt kapom:
// 2010-10-28 00:00:00
 
// utána kikértem a 4 nappal későbbi dátumot:
$fourdays = mktime(0,0,0,date("m"),date("d")+4, date("Y"));
$four = format_date($fourdays);
// eredményei:
// 1287100800
// p, 2010-10-15 02:00
 
// végül megpróbáltam összehasonlítani a két dátumot:
  if ($gotdate < $four) {
	$fd = format_date($fourdays, 'custom', 'Y F j - l');
    form_set_error('submitted][typed_amount', t('"'.$fd.'" előtti dátumra nem lehet foglalni!'));
  }
// aminek az eredménye az lett, hogy minden esetben igaz a feltétel vagyis a megadott érték kisebb mint a 4 nap múlvai dátum, még akkor is ha nem :(
 
// megpróbáltam máshogy kikérni a mai dátumot:
$maidatum = format_date(time());
// amire ezt kapom, vagyis még így sem vagyok előbbre:
// k, 2010-10-12 01:53

Szerintem a formátumok nem egyeznek ezért hibás az összehasonlítás, de már próbáltam rengeteg módszerrel átalakítani a formátumokat, számmá alakítani a dátumokat (még manuálisan is), vagy lekérni az adatokat, de sehogyan se működött :(. Talán a dátumokat másféleképpen kéne hasonlítani?

Ha valaki tudna egy megoldást adni az nagyon jól jönne, mert így egyszerűen nem tudok tovább haladni :(.
Előre is köszönök minden segítséget :).

0
0
kkwx képe

Sikerült megoldanom a problémát! :)
Választ sajnos nem kaptam, de megoldottam minden problémámat :).
Leírom a megoldásokat hátha érdekel valakit :)

$gotdate = $form_state['values']['datum'];    			// megadott dátum (2010-10-16 00:00:00 - formátumban)
$fourdays = mktime(0,0,0,date("m"),date("d")+4, date("Y"));	// 4 nap múlva (1287187200 - formátumban)
 
$fd = format_date($fourdays, 'custom', 'Y-m-j');		// 4 nap múlva (2010-10-16 - formátumban)
 
  if ($gotdate < $fd) { // így már összehasonlíthatók a formátumok...
	$fd = format_date($fourdays, 'custom', 'Y F j - l');
    form_set_error('submitted][typed_amount', t('"'.$fd.'" előtti dátumra nem lehet foglalni!'));
  }

ezek után még az adatbázisba való feltöltéssel is gondok voltak, hiába volt ugyanaz a formátuma a változómnak (2010-10-16 00:00:00) mint amit a mező kért (0000-00-00 00:00:00), mégse töltötte fel az értéket a datetime típusú mezőbe, dátum és int mezőbe meg csak a 2010-et tette.
Végül úgy oldottam meg, hogy számmá alakítottam (timestamp) és úgy tároltam el, majd visszaalakítottam a számot dátummá:

// lekértem a dátumot az űrlapból:
$gotdate = $form_state['values']['datum']; 
// számmá alakítottam:
$datum = strtotime($gotdate);
// és így alakítottam vissza a számot jól olvasható dátummá (akármilyen dátumba lehet, ez úgyis nálam csak kiíratáshoz kell)
$re = format_date($datum, $type = 'custom', 'Y-m-j - l');

Hogy én mennyit szenvedtem ezekkel :), de remélem más is hasznosnak találja a leírásomat :).

Ja, és még egy apróság. Ha a dátum mezőt a következő formában valósítjuk meg, akkor eltűnik az időmező és csak dátumot kér:

$form['datum'] = array(
    '#type'=> 'date_popup',
    '#title' => t('Dátum'),
    '#required' => TRUE,
    '#date_timezone' => 'Europe/Budapest',
    '#date_type' => datetime,
    '#date_year_range' => '-0:+1',
    '#date_format' => 'Y.m.d',
    '#description' => t('Adja meg az érkezés dátumát!'),    
  );
0
0