diff --git a/moje-statystyki.php b/moje-statystyki.php index 9a5dbb0..769bb51 100644 --- a/moje-statystyki.php +++ b/moje-statystyki.php @@ -19,6 +19,8 @@ function mystat_activate() { $table_categories = $wpdb->prefix . 'mystat_categories'; $table_activities = $wpdb->prefix . 'mystat_activities'; + $table_event_types = $wpdb->prefix . 'mystat_event_types'; + $table_equipment = $wpdb->prefix . 'mystat_equipment'; // SQL dla Kategorii $sql_cat = "CREATE TABLE $table_categories ( @@ -29,20 +31,51 @@ function mystat_activate() { PRIMARY KEY (id) ) $charset_collate;"; + // SQL dla Typów Wydarzeń + $sql_event_types = "CREATE TABLE $table_event_types ( + id mediumint(9) NOT NULL AUTO_INCREMENT, + name varchar(100) NOT NULL, + PRIMARY KEY (id) + ) $charset_collate;"; + + // SQL dla Sprzętu + $sql_equipment = "CREATE TABLE $table_equipment ( + id mediumint(9) NOT NULL AUTO_INCREMENT, + name varchar(100) NOT NULL, + PRIMARY KEY (id) + ) $charset_collate;"; + // SQL dla Aktywności $sql_act = "CREATE TABLE $table_activities ( id bigint(20) NOT NULL AUTO_INCREMENT, category_id mediumint(9) NOT NULL, date date NOT NULL, + title varchar(255) DEFAULT '' NOT NULL, distance decimal(10,2) DEFAULT 0.00, duration time DEFAULT '00:00:00', calories int(11) DEFAULT 0, comment text, + strava_url varchar(255) DEFAULT NULL, + avg_heart_rate smallint(5) UNSIGNED DEFAULT NULL, + max_heart_rate smallint(5) UNSIGNED DEFAULT NULL, + avg_speed decimal(5,2) DEFAULT NULL, + max_speed decimal(5,2) DEFAULT NULL, + avg_cadence smallint(5) UNSIGNED DEFAULT NULL, + max_cadence smallint(5) UNSIGNED DEFAULT NULL, + total_elevation_gain int(11) DEFAULT NULL, + total_elevation_loss int(11) DEFAULT NULL, + min_altitude int(11) DEFAULT NULL, + max_altitude int(11) DEFAULT NULL, + equipment_id mediumint(9) DEFAULT NULL, + gpx_url varchar(255) DEFAULT NULL, + event_type_id mediumint(9) DEFAULT NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + dbDelta( $sql_equipment ); dbDelta( $sql_cat ); + dbDelta( $sql_event_types ); dbDelta( $sql_act ); // Dodanie domyślnych kategorii, jeśli tabela jest pusta @@ -50,13 +83,69 @@ function mystat_activate() { $wpdb->insert( $table_categories, array( 'name' => 'Rower', 'icon' => 'dashicons-buddicons-groups', 'color' => '#3498db' ) ); $wpdb->insert( $table_categories, array( 'name' => 'Bieganie', 'icon' => 'dashicons-businessman', 'color' => '#e74c3c' ) ); } + + // Dodanie domyślnych typów wydarzeń, jeśli tabela jest pusta + if ( $wpdb->get_var( "SELECT COUNT(*) FROM $table_event_types" ) == 0 ) { + $default_event_types = ['Bez kategorii', 'Fitness', 'Geocaching', 'Podróżowanie', 'Rekreacyjny', 'Specjalne zdarzenie', 'Transport', 'Trening', 'Wyścig']; + foreach ($default_event_types as $type_name) { + $wpdb->insert( $table_event_types, array( 'name' => $type_name ) ); + } + // Ustawienie domyślnego typu "Trening" dla istniejących aktywności, które go nie mają + $training_id = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $table_event_types WHERE name = %s", 'Trening' ) ); + if ($training_id) { + $wpdb->query( $wpdb->prepare( "UPDATE $table_activities SET event_type_id = %d WHERE event_type_id IS NULL OR event_type_id = 0", $training_id ) ); + } + } + + // Dodanie domyślnego sprzętu, jeśli tabela jest pusta + if ( $wpdb->get_var( "SELECT COUNT(*) FROM $table_equipment" ) == 0 ) { + $default_equipment = ['Giant Revolt', 'Cube LTD', 'Author Agang', 'Liv Tempt 4', 'Cube Acid 24', 'Mongoose BMX', 'Nextbike - Miejski']; + foreach ($default_equipment as $eq_name) { + $wpdb->insert( $table_equipment, array( 'name' => $eq_name ) ); + } + } } // --- 2. MENU ADMINA I DASHBOARD --- add_action( 'admin_menu', 'mystat_add_admin_menu' ); function mystat_add_admin_menu() { - add_menu_page( 'Moje Statystyki', 'Statystyki', 'manage_options', 'moje-statystyki', 'mystat_dashboard_page', 'dashicons-chart-line', 6 ); + add_menu_page( + 'Moje Statystyki', // Tytuł strony + 'Statystyki', // Tytuł w menu + 'manage_options', // Wymagane uprawnienia + 'moje-statystyki', // Slug menu + 'mystat_dashboard_page', // Funkcja renderująca stronę główną (dashboard) + 'dashicons-chart-line', // Ikona + 6 // Pozycja + ); + + add_submenu_page( + 'moje-statystyki', // Slug rodzica + 'Dodaj Nowy Trening', // Tytuł strony + 'Nowy trening', // Tytuł w podmenu + 'manage_options', // Wymagane uprawnienia + 'mystat-nowy-trening', // Slug podmenu + 'mystat_add_new_page' // Funkcja renderująca stronę dodawania + ); + + add_submenu_page( + 'moje-statystyki', + 'Typy Wydarzeń', + 'Typy wydarzeń', + 'manage_options', + 'mystat-event-types', + 'mystat_event_types_page' + ); + + add_submenu_page( + 'moje-statystyki', + 'Sprzęt', + 'Sprzęt', + 'manage_options', + 'mystat-equipment', + 'mystat_equipment_page' + ); } function mystat_dashboard_page() { @@ -65,6 +154,369 @@ function mystat_dashboard_page() { echo ''; } +function mystat_add_new_page() { + echo '
Błąd weryfikacji bezpieczeństwa formularza.
'; + return; + } + + $table_activities = $wpdb->prefix . 'mystat_activities'; + + // Przygotowanie danych (zamiana przecinka na kropkę w dystansie) + $distance = isset($_POST['distance']) ? floatval( str_replace( ',', '.', $_POST['distance'] ) ) : 0; + + // Funkcja pomocnicza do zamiany pustych wartości na NULL, aby poprawnie zapisać je w bazie + $null_if_empty = function($value) { + return $value !== '' ? $value : null; + }; + + $data = array( + 'category_id' => intval( $_POST['category_id'] ), + 'date' => sanitize_text_field( $_POST['date'] ), + 'title' => sanitize_text_field( $_POST['title'] ), + 'distance' => $distance, + 'duration' => sanitize_text_field( $_POST['duration'] ), + 'calories' => intval( $_POST['calories'] ), + 'comment' => sanitize_textarea_field( $_POST['comment'] ), + 'strava_url' => $null_if_empty( esc_url_raw( $_POST['strava_url'] ) ), + 'avg_heart_rate' => $null_if_empty( intval( $_POST['avg_heart_rate'] ) ), + 'max_heart_rate' => $null_if_empty( intval( $_POST['max_heart_rate'] ) ), + 'avg_speed' => $null_if_empty( floatval( str_replace( ',', '.', $_POST['avg_speed'] ) ) ), + 'max_speed' => $null_if_empty( floatval( str_replace( ',', '.', $_POST['max_speed'] ) ) ), + 'avg_cadence' => $null_if_empty( intval( $_POST['avg_cadence'] ) ), + 'max_cadence' => $null_if_empty( intval( $_POST['max_cadence'] ) ), + 'total_elevation_gain' => $null_if_empty( intval( $_POST['total_elevation_gain'] ) ), + 'total_elevation_loss' => $null_if_empty( intval( $_POST['total_elevation_loss'] ) ), + 'min_altitude' => $null_if_empty( intval( $_POST['min_altitude'] ) ), + 'max_altitude' => $null_if_empty( intval( $_POST['max_altitude'] ) ), + 'equipment_id' => $null_if_empty( intval( $_POST['equipment_id'] ) ), + 'gpx_url' => $null_if_empty( esc_url_raw( $_POST['gpx_url'] ) ), + 'event_type_id' => $null_if_empty( intval( $_POST['event_type_id'] ) ), + ); + + // Format danych dla $wpdb->insert + $format = array( + '%d', '%s', '%s', '%f', '%s', '%d', '%s', // Pola podstawowe + '%s', '%d', '%d', '%f', '%f', '%d', '%d', // Tętno, prędkość, kadencja + '%d', '%d', '%d', '%d', '%d', '%s', '%d' // Wysokość, sprzęt, linki, typ wydarzenia + ); + + $result = $wpdb->insert( $table_activities, $data, $format ); + + if ( $result ) { + echo 'Trening dodany pomyślnie!
Wystąpił błąd podczas zapisu do bazy.