/** * Update any requests to limit the results to the current site */ public function augmentSQL(SQLQuery &$query, DataQuery &$dataQuery = null) { if (Subsite::$disable_subsite_filter) { return; } if ($dataQuery->getQueryParam('Subsite.filter') === false) { return; } // If you're querying by ID, ignore the sub-site - this is a bit ugly... // if(!$query->where || (strpos($query->where[0], ".\"ID\" = ") === false && strpos($query->where[0], ".`ID` = ") === false && strpos($query->where[0], ".ID = ") === false && strpos($query->where[0], "ID = ") !== 0)) { if ($query->filtersOnID()) { return; } if (Subsite::$force_subsite) { $subsiteID = Subsite::$force_subsite; } else { /*if($context = DataObject::context_obj()) $subsiteID = (int)$context->SubsiteID; else */ $subsiteID = (int) Subsite::currentSubsiteID(); } // The foreach is an ugly way of getting the first key :-) foreach ($query->getFrom() as $tableName => $info) { // The tableName should be custommenu... if (strpos($tableName, 'CustomMenu') === false) { break; } $query->addWhere("\"{$tableName}\".\"SubsiteID\" IN ({$subsiteID})"); break; } }
/** * Update any requests to limit the results to the current site */ public function augmentSQL(SQLQuery &$query, DataQuery &$dataQuery = null) { $ctrl = null; if (Controller::has_curr()) { $ctrl = Controller::curr(); } if (Subsite::$disable_subsite_filter) { return; } if ($dataQuery->getQueryParam('Subsite.filter') === false) { return; } if ($ctrl && get_class(Controller::curr()) == 'Security') { return; } // Don't run on delete queries, since they are always tied to // a specific ID. if ($query->getDelete()) { return; } // If you're querying by ID, ignore the sub-site - this is a bit ugly... // if(!$query->where || (strpos($query->where[0], ".\"ID\" = ") === false && strpos($query->where[0], ".`ID` = ") === false && strpos($query->where[0], ".ID = ") === false && strpos($query->where[0], "ID = ") !== 0)) { if (!$query->filtersOnID()) { if (Subsite::$force_subsite) { $subsiteID = Subsite::$force_subsite; } else { $subsiteID = (int) Subsite::currentSubsiteID(); } $froms = $query->getFrom(); $froms = array_keys($froms); $tableName = array_shift($froms); $query->addWhere("\"{$tableName}\".\"SubsiteID\" IN ({$subsiteID})"); } }
/** * Update any requests to limit the results to the current site */ public function augmentSQL(SQLQuery &$query, DataQuery &$dataQuery = null) { // Filters are disabled globally if (self::$disable) { return; } // Filters are disabled for this query if ($dataQuery->getQueryParam('SoftDeletable.filter') === false) { return; } // Don't run on delete queries, since they are always tied to a specific ID. if ($query->getDelete()) { return; } // Don't run if querying by ID if ($query->filtersOnID()) { return; } $froms = $query->getFrom(); $froms = array_keys($froms); $tableName = array_shift($froms); $query->addWhere("\"{$tableName}\".\"Deleted\" IS NULL"); }
public function augmentSQL(SQLQuery &$query, DataQuery &$dataQuery = null) { if (!FluentOldPageRedirectFix::$disableSkipIDFilter) { // Skip ID based filters if ($query->filtersOnID()) { return; } } // Skip filter in the CMS, unless filtering is explicitly turned on $filterAdmin = $dataQuery->getQueryParam('Fluent.FilterAdmin'); if (!$filterAdmin) { $isFrontend = $dataQuery->getQueryParam('Fluent.IsFrontend'); if ($isFrontend === null) { $isFrontend = Fluent::is_frontend(); } if (!$isFrontend) { return; } } // Add filter for locale $locale = $dataQuery->getQueryParam('Fluent.Locale') ?: Fluent::current_locale(); $query->addWhere("\"{$this->ownerBaseClass}\".\"LocaleFilter_{$locale}\" = 1"); }
public function testFiltersOnID() { $query = new SQLQuery(); $query->setWhere("ID = 5"); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with simple unquoted column name"); $query = new SQLQuery(); $query->setWhere("ID=5"); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with simple unquoted column name and no spaces in equals sign"); $query = new SQLQuery(); $query->setWhere("Identifier = 5"); $this->assertFalse($query->filtersOnID(), "filtersOnID() is false with custom column name (starting with 'id')"); $query = new SQLQuery(); $query->setWhere("ParentID = 5"); $this->assertFalse($query->filtersOnID(), "filtersOnID() is false with column name ending in 'ID'"); $query = new SQLQuery(); $query->setWhere("MyTable.ID = 5"); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with table and column name"); $query = new SQLQuery(); $query->setWhere("MyTable.ID = 5"); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with table and quoted column name "); }
function testFiltersOnID() { $query = new SQLQuery(); $query->where[] = "ID = 5"; $this->assertTrue( $query->filtersOnID(), "filtersOnID() is true with simple unquoted column name" ); $query = new SQLQuery(); $query->where[] = "ID=5"; $this->assertTrue( $query->filtersOnID(), "filtersOnID() is true with simple unquoted column name and no spaces in equals sign" ); /* $query = new SQLQuery(); $query->where[] = "Foo='Bar' AND ID=5"; $this->assertTrue( $query->filtersOnID(), "filtersOnID() is true with combined SQL statements" ); */ $query = new SQLQuery(); $query->where[] = "Identifier = 5"; $this->assertFalse( $query->filtersOnID(), "filtersOnID() is false with custom column name (starting with 'id')" ); $query = new SQLQuery(); $query->where[] = "ParentID = 5"; $this->assertFalse( $query->filtersOnID(), "filtersOnID() is false with column name ending in 'ID'" ); $query = new SQLQuery(); $query->where[] = "MyTable.ID = 5"; $this->assertTrue( $query->filtersOnID(), "filtersOnID() is true with table and column name" ); $query = new SQLQuery(); $query->where[] = "MyTable.`ID`= 5"; $this->assertTrue( $query->filtersOnID(), "filtersOnID() is true with table and quoted column name " ); }
/** * Changes any SELECT query thats not filtering on an ID * to limit by the current language defined in {@link get_current_locale()}. * It falls back to "Locale='' OR Lang IS NULL" and assumes that * this implies querying for the default language. * * Use {@link disable_locale_filter()} to temporarily disable this "auto-filtering". */ function augmentSQL(SQLQuery &$query) { // If the record is saved (and not a singleton), and has a locale, // limit the current call to its locale. This fixes a lot of problems // with other extensions like Versioned $locale = $this->owner->ID && $this->owner->Locale ? $this->owner->Locale : Translatable::get_current_locale(); $baseTable = ClassInfo::baseDataClass($this->owner->class); $where = $query->where; if ($locale && self::locale_filter_enabled() && !$query->filtersOnID() && array_search($baseTable, array_keys($query->from)) !== false && !preg_match('/("|\'|`)Locale("|\'|`)/', $query->getFilter())) { $qry = sprintf('"%s"."Locale" = \'%s\'', $baseTable, Convert::raw2sql($locale)); $query->where[] = $qry; } }
/** * Update any requests to limit the results to the current site */ public function augmentSQL(SQLQuery &$query) { if (Subsite::$disable_subsite_filter) { return; } if (Cookie::get('noSubsiteFilter') == 'true') { return; } // If you're querying by ID, ignore the sub-site - this is a bit ugly... if (!$query->filtersOnID()) { /* if($context = DataObject::context_obj()) $subsiteID = (int)$context->SubsiteID; else */ $subsiteID = (int) Subsite::currentSubsiteID(); // Don't filter by Group_Subsites if we've already done that $hasGroupSubsites = false; foreach ($query->getFrom() as $item) { if (is_array($item) && strpos($item['table'], 'Group_Subsites') !== false || !is_array($item) && strpos($item, 'Group_Subsites') !== false) { $hasGroupSubsites = true; break; } } if (!$hasGroupSubsites) { if ($subsiteID) { $query->addLeftJoin("Group_Subsites", "\"Group_Subsites\".\"GroupID\"\n\t\t\t\t\t\t= \"Group\".\"ID\" AND \"Group_Subsites\".\"SubsiteID\" = {$subsiteID}"); $query->addWhere("(\"Group_Subsites\".\"SubsiteID\" IS NOT NULL OR\n\t\t\t\t\t\t\"Group\".\"AccessAllSubsites\" = 1)"); } } // WORKAROUND for databases that complain about an ORDER BY when the column wasn't selected (e.g. SQL Server) $select = $query->getSelect(); if ($hasGroupSubsites && $subsiteID && isset($select[0]) && !$select[0] == 'COUNT(*)') { $query->orderby = "\"AccessAllSubsites\" DESC" . ($query->orderby ? ', ' : '') . $query->orderby; } } }
/** * Filter records on the current variant * * @param SQLQuery $query * @param DataQuery $dataQuery */ public function augmentSQL(SQLQuery &$query, DataQuery &$dataQuery = null) { $variant = SolrReindexTest_Variant::get_current(); if ($variant !== null && !$query->filtersOnID()) { $sqlVariant = Convert::raw2sql($variant); $query->addWhere("\"Variant\" = '{$sqlVariant}'"); } }
public function augmentSQL(SQLQuery &$query, DataQuery &$dataQuery = null) { // Skip ID based filters if ($query->filtersOnID()) { return; } // Skip filter in the CMS $isFrontend = $dataQuery->getQueryParam('Fluent.IsFrontend'); if ($isFrontend === null) { $isFrontend = Fluent::is_frontend(); } if (!$isFrontend) { return; } // Add filter for locale $locale = $dataQuery->getQueryParam('Fluent.Locale') ?: Fluent::current_locale(); $query->addWhere("\"{$this->ownerBaseClass}\".\"LocaleFilter_{$locale}\" = 1"); }
public function testFiltersOnID() { $query = new SQLQuery(); $query->setWhere("ID = 5"); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with simple unquoted column name"); $query = new SQLQuery(); $query->setWhere('"ID" = 5'); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with simple quoted column name"); $query = new SQLQuery(); $query->setWhere(array('"ID"' => 4)); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with parameterised quoted column name"); $query = new SQLQuery(); $query->setWhere(array('"ID" = ?' => 4)); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with parameterised quoted column name"); $query = new SQLQuery(); $query->setWhere('"ID" IN (5,4)'); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with WHERE ID IN"); $query = new SQLQuery(); $query->setWhere(array('"ID" IN ?' => array(1, 2))); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with parameterised WHERE ID IN"); $query = new SQLQuery(); $query->setWhere("ID=5"); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with simple unquoted column name and no spaces in equals sign"); $query = new SQLQuery(); $query->setWhere("Identifier = 5"); $this->assertFalse($query->filtersOnID(), "filtersOnID() is false with custom column name (starting with 'id')"); $query = new SQLQuery(); $query->setWhere("ParentID = 5"); $this->assertFalse($query->filtersOnID(), "filtersOnID() is false with column name ending in 'ID'"); $query = new SQLQuery(); $query->setWhere("MyTable.ID = 5"); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with table and column name"); $query = new SQLQuery(); $query->setWhere("MyTable.ID = 5"); $this->assertTrue($query->filtersOnID(), "filtersOnID() is true with table and quoted column name "); }
/** * Changes any SELECT query thats not filtering on an ID * to limit by the current language defined in {@link get_current_locale()}. * It falls back to "Locale='' OR Lang IS NULL" and assumes that * this implies querying for the default language. * * Use {@link disable_locale_filter()} to temporarily disable this "auto-filtering". */ function augmentSQL(SQLQuery &$query, DataQuery &$dataQuery = null) { // If the record is saved (and not a singleton), and has a locale, // limit the current call to its locale. This fixes a lot of problems // with other extensions like Versioned if ($this->owner->ID && !empty($this->owner->Locale)) { $locale = $this->owner->Locale; } else { $locale = Translatable::get_current_locale(); } $baseTable = ClassInfo::baseDataClass($this->owner->class); if ($locale && self::locale_filter_enabled() && $dataQuery->getQueryParam(self::QUERY_LOCALE_FILTER_ENABLED) && !$query->filtersOnID() && array_search($baseTable, array_keys($query->getFrom())) !== false && !preg_match('/("|\'|`)Locale("|\'|`)/', implode(' ', $query->getWhere()))) { $qry = sprintf('"%s"."Locale" = \'%s\'', $baseTable, Convert::raw2sql($locale)); $query->addWhere($qry); } }