'fdbt-widget', 'description' => __( 'C-15 incidents or a Low Emission Zones summary.', 'fontdelbosc-transit' ), ) ); } /** * Render the widget. * * @param array $args Sidebar arguments. * @param array $instance Widget settings. */ public function widget( $args, $instance ): void { $title = Fontdelbosc_Transit_Payload::str( apply_filters( 'widget_title', Fontdelbosc_Transit_Payload::str( Fontdelbosc_Transit_Payload::get( $instance, 'title' ) ) ?? '' ) ) ?? ''; $view = Fontdelbosc_Transit_Payload::str( Fontdelbosc_Transit_Payload::get( $instance, 'view' ) ) ?? 'c15'; $before_widget = Fontdelbosc_Transit_Payload::str( Fontdelbosc_Transit_Payload::get( $args, 'before_widget' ) ) ?? ''; $after_widget = Fontdelbosc_Transit_Payload::str( Fontdelbosc_Transit_Payload::get( $args, 'after_widget' ) ) ?? ''; $before_title = Fontdelbosc_Transit_Payload::str( Fontdelbosc_Transit_Payload::get( $args, 'before_title' ) ) ?? ''; $after_title = Fontdelbosc_Transit_Payload::str( Fontdelbosc_Transit_Payload::get( $args, 'after_title' ) ) ?? ''; echo wp_kses_post( $before_widget ); if ( '' !== $title ) { echo wp_kses_post( $before_title . esc_html( $title ) . $after_title ); } if ( 'zbe' === $view ) { $this->render_zbe_summary(); } else { $this->render_incidents(); } echo wp_kses_post( $after_widget ); } /** * Render the compact C-15 incident list. */ private function render_incidents(): void { $data = Fontdelbosc_Transit_Data_Manager::get_incidents(); if ( null === $data ) { echo '

' . esc_html__( 'Data unavailable.', 'fontdelbosc-transit' ) . '

'; return; } $incidents = array_filter( $data['incidents'], static fn( array $incident ): bool => Fontdelbosc_Transit_Maps::is_c15( $incident ) ); $incidents = array_slice( array_values( $incidents ), 0, 5 ); if ( array() === $incidents ) { echo '

' . esc_html__( 'No incidents on C-15.', 'fontdelbosc-transit' ) . '

'; return; } echo ''; } /** * Build the one-line summary of an incident for the widget. * * @param array $incident Normalized incident. * @return string */ private function incident_summary( array $incident ): string { $parts = array(); $km = Fontdelbosc_Transit_Payload::str( $incident['km'] ?? null ); if ( null !== $km && '' !== $km ) { $parts[] = sprintf( /* translators: %s: kilometre point. */ __( 'km %s', 'fontdelbosc-transit' ), $km ); } $town = Fontdelbosc_Transit_Payload::str( $incident['town'] ?? null ); if ( null !== $town && '' !== $town ) { $parts[] = $town; } $title = Fontdelbosc_Transit_Payload::str( $incident['title'] ?? null ); if ( null !== $title && '' !== $title ) { $parts[] = $title; } if ( array() === $parts ) { return Fontdelbosc_Transit_Payload::str( $incident['road_name'] ?? null ) ?? ''; } return implode( ' — ', $parts ); } /** * Render the compact ZBE summary. */ private function render_zbe_summary(): void { $zones = Fontdelbosc_Transit_Data_Manager::get_zbes(); if ( array() === $zones ) { echo '

' . esc_html__( 'Data unavailable.', 'fontdelbosc-transit' ) . '

'; return; } echo '
    '; foreach ( $zones as $zone ) { echo '
  • ' . esc_html( Fontdelbosc_Transit_Payload::str( $zone['name'] ?? null ) ?? '' ) . ''; $periods = Fontdelbosc_Transit_Payload::arr( $zone['periods'] ?? null ); $first = $periods[0] ?? null; if ( is_array( $first ) ) { $start = Fontdelbosc_Transit_Payload::str( $first['start'] ?? null ) ?? ''; $end = Fontdelbosc_Transit_Payload::str( $first['end'] ?? null ) ?? ''; $label = $start . '–' . $end; if ( '' !== $start && '' !== $end ) { echo ' ' . esc_html( $label ) . ''; } } echo '
  • '; } echo '
'; } /** * Widget settings form. * * @param array $instance Widget settings. */ public function form( $instance ): ?string { $title = Fontdelbosc_Transit_Payload::str( Fontdelbosc_Transit_Payload::get( $instance, 'title' ) ) ?? __( 'Traffic on C-15', 'fontdelbosc-transit' ); $view = Fontdelbosc_Transit_Payload::str( Fontdelbosc_Transit_Payload::get( $instance, 'view' ) ) ?? 'c15'; echo '

'; echo ''; echo ''; echo '

'; echo '

'; echo ''; echo ''; echo '

'; return null; } /** * Save widget settings. * * @param array $new_instance New settings. * @param array $old_instance Old settings. * @return array */ public function update( $new_instance, $old_instance ): array { $instance = $old_instance; $instance['title'] = sanitize_text_field( Fontdelbosc_Transit_Payload::str( Fontdelbosc_Transit_Payload::get( $new_instance, 'title' ) ) ?? '' ); $instance['view'] = 'zbe' === Fontdelbosc_Transit_Payload::str( Fontdelbosc_Transit_Payload::get( $new_instance, 'view' ) ) ? 'zbe' : 'c15'; return $instance; } }