/** * Метод валидирует настройки таблицы, переданные извне */ public static function validateTablePropertiesCustom(PsTable $table, array $tableProperties = null) { $errors = array(); if ($tableProperties === null) { return $errors; // Нет настроет - нет проблем:) } $tableName = $table->getName(); //Пробегаемся по настройкам, заданным для таблицы и валидируем её foreach ($tableProperties as $propName => $propValue) { if (!in_array($propName, self::names())) { $errors[] = "Настройка {$propName} для таблицы {$tableName} не существует."; continue; //--- } $prop = self::valueOf($propName); /* * Таблица */ if ($prop->isTableProperty()) { if (!$prop->isAllowedForTable($table)) { $errors[] = "Настройка {$propName} не допустима для таблицы {$tableName}."; } continue; //--- } /* * Столец */ if ($prop->isColumnProperty()) { if (!$prop->isAllowedForTableColumns($table)) { $errors[] = "Настройка {$propName} не допустима для столбцов таблицы {$tableName}."; continue; //--- } if (!is_array($propValue)) { $errors[] = "Настройка {$propName} для таблицы {$tableName} должна быть задана в виде массива, передано: " . PsUtil::toString($propValue); continue; //--- } foreach ($propValue as $colName) { if (!$table->hasColumn($colName)) { $errors[] = "Настройка {$propName} для столбца {$tableName}.{$colName} некорректна - столбец не существует."; } } continue; //--- } raise_error("Invalid table col property [{$propName}]"); } /* * Если мы обнаружили ошибку или таблица не сконфигурирована - возвращаем. * Мы не запрещаем, чтобы в db.ini были настройки для несконфигурированной таблицы, * но они должны быть корректно описаны. */ if ($errors || !self::TABLE_CONFIGURED()->isTableHasPropertyCustom($tableName, $tableProperties)) { return $errors; //--- } //Если нет первичного ключа или он является автоинкремент полем - нужен столбец, замещающий ПК if (!self::COL_PK()->getColumnsWithPropertyCustom($tableName, $tableProperties)) { //Нет альтернативы ПК if (!$table->hasPk()) { $errors[] = "Таблица {$tableName} не имеет первичного ключа и его альтернативы"; } else { if ($table->isPkAi()) { $errors[] = "Первичный ключ {$tableName}.{$table->getPk()->getName()} является autoincrement полем, и при этом не имеет альтернативы"; } } } return $errors; }