public function getByDomain($domain) { $data = $this->db->fetchRow("SELECT * FROM sites WHERE mainDomain = ? OR domains LIKE ?", [$domain, "%\"" . $domain . "\"%"]); if (!$data["id"]) { // check for wildcards // @TODO: refactor this to be more clear $sitesRaw = $this->db->fetchAll("SELECT id,domains FROM sites"); $wildcardDomains = []; foreach ($sitesRaw as $site) { if (!empty($site["domains"]) && strpos($site["domains"], "*")) { $siteDomains = unserialize($site["domains"]); if (is_array($siteDomains) && count($siteDomains) > 0) { foreach ($siteDomains as $siteDomain) { if (strpos($siteDomain, "*") !== false) { $siteDomain = str_replace(".*", "*", $siteDomain); // backward compatibility $wildcardDomains[$siteDomain] = $site["id"]; } } } } } foreach ($wildcardDomains as $wildcardDomain => $siteId) { $wildcardDomain = preg_quote($wildcardDomain, "#"); $wildcardDomain = str_replace("\\*", ".*", $wildcardDomain); if (preg_match("#^" . $wildcardDomain . "\$#", $domain)) { $data = $this->db->fetchRow("SELECT * FROM sites WHERE id = ?", [$siteId]); } } if (!$data["id"]) { throw new \Exception("there is no site for the requested domain: `" . $domain . "ยด"); } } $this->assignVariablesToModel($data); }