- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/web/dom/queryengine.php
- Класс: BitrixMainWebDOMQueryEngine
- Вызов: QueryEngine::isNodeFiltered
protected function isNodeFiltered(Node $node, array $filter)
{
$isFiltered = false;
foreach($filter as $filterItem)
{
foreach($filterItem as $type => $value)
{
switch($type)
{
case self::FILTER_NODE_TYPE:
if (!is_array($value))
{
$value = array($value);
}
foreach($value as $nodeType)
{
if(!$node->getNodeType() === $nodeType)
{
return false;
}
else
{
$isFiltered = true;
}
}
break;
case self::FILTER_NODE_NAME:
if(mb_strtoupper($value) === $node->getNodeName())
{
$isFiltered = true;
}
else
{
return false;
}
break;
case self::FILTER_ATTR:
if(!$node->hasAttributes())
{
$isFiltered = false;
}
else
{
if (!is_array($value))
{
$value = array($value);
}
foreach($value as $attrName)
{
/* @var $node Element*/
if($node->getAttribute($attrName) === null)
{
return false;
}
else
{
$isFiltered = true;
}
}
}
break;
case self::FILTER_ATTR_VALUE:
if(!$node->hasAttributes())
{
$isFiltered = false;
}
else
{
foreach($value as $attr)
{
$attrValue = $node->getAttribute($attr['name']);
if(!$attrValue)
{
continue;
}
$operationValue = $attr['value'];
switch($attr['operation'])
{
case self::FILTER_OPERATION_NOT_EQUAL:
if($attrValue === $operationValue)
{
return false;
}
break;
case self::FILTER_OPERATION_CONTAIN:
if(mb_strpos($attrValue, $operationValue) === false)
{
return false;
}
break;
case self::FILTER_OPERATION_END:
if(mb_substr($attrValue, -mb_strlen($operationValue)) !== $operationValue)
{
return false;
}
break;
case self::FILTER_OPERATION_START:
if(mb_strpos($attrValue, $operationValue) !== 0)
{
return false;
}
break;
case self::FILTER_OPERATION_CONTAIN_WORD:
throw new DomException('Not supported query filter: FILTER_OPERATION_CONTAIN_WORD');
break;
case self::FILTER_OPERATION_EQUAL:
default:
if($attrValue !== $operationValue)
{
return false;
}
}
$isFiltered = true;
}
}
break;
case self::FILTER_ATTR_CLASS_NAME:
if(!$node->hasAttributes())
{
$isFiltered = false;
}
else
{
if (!is_array($value))
{
$value = array($value);
}
foreach($value as $className)
{
if(!in_array($className, $node->getClassList()))
{
return false;
}
else
{
$isFiltered = true;
}
}
}
break;
}
}
}
return $isFiltered;
}