# Regisztrációs űrlap bővítése

> Egyéni mezők a regisztrációs űrlapon, a profilszerkesztőben és az ügyfélszerkesztőben, erős jelszó, matematikai ellenőrzés, a blokkoló réteg stílusa és a felfüggesztett profil üzenete.

Ez a fejezet azt mutatja meg, hogyan bővítheted a regisztrációs folyamatot: egyéni mezőkkel, jelszóerősség-ellenőrzéssel, robotok elleni kérdéssel és stílusbeállításokkal. A kódos részek egyéni kódnak számítanak. Ha nem vagy otthon a fejlesztésben, kérd fejlesztő segítségét.

## Egyéni mezők a regisztrációs és profilűrlapon

Egyéni mezőt három helyre tehetsz:

- a regisztrációs űrlapra (`[register_form]`),
- a tagok által használt profilszerkesztőbe (`[rcp_profile_editor]`),
- az adminisztrációs **Edit Customer** (ügyfélszerkesztő) képernyőre.

Az összes kódot egy saját bővítménybe vagy a sablon `functions.php` fájljába kell tenni. A példában két szövegmező szerepel (`rcp_profession` és `rcp_location`), és mind az öt lépésben ugyanazokat az azonosítókat kell használni.

### 1. Mezők kiírása a regisztrációs és a profilűrlapon

A regisztrációs űrlapra a `rcp_after_password_registration_field`, a profilszerkesztőbe a `rcp_profile_editor_after` művelet kapcsolódik. Más műveletekkel a mező helyét is megváltoztathatod.

```php
function pelda_rcp_mezok_kiirasa() {
	$foglalkozas = get_user_meta( get_current_user_id(), 'rcp_profession', true );
	$helyszin    = get_user_meta( get_current_user_id(), 'rcp_location', true );
	?>
	<p>
		<label for="rcp_profession"><?php _e( 'Foglalkozásod', 'rcp' ); ?></label>
		<input name="rcp_profession" id="rcp_profession" type="text" value="<?php echo esc_attr( $foglalkozas ); ?>"/>
	</p>
	<p>
		<label for="rcp_location"><?php _e( 'Városod', 'rcp' ); ?></label>
		<input name="rcp_location" id="rcp_location" type="text" value="<?php echo esc_attr( $helyszin ); ?>"/>
	</p>
	<?php
}
add_action( 'rcp_after_password_registration_field', 'pelda_rcp_mezok_kiirasa' );
add_action( 'rcp_profile_editor_after', 'pelda_rcp_mezok_kiirasa' );
```

Más mezőre így alakítsd át:

- Az `rcp_profession` és az `rcp_location` azonosítót cseréld a sajátodra, szóköz nélkül, alulvonással. Ugyanazt kell átírni a `get_user_meta()` hívásban, a címke `for` attribútumában, a beviteli mező `name` és `id` attribútumában.
- A `$foglalkozas` és `$helyszin` változók nevét igazítsd a mezőkhöz.
- Írd át a címkék szövegét.

### 2. Mezők az ügyfélszerkesztő képernyőn

Ahhoz, hogy az adminisztrátor is szerkeszthesse az új adatokat (ahogy a nevet vagy az e-mail-címet), a mezőket az RCP **Edit Customer** képernyőjére is fel kell venni. A kód majdnem ugyanaz, két különbséggel: a művelet neve `rcp_edit_member_after`, és a mezőt táblázatsorba kell tenni. A felhasználó azonosítóját a függvény paraméterként kapja.

```php
function pelda_rcp_ugyfel_mezok( $user_id = 0 ) {
	$foglalkozas = get_user_meta( $user_id, 'rcp_profession', true );
	$helyszin    = get_user_meta( $user_id, 'rcp_location', true );
	?>
	<tr valign="top">
		<th scope="row" valign="top"><label for="rcp_profession"><?php _e( 'Foglalkozás', 'rcp' ); ?></label></th>
		<td>
			<input name="rcp_profession" id="rcp_profession" type="text" value="<?php echo esc_attr( $foglalkozas ); ?>"/>
			<p class="description"><?php _e( 'A tag foglalkozása', 'rcp' ); ?></p>
		</td>
	</tr>
	<tr valign="top">
		<th scope="row" valign="top"><label for="rcp_location"><?php _e( 'Város', 'rcp' ); ?></label></th>
		<td>
			<input name="rcp_location" id="rcp_location" type="text" value="<?php echo esc_attr( $helyszin ); ?>"/>
			<p class="description"><?php _e( 'A tag városa', 'rcp' ); ?></p>
		</td>
	</tr>
	<?php
}
add_action( 'rcp_edit_member_after', 'pelda_rcp_ugyfel_mezok' );
```

### 3. Hibaellenőrzés regisztrációkor (nem kötelező)

Ha kötelezővé akarod tenni a mezőket, kapcsolódj az `rcp_form_errors` művelethez. Ha a mező üres, az `rcp_errors()->add()` hibát vesz fel, és az RCP addig nem engedi elküldeni az űrlapot, amíg minden ellenőrzés át nem megy. Ha a mező nem kötelező, ezt a lépést hagyd ki. Más típusú adatnál (például telefonszám) a formátumot is ellenőrizheted.

```php
function pelda_rcp_mezok_ellenorzese( $posted ) {
	if ( is_user_logged_in() ) {
		return;
	}
	if ( empty( $posted['rcp_profession'] ) ) {
		rcp_errors()->add( 'invalid_profession', __( 'Add meg a foglalkozásodat', 'rcp' ), 'register' );
	}
	if ( empty( $posted['rcp_location'] ) ) {
		rcp_errors()->add( 'invalid_location', __( 'Add meg a városodat', 'rcp' ), 'register' );
	}
}
add_action( 'rcp_form_errors', 'pelda_rcp_mezok_ellenorzese', 10 );
```

### 4. Mentés regisztrációkor

Az ellenőrzés után az adatokat a felhasználó metaadatai közé kell menteni az `rcp_form_processing` művelettel és az `update_user_meta()` függvénnyel. Az itt megadott azonosítóknak pontosan egyezniük kell a `get_user_meta()` hívásokban használtakkal.

```php
function pelda_rcp_mezok_mentese_regisztraciokor( $posted, $user_id ) {
	if ( ! empty( $posted['rcp_profession'] ) ) {
		update_user_meta( $user_id, 'rcp_profession', sanitize_text_field( $posted['rcp_profession'] ) );
	}
	if ( ! empty( $posted['rcp_location'] ) ) {
		update_user_meta( $user_id, 'rcp_location', sanitize_text_field( $posted['rcp_location'] ) );
	}
}
add_action( 'rcp_form_processing', 'pelda_rcp_mezok_mentese_regisztraciokor', 10, 2 );
```

### 5. Mentés profil- és ügyfélszerkesztéskor

A profilszerkesztő mentésekor az `rcp_user_profile_updated`, az ügyfélszerkesztő mentésekor az `rcp_edit_member` művelet fut le. Mindkettő a felhasználó azonosítóját kapja, a többi ugyanaz. Ha azt akarod, hogy a tagok üres értéket is menthessenek (törölhessék a mezőt), a függvény kezelje az üres bemenetet is.

```php
function pelda_rcp_mezok_mentese_profilnal( $user_id ) {
	if ( ! empty( $_POST['rcp_profession'] ) ) {
		update_user_meta( $user_id, 'rcp_profession', sanitize_text_field( $_POST['rcp_profession'] ) );
	}
	if ( ! empty( $_POST['rcp_location'] ) ) {
		update_user_meta( $user_id, 'rcp_location', sanitize_text_field( $_POST['rcp_location'] ) );
	}
}
add_action( 'rcp_user_profile_updated', 'pelda_rcp_mezok_mentese_profilnal', 10 );
add_action( 'rcp_edit_member', 'pelda_rcp_mezok_mentese_profilnal', 10 );
```

### Tippek az átalakításhoz

- A mezőket elsősorban a `name` és az `id` azonosítja. Ha a „foglalkozás” helyett „munka” kell, keresd meg az `rcp_profession` előfordulásait, és cseréld `rcp_munka`-ra, vagy vegyél fel egy második mezőpárt.
- A beküldött adatot mindig ellenőrizd, hogy a várt formátumú-e.
- Újabb mezőnél ne a függvényeket másold, hanem a függvényeken belüli kódot.

### Más mezőtípusok

A szövegmező mellett más típus is használható. Minden típusnál mind az öt lépést át kell alakítani: a kiírást, az ellenőrzést és a mentést is.

| Típus | Amire figyelni kell |
| --- | --- |
| Jelölőnégyzet (checkbox) | A kiírásnál `checked()` jelöli az állapotot. Kötelező jelölésnél az `isset()` ellenőrzi, hogy a mező megjött-e. Mentéskor az érték `true`, ha be volt pipálva. Az ügyfélszerkesztőben a címke mellé leírás kerül. |
| E-mail | A beviteli mező típusa `email`. Regisztrációkor az `is_email()` ellenőrzi a formátumot, mentés előtt a `sanitize_email()` tisztítja az értéket. |
| Rádiógomb (radio) | Azonos nevű `radio` bemenetek, a kiválasztottat a `checked()` jelöli. Mentés előtt ellenőrizd, hogy a beküldött érték az engedélyezett választások között van-e (`in_array()`). |
| Több jelölőnégyzet (multi-check) | Tömbként küldött értékek (`name="mezo[]"`). A kiírásnál a `checked()` az `in_array()` eredményét kapja, mentés előtt a tömb minden elemét tisztítani kell (`array_map()` és `sanitize_text_field`). |
| Legördülő menü (select) | A kiválasztott `option` a `selected()` jelölést kapja. Mentés előtt az engedélyezett választások listájával kell összevetni az értéket. |
| Szövegterület (textarea) | A kiírásnál az `esc_textarea()` védi az értéket. A példában mentés előtt a `wp_filter_nohtml_kses()` eltávolít minden HTML-t. Ha engedni akarsz némi HTML-t, használd helyette a `wp_kses()` függvényt. |
| Webcím (URL) | A bemenet típusa `url`. Mentés előtt az `esc_url_raw()` tisztítja az értéket. |

## Erős jelszó kikényszerítése (Enforce Strong Passwords)

Az **Enforce Strong Passwords** kiegészítő regisztrációkor megköveteli az erős jelszót, így biztonságosabbak az ügyfélfiókok. A kiegészítőnek nincs beállítása: bekapcsolás után magától működik. Működéséhez az RCP kell.

- Ahogy a felhasználó beírja a jelszót, egy erősségmérő jelzi, mennyire erős.
- Ha gyenge jelszóval próbálja elküldeni az űrlapot, a „Please use a strong password” üzenetet kapja, és tippeket arra, mit kell teljesítenie.
- Erős jelszó megadása után a regisztráció befejezhető.

## Matematikai ellenőrzés (Math Verification)

A **Math Verification** kiegészítő egy egyszerű számtani feladatot tesz a regisztrációs űrlapra, hogy a robotok ne tudjanak kéretlen fiókokat létrehozni. Bekapcsolás után a regisztrációs oldalon megjelenik a feladat és egy mező a válasznak. A feladat mellett látható címkét a **Restrict → Settings → Misc** fülön lehet átírni.

## A blokkoló réteg stílusának átalakítása

Az RCP a jQuery BlockUI segítségével zárolja a regisztrációs űrlapot, amikor dolgozik rajta (például végösszeget számol vagy a fizetési mezőket cseréli). Ezt a réteget a bővítmény színnel, átlátszósággal és szegéllyel stílusozza. Mivel a stílusokat a script közvetlenül az elemre írja, az átírásukhoz `!important` kell. A saját szabályokat a **Megjelenés → Testreszabás → További CSS** területen add meg.

Példa: kék szín, félig átlátszó réteg és árnyék:

```css
.blockUI.blockOverlay {
	background-color: #0088d0 !important;
	opacity: 0.5 !important;
	box-shadow: 0 0 10px 1px #000 !important;
}
```

## A felfüggesztett profil üzenetének módosítása (RCP Ultimate Member)

Ha az Ultimate Member és az RCP együtt fut, a lejárt tagság profilján egy üzenet látszik. Ezt az `rcpum_expired_member_message` szűrővel írhatod át. A példában a sajátodat megnézők „Your account is expired!” (a te fiókod lejárt), mások „This account is expired.” szöveget látnak:

```php
function pelda_lejart_uzenet( $message ) {
	$uj_uzenet = __( 'Ez a fiók lejárt.', 'rcp-ultimate-member' );
	if ( um_is_myprofile() ) {
		$uj_uzenet = __( 'A fiókod lejárt!', 'rcp-ultimate-member' );
	}
	return sprintf( '<p>%s</p>', $uj_uzenet );
}
add_filter( 'rcpum_expired_member_message', 'pelda_lejart_uzenet' );
```

## A jelszó megerősítő mező eltávolítása

Alapból a regisztrációs űrlapon két jelszómező van: **Password** és **Password again**. Ha azt szeretnéd, hogy a tagnak elég egyszer megadnia a jelszavát, két lépés kell. Ez egyedi kód, ezért ellenőrizd tesztoldalon.

1. Rejtsd el a második mezőt. Add hozzá a **Megjelenés → Testreszabás → További CSS** területhez:

```css
#rcp_password_again_wrap {
	display: none;
}
```

2. Töröld a „Passwords do not match” hibát. A mező elrejtése nem elég, mert az RCP továbbra is várja a második jelszót, és eltérés miatt hibát dob. Tedd a kódot a gyermektéma `functions.php` fájljába vagy egy saját bővítménybe:

```php
function pelda_rcp_jelszo_egyezes_hiba_torlese( $posted ) {
	rcp_errors()->remove( 'password_mismatch' );
}
add_action( 'rcp_form_errors', 'pelda_rcp_jelszo_egyezes_hiba_torlese' );
```

## A vezetéknév és a keresztnév kötelezővé tétele

A regisztrációs űrlapon van **First Name** és **Last Name** mező, de alapból egyik sem kötelező. A következő kód kötelezővé teszi őket a regisztrációnál és a profil szerkesztésénél is, és hibaüzenetet ad, ha üresen maradnak. Tedd a gyermektéma `functions.php` fájljába vagy egy saját bővítménybe:

```php
// Regisztráció
function pelda_rcp_nevek_kotelezo( $posted ) {
	if ( empty( $posted['rcp_user_first'] ) ) {
		rcp_errors()->add( 'first_name_required', __( 'Kérjük, add meg a keresztneved', 'rcp' ), 'register' );
	}
	if ( empty( $posted['rcp_user_last'] ) ) {
		rcp_errors()->add( 'last_name_required', __( 'Kérjük, add meg a vezetékneved', 'rcp' ), 'register' );
	}
}
add_action( 'rcp_form_errors', 'pelda_rcp_nevek_kotelezo' );

// Profil szerkesztése
function pelda_rcp_nevek_kotelezo_profil( $posted, $user_id ) {
	if ( empty( $posted['rcp_first_name'] ) ) {
		rcp_errors()->add( 'first_name_required', __( 'Kérjük, add meg a keresztneved', 'rcp' ) );
	}
	if ( empty( $posted['rcp_last_name'] ) ) {
		rcp_errors()->add( 'last_name_required', __( 'Kérjük, add meg a vezetékneved', 'rcp' ) );
	}
}
add_action( 'rcp_edit_profile_form_errors', 'pelda_rcp_nevek_kotelezo_profil', 10, 2 );
```

A fenti kódok útmutatásnak szólnak: egyedi fejlesztésnek számítanak, a módosításuk és hibakeresésük a te feladatod.
