theme_user_register() és theme_user_edit() új regisztrációs űrlapra

Banderasz képe

Üdv!

Előljáróban annyit elmondok, hogy ugyanezt a topikot megnyitottam a Prog.Hu-n is, de ott nem igen tudtak mit kezdeni ezzel, ezért nagyon bízom benne, hogy itt helyben sokkal több szakértőt talál meg a topikom.

Adott ez a két függvény: theme_user_register() és theme_user_edit(). És adott egy olyan feladat, amiben egy regisztrációs űrlapot kell elkészíteni, de alapfeltétel, hogy ezzel a két függvénnyel kell ezt megoldani. Mindezt Drupal 5.0-ban.

Buzgón nekifogtam volna elolvasni az interneten szerteszét található leírásokat eme két függvényről, de elképedve látom, hogy ezekről internet szerte hallgatnak, mint a sír. Mintha vagy senki sem értené és tudná, hogy mik ezek, vagy ellenkezőleg, mindenki tudja, csak én nem, és azért nem írnak róla, mert annyira egyértelmű.

Elmondom mit sikerült eddig megértenem a dologból, és arra kérnélek titeket, hogy ha nagy hülyeséget mondanék, akkor javítsatok ki, illetve mondjátok el, hogy miként gyárthatok egy összetettebb regisztrációs űrlapot ezen két függvénnyel.

Szóval a theme_user_register() és a theme_user_edit() függvények szintaxisát tekintve arra következtettem, hogy a theme előtag azt jelenti, hogy valamilyen megjelenésért felelős függvényről van szó, amivel a Drupal-ban megjelenő dolgok sminkjei változtathatóak meg. A középen lévő user szócska arra utal, hogy a user modulba kellene beletúrnom, mivel ez intézi Drupal-ban a felhasználókezelést. Végül a függvénynevek 3. része a register/edit pedig a konkrét feladat kijelölését jelenti.

Vagyis ha én a regisztrációs űrlapot akarom buherálni, akkor a theme_user_register() függvényt el kell helyeznem a user.module modulban. Oké, de akkor mire való a theme_user_edit()? Mit jelent az, hogy felhasználó szerkesztés??? Egyáltalán milyen paramétereket kellene ennek a két függvénynek várniuk? Természetesen talán mondanom sem kell, hogy a Drupal API semmit sem mond erre a két függvényre, de ha elhagyom róluk a theme_ prefixet, akkor is csak forráskódot produkál, dokumentációt nem:
theme_user_edit() ---- user_edit()
theme_user_register ---- user_register()

Továbbá programozva miként építhetek fel egy normális űrlapot? Próbáltam úgy, hogy ebbe a theme_user_register() függvénybe létrehoztam próbaként az alábbi form tömböt, majd a drupal_render() nevű függvénnyel előállíttattam a HTML tartalmat. De ezzel így miként szólok bele a megjelenésébe? És miért rendezi az űrlapmezőket ABC sorrendbe, holott én ezt nagyon nem akarom? Egyáltalán jól építem fel a tömböt?

function theme_user_register()
{
  $form = array();
 
  $form['children'] = array(
 
  'name' => array(
    '#type' => 'textfield',
    '#title' => 'Username',
    '#default_value' => '',
    '#maxlength' => 60,
    '#description' => '...',
    '#required' => 1,
    '#name' => 'username'
  ),
  'mail' => array(
    '#type' => 'textfield',
    '#title' => 'E-mail address',
    '#default_value' => '',
    '#maxlength' => 64,
    '#description' => '...',
    '#required' => 1
  ),
  'pass' => array(
    '#type' => 'password',
    '#title' => 'Password',
    '#default_value' => '',
    '#maxlength' => 60,
    '#description' => '...',
    '#required' => 1
  ),
  'confirm-pass' => array(
    '#type' => 'password',
    '#title' => 'Confirm password',
    '#default_value' => '',
    '#maxlength' => 60,
    '#description' => '...',
    '#required' => 1
  ),
  'submit' => array(
    '#type' => 'submit',
    '#value' => 'Register new user'
  ));
 
  $form['#sorted'] = FALSE;
 
  return drupal_render($form);
}

Meg miért van az, hogy az input mezőknek nem lesz értéke a name és id attribútumukban?

Valamiért olyan érzésem van, hogy ezt a feladatot csak csupán ezeknek a függvényeknek a használatával nem lehet megcsinálni, de ne legyen igazam... Annál is inkább, mert az eredeti feladatkiírásban nem theme_user_register() szerepel, hanem theme_user_registration(), ami ha jól sejtem nem is létezik, és csak elírás akar lenni.

A feladatkiírást nem idézhetem be ide, mert ezért "megköveznének". Feladatkiírás egyébként csak annyiról szól, hogy ezen két függvénnyel össze kell rakni egy regisztrációs formot, mindegy, hogy milyen Drupal sablonba. És ehhez adott egy screenshot, ami mutatja, hogy milyen űrlapmezőket, milyen elrendezésben és milyen kinézetben kell elhelyezni. Ennyi. De ezzel már majdnem szó szerint elmondtam a feladatkiírást...

Nagyon kérem, hogy aki ért a Drupal-hoz, az világosítson fel legyen szíves. Előre is köszönöm!

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
eMeLA képe

És adott egy olyan feladat, amiben egy regisztrációs űrlapot kell elkészíteni, de alapfeltétel, hogy ezzel a két függvénnyel kell ezt megoldani

Ennek semmi értelme, mert ez meg van oldva a Drupal-ban.

hogy miként gyárthatok egy összetettebb regisztrációs űrlapot ezen két függvénnyel

Ki mondta neked, hogy így kell ezt csinálni ?

Erre van a profile modul, vagy a hook_alter(), de biztos találsz még 10-15 modult a Drupal.org-on ami erre való.

0
0

...mit tudok: http://web.termuves.hu

Banderasz képe

Az való igaz, hogy azt mondtam, hogy ezzel a két függvénnyel kell megoldanom a feladatot, de azt nem mondtam, hogy ezen kívül semmi mást nem vehetek igénybe. Egyéb más modulok iránt pedig azért nem "kacsintgattam", mert a két függvénynév egyértelműen meghatározza nekem, hogy a user modult kell igénybe vennem. De már abban sem vagyok biztos, hogy csak ezt a user modult használhatom...

Egy szó, mint száz: mindent szabad, csak legyen megoldva, és valamilyen módon köze legyen ehhez a két függvényhez. Mire elkészül, addigra úgyis letisztulnak bennem a kérdéseim...

0
0
Nagy Gusztáv képe

Ez úgy, ahogy van, egy értelmetlen megközelítés.

Ha leírnád, hogy mit is szeretnél (nem azt, hogy milyen eszközt akarsz használni, hanem hogy mit szeretnél) elérni, akkor lehet, hogy nem csak válaszod, hanem már működő oldalad is lenne.

0
0

Nagy Gusztáv

Banderasz képe

A feladatkiírásban (mint ahogy azt már mondtam) van egy screenshot, ami egy adott Drupal alapú oldal felhasználó-regisztrációs lapját mutatja. Nekem konkrétan ezt az űrlapot kell összerakni ugyanebben az elrendezésben és kinézetben, ugyanezen funkciókkal. Mivel az oldal kilétét nem fedhetem fel, így a screenshot-ból kivágtam magát a formot, és azt feltettem, hogy megnézhesd.

Ezt szeretném elérni végeredményként. (nyilván reklámcsík nélkül. :))

0
0
sgabe képe

Az említett theme_user_register(); függvényt magadnak kell implementálnod a template.php fájlodban és arra szolgál, hogy a user_register űrlap megjelenését megváltoztasd, tehát az űrlapot magát nem így kell előállítani! Alább mutatok egy elborult példát miről van szó:

function theme_user_register($form) {
 
	$output .= '<span style="width: 100%; padding:5px; border: 1px solid;">Itt bekérem a felhasználónevet:</span>'.drupal_render($form['account']['name']);
	$output	.= '<span style="width: 100%; padding:5px; border: 1px solid;">Itt bekérem az e-mail cimet:</span>'.drupal_render($form['account']['mail']);
	$output	.= drupal_render($form['submit']);
 
  return $output;
}

Nézd meg, remélem érzékeled a dolog lényegét. Mindazonáltal ennek is az elegáns módja, ha egy saját .tpl fájlt hívsz meg és azt használod a regisztrációs űrlap megjelenítésére.

function theme_user_register($form) {
    return _phptemplate_callback('user_register', array('form' => $form));
}

Utána létrehozol egy user_register.tpl.php fájlt, amiben úgy alakítgatod az űrlap megjelenését, ahogy neked tetszik, de magát az űrlapot nem neked kell létrehoznod, főleg nem így!

0
0
Banderasz képe

Oké, ezt most már értem. Próbálgatom, és úgy látszik, menni fog. Már csak az a kérdésem, hogy az űrlapra az egyes mezőket hogyan szedjem össze? Gondolom valahol ezt egyszerű összekattintgatással is meg lehet csinálni, csak éppen én nem tudom, hogy hol. Bár hogy őszinte legyek, programozóibb űrlapnak (ahol én általam írt forráskód szedi össze az űrlapmezőket) sokkal jobban örülnék. Én is valami ilyesmivel próbálkoztam a topiknyitó hozzászólásomban, de nyilván ott rosszul tettem ezt. A konkrét űrlap kívánt funkciói és kinézete elleshető a Nagy Gusztávhoz intézett előző hozzászólásomban lévő linkről.

0
0
LaciApu képe

Szerintem a hook_form_alter függvénnyel tudod a saját mezőidet hozzáadni a 'user_register' és a 'user_profile_form' formokhoz (pl: vezetéknév, keresztnév, szülidő...), aztán a sminkedben kell megvalósítanod a megjelenést valamilyen ????.tpl.php fájlban.

0
0
Banderasz képe

Nos sgabe tanácsára felraktam a szükséges modulokat, amelyek szépen meg is jelentek a regisztrációs oldalon. Most jönne az, hogy a nem modulfüggő input-okat is ki kellene raknom, mint például vezetéknév, keresztvév, e-mail ellenőrzés és születési idő.

Ehhez megnéztem az általad ajánlott hook_form_alter() függvényt, amivel egyelőre nem tudtam megbírkózni. A leírásában csak ennyi forrás szerepel:

function hook_form_alter($form_id, &$form) {
  if (isset($form['type']) && $form['type']['#value'] .'_node_settings' == $form_id) {
    $form['workflow']['upload_'. $form['type']['#value']] = array(
      '#type' => 'radios',
      '#title' => t('Attachments'),
      '#default_value' => variable_get('upload_'. $form['type']['#value'], 1),
      '#options' => array(t('Disabled'), t('Enabled')),
    );
  }
}

Ezzel miként adjak új inputokat még a formhoz? Megpróbáltam úgy, hogy csináltam egy tömböt, amibe felvettem ezt-azt, és ezt adtam át a függvény második paraméteréül, de valamiért nem úgy viselkedik, ahogy kellene. Ha a forrását megnézem, akkor csak azt látom, hogy az egésznek a működése attól függ, hogy a tömbben szerepel-e "type" asszociatív kulcs, mely önmaga is tömb, amiben "#value" kulccsal egy sztringnek kellene lennie, amit a "_node_settings"-szel összetoldva meg kellene egyeznie a form_id-val.

Nos megnéztem Firebug-gal, a posztolt form ID-ját, ami "user_register", illetve találtam egy hidden mezőt is a formon, name="form-id" néven, szintén "user_register" értékkel. Én kipróbáltam ezzel a fenti függvényt, de nem reagált semmire sem, mert annak nem része a "_node_settings".

Tudnál nekem egy pici példakódot mutatni arra, hogy ezzel a függvénnyel miként fűzök "text"-et, meg "select"-et hozzá?

Illetve fennálló kérdés még, hogy ehhez az egészhez hogy jön hozzá a theme_user_edit()? Mi köze van ennek a regisztrációhoz?

Előre is köszönöm a választ, és bocs, ha értetlennek tűnöm. Nekem ez a Drupal-osdi még nagyon új. Egyébként ugyanezt az űrlapot Drupal nélkül 1 nap alatt megcsináltam volna... :)

0
0
aboros képe

a hook_ kezdetű függvényeket nem hívni kell, hanem a saját modulodban megvalósítani. itt olvashatsz erről a "hook concept" -ről bővebben: http://api.drupal.org/api/group/hooks/6

a lényeg kb az, hogy egy saját .module fileodban megvalósíthatod a hook_form_alter -t MODULODNEVE_form_alter -ként.. ebben a függvényben jelen lesz az űrlapod a $form tömbben, szabadon módosíthatod azt, persze betartva a drupal formAPI szabályait. nem kell semmit visszadnod, csak ezt a $form tömböt módosítod kedvedre. rögtön az elején, a form id alapján vizsgálod, hogy arról a formról van e szó, és ha igen, belepiszkálsz.

0
0

-
clear: both;

sgabe képe

Nem is igazán kell neked a hook_form_alter(); mivel a modulok telepítésével illetve az új profil mezők beállításával a regisztrációs űrlapban már szerepelnek a saját mezőid. A theme_user_edit(); függvénynek - mint írottam volt - annyi a köze ehhez az egészhez, hogy a segítségével megváltoztathatod az űrlap megjelenését, azt is a már felvázolt módon.

Egy print_r($form); beírásával írasd ki még az elején a $form tartalmát és látod majd, hogy benne lesznek a saját mezőid, úgy mint profile_sajatmezo amit a kategória alapján drupal_render($form['kategoria']['profile_sajatmezo']; módon tudsz megjeleníteni. Neked csak a HTML kimenetet kell összeállítanod, hogy úgy nézzen ki az űrlapod, ahogy szeretnéd.

Összefoglalom a lényeget: a theme_<form_element>(); függvénnyel a megadott űrlap megjelenését tudod megváltoztatni, magát az űrlapot nem így kell összeállítani! Egy űrlap módosításához kell a hook_form_alter(); amit saját modulban kell megvalósítani, de neked ennek a feladatnak a megoldásához erre nincs szükséged!

Szerintem...

0
0
Banderasz képe

A theme_user_edit(); függvénynek - mint írottam volt - annyi a köze ehhez az egészhez, hogy a segítségével megváltoztathatod az űrlap megjelenését, azt is a már felvázolt módon.

Hát én erre eddig a theme_user_register() függvényt használtam, és úgy fest, hogy működik vele. Most akkor hülyeséget csinálok? Vagy netán a theme_user_edit() alias függvénye a theme_user_register()? Nem hinném, inkább az van, hogy én még mindig nem értem mi különbség van a két függvény között.

0
0
sgabe képe

csak elgépeltem, természetesen a theme_user_register(); függvényre gondoltam még mindig...my bad

0
0
LaciApu képe

<?php
function ingatlan_form_alter(&$form, $form_state,$form_id){
 
  // regisztációkor kap egy üzenetett, hogy hol tudja megadni a telefonszámát
  if($form_id == 'user_register'){
    drupal_set_message('Ha szeretné, hogy a hirdetésénél a telefonszám is megjelenjen, regisztáció után beállíthatja a Saját adatok / Szerkesztés oldalon.');
  }
 
  // a Saját adatok/Szerkesztés oldalhoz hozzáadok két mezőt,
  // amiben bekérem a körzetszámot és a hívószámot
  if($form_id == 'user_profile_form'){
    global $user;
    $uid = $user->uid;
    $ksz = array();
    $ksz[0] = 'Válassz';
    $res = db_query("SELECT * FROM {ing_korzetsz}");
    while ($row = db_fetch_array($res)) {
      $ksz[$row['korzetsz_id']]= $row['korzetsz'];
    }
    $user_adat = db_fetch_array(db_query("SELECT * FROM {ing_user_adat} WHERE uid=%d",$uid));
    $form['#validate'][] = 'ing_user_form_validate'; // a telefonszám ellenörzését végző függvény
    $form['#submit'][]   = 'ing_user_form_submit'; // a telefonszám rögzítését végző függvény
    $form['telefon']     = array(
      '#type'        => 'fieldset',
      '#title'       => 'Telefonszám megadása',
      '#collapsible' => true,
      '#collapsed'   => false
    );
    $form['telefon']['ksz_id'] = array(
      '#type'          => 'select',
      '#options'       => $ksz,
      '#title'         => 'Válaszd ki a körzetszámot',
      '#default_value' => isset($user_adat) ? $user_adat['korzetsz_id'] : 0,
    );
    $form['telefon']['tsz']    = array(
      '#type'          => 'textfield',
      '#title'         => 'Add meg a telefonszámot',
      '#default_value' => isset($user_adat) ? $user_adat['telsz'] : '',
    );
  }
}
?>
0
0
sgabe képe

Saját űrlap mezők hozzáadásához használd a beépített Profile modult.

A felhasználási feltételekhez ott a Legal modul, amihez szükséged lesz a Checkbox Validate modulra is, ami kijavít pár ezzel kapcsolatos hibát a coreban. Jelesül, hogy kötelező legyen a jelölőnégyzet kipipálása a regisztrációhoz.

Használd a Register with Picture modult, hogy a felhasználók már a regisztrációnál feltölthessenek képet.

A hírlevelekhez először is szükséged lesz a Simplenews modulra, aztán a Simplenews on register modulra, amivel már regisztrációnál feliratkozhatnak a felhasználók az általad beállított hírlevelekre.

Az említett modulok feltelepítése és beállítása után, a már általam említett módon kialakíthatod az űrlap kinézetét a csatolt kép mintájára.

0
0
Banderasz képe

Köszönöm a tippeket a modulokhoz! Felraktam őket, épp most állítgatom be. Ezekkel nem volt baj. Még egyszer köszi.

0
0