Source for file DBDataSet.class.php
Documentation is available at DBDataSet.class.php
* Содержит класс DBDataSet
* @copyright Energine 2006
//require_once('core/modules/share/components/DataSet.class.php');
//require_once('core/framework/MultiLanguageBuilder.class.php');
* Класс позволяющий выводить данные из БД
* Имя таблицы содержащей переводы
* Имя поля первичного ключа
* Ограничение количества записей
* Действие которое исполнялось на предыдущем шаге
* используется в методе сохранения
public function __construct($name, $module, Document $document, array $params = null) {
parent::__construct($name, $module, $document, $params);
* Добавлен параметр tableName
'onlyCurrentLang' => false
* Переопределенный метод загрузки описания данных
* Возвращает информацию о колонках в основной таблице и таблице переводов
foreach (array_keys($transColumnsDescription) as $fieldName) {
//для всех полей кроме идентификатора языка и первичного ключа выставляем дополнительное свойство isMultiLanguage
$transColumnsDescription[$fieldName]['isMultilanguage'] = true;
elseif ($fieldName === 'lang_id' && $this->getPK() !== 'lang_id') {
$transColumnsDescription[$fieldName]['languageID'] = true;
$result += $transColumnsDescription;
if (isset ($result['lang_id'])) {
$result['lang_id']['key'] = false;
* Переопределенный метод загрузки данных
// pager существует -- загружаем только часть данных, текущую страницу
//Если не существует таблицы с переводами, то выбираем данные из основной таблицы
if (is_null($field->getPropertyValue('customField'))) {
$fieldName = ' IF(('. $fieldName. ' IS NOT NULL) AND ('. $fieldName. ' <> ""), 1, 0) AS '. $fieldName;
//Если не пустой массив полей для отбора
$this->pager->setRecordsCount($recordCount);
if ($this->getType() == self::COMPONENT_TYPE_FORM_ADD ) {
foreach ($dbFields as $key => $value) {
//Для мультиязычной таблицы - дергаем отдельный метод загрузки данных
* Возвращает язык на которм берутся данные
if ($this->getParam('onlyCurrentLang')) {
* Загрузка мультиязычных данных
$lang = $lang->getLanguages();
$filter = $order = $limit = '';
//Создаем перечень полей в формате array('имя основной таблицы' => array('имя поля'=>'имя таблицы.имя поля'), 'имя таблицыпереводов' => array('имя поля'=>'имя таблицы.имя поля'))
//Не включаем в набор идентификатор языка
if (!$field->getPropertyValue('languageID') && $field->getPropertyValue('key') !== true) {
//не включаем в набор поля полученные из конфигурации
if (is_null($field->getPropertyValue('customField'))) {
$dbFields[$field->getPropertyValue('tableName')][$fieldName] = $field->getPropertyValue('tableName'). '.'. $fieldName;
$dbFields[$field->getPropertyValue('tableName')][$fieldName] =
' IF(('. $field->getPropertyValue('tableName'). '.'. $fieldName. ' IS NOT NULL) AND ('. $field->getPropertyValue('tableName'). '.'. $fieldName. ' <> ""), 1, 0) AS '. $fieldName;
$order = $this->dbh->buildOrderCondition($this->getOrder());
if (!empty($filterCondition)) {
$filter = $this->dbh->buildWhereCondition($filterCondition). ($this->getParam('onlyCurrentLang')? ' AND lang_id = '. $this->getDataLanguage(): '');
$limit = $this->dbh->buildLimitStatement($limit);
//Если существует листалка указываем ей количество записей
//Определяем общее количество записей
"SELECT COUNT(*) as records_count
LEFT JOIN %s ON %s.%s = %s.%s
$recordsCount = $this->dbh->selectRequest($request);
$this->pager->setRecordsCount($recordsCount);
if ($this->getType() != self::COMPONENT_TYPE_FORM_ADD) {
LEFT JOIN %3$s ON %3$s.%2$s = %1$s.%2$s
$data = $this->dbh->selectRequest($request);
//Если данные не только для текущего языка
foreach ($data as $row) {
$matrix[$row[$this->getPK()]][$row['lang_id']] = $row;
//в нем все языкозависимые поля заполнены nullами
$translationColumns[] = 'NULL as '. $fieldName;
$res = $this->dbh->selectRequest($request);
$template[$row[$this->getPK()]] = $row;
foreach ($matrix as $ltagID => $langVersions) {
if (isset ($langVersions[$langID])) {
$data[] = $langVersions[$langID];
$data[arrayPush($data, $template[$ltagID])]['lang_id'] = $langID;
foreach ($dbFields as $key => $value) {
$data[$i][$this->getPK()] = null;
$data[$i]['lang_id'] = $langID;
* Устанавливает имя таблицы
$this->setParam('tableName', $tableName);
* Для параметра tableName устанавливаем еще и имя таблицы переводов
protected function setParam($name, $value) {
if ($name == 'tableName') {
parent::setParam($name, $value);
* Возвращает значение фильтра
* Устанавливает значение фильтра
final protected function setFilter($filter) {
* Добавляет условие к фильтру
$filter = array($filter);
* Возвращает условия сортровки
* Устанавливает условие сортровки
final protected function setOrder($order) {
$this->order = array($order=>QAL::ASC);
* Возвращает ограничения по количеству записей
* Устанавливает ограничения по количеству записей
final protected function setLimit(array $limit) {
* Возвращает имя поля - первичного ключа
final protected function getPK() {
foreach ($res as $fieldName => $fieldInfo) {
if ($fieldInfo['key'] === true) {
final protected function setPK($primaryColumnName){
$this->pk = $primaryColumnName;
* Для мультиязычного грида
* добавлена обработка ключей
* @return DataDescription
foreach ($result->getFieldDescriptions() as $fieldName => $fieldMetaData) {
$keyInfo = $fieldMetaData->getPropertyValue('key');
$fkTableName = $keyInfo['tableName'];
$fkKeyName = $keyInfo['fieldName'];
//загружаем информацию о возможных значениях
* Возвращает данные о значения в связанной таблицы
protected function getFKData($fkTableName, $fkKeyName) {
return $this->dbh->getForeignKeyData($fkTableName, $fkKeyName, $this->document->getLang());
* Возвращает имя таблицы переводов
* Метод выводит форму просмотра
protected function view() {
$this->setType(self::COMPONENT_TYPE_FORM);
//$this->addCrumb('TXT_VIEW_ITEM');
* Определяет существует ли запись с идентификатором переданным в параметре
* Вызывается из методов где нужно быть уверенным в наличии записи(view, edit,delete)
final protected function recordExists($id, $fieldName = false) {
$fieldName = $this->getPK();
$res = $this->dbh->select($this->getTableName(), array($fieldName), array($fieldName=> $id));
* Возвращает предыдущее действие
if (!isset ($_POST['componentAction'])) {
|