/** * Creates a smart search condition for a given search value, and adds it * to the query that will be used for performing the actual search. * * @param int $id The unique smart search criterium identifier. * @param int $nr The element number in the path. * @param array $path The remaining attribute path. * @param Query $query The query to which the condition will be added. * @param string $ownerAlias The owner table alias to use. * @param mixed $value The value the user has entered in the searchbox. * @param string $mode The searchmode to use. */ public function smartSearchCondition($id, $nr, $path, $query, $ownerAlias, $value, $mode) { // one-to-many join means we need to perform a distinct select $query->setDistinct(true); if (count($path) > 0) { $this->createDestination(); $destAlias = "ss_{$id}_{$nr}_" . $this->fieldName(); $query->addJoin($this->m_destInstance->m_table, $destAlias, $this->getJoinCondition($query, $ownerAlias, $destAlias), false); $attrName = array_shift($path); $attr = $this->m_destInstance->getAttribute($attrName); if (is_object($attr)) { $attr->smartSearchCondition($id, $nr + 1, $path, $query, $destAlias, $value, $mode); } } else { $this->searchCondition($query, $ownerAlias, $value, $mode); } }
/** * Creates a searchcondition for the field, * was once part of searchCondition, however, * searchcondition() also immediately adds the search condition. * * @param Query $query The query object where the search condition should be placed on * @param string $table The name of the table in which this attribute * is stored * @param mixed $value The value the user has entered in the searchbox * @param string $searchmode The searchmode to use. This can be any one * of the supported modes, as returned by this * attribute's getSearchModes() method. * @param string $fieldname * * @return string The searchcondition to use. */ public function getSearchCondition(Query $query, $table, $value, $searchmode, $fieldname = '') { if ($this->createDestination() && is_array($value)) { // we are a relation, so instead of hooking ourselves into the // query, hook the attributes in the destination node onto the query foreach ($value as $key => $val) { // if we aren't searching for anything in this field, there is no need // to look any further: if ($val === '' || $val === null) { continue; } $p_attrib = $this->m_destInstance->m_attribList[$key]; if (is_object($p_attrib)) { if ($this->m_refKey && $this->createDestination()) { // master mode $new_table = $this->fieldName(); } else { // slave mode $new_table = $this->m_destInstance->m_table; // we need to left join the destination table into the query // (don't worry ATK won't add it when it's already there) $query->addJoin($new_table, $new_table, $this->getJoinCondition($query), false); } $p_attrib->searchCondition($query, $new_table, $val, $this->getChildSearchMode($searchmode, $p_attrib->fieldName())); } else { // attribute not found in destination, so it should // be in the owner (this is the case when extra fields // are in the relation $p_attrib = $this->m_ownerInstance->m_attribList[$key]; if (is_object($p_attrib)) { $p_attrib->searchCondition($query, $p_attrib->getOwnerInstance()->getTable(), $val, $this->getChildSearchMode($searchmode, $p_attrib->fieldName())); } else { Tools::atkdebug("Field {$key} was not found in this relation (this is very weird)"); } } } } else { // we were passed a value that is not an array, so appearantly the function calling us // does not know we are a relation, not just another attrib // so we assume that it is looking for something in the descriptor def of the destination if ($this->createDestination()) { $descfields = $this->m_destInstance->descriptorFields(); foreach ($descfields as $key) { $p_attrib = $this->m_destInstance->m_attribList[$key]; if (is_object($p_attrib)) { if ($this->m_refKey && $this->createDestination()) { // master mode $new_table = $this->fieldName(); } else { // slave mode $new_table = $this->m_destInstance->m_table; // we need to left join the destination table into the query // (don't worry ATK won't add it when it's already there) $query->addJoin($new_table, $new_table, $this->getJoinCondition($query), false); } $p_attrib->searchCondition($query, $new_table, $value, $searchmode); } } } } }
/** * Creates an search condition for a given search value. * * @param Query $query The query to which the condition will be added. * @param string $table The name of the table in which this attribute * is stored * @param mixed $value The value the user has entered in the searchbox * @param string $searchmode The searchmode to use. This can be any one * of the supported modes, as returned by this * attribute's getSearchModes() method. * @param string $fieldaliasprefix optional prefix for the fieldalias in the table */ public function searchCondition($query, $table, $value, $searchmode, $fieldaliasprefix = '') { $ownerFields = $this->getOwnerFields(); // We only support 'exact' matches. // But you can select more than one value, which we search using the IN() statement, // which should work in any ansi compatible database. if (is_array($value) && count($value) > 0 && $value[0] != '') { // This last condition is for when the user selected the 'search all' option, in which case, we don't add conditions at all. $this->createLink(); $query->addJoin($this->m_linkInstance->m_table, $this->fieldName(), $table . '.' . $ownerFields[0] . '=' . $this->fieldName() . '.' . $this->getLocalKey(), false); $query->setDistinct(true); if (count($value) == 1) { // exactly one value $query->addSearchCondition($query->exactCondition($this->fieldName() . '.' . $this->getRemoteKey(), $this->escapeSQL($value[0]))); } else { // search for more values using IN() $query->addSearchCondition($this->fieldName() . '.' . $this->getRemoteKey() . " IN ('" . implode("','", $value) . "')"); } } }