Перейти к содержимому

Класс XoopsObject

Класс XoopsObject является фундаментальным базовым классом для всех объектов данных в системе XOOPS. Он предоставляет стандартизированный интерфейс для управления свойствами объекта, валидации, отслеживания изменений и сериализации.

namespace Xoops\Core;
class XoopsObject
{
protected array $vars = [];
protected array $cleanVars = [];
protected bool $isNew = true;
protected array $errors = [];
}
XoopsObject
├── XoopsUser
├── XoopsGroup
├── XoopsModule
├── XoopsBlock
├── XoopsComment
├── XoopsNotification
├── XoopsConfig
└── [Custom Module Objects]
СвойствоТипВидимостьОписание
$varsarrayprotectedХранит определения и значения переменных
$cleanVarsarrayprotectedХранит санированные значения для операций БД
$isNewboolprotectedУказывает, является ли объект новым (еще не в БД)
$errorsarrayprotectedХранит сообщения валидации и ошибок
public function __construct()

Создает новый экземпляр XoopsObject. По умолчанию объект помечается как новый.

Пример:

$object = new XoopsObject();
// Объект новый и не имеет определенных переменных

Инициализирует определение переменной для объекта.

public function initVar(
string $key,
int $dataType,
mixed $value = null,
bool $required = false,
int $maxlength = null,
string $options = ''
): void

Параметры:

ПараметрТипОписание
$keystringИмя переменной
$dataTypeintКонстанта типа данных (см. Типы данных)
$valuemixedЗначение по умолчанию
$requiredboolЯвляется ли поле обязательным
$maxlengthintМаксимальная длина для строковых типов
$optionsstringДополнительные опции

Типы данных:

КонстантаЗначениеОписание
XOBJ_DTYPE_TXTBOX1Текстовое поле ввода
XOBJ_DTYPE_TXTAREA2Содержимое области текста
XOBJ_DTYPE_INT3Целочисленное значение
XOBJ_DTYPE_URL4Строка URL
XOBJ_DTYPE_EMAIL5Адрес электронной почты
XOBJ_DTYPE_ARRAY6Сериализованный массив
XOBJ_DTYPE_OTHER7Пользовательский тип
XOBJ_DTYPE_SOURCE8Исходный код
XOBJ_DTYPE_STIME9Короткий формат времени
XOBJ_DTYPE_MTIME10Средний формат времени
XOBJ_DTYPE_LTIME11Длинный формат времени
XOBJ_DTYPE_FLOAT12Число с плавающей точкой
XOBJ_DTYPE_DECIMAL13Десятичное число
XOBJ_DTYPE_ENUM14Перечисление

Пример:

class MyObject extends XoopsObject
{
public function __construct()
{
parent::__construct();
$this->initVar('id', XOBJ_DTYPE_INT, null, false);
$this->initVar('title', XOBJ_DTYPE_TXTBOX, '', true, 255);
$this->initVar('content', XOBJ_DTYPE_TXTAREA, '', false);
$this->initVar('email', XOBJ_DTYPE_EMAIL, '', true, 100);
$this->initVar('created', XOBJ_DTYPE_INT, time(), false);
$this->initVar('status', XOBJ_DTYPE_INT, 1, true);
}
}

Устанавливает значение переменной.

public function setVar(
string $key,
mixed $value,
bool $notGpc = false
): bool

Параметры:

ПараметрТипОписание
$keystringИмя переменной
$valuemixedЗначение для установки
$notGpcboolЕсли true, значение не из GET/POST/COOKIE

Возвращает: bool - True если успешно, false в противном случае

Пример:

$object = new MyObject();
$object->setVar('title', 'Hello World');
$object->setVar('content', '<p>Content here</p>', true); // Не из пользовательского ввода
$object->setVar('status', 1);

Получает значение переменной с опциональным форматированием.

public function getVar(
string $key,
string $format = 's'
): mixed

Параметры:

ПараметрТипОписание
$keystringИмя переменной
$formatstringФормат вывода

Опции формата:

ФорматОписание
's'Show - Сущности HTML экранированы для отображения
'e'Edit - Для значений ввода формы
'p'Preview - Аналогично show
'f'Form data - Сырое для обработки формы
'n'None - Сырое значение, без форматирования

Возвращает: mixed - Форматированное значение

Пример:

$object = new MyObject();
$object->setVar('title', 'Hello <World>');
echo $object->getVar('title', 's'); // "Hello &lt;World&gt;"
echo $object->getVar('title', 'e'); // "Hello &lt;World&gt;" (для значения ввода)
echo $object->getVar('title', 'n'); // "Hello <World>" (сырое)
// Для типов массивов данных
$object->setVar('options', ['a', 'b', 'c']);
$options = $object->getVar('options', 'n'); // Возвращает массив

Устанавливает несколько переменных одновременно из массива.

public function setVars(
array $values,
bool $notGpc = false
): void

Параметры:

ПараметрТипОписание
$valuesarrayАссоциативный массив пар ключ => значение
$notGpcboolЕсли true, значения не из GET/POST/COOKIE

Пример:

$object = new MyObject();
$object->setVars([
'title' => 'My Title',
'content' => 'My content',
'status' => 1
]);
// Из базы данных (не из пользовательского ввода)
$object->setVars($row, true);

Получает все значения переменных.

public function getValues(
array $keys = null,
string $format = 's',
int $maxDepth = 1
): array

Параметры:

ПараметрТипОписание
$keysarrayСпециальные ключи для получения (null для всех)
$formatstringФормат вывода
$maxDepthintМаксимальная глубина для вложенных объектов

Возвращает: array - Ассоциативный массив значений

Пример:

$object = new MyObject();
// Получить все значения
$allValues = $object->getValues();
// Получить конкретные значения
$subset = $object->getValues(['title', 'status']);
// Получить сырые значения для БД
$rawValues = $object->getValues(null, 'n');

Присваивает значение напрямую без валидации (используйте с осторожностью).

public function assignVar(
string $key,
mixed $value
): void

Параметры:

ПараметрТипОписание
$keystringИмя переменной
$valuemixedЗначение для присвоения

Пример:

// Прямое присвоение из доверенного источника (напр. БД)
$object->assignVar('id', $row['id']);
$object->assignVar('created', $row['created']);

Санирует все переменные для операций базы данных.

public function cleanVars(): bool

Возвращает: bool - True если все переменные корректны

Пример:

$object = new MyObject();
$object->setVar('title', 'Test');
$object->setVar('email', 'user@example.com');
if ($object->cleanVars()) {
// Переменные санированы и готовы для БД
$cleanData = $object->cleanVars;
} else {
// Произошли ошибки валидации
$errors = $object->getErrors();
}

Проверяет или устанавливает, является ли объект новым.

public function isNew(): bool
public function setNew(): void
public function unsetNew(): void

Пример:

$object = new MyObject();
echo $object->isNew(); // true
$object->unsetNew();
echo $object->isNew(); // false
$object->setNew();
echo $object->isNew(); // true

Добавляет сообщение об ошибке.

public function setErrors(string|array $error): void

Пример:

$object->setErrors('Title is required');
$object->setErrors(['Field 1 error', 'Field 2 error']);

Получает все сообщения об ошибках.

public function getErrors(): array

Пример:

$errors = $object->getErrors();
foreach ($errors as $error) {
echo $error . "\n";
}

Возвращает ошибки отформатированные как HTML.

public function getHtmlErrors(): string

Пример:

if (!$object->cleanVars()) {
echo '<div class="error">' . $object->getHtmlErrors() . '</div>';
}

Преобразует объект в массив.

public function toArray(): array

Пример:

$object = new MyObject();
$object->setVar('title', 'Test');
$data = $object->toArray();
// ['title' => 'Test', ...]

Возвращает определения переменных.

public function getVars(): array

Пример:

$vars = $object->getVars();
foreach ($vars as $key => $definition) {
echo "Field: $key, Type: {$definition['data_type']}\n";
}

<?php
/**
* Пользовательский объект статьи
*/
class Article extends XoopsObject
{
/**
* Конструктор - Инициализирует все переменные
*/
public function __construct()
{
parent::__construct();
// Первичный ключ
$this->initVar('article_id', XOBJ_DTYPE_INT, null, false);
// Обязательные поля
$this->initVar('title', XOBJ_DTYPE_TXTBOX, '', true, 255);
$this->initVar('author_id', XOBJ_DTYPE_INT, 0, true);
// Опциональные поля
$this->initVar('summary', XOBJ_DTYPE_TXTAREA, '', false);
$this->initVar('content', XOBJ_DTYPE_TXTAREA, '', false);
$this->initVar('category_id', XOBJ_DTYPE_INT, 0, false);
// Временные метки
$this->initVar('created', XOBJ_DTYPE_INT, time(), false);
$this->initVar('updated', XOBJ_DTYPE_INT, time(), false);
// Флаги статуса
$this->initVar('published', XOBJ_DTYPE_INT, 0, false);
$this->initVar('views', XOBJ_DTYPE_INT, 0, false);
// Метаданные как массив
$this->initVar('meta', XOBJ_DTYPE_ARRAY, [], false);
}
/**
* Получить отформатированную дату создания
*/
public function getCreatedDate(string $format = 'Y-m-d H:i:s'): string
{
return date($format, $this->getVar('created', 'n'));
}
/**
* Проверить, опубликована ли статья
*/
public function isPublished(): bool
{
return $this->getVar('published', 'n') == 1;
}
/**
* Увеличить счетчик просмотров
*/
public function incrementViews(): void
{
$views = $this->getVar('views', 'n');
$this->setVar('views', $views + 1);
}
/**
* Пользовательская валидация
*/
public function validate(): bool
{
$this->errors = [];
// Валидация заголовка
$title = trim($this->getVar('title', 'n'));
if (empty($title)) {
$this->setErrors('Title is required');
} elseif (strlen($title) < 5) {
$this->setErrors('Title must be at least 5 characters');
}
// Валидация автора
if ($this->getVar('author_id', 'n') <= 0) {
$this->setErrors('Author is required');
}
return empty($this->errors);
}
}
// Использование
$article = new Article();
$article->setVar('title', 'My First Article');
$article->setVar('author_id', 1);
$article->setVar('content', '<p>Article content here...</p>', true);
$article->setVar('meta', [
'keywords' => ['xoops', 'cms', 'php'],
'description' => 'An example article'
]);
if ($article->validate() && $article->cleanVars()) {
// Сохранить в БД через обработчик
$handler = xoops_getModuleHandler('article', 'mymodule');
$handler->insert($article);
echo "Article saved with ID: " . $article->getVar('article_id');
} else {
echo "Errors: " . $article->getHtmlErrors();
}
  1. Всегда инициализируйте переменные: Определите все переменные в конструкторе с помощью initVar()

  2. Используйте подходящие типы данных: Выберите правильную константу XOBJ_DTYPE_* для валидации

  3. Тщательно обрабатывайте пользовательский ввод: Используйте setVar() с $notGpc = false для пользовательского ввода

  4. Валидируйте перед сохранением: Всегда вызывайте cleanVars() перед операциями БД

  5. Используйте параметры формата: Используйте подходящий формат в getVar() для контекста

  6. Расширяйте для пользовательской логики: Добавьте методы, специфичные для домена, в подклассы

  • XoopsObjectHandler - Паттерн обработчика для сохранения объектов
  • ../Database/Criteria - Построение запросов с Criteria
  • ../Database/XoopsDatabase - Операции с БД

См. также: Исходный код XOOPS