Lewati ke konten

Kelas XoopsObjectHandler

Kelas XoopsObjectHandler dan ekstensinya XoopsPersistableObjectHandler menyediakan antarmuka standar untuk melakukan operasi CRUD (Buat, Baca, Perbarui, Hapus) pada instans XoopsObject. Ini mengimplementasikan pola Data Mapper, yang memisahkan logika domain dari akses database.

namespace Xoops\Core;
abstract class XoopsObjectHandler
{
protected XoopsDatabase $db;
public function __construct(XoopsDatabase $db);
abstract public function create(bool $isNew = true);
abstract public function get(int $id);
abstract public function insert(XoopsObject $obj, bool $force = false): bool;
abstract public function delete(XoopsObject $obj, bool $force = false): bool;
}
XoopsObjectHandler (Abstract Base)
└── XoopsPersistableObjectHandler (Extended Implementation)
├── XoopsUserHandler
├── XoopsGroupHandler
├── XoopsModuleHandler
├── XoopsBlockHandler
├── XoopsConfigHandler
└── [Custom Module Handlers]
public function __construct(XoopsDatabase $db)

Parameter:

ParameterKetikDeskripsi
$dbXoopsDatabaseContoh koneksi database

Contoh:

$db = XoopsDatabaseFactory::getDatabaseConnection();
$handler = new MyObjectHandler($db);

Membuat instance objek baru.

abstract public function create(bool $isNew = true): ?XoopsObject

Parameter:

ParameterKetikDeskripsi
$isNewbodohApakah objek baru (default: true)

Pengembalian: XoopsObject|null - Contoh objek baru

Contoh:

$handler = xoops_getHandler('user');
$user = $handler->create();
$user->setVar('uname', 'newuser');

Mengambil objek dengan kunci utamanya.

abstract public function get(int $id): ?XoopsObject

Parameter:

ParameterKetikDeskripsi
$idke dalamNilai kunci utama

Pengembalian: XoopsObject|null - Contoh objek atau null jika tidak ditemukan

Contoh:

$handler = xoops_getHandler('user');
$user = $handler->get(1);
if ($user) {
echo $user->getVar('uname');
}

Menyimpan objek ke database (memasukkan atau memperbarui).

abstract public function insert(
XoopsObject $obj,
bool $force = false
): bool

Parameter:

ParameterKetikDeskripsi
$objXoopsObjekObjek untuk disimpan
$forcebodohPaksa operasi meskipun objek tidak berubah

Pengembalian: bool - Benar dalam kesuksesan

Contoh:

$handler = xoops_getHandler('user');
$user = $handler->create();
$user->setVar('uname', 'testuser');
$user->setVar('email', 'test@example.com');
if ($handler->insert($user)) {
echo "User saved with ID: " . $user->getVar('uid');
} else {
echo "Save failed: " . implode(', ', $user->getErrors());
}

Menghapus objek dari database.

abstract public function delete(
XoopsObject $obj,
bool $force = false
): bool

Parameter:

ParameterKetikDeskripsi
$objXoopsObjekKeberatan untuk dihapus
$forcebodohPenghapusan paksa

Pengembalian: bool - Benar dalam kesuksesan

Contoh:

$handler = xoops_getHandler('user');
$user = $handler->get(5);
if ($user && $handler->delete($user)) {
echo "User deleted";
}

XoopsPersistableObjectHandler memperluas XoopsObjectHandler dengan metode tambahan untuk kueri dan operasi massal.

public function __construct(
XoopsDatabase $db,
string $table,
string $className,
string $keyName,
string $identifierName = ''
)

Parameter:

ParameterKetikDeskripsi
$dbXoopsDatabaseKoneksi basis data
$tabletaliNama tabel (tanpa awalan)
$classNametaliNama kelas lengkap objek
$keyNametaliNama bidang kunci utama
$identifierNametaliBidang pengenal yang dapat dibaca manusia

Contoh:

class ArticleHandler extends XoopsPersistableObjectHandler
{
public function __construct(XoopsDatabase $db)
{
parent::__construct(
$db,
'mymodule_articles', // Table name
'Article', // Class name
'article_id', // Primary key
'title' // Identifier field
);
}
}

Mengambil beberapa objek yang cocok dengan kriteria.

public function getObjects(
CriteriaElement $criteria = null,
bool $idAsKey = false,
bool $asObject = true
): array

Parameter:

ParameterKetikDeskripsi
$criteriaElemen KriteriaKriteria kueri (opsional)
$idAsKeybodohGunakan kunci utama sebagai kunci array
$asObjectbodohMengembalikan objek (benar) atau array (salah)

Pengembalian: array - Array objek atau array asosiatif

Contoh:

$handler = xoops_getHandler('user');
// Get all active users
$criteria = new Criteria('level', 0, '>');
$users = $handler->getObjects($criteria);
// Get users with ID as key
$users = $handler->getObjects($criteria, true);
echo $users[1]->getVar('uname'); // Access by ID
// Get as arrays instead of objects
$usersArray = $handler->getObjects($criteria, false, false);
foreach ($usersArray as $userData) {
echo $userData['uname'];
}

Menghitung objek yang cocok dengan kriteria.

public function getCount(CriteriaElement $criteria = null): int

Parameter:

ParameterKetikDeskripsi
$criteriaElemen KriteriaKriteria kueri (opsional)

Pengembalian: int - Jumlah objek yang cocok

Contoh:

$handler = xoops_getHandler('user');
// Count all users
$totalUsers = $handler->getCount();
// Count active users
$criteria = new Criteria('level', 0, '>');
$activeUsers = $handler->getCount($criteria);
echo "Total: $totalUsers, Active: $activeUsers";

Mengambil semua objek (alias untuk getObjects tanpa kriteria).

public function getAll(
CriteriaElement $criteria = null,
array $fields = null,
bool $asObject = true,
bool $idAsKey = true
): array

Parameter:

ParameterKetikDeskripsi
$criteriaElemen KriteriaKriteria kueri
$fieldssusunanBidang khusus untuk diambil
$asObjectbodohKembali sebagai objek
$idAsKeybodohGunakan ID sebagai kunci array

Contoh:

$handler = xoops_getHandler('module');
// Get all modules
$modules = $handler->getAll();
// Get only specific fields
$modules = $handler->getAll(null, ['mid', 'name', 'dirname'], false);

Hanya mengambil kunci utama dari objek yang cocok.

public function getIds(CriteriaElement $criteria = null): array

Parameter:

ParameterKetikDeskripsi
$criteriaElemen KriteriaKriteria kueri

Pengembalian: array - Kumpulan nilai kunci utamaContoh:

$handler = xoops_getHandler('user');
$criteria = new Criteria('level', 1);
$adminIds = $handler->getIds($criteria);
// [1, 5, 12, ...] - Array of admin user IDs

Mengambil daftar nilai kunci untuk dropdown.

public function getList(CriteriaElement $criteria = null): array

Pengembalian: array - Array asosiatif [id => pengidentifikasi]

Contoh:

$handler = xoops_getHandler('group');
$groups = $handler->getList();
// [1 => 'Administrators', 2 => 'Registered Users', ...]
// For a select dropdown
$form->addElement(new XoopsFormSelect('Group', 'group_id', $default, 1, false));
$form->getElement('group_id')->addOptionArray($groups);

Menghapus semua objek yang cocok dengan kriteria.

public function deleteAll(
CriteriaElement $criteria = null,
bool $force = true,
bool $asObject = false
): bool

Parameter:

ParameterKetikDeskripsi
$criteriaElemen KriteriaKriteria objek yang akan dihapus
$forcebodohPenghapusan paksa
$asObjectbodohMemuat objek sebelum menghapus (memicu kejadian)

Pengembalian: bool - Benar dalam kesuksesan

Contoh:

$handler = xoops_getModuleHandler('comment', 'mymodule');
// Delete all comments for a specific article
$criteria = new Criteria('article_id', $articleId);
$handler->deleteAll($criteria);
// Delete with object loading (triggers delete events)
$handler->deleteAll($criteria, true, true);

Memperbarui nilai bidang untuk semua objek yang cocok.

public function updateAll(
string $fieldname,
mixed $fieldvalue,
CriteriaElement $criteria = null,
bool $force = false
): bool

Parameter:

ParameterKetikDeskripsi
$fieldnametaliBidang yang akan diperbarui
$fieldvaluecampuranNilai baru
$criteriaElemen KriteriaKriteria objek yang akan diperbarui
$forcebodohPaksa pembaruan

Pengembalian: bool - Benar dalam kesuksesan

Contoh:

$handler = xoops_getModuleHandler('article', 'mymodule');
// Mark all articles by an author as draft
$criteria = new Criteria('author_id', $authorId);
$handler->updateAll('published', 0, $criteria);
// Update view count
$criteria = new Criteria('article_id', $id);
$handler->updateAll('views', $views + 1, $criteria);

Metode penyisipan yang diperluas dengan fungsionalitas tambahan.

public function insert(
XoopsObject $obj,
bool $force = false
): bool

Perilaku:

  • Jika objek baru (isNew() === true): INSERT
  • Jika objek ada (isNew() === false): UPDATE
  • Memanggil cleanVars() secara otomatis
  • Menetapkan ID kenaikan otomatis pada objek baru

Contoh:

$handler = xoops_getModuleHandler('article', 'mymodule');
// Create new article
$article = $handler->create();
$article->setVar('title', 'New Article');
$article->setVar('content', 'Content here');
$handler->insert($article);
echo "Created with ID: " . $article->getVar('article_id');
// Update existing article
$article = $handler->get(5);
$article->setVar('title', 'Updated Title');
$handler->insert($article);

Fungsi global untuk mengambil pengendali core.

function xoops_getHandler(string $name, bool $optional = false): ?XoopsObjectHandler

Parameter:

ParameterKetikDeskripsi
$nametaliNama handler (pengguna, module, grup, dll.)
$optionalbodohKembalikan null alih-alih memicu kesalahan

Contoh:

$userHandler = xoops_getHandler('user');
$moduleHandler = xoops_getHandler('module');
$groupHandler = xoops_getHandler('group');
$blockHandler = xoops_getHandler('block');
$configHandler = xoops_getHandler('config');

Mengambil pengendali khusus module.

function xoops_getModuleHandler(
string $name,
string $dirname = null,
bool $optional = false
): ?XoopsObjectHandler

Parameter:

ParameterKetikDeskripsi
$nametaliNama pengendali
$dirnametaliNama direktori module
$optionalbodohKembalikan null jika gagal

Contoh:

// Get handler from current module
$articleHandler = xoops_getModuleHandler('article');
// Get handler from specific module
$articleHandler = xoops_getModuleHandler('article', 'news');
$storyHandler = xoops_getModuleHandler('story', 'news');

<?php
namespace XoopsModules\MyModule;
use XoopsPersistableObjectHandler;
use XoopsDatabase;
use CriteriaElement;
use Criteria;
use CriteriaCompo;
/**
* Handler for Article objects
*/
class ArticleHandler extends XoopsPersistableObjectHandler
{
/**
* Constructor
*/
public function __construct(XoopsDatabase $db = null)
{
parent::__construct(
$db,
'mymodule_articles',
Article::class,
'article_id',
'title'
);
}
/**
* Get published articles
*/
public function getPublished(int $limit = 10, int $start = 0): array
{
$criteria = new CriteriaCompo();
$criteria->add(new Criteria('published', 1));
$criteria->add(new Criteria('publish_date', time(), '<='));
$criteria->setSort('publish_date');
$criteria->setOrder('DESC');
$criteria->setLimit($limit);
$criteria->setStart($start);
return $this->getObjects($criteria);
}
/**
* Get articles by author
*/
public function getByAuthor(int $authorId, bool $publishedOnly = true): array
{
$criteria = new CriteriaCompo();
$criteria->add(new Criteria('author_id', $authorId));
if ($publishedOnly) {
$criteria->add(new Criteria('published', 1));
}
$criteria->setSort('created');
$criteria->setOrder('DESC');
return $this->getObjects($criteria);
}
/**
* Get articles by category
*/
public function getByCategory(int $categoryId, int $limit = 0): array
{
$criteria = new CriteriaCompo();
$criteria->add(new Criteria('category_id', $categoryId));
$criteria->add(new Criteria('published', 1));
$criteria->setSort('publish_date');
$criteria->setOrder('DESC');
if ($limit > 0) {
$criteria->setLimit($limit);
}
return $this->getObjects($criteria);
}
/**
* Search articles
*/
public function search(string $query, array $fields = ['title', 'content']): array
{
$criteria = new CriteriaCompo();
$searchCriteria = new CriteriaCompo();
foreach ($fields as $field) {
$searchCriteria->add(
new Criteria($field, '%' . $query . '%', 'LIKE'),
'OR'
);
}
$criteria->add($searchCriteria);
$criteria->add(new Criteria('published', 1));
$criteria->setSort('publish_date');
$criteria->setOrder('DESC');
return $this->getObjects($criteria);
}
/**
* Get popular articles by view count
*/
public function getPopular(int $limit = 5): array
{
$criteria = new CriteriaCompo();
$criteria->add(new Criteria('published', 1));
$criteria->setSort('views');
$criteria->setOrder('DESC');
$criteria->setLimit($limit);
return $this->getObjects($criteria);
}
/**
* Increment view count
*/
public function incrementViews(int $articleId): bool
{
$sql = sprintf(
"UPDATE %s SET views = views + 1 WHERE article_id = %d",
$this->db->prefix($this->table),
$articleId
);
return $this->db->queryF($sql) !== false;
}
/**
* Override insert for custom behavior
*/
public function insert(\XoopsObject $obj, bool $force = false): bool
{
// Set updated timestamp
$obj->setVar('updated', time());
// If new, set created timestamp
if ($obj->isNew()) {
$obj->setVar('created', time());
}
return parent::insert($obj, $force);
}
/**
* Override delete for cascade operations
*/
public function delete(\XoopsObject $obj, bool $force = false): bool
{
// Delete associated comments
$commentHandler = xoops_getModuleHandler('comment', 'mymodule');
$criteria = new Criteria('article_id', $obj->getVar('article_id'));
$commentHandler->deleteAll($criteria);
return parent::delete($obj, $force);
}
}
// Get the handler
$articleHandler = xoops_getModuleHandler('article', 'mymodule');
// Create a new article
$article = $articleHandler->create();
$article->setVars([
'title' => 'My New Article',
'content' => 'Article content here...',
'author_id' => $xoopsUser->getVar('uid'),
'category_id' => 1,
'published' => 1,
'publish_date' => time()
]);
if ($articleHandler->insert($article)) {
redirect_header('article.php?id=' . $article->getVar('article_id'), 2, 'Article created');
}
// Get published articles
$articles = $articleHandler->getPublished(10);
// Search articles
$results = $articleHandler->search('xoops');
// Get popular articles
$popular = $articleHandler->getPopular(5);
// Update view count
$articleHandler->incrementViews($articleId);
  1. Gunakan Kriteria untuk Kueri: Selalu gunakan objek Kriteria untuk kueri yang aman untuk tipe

  2. Perluas untuk Metode Kustom: Tambahkan metode kueri khusus domain ke handler

  3. Override insert/delete: Tambahkan operasi kaskade dan stempel waktu dalam override

  4. Gunakan Transaksi Jika Diperlukan: Gabungkan operasi kompleks dalam transaksi

  5. Manfaatkan getList: Gunakan getList() untuk dropdown pilihan guna mengurangi kueri

  6. Kunci Indeks: Pastikan kolom database yang digunakan dalam kriteria diindeks

  7. Batasi Hasil: Selalu gunakan setLimit() untuk kumpulan hasil yang berpotensi besar

  • XoopsObject - Kelas objek dasar
  • ../Database/Criteria - Membangun kriteria kueri
  • ../Database/XoopsDatabase - Operasi basis data

Lihat juga: Kode Sumber XOOPS