0 && ! array_key_exists( $id, self::$rows ) ) { $ids[ $id ] = $id; } } if ( array() === $ids ) { return; } $ids = array_values( $ids ); foreach ( $ids as $id ) { self::$rows[ $id ] = false; } foreach ( Db::rows( 'SELECT id, home_post_id, state, qa_mode, qa_private, reviews_mode, coming_soon_flags, available_from FROM %i WHERE id IN (' . implode( ',', array_fill( 0, count( $ids ), '%d' ) ) . ')', array_merge( array( Db::table( 'courses' ) ), $ids ) ) as $row ) { self::$rows[ (int) $row['id'] ] = $row; } } public static function exists( int $course_id ): bool { $row = self::course( $course_id ); return null !== $row && ObjectState::TRASHED->value !== (int) $row['state']; } public static function is_learner( int $user_id, int $course_id ): bool { if ( $user_id <= 0 || $course_id <= 0 ) { return false; } $e = Services::enrolment_repo()->for_user( $user_id, array( $course_id ) )[ $course_id ] ?? null; return null !== $e && $e->is_active(); } public static function is_staff( int $user_id, int $course_id ): bool { if ( $user_id <= 0 || $course_id <= 0 ) { return false; } $key = $user_id . ':' . $course_id; if ( ! isset( self::$staff[ $key ] ) ) { $row = self::course( $course_id ); self::$staff[ $key ] = null !== $row && ( Users::can( $user_id, 'manage_options' ) || Users::can( $user_id, 'rooster_lms_manage_orgs' ) || ( (int) $row['home_post_id'] > 0 && Users::can( $user_id, 'edit_post', (int) $row['home_post_id'] ) ) || null !== Services::course_staff()->role_of( $user_id, $course_id ) || null !== Services::gate()->staff_access( $user_id, $course_id ) ); } return self::$staff[ $key ]; } public static function is_member( int $user_id, int $course_id ): bool { return self::is_staff( $user_id, $course_id ) || self::is_learner( $user_id, $course_id ); } public static function progress( int $user_id, int $course_id ): array { $p = Services::progress_repo()->for_user( $user_id, array( $course_id ) )[ $course_id ] ?? null; return null === $p ? array( ProgressStatus::NOT_STARTED, 0 ) : array( $p->status, $p->percent ); } public static function placed( int $course_id, int $unit_id ): bool { return $course_id > 0 && $unit_id > 0 && null !== Db::value( 'SELECT 1 FROM %i WHERE course_id = %d AND unit_id = %d LIMIT 1', Db::table( 'items' ), $course_id, $unit_id ); } public static function qa_mode( int $course_id ): int { if ( true !== CommunitySettings::get( 'qa_enabled' ) ) { return 1; } $row = self::course( $course_id ); $mode = null === $row ? 0 : (int) $row['qa_mode']; return $mode >= 1 && $mode <= 5 ? $mode : (int) CommunitySettings::get( 'qa_mode' ); } public static function qa_private( int $course_id ): bool { $row = self::course( $course_id ); $mode = null === $row ? 0 : (int) ( $row['qa_private'] ?? 0 ); if ( 1 === $mode || 2 === $mode ) { return 2 === $mode; } return true === CommunitySettings::get( 'qa_private' ); } public static function reviews_on( int $course_id ): bool { $row = self::course( $course_id ); $mode = null === $row ? 0 : (int) $row['reviews_mode']; if ( 1 === $mode || 2 === $mode ) { return 2 === $mode; } return true === CommunitySettings::get( 'reviews_enabled' ); } public static function coming_soon( int $course_id ): bool { $row = self::course( $course_id ); return null !== $row && ( (int) $row['coming_soon_flags'] & self::COMING_SOON ) > 0; } }