%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/activities/bitrix/propertyvariablecondition/ |
| Current File : /home/bitrix/www/bitrix/activities/bitrix/propertyvariablecondition/propertyvariablecondition.php |
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
class CBPPropertyVariableCondition
extends CBPActivityCondition
{
const CONDITION_JOINER_AND = 0;
const CONDITION_JOINER_OR = 1;
public $condition = null;
public function __construct($condition)
{
$this->condition = $condition;
}
public function Evaluate(CBPActivity $ownerActivity)
{
if ($this->condition == null || !is_array($this->condition) || count($this->condition) <= 0)
{
return true;
}
if (!is_array($this->condition[0]))
{
$this->condition = array($this->condition);
}
$rootActivity = $ownerActivity->GetRootActivity();
$result = [0 => true];
$i = 0;
foreach ($this->condition as $cond)
{
$r = true;
$joiner = empty($cond[3])? static::CONDITION_JOINER_AND : static::CONDITION_JOINER_OR;
if ($rootActivity->IsPropertyExists($cond[0]))
{
if (!$this->CheckCondition($rootActivity->{$cond[0]}, $cond[1], $cond[2], $rootActivity->GetPropertyBaseType($cond[0]), $rootActivity, $rootActivity->getTemplatePropertyType($cond[0])))
{
$r = false;
}
}
elseif ($rootActivity->IsVariableExists($cond[0]))
{
if (!$this->CheckCondition($rootActivity->GetVariable($cond[0]), $cond[1], $cond[2], $rootActivity->GetVariableBaseType($cond[0]), $rootActivity, $rootActivity->getVariableType($cond[0])))
{
$r = false;
}
}
if ($joiner == static::CONDITION_JOINER_OR)
{
++$i;
$result[$i] = $r;
}
elseif (!$r)
$result[$i] = false;
}
$result = array_filter($result);
return sizeof($result) > 0 ? true : false;
}
/**
* @param $field
* @param $operation
* @param $value
* @param null $baseType
* @param CBPActivity $rootActivity
* @param null $property
* @return bool
*/
private function CheckCondition($field, $operation, $value, $baseType, $rootActivity, $property = null)
{
if ($operation === 'empty')
{
return CBPHelper::isEmptyValue($field);
}
elseif ($operation === '!empty')
{
return !CBPHelper::isEmptyValue($field);
}
$result = false;
$type = is_array($property) ? $property['Type'] : $baseType;
$value = $rootActivity->ParseValue($value, $type);
if ($baseType == "user")
{
$field = CBPHelper::ExtractUsersFromUserGroups($field, $rootActivity);
$value = CBPHelper::ExtractUsersFromUserGroups($value, $rootActivity);
}
if (!is_array($field))
{
$field = array($field);
}
if ($operation == "in")
{
foreach ($field as $f)
{
if (is_array($value))
$result = in_array($f, $value);
else
$result = (strpos($value, $f) !== false);
if (!$result)
break;
}
return $result;
}
if ($operation == "contain")
{
if (!is_array($value))
$value = array($value);
foreach ($value as $v)
{
foreach ($field as $f)
{
if (is_array($f))
$result = in_array($v, $f);
else
$result = (strpos($f, $v) !== false);
if ($result)
break;
}
if (!$result)
break;
}
return $result;
}
if (!is_array($value))
{
$value = array($value);
}
if (CBPHelper::IsAssociativeArray($field))
{
$field = array_keys($field);
}
if (CBPHelper::IsAssociativeArray($value))
{
$value = array_keys($value);
}
$i = 0;
$fieldCount = count($field);
$valueCount = count($value);
if (($fieldCount == 0) && ($valueCount == 0))
{
return in_array($operation, array("=", ">=", "<="));
}
$iMax = max($fieldCount, $valueCount);
while ($i < $iMax)
{
$f1 = ($fieldCount > $i) ? $field[$i] : $field[$fieldCount - 1];
$v1 = ($valueCount > $i) ? $value[$i] : $value[$valueCount - 1];
if ($baseType == "datetime" || $baseType == "date")
{
if (($f1Tmp = MakeTimeStamp($f1, FORMAT_DATETIME)) === false)
{
if (($f1Tmp = MakeTimeStamp($f1, FORMAT_DATE)) === false)
{
if (($f1Tmp = MakeTimeStamp($f1, "YYYY-MM-DD HH:MI:SS")) === false)
{
if (($f1Tmp = MakeTimeStamp($f1, "YYYY-MM-DD")) === false)
$f1Tmp = 0;
}
}
}
$f1 = $f1Tmp;
if (($v1Tmp = MakeTimeStamp($v1, FORMAT_DATETIME)) === false)
{
if (($v1Tmp = MakeTimeStamp($v1, FORMAT_DATE)) === false)
{
if (($v1Tmp = MakeTimeStamp($v1, "YYYY-MM-DD HH:MI:SS")) === false)
{
if (($v1Tmp = MakeTimeStamp($v1, "YYYY-MM-DD")) === false)
$v1Tmp = 0;
}
}
}
$v1 = $v1Tmp;
}
if ($baseType === 'bool')
{
$f1 = CBPHelper::getBool($f1);
$v1 = CBPHelper::getBool($v1);
}
/** @var \Bitrix\Bizproc\BaseType\Base $classType */
$classType = \Bitrix\Bizproc\BaseType\Base::class;
if ($type)
{
$fieldType = $rootActivity->workflow
->GetService('DocumentService')
->getFieldTypeObject($rootActivity->GetDocumentType(), ['Type' => $type]);
if ($fieldType)
{
$classType = $fieldType->getTypeClass();
}
}
$compareResult = $classType::compareValues($f1, $v1);
switch ($operation)
{
case ">":
$result = ($compareResult === 1);
break;
case ">=":
$result = ($compareResult >= 0);
break;
case "<":
$result = ($compareResult === -1);
break;
case "<=":
$result = ($compareResult <= 0);
break;
case "!=":
$result = ($compareResult !== 0);
break;
default:
$result = ($compareResult === 0);
}
if (!$result)
{
break;
}
$i++;
}
return $result;
}
public static function GetPropertiesDialog($documentType, $arWorkflowTemplate, $arWorkflowParameters, $arWorkflowVariables, $defaultValue, $arCurrentValues = null, $formName = "")
{
if (count($arWorkflowParameters) <= 0 && count($arWorkflowVariables) <= 0)
{
return null;
}
$runtime = CBPRuntime::GetRuntime();
$documentService = $runtime->GetService("DocumentService");
$arFieldTypes = $documentService->GetDocumentFieldTypes($documentType);
if (!is_array($arCurrentValues))
{
$arCurrentValues = [];
if (is_array($defaultValue))
{
$i = 0;
foreach ($defaultValue as $value)
{
if (strlen($arCurrentValues["variable_condition_count"]) > 0)
$arCurrentValues["variable_condition_count"] .= ",";
$arCurrentValues["variable_condition_count"] .= $i;
$arCurrentValues["variable_condition_field_".$i] = $value[0];
$arCurrentValues["variable_condition_condition_".$i] = $value[1];
$arCurrentValues["variable_condition_value_".$i] = $value[2];
$arCurrentValues["variable_condition_joiner_".$i] = $value[3];
$i++;
}
}
}
else
{
$arVariableConditionCount = explode(",", $arCurrentValues["variable_condition_count"]);
foreach ($arVariableConditionCount as $i)
{
if (intval($i)."!" != $i."!")
{
continue;
}
$i = intval($i);
if (!array_key_exists("variable_condition_field_".$i, $arCurrentValues) || strlen($arCurrentValues["variable_condition_field_".$i]) <= 0)
{
continue;
}
$n = $arCurrentValues["variable_condition_field_".$i];
$errors = [];
$arCurrentValues["variable_condition_value_".$i] = $documentService->GetFieldInputValue(
$documentType,
array_key_exists($n, $arWorkflowParameters) ? $arWorkflowParameters[$n] : $arWorkflowVariables[$n],
"variable_condition_value_".$i,
$arCurrentValues,
$errors
);
}
}
$javascriptFunctions = $documentService->GetJSFunctionsForFields($documentType, "objFieldsPVC", $arWorkflowParameters + $arWorkflowVariables, $arFieldTypes);
return $runtime->ExecuteResourceFile(
__FILE__,
"properties_dialog.php",
array(
"arCurrentValues" => $arCurrentValues,
"arProperties" => $arWorkflowParameters,
"arVariables" => $arWorkflowVariables,
"formName" => $formName,
"arFieldTypes" => $arFieldTypes,
"javascriptFunctions" => $javascriptFunctions,
)
);
}
public static function GetPropertiesDialogValues($documentType, $arWorkflowTemplate, $arWorkflowParameters, $arWorkflowVariables, $arCurrentValues, &$errors)
{
$errors = [];
if (!array_key_exists("variable_condition_count", $arCurrentValues) || strlen($arCurrentValues["variable_condition_count"]) <= 0)
{
$errors[] = array(
"code" => "",
"message" => GetMessage("BPPVC_EMPTY_CONDITION"),
);
return null;
}
$runtime = CBPRuntime::GetRuntime();
$documentService = $runtime->GetService("DocumentService");
$result = [];
$arVariableConditionCount = explode(",", $arCurrentValues["variable_condition_count"]);
foreach ($arVariableConditionCount as $i)
{
if (intval($i)."!" != $i."!")
{
continue;
}
$i = intval($i);
if (!array_key_exists("variable_condition_field_".$i, $arCurrentValues) || strlen($arCurrentValues["variable_condition_field_".$i]) <= 0)
{
continue;
}
$n = $arCurrentValues["variable_condition_field_".$i];
$errors = [];
$arCurrentValues["variable_condition_value_".$i] = $documentService->GetFieldInputValue(
$documentType,
array_key_exists($n, $arWorkflowParameters) ? $arWorkflowParameters[$n] : $arWorkflowVariables[$n],
"variable_condition_value_".$i,
$arCurrentValues,
$errors
);
$result[] = array(
$arCurrentValues["variable_condition_field_".$i],
htmlspecialcharsback($arCurrentValues["variable_condition_condition_".$i]),
$arCurrentValues["variable_condition_value_".$i],
(int) $arCurrentValues["variable_condition_joiner_".$i],
);
}
if (count($result) <= 0)
{
$errors[] = array(
"code" => "",
"message" => GetMessage("BPPVC_EMPTY_CONDITION"),
);
return null;
}
return $result;
}
}