Passed
Push — master ( da0845...b044b4 )
by Aimeos
06:46
created

Site::siteCondition()   A

Complexity

Conditions 6
Paths 6

Size

Total Lines 19
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 11
nc 6
nop 2
dl 0
loc 19
rs 9.2222
c 1
b 0
f 0
1
<?php
2
3
/**
4
 * @license LGPLv3, https://opensource.org/licenses/LGPL-3.0
5
 * @copyright Aimeos (aimeos.org), 2022
6
 * @package MShop
7
 * @subpackage Common
8
 */
9
10
11
namespace Aimeos\MShop\Common\Manager;
12
13
use \Aimeos\MShop\Locale\Manager\Base as Locale;
14
15
16
/**
17
 * Site trait for managers
18
 *
19
 * @package MShop
20
 * @subpackage Common
21
 */
22
trait Site
23
{
24
	/**
25
	 * Returns the context object.
26
	 *
27
	 * @return \Aimeos\MShop\Context\Item\Iface Context object
28
	 */
29
	abstract protected function context() : \Aimeos\MShop\Context\Item\Iface;
30
31
32
	/**
33
	 * Returns a filter object.
34
	 *
35
	 * @return \Aimeos\MW\Criteria\Iface Filter object
36
	 */
37
	abstract public function filter( ?bool $default = false, bool $site = false ) : \Aimeos\MW\Criteria\Iface;
38
39
40
	/**
41
	 * Returns the site expression for the given name
42
	 *
43
	 * @param string $name Name of the site condition
44
	 * @param int $sitelevel Site level constant from \Aimeos\MShop\Locale\Manager\Base
45
	 * @return \Aimeos\MW\Criteria\Expression\Iface Site search condition
46
	 * @since 2022.04
47
	 */
48
	protected function siteCondition( string $name, int $sitelevel ) : \Aimeos\MW\Criteria\Expression\Iface
49
	{
50
		$sites = $this->context()->locale()->getSites();
51
		$values = [''];
52
53
		if( isset( $sites[Locale::SITE_PATH] ) && $sitelevel & Locale::SITE_PATH ) {
54
			$values = array_merge( $values, $sites[Locale::SITE_PATH] );
55
		} elseif( isset( $sites[Locale::SITE_ONE] ) ) {
56
			$values[] = $sites[Locale::SITE_ONE];
57
		}
58
59
		$filter = $this->filter();
60
		$cond = [$filter->compare( '==', $name, $values )];
61
62
		if( isset( $sites[Locale::SITE_SUBTREE] ) && $sitelevel & Locale::SITE_SUBTREE ) {
63
			$cond[] = $filter->compare( '=~', $name, $sites[Locale::SITE_SUBTREE] );
64
		}
65
66
		return $filter->or( $cond );
67
	}
68
69
70
	/**
71
	 * Returns the site expression for the given name
72
	 *
73
	 * @param string $name SQL name for the site condition
74
	 * @param int $sitelevel Site level constant from \Aimeos\MShop\Locale\Manager\Base
75
	 * @return string Site search condition
76
	 * @since 2022.04
77
	 */
78
	protected function siteString( string $name, int $sitelevel ) : string
79
	{
80
		$translation = ['marker' => $name];
81
		$types = ['marker' => \Aimeos\MW\DB\Statement\Base::PARAM_STR];
82
83
		return $this->siteCondition( 'marker', $sitelevel )->toSource( $types, $translation );
84
	}
85
86
87
	/**
88
	 * Returns the site ID that should be use based on the site level
89
	 *
90
	 * @param string $siteId Site ID to check
91
	 * @param int $sitelevel Site level to check against
92
	 * @return string Site ID that should be use based on the site level
93
	 * @since 2022.04
94
	 */
95
	protected function siteId( string $siteId, int $sitelevel ) : string
96
	{
97
		$sites = $this->context()->locale()->getSites();
98
99
		if( ( $sitelevel & Locale::SITE_ONE ) && isset( $sites[Locale::SITE_ONE] )
100
			&& $siteId === $sites[Locale::SITE_ONE]
101
		) {
102
			return $siteId;
103
		}
104
105
		if( ( $sitelevel & Locale::SITE_PATH ) && isset( $sites[Locale::SITE_PATH] )
106
			&& in_array( $siteId, $sites[Locale::SITE_PATH] )
107
		) {
108
			return $siteId;
109
		}
110
111
		if( ( $sitelevel & Locale::SITE_SUBTREE ) && isset( $sites[Locale::SITE_SUBTREE] )
112
			&& !strncmp( $sites[Locale::SITE_SUBTREE], $siteId, strlen ( $sites[Locale::SITE_SUBTREE] ) )
113
		) {
114
			return $siteId;
115
		}
116
117
		return $this->context()->locale()->getSiteId();
118
	}
119
}
120