# Számítási példák: napok, törtek, átváltás és tizedes lépésköz

> Két dátum közti napok számolása szám mezőbe, valamint törtméretek (például 1/8) használata területszámításhoz.

## Két dátum közti napok száma

A **Számítás** mező nem számol dátumokkal, ezért a napok számát egy kis JavaScript tölti ki egy **Szám** mezőbe, amelyet a vásárló nem tud átírni. Az eredményt aztán más számítások felhasználhatják, például bérleti díj számolásához.

### Mezők

1. Vegyél fel két **Dátum** mezőt: az egyik a kezdő, a másik a záró dátum.
2. Vegyél fel egy **Szám** mezőt az eredménynek.
3. Jegyezd fel mindhárom mező azonosítóját.

### Kód

Add a kódot az oldalhoz (például egy kódrészlet-bővítménnyel). A kód a `wp_footer` horgon keresztül kerül az oldal aljára. Három dolgot csinál:

- az eredménymezőt csak olvashatóvá teszi (`.pewc-number-field-<azonosító>`),
- figyeli a dátummezők (`.pewc-date-field`) `change` és `update` eseményeit,
- ha mindkét dátum ki van töltve, kiszámolja a különbséget napokban, és beírja az eredménymezőbe.

A számítás: a két dátum különbségének abszolút értékét osztja egy nap ezredmásodpercben kifejezett hosszával (1000 × 60 × 60 × 24), és lefelé kerekíti. A sorrend tehát nem számít.

```php
add_action( 'wp_footer', function () {
	if ( ! is_product() ) {
		return;
	}
	?>
	<script>
	jQuery( function ( $ ) {
		// Cseréld a három azonosítót a saját mezőidére.
		var startId  = 1245;
		var endId    = 1246;
		var resultId = 1247;

		var $result = $( '.pewc-number-field-' + resultId );
		$result.prop( 'readonly', true );

		function updateDays() {
			var start = $( '.pewc-date-field-' + startId ).val();
			var end   = $( '.pewc-date-field-' + endId ).val();
			if ( ! start || ! end ) {
				return;
			}
			var diff = Math.abs( new Date( end ) - new Date( start ) );
			var days = Math.floor( diff / ( 1000 * 60 * 60 * 24 ) );
			$result.val( days ).trigger( 'change' );
		}

		$( 'body' ).on( 'change update', '.pewc-date-field', updateDays );
	} );
	</script>
	<?php
} );
```

A kódban a `1245`, `1246`, `1247` mintaazonosító: a saját mezőid azonosítóját írd a helyükre. A termék közzététele után a szám mező mutatja a napok számát, és a vásárló nem szerkesztheti.

## Törtek a méretekben

Ha a vásárló törtekkel (például 1/8 vagy 1/4) adja meg a méreteket, a törtet tizedes számra kell váltani a területszámításhoz. Ehhez egy egész számot és egy törtválasztót kombinálsz.

### 1. rész: a törtmezők felvétele

1. Vegyél fel egy szokásos **Szám** mezőt az első méret egész részének (például Szélesség).
2. Vegyél fel egy **Kiválasztás** mezőt, amelynek opciói a törtek (például 1/8, 1/4).
3. Az opciók **Ár** oszlopába írd be a tört tizedes értékét: 0,125 az 1/8-hoz, 0,25 az 1/4-hez (a képletekben tizedespontot használj: `0.125`).
4. A **Mező árának láthatósága** és az **Opció árának láthatósága** legyen **Rejtett**, hogy a vásárló ne lássa árként.
5. Ismételd meg a többi mérettel (például Magasság).

### 2. rész: a törtek a számításban

1. Vegyél fel egy **Számítás** mezőt, amely a szélességet tizedes számra váltja:

   ```text
   {field_1752} + {field_1753_option_price}
   ```

   A `field_1752` helyére az egész szám mező azonosítója, a `field_1753` helyére a törtválasztó mező azonosítója kerül.
2. Ha nem akarod megjeleníteni a termékoldalon, kapcsold be a **Számítás elrejtése?** beállítást.
3. Állítsd be a **Tizedesjegyek** értékét megfelelő számra.
4. Ismételd meg a magassággal.

### 3. rész: a terület kiszámítása

Vegyél fel egy újabb **Számítás** mezőt, amely összeszorozza a két tizedes mezőt:

```text
{field_2796} * {field_2797}
```

A két azonosító a szélesség és a magasság számítás mező azonosítója legyen.

## Átváltás láb és méter között

A bővítmény nem kezel mértékegységeket, de három mezővel megoldható az átváltás: a vásárló kiválasztja a mértékegységet, beírja az értéket, a számítás pedig az átváltott eredményt adja.

### 1. rész: a mértékegység-választó

1. Vegyél fel egy új mezőt, a **Mező típusa** legyen **Rádiógomb-csoport**, és adj neki címkét. Választómező is jó.
2. Az **Opciók** fülön vegyél fel két opciót: **Láb** és **Méter**.
3. Az **Ár** oszlopba az átváltási szorzót írd: a Láb mellé `0.3048`, a Méter mellé `1`.
4. Az **Árazás** fülön az **Opció árának láthatósága** legyen **Rejtett**, így a szorzó csak a számításban szerepel, a vásárló nem látja, és a kosárba sem kerül ár.
5. Jegyezd fel a mező azonosítóját (például `123`).

### 2. rész: a mért érték

1. Vegyél fel egy **Szám** típusú mezőt, és adj neki címkét.
2. A **Minimális érték** legyen `0`.
3. Állítsd be a **Tizedesjegyek** értékét a kívánt pontosságra.
4. Jegyezd fel a mező azonosítóját (például `124`). Ha a mező tizedes értékeket is fogadjon, lásd lent a lépésköz módosítását.

### 3. rész: az átváltás

1. Vegyél fel egy **Számítás** típusú mezőt, és adj neki címkét.
2. A **Számítások** fülön a képlet:

   ```text
   {field_123_option_price} * {field_124}
   ```

   A `123` és `124` helyére a saját mezőid azonosítója kerül.
3. Ha egész számra akarod kerekíteni az eredményt, az **Eredmény kerekítése** legyen **Felfelé kerekítés**. Ez a legközelebbi egész számra felfelé kerekít (a 3,048 például 4 lesz), ezért csak akkor használd, ha a terméknél ez a pontosság elég.

A képlet a beírt értéket a kiválasztott mértékegység szorzójával szorozza. Ha a vásárló Láb-at választ és 10-et ír be, az eredmény 10 × 0,3048 = 3,048 méter. Méter esetén a szorzó 1, az érték nem változik.

## Tizedes értékek a szám mezőkben és a feltételekben

Alapból a **Szám** mezők egész számokkal lépkednek (a lépésköz 1), és a feltételek értéke is egész szám. Tizedes értékekhez egy szűrővel kisebb lépésközt kell megadni. A szűrőt a sablon `functions.php` fájljába vagy egy kódrészlet-bővítménybe teheted.

### Lépésköz a szám mezőkben

A `pewc_number_field_step` szűrő a szám mező lépésközét adja vissza. Két paramétere van: a jelenlegi lépésköz (`$step`) és a mező adatai (`$item`), amelyből a `field_id` kiolvasható.

Minden szám mezőre:

```php
function prefix_number_field_step( $step, $item ) {
	return 0.01;
}
add_filter( 'pewc_number_field_step', 'prefix_number_field_step', 10, 2 );
```

Csak egy mezőre:

```php
function prefix_specific_number_field_step( $step, $item ) {
	// Cseréld a saját meződ azonosítójára
	if ( $item['field_id'] == 1234 ) {
		return 0.01;
	}
	return $step;
}
add_filter( 'pewc_number_field_step', 'prefix_specific_number_field_step', 10, 2 );
```

Ha az első változat is aktív, az minden mezőre `0.01`-et ad, ezért a második fölösleges.

### Lépésköz a minimális és maximális értéknél

A szám mező **Minimális érték** és **Maximális érték** beállítása a `pewc_min_max_val_step` szűrővel kap tizedes lépésközt. A felépítése ugyanolyan:

```php
function prefix_min_max_val_step( $step, $item ) {
	return 0.01;
}
add_filter( 'pewc_min_max_val_step', 'prefix_min_max_val_step', 10, 2 );
```

### Tizedes érték a feltételekben

Ha a feltétel egy szám mezőre vonatkozik, az értékmező alapból egész számokat fogad. A `pewc_condition_value_step` szűrő megváltoztatja ezt. A paraméterei a jelenlegi lépésköz (`$step`) és annak a mezőnek az azonosítója, amelyre a feltétel vonatkozik (`$field_id`).

```php
function prefix_condition_value_step( $step, $field_id ) {
	return 0.01;
}
add_filter( 'pewc_condition_value_step', 'prefix_condition_value_step', 10, 2 );
```

A `0.01` két tizedesjegyet enged, a `0.1` egyet, a `0.001` hármat. Ha csak bizonyos mezőknél akarod, a függvényben ellenőrizd a `$field_id` értékét, és más mezőknél add vissza változatlanul a `$step`-et.
