public static function adaptResult(Compatible\CDBResult $result, Compatible\OrderQuery $query, $taskIdName) { if (!($query->grouped() || $query->aggregated())) { $select = $query->allSelected() ? self::permissions() : array_intersect_key(self::permissions(), $query->getSelect()); if ($select) { $query->setSelect(array_diff_key($query->getSelect(), $select)); $query->addAlias('TASK_ID', $taskIdName); $query->addAliasSelect('TASK_ID'); $result->addFetchAdapter(new self($select)); } } }
public function compatibleExec(CDBResult $result, $navStart) { if ($this->aggregated) { $result->addFetchAdapter(new AggregateAdapter($this->aggregated)); } if (is_array($navStart) && isset($navStart['nTopCount'])) { if ($navStart['nTopCount'] > 0) { $this->setLimit($navStart['nTopCount']); } else { $result->compatibleNavQuery($this, $navStart); return $result; } } $rows = $this->exec()->fetchAll(); $result->InitFromArray($rows); return $result; }
/** * <p>Метод возвращает результат выборки записей из заказов в соответствии со своими параметрами. Метод динамичный.</p> * * * @param array $arOrder = array() Массив, в соответствии с которым сортируются результирующие * записи. Массив имеет вид: <pre class="syntax">array( "название_поля1" => * "направление_сортировки1", "название_поля2" => * "направление_сортировки2", . . . )</pre> В качестве "название_поля<i>N</i>" * может стоять любое поле местоположения, а в качестве * "направление_сортировки<i>X</i>" могут быть значения "<i>ASC</i>" (по * возрастанию) и "<i>DESC</i>" (по убыванию).<br><br> Если массив сортировки * имеет несколько элементов, то результирующий набор сортируется * последовательно по каждому элементу (т.е. сначала сортируется по * первому элементу, потом результат сортируется по второму и * т.д.). <br><br> Значение по умолчанию - пустой массив array() - означает, * что результат отсортирован не будет. * * @param array $arFilter = array() Массив, в соответствии с которым фильтруются записи значений * свойств. Массив имеет вид: <pre class="syntax">array( * "[модификатор1][оператор1]название_поля1" => "значение1", * "[модификатор2][оператор2]название_поля2" => "значение2", . . . )</pre> * Удовлетворяющие фильтру записи возвращаются в результате, а * записи, которые не удовлетворяют условиям фильтра, * отбрасываются.<br><br> Допустимыми являются следующие модификаторы: * <ul> <li> <b> !</b> - отрицание;</li> <li> <b> +</b> - значения null, 0 и пустая строка * так же удовлетворяют условиям фильтра.</li> </ul> Допустимыми * являются следующие операторы: <ul> <li> <b>>=</b> - значение поля больше * или равно передаваемой в фильтр величины;</li> <li> <b>></b> - значение * поля строго больше передаваемой в фильтр величины;</li> <li> <b><=</b> - * значение поля меньше или равно передаваемой в фильтр величины;</li> * <li> <b><</b> - значение поля строго меньше передаваемой в фильтр * величины;</li> <li> <b>@</b> - значение поля находится в передаваемом в * фильтр массиве со списком значений;</li> <li> <b>~</b> - значение поля * проверяется на соответствие передаваемому в фильтр шаблону;</li> * <li> <b>%</b> - значение поля проверяется на соответствие передаваемой * в фильтр строке в соответствии с языком запросов.</li> </ul> В * качестве "название_поляX" может стоять любое поле заказов.<br><br> * Пример фильтра: <pre class="syntax">array("~CODE" => "SH*")</pre> Этот фильтр означает * "выбрать все записи, в которых значение в поле CODE (символьный код * свойства) начинается с SH".<br><br> Значение по умолчанию - пустой * массив array() - означает, что результат отфильтрован не будет. * * @param array $arGroupBy = false Массив полей, по которым группируются записи значений свойств. * Массив имеет вид: <pre class="syntax"> array("название_поля1", * "группирующая_функция2" => "название_поля2", . . .)</pre> В качестве * "название_поля<i>N</i>" может стоять любое поле значений свойств. В * качестве группирующей функции могут стоять: <ul> <li> <b> COUNT</b> - * подсчет количества;</li> <li> <b>AVG</b> - вычисление среднего значения;</li> * <li> <b>MIN</b> - вычисление минимального значения;</li> <li> <b> MAX</b> - * вычисление максимального значения;</li> <li> <b>SUM</b> - вычисление * суммы.</li> </ul> Если массив пустой, то метод вернет число записей, * удовлетворяющих фильтру.<br><br> Значение по умолчанию - <i>false</i> - * означает, что результат группироваться не будет. * * @param array $arNavStartParams = false Массив параметров выборки. Может содержать следующие ключи: <ul> * <li>"<b>nTopCount</b>" - количество возвращаемых методом записей будет * ограничено сверху значением этого ключа;</li> <li> любой ключ, * принимаемый методом <b> CDBResult::NavQuery</b> в качестве третьего * параметра.</li> </ul> Значение по умолчанию - <i>false</i> - означает, что * параметров выборки нет. * * @param array $arSelectFields = array() Массив полей записей, которые будут возвращены методом. Можно * указать только те поля, которые необходимы. Если в массиве * присутствует значение "*", то будут возвращены все доступные * поля.<br><br> Значение по умолчанию - пустой массив array() - означает, * что будут возвращены все поля основной таблицы запроса. * * @return CDBResult <p>Возвращается объект класса CDBResult, содержащий набор * ассоциативных массивов параметров значений свойств с ключами:</p> * <table class="tnormal" width="100%"> <tr> <th width="15%">Ключ</th> <th>Описание</th> </tr> <tr> <td>ID</td> * <td>Код значения свойства заказа.</td> </tr> <tr> <td>ORDER_ID</td> <td>Код * заказа.</td> </tr> <tr> <td>ORDER_PROPS_ID</td> <td>Код свойства.</td> </tr> <tr> <td>NAME</td> * <td>Название свойства.</td> </tr> <tr> <td>VALUE</td> <td>Значение свойства.</td> </tr> * <tr> <td>CODE</td> <td>Символьный код свойства.</td> </tr> </table> <p>Если в качестве * параметра arGroupBy передается пустой массив, то метод вернет число * записей, удовлетворяющих фильтру.</p> <a name="examples"></a> * * <h4>Example</h4> * <pre> * <? * // Узнаем имя заказчика (т.е. значение, которое было введено в поле свойства * // заказа $ORDER_ID с установленным флагом IS_PAYER) * $PAYER_NAME = ""; * $db_order = CSaleOrder::GetList( * array("DATE_UPDATE" => "DESC"), * array("ID" => $ORDER_ID) * ); * if ($arOrder = $db_order->Fetch()) * { * $db_props = CSaleOrderProps::GetList( * array("SORT" => "ASC"), * array( * "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"], * "IS_PAYER" => "Y" * ) * ); * if ($arProps = $db_props->Fetch()) * { * $db_vals = CSaleOrderPropsValue::GetList( * array("SORT" => "ASC"), * array( * "ORDER_ID" => $ORDER_ID, * "ORDER_PROPS_ID" => $arProps["ID"] * ) * ); * if ($arVals = $db_vals->Fetch()) * $PAYER_NAME = $arVals["VALUE"]; * } * } * echo $PAYER_NAME; * ?> * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csaleorderpropsvalue/csaleorderpropsvalue__getlist.52da0d54.php * @author Bitrix */ public static function GetList($arOrder = array(), $arFilter = array(), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array()) { global $DB; if (!is_array($arOrder) && !is_array($arFilter)) { $arOrder = strval($arOrder); $arFilter = strval($arFilter); if (strlen($arOrder) > 0 && strlen($arFilter) > 0) { $arOrder = array($arOrder => $arFilter); } else { $arOrder = array(); } if (is_array($arGroupBy)) { $arFilter = $arGroupBy; } else { $arFilter = array(); } $arGroupBy = false; $arSelectFields = array("ID", "ORDER_ID", "ORDER_PROPS_ID", "NAME", "VALUE", "VALUE_ORIG", "CODE"); } if (count($arSelectFields) <= 0) { $arSelectFields = array("ID", "ORDER_ID", "ORDER_PROPS_ID", "NAME", "VALUE", "VALUE_ORIG", "CODE"); } // add aliases $query = new Compatible\OrderQueryLocation(Internals\OrderPropsValueTable::getEntity()); $query->addLocationRuntimeField('VALUE', 'PROPERTY'); $query->addAliases(array('PROP_ID' => 'PROPERTY.ID', 'PROP_PERSON_TYPE_ID' => 'PROPERTY.PERSON_TYPE_ID', 'PROP_NAME' => 'PROPERTY.NAME', 'PROP_TYPE' => 'PROPERTY.TYPE', 'PROP_REQUIED' => 'PROPERTY.REQUIRED', 'PROP_DEFAULT_VALUE' => 'PROPERTY.DEFAULT_VALUE', 'PROP_SORT' => 'PROPERTY.SORT', 'PROP_USER_PROPS' => 'PROPERTY.USER_PROPS', 'PROP_IS_LOCATION' => 'PROPERTY.IS_LOCATION', 'PROP_PROPS_GROUP_ID' => 'PROPERTY.PROPS_GROUP_ID', 'PROP_DESCRIPTION' => 'PROPERTY.DESCRIPTION', 'PROP_IS_EMAIL' => 'PROPERTY.IS_EMAIL', 'PROP_IS_PROFILE_NAME' => 'PROPERTY.IS_PROFILE_NAME', 'PROP_IS_PAYER' => 'PROPERTY.IS_PAYER', 'PROP_IS_LOCATION4TAX' => 'PROPERTY.IS_LOCATION4TAX', 'PROP_IS_ZIP' => 'PROPERTY.IS_ZIP', 'PROP_CODE' => 'PROPERTY.CODE', 'PROP_ACTIVE' => 'PROPERTY.ACTIVE', 'PROP_UTIL' => 'PROPERTY.UTIL', 'TYPE' => 'PROPERTY.TYPE', 'SETTINGS' => 'PROPERTY.SETTINGS', 'MULTIPLE' => 'PROPERTY.MULTIPLE', 'PROPERTY_NAME' => 'PROPERTY.NAME', 'PROPS_GROUP_ID' => 'PROPERTY.PROPS_GROUP_ID', 'INPUT_FIELD_LOCATION' => 'PROPERTY.INPUT_FIELD_LOCATION', 'IS_LOCATION' => 'PROPERTY.IS_LOCATION', 'IS_EMAIL' => 'PROPERTY.IS_EMAIL', 'IS_PROFILE_NAME' => 'PROPERTY.IS_PROFILE_NAME', 'IS_PAYER' => 'PROPERTY.IS_PAYER', 'ACTIVE' => 'PROPERTY.ACTIVE', 'UTIL' => 'PROPERTY.UTIL', 'GROUP_SORT' => 'PROPERTY.GROUP.SORT', 'GROUP_NAME' => 'PROPERTY.GROUP.NAME')); // relations for GetOrderRelatedProps $relationFilter = array(); if ($arFilter['PAYSYSTEM_ID']) { $relationFilter[] = array('=PROPERTY.Bitrix\\Sale\\Internals\\OrderPropsRelationTable:lPROPERTY.ENTITY_TYPE' => 'P', '=PROPERTY.Bitrix\\Sale\\Internals\\OrderPropsRelationTable:lPROPERTY.ENTITY_ID' => $arFilter['PAYSYSTEM_ID']); } if ($arFilter['DELIVERY_ID']) { $relationFilter['LOGIC'] = 'OR'; $relationFilter[] = array('=PROPERTY.Bitrix\\Sale\\Internals\\OrderPropsRelationTable:lPROPERTY.ENTITY_TYPE' => 'D', '=PROPERTY.Bitrix\\Sale\\Internals\\OrderPropsRelationTable:lPROPERTY.ENTITY_ID' => $arFilter['DELIVERY_ID']); } if ($relationFilter) { $query->addFilter(null, $relationFilter); } // execute $query->prepare($arOrder, $arFilter, $arGroupBy, $arSelectFields); if ($query->counted()) { return $query->exec()->getSelectedRowsCount(); } else { $result = new Compatible\CDBResult(); $adapter = new CSaleOrderPropsValueAdapter($query->getSelectNamesAssoc() + array_flip($arSelectFields)); $adapter->addFieldProxy('VALUE'); $result->addFetchAdapter($adapter); if (!$query->aggregated()) { $query->addAliasSelect('TYPE'); $query->addAliasSelect('SETTINGS'); $query->addAliasSelect('MULTIPLE'); if ($relationFilter) { $query->registerRuntimeField('PROPERTY_ID', new Entity\ExpressionField('PROPERTY_ID', 'DISTINCT(%s)', 'ID')); $sel = $query->getSelect(); array_unshift($sel, 'PROPERTY_ID'); $query->setSelect($sel); } } return $query->compatibleExec($result, $arNavStartParams); } }
public function compatibleExec(CDBResult $result, $navStart) { if ($this->aggregated) { $result->addFetchAdapter(new AggregateAdapter($this->aggregated)); } if (is_array($navStart) && isset($navStart['nTopCount'])) { if ($navStart['nTopCount'] > 0) { $this->setLimit($navStart['nTopCount']); } else { $result->compatibleNavQuery($this, $navStart); return $result; } } // Do not remove!!! // file_put_contents('/var/www/log', "\n\n\n\n".$this->getQuery()."\n", FILE_APPEND); // $this->dump() $rows = $this->exec()->fetchAll(); // Do not remove!!! // foreach ($rows as $row) // { // file_put_contents('/var/www/log', "\n".print_r($row, true), FILE_APPEND); // } $result->InitFromArray($rows); // Do not remove!!! // while ($row = $result->Fetch()) // { // file_put_contents('/var/www/log', "\n".print_r($row, true), FILE_APPEND); // } return $result; }