automatewoo/includes/Rules/Abstract_Sensei_Rule.php
fei-source 47d3c9a8b6 Update to v6.2.2
Source: GrootMade/Festinger Vault
2026-03-15 08:31:15 +08:00

112 lines
2.5 KiB
PHP

<?php
namespace AutomateWoo\Rules;
use AutomateWoo\DataTypes\DataTypes;
use AutomateWoo\Sensei_Workflow_Helper;
defined( 'ABSPATH' ) || exit;
/**
* @class Abstract_Sensei_Rule
*/
abstract class Abstract_Sensei_Rule extends Searchable_Select_Rule_Abstract {
/**
* The rule's primary data item.
*
* @var string
*/
public $data_item = DataTypes::CUSTOMER;
/**
* This rule supports multiple selections.
*
* @var bool
*/
public $is_multi = true;
/**
* Init the rule.
*/
public function init() {
parent::init();
$this->group = Sensei_Workflow_Helper::get_group_name();
$this->compare_types = [];
}
/**
* Get the ajax action to use for the AJAX search.
*
* @return string
*/
public function get_search_ajax_action() {
return 'aw_json_search_sensei_courses';
}
/**
* Display the value title instead of the ID.
*
* @param string $value
*
* @return string
*/
public function get_object_display_value( $value ) {
return get_the_title( $value );
}
/**
* Check whether the workflow is sensei related.
*
* @return boolean
*/
public function is_sensei_workflow() {
$workflow = $this->get_workflow();
if ( ! $workflow ) {
return false;
}
return $workflow->get_trigger() && $workflow->get_trigger()->get_group() === $this->group;
}
/**
* Validate the rule for a given Student.
*
* @param \AutomateWoo\Customer $customer The customer to validate the rule for.
* @param array $quiz_ids Array of lesson ids
* @param string $status Quiz status. eg: 'passed', 'failed', 'not_yet_taken'.
* @return bool
*/
public function validate_quiz( $customer, $quiz_ids, $status ) {
$passed = true;
$user_id = $customer->get_user_id();
if ( ! $user_id || ! $this->is_sensei_workflow() ) {
return false;
}
if ( empty( $quiz_ids ) ) {
$quiz_ids = Sensei_Workflow_Helper::get_student_quiz_ids( $user_id );
}
if ( empty( $quiz_ids ) ) {
return 'not_yet_taken' === $status;
}
foreach ( $quiz_ids as $quiz_id ) {
$lesson_id = Sensei()->quiz->get_lesson_id( $quiz_id );
$quiz_progress = Sensei()->quiz_progress_repository->get( $quiz_id, $user_id );
if ( 'not_yet_taken' === $status ) {
if ( \Sensei()->lesson->is_quiz_submitted( $lesson_id, $user_id ) ) {
return false;
}
} elseif ( 'passed' === $status || 'failed' === $status ) {
if ( ! $quiz_progress || $quiz_progress->get_status() !== $status ) {
return false;
}
}
}
return $passed;
}
}