Automattic\WooCommerce\Admin\API\Reports
DataStore::fill_in_missing_intervals
Fills in interval gaps from DB with 0-filled objects.
Метод класса: DataStore{}
Хуков нет.
Возвращает
stdClass.
Использование
// protected - в коде основоного (родительского) или дочернего класса $result = $this->fill_in_missing_intervals( $db_intervals, $start_datetime, $end_datetime, $time_interval, $data );
- $db_intervals(массив) (обязательный)
- Array of all intervals present in the db.
- $start_datetime(DateTime) (обязательный)
- Start date.
- $end_datetime(DateTime) (обязательный)
- End date.
- $time_interval(строка) (обязательный)
- Time interval, e.g. day, week, month.
- $data(stdClass) (обязательный) (передается по ссылке — &)
- Data with SQL extracted intervals.
Код DataStore::fill_in_missing_intervals() DataStore::fill in missing intervals WC 11.0.0
protected function fill_in_missing_intervals( $db_intervals, $start_datetime, $end_datetime, $time_interval, &$data ) {
// @todo This is ugly and messy.
$local_tz = new \DateTimeZone( wc_timezone_string() );
// At this point, we don't know when we can stop iterating, as the ordering can be based on any value.
$time_ids = array_flip( wp_list_pluck( $data->intervals, 'time_interval' ) );
$db_intervals = array_flip( $db_intervals );
// Totals object used to get all needed properties.
$totals_arr = get_object_vars( $data->totals );
foreach ( $totals_arr as $key => $val ) {
$totals_arr[ $key ] = 0;
}
// @todo Should 'products' be in intervals?
unset( $totals_arr['products'] );
while ( $start_datetime <= $end_datetime ) {
$next_start = TimeInterval::iterate( $start_datetime, $time_interval );
$time_id = TimeInterval::time_interval_id( $time_interval, $start_datetime );
// Either create fill-zero interval or use data from db.
if ( $next_start > $end_datetime ) {
$interval_end = $end_datetime->format( 'Y-m-d H:i:s' );
} else {
$prev_end_timestamp = (int) $next_start->format( 'U' ) - 1;
$prev_end = new \DateTime();
$prev_end->setTimestamp( $prev_end_timestamp );
$prev_end->setTimezone( $local_tz );
$interval_end = $prev_end->format( 'Y-m-d H:i:s' );
}
if ( array_key_exists( $time_id, $time_ids ) ) {
// For interval present in the db for this time frame, just fill in dates.
$record = &$data->intervals[ $time_ids[ $time_id ] ];
$record['date_start'] = $start_datetime->format( 'Y-m-d H:i:s' );
$record['date_end'] = $interval_end;
} elseif ( ! array_key_exists( $time_id, $db_intervals ) ) {
// For intervals present in the db outside of this time frame, do nothing.
// For intervals not present in the db, fabricate it.
$record_arr = array();
$record_arr['time_interval'] = $time_id;
$record_arr['date_start'] = $start_datetime->format( 'Y-m-d H:i:s' );
$record_arr['date_end'] = $interval_end;
$data->intervals[] = array_merge( $record_arr, $totals_arr );
}
$start_datetime = $next_start;
}
return $data;
}