| Server IP : 54.36.91.62 / Your IP : 216.73.217.112 Web Server : Apache System : Linux webm013.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : coopiak ( 151928) PHP Version : 8.3.23 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/coopiak/amisdesseniors-fr/toulouse/libraries/kunena/src/Table/ |
Upload File : |
<?php
/**
* Kunena Component
*
* @package Kunena.Framework
* @subpackage Table
*
* @copyright Copyright (C) 2008 - @currentyear@ Kunena Team. All rights reserved.
* @license https://www.gnu.org/copyleft/gpl.html GNU/GPL
* @link https://www.kunena.org
**/
namespace Kunena\Forum\Libraries\Table;
\defined('_JEXEC') or die();
use InvalidArgumentException;
use Joomla\CMS\Factory;
use Joomla\Database\DatabaseDriver;
use Joomla\Utilities\ArrayHelper;
use RuntimeException;
use UnexpectedValueException;
/**
* Class KunenaTableMap
*
* @since Kunena 6.0
*/
class KunenaTableMap
{
/**
* Name of the database table to model.
*
* @var string
* @since Kunena 6.0
*/
protected $_tbl = '';
/**
* Name of the primary key field in the table.
*
* @var string
* @since Kunena 6.0
*/
protected $_tbl_key = '';
/**
* Name of the mapped key field in the table.
*
* @var string
* @since Kunena 6.0
*/
protected $_tbl_mapped = '';
/**
* DatabaseDriver object.
*
* @var DatabaseDriver
* @since Kunena 6.0
*/
protected $_db = null;
/**
* Indicator that the tables have been locked.
*
* @var boolean
* @since Kunena 6.0
*/
protected $_locked = false;
public $message_id;
public $user_id;
public $private_id;
public $read_at;
public $replied_at;
public $deleted_at;
public $attachment_id;
/**
* Object constructor to set table and key fields. In most cases this will
* be overridden by child classes to explicitly set the table and key fields
* for a particular database table.
*
* @param string $table Name of the table to model.
* @param string $key Name of the primary key field in the table.
* @param string $mapped Name of the mapped key field in the table.
* @param DatabaseDriver|null $db DatabaseDriver object.
*
* @since Kunena 6.0
*/
public function __construct(string $table, string $key, string $mapped, ?DatabaseDriver $db = null)
{
// Set internal variables.
$this->_tbl = $table;
$this->_tbl_key = $key;
$this->_tbl_mapped = $mapped;
$this->{$mapped} = [];
$this->_db = $db ? $db : Factory::getContainer()->get('DatabaseDriver');
// Initialise the table properties.
$fields = $this->getFields();
foreach ($fields as $name => $v) {
// Add the field if it is not already present.
if (!property_exists($this, $name)) {
$this->{$name} = null;
}
}
}
/**
* Get the columns from database table.
*
* @return mixed An array of the field names, or false if an error occurs.
*
* @since Kunena 6.0
*
* @throws UnexpectedValueException
*/
public function getFields(): array
{
static $cache = [];
$name = $this->_tbl;
if (!isset($cache[$name])) {
// Lookup the fields for this table only once.
$fields = $this->_db->getTableColumns($name, false);
if (empty($fields)) {
throw new UnexpectedValueException(sprintf('No columns found for %s table', $name));
}
$cache[$name] = $fields;
}
return (array) $cache[$name];
}
/**
* @return mixed
*
* @since Kunena 6.0
*/
public function getMirrorInstance()
{
static $instance = [];
$key = md5(serialize([$this->_tbl, $this->_tbl_mapped, $this->_tbl_key]));
if (!isset($instance[$key])) {
$c = \get_called_class();
$instance[$key] = new $c($this->_tbl, $this->_tbl_mapped, $this->_tbl_key);
}
return $instance[$key];
}
/**
* Method to get the database table name for the class.
*
* @link http://docs.joomla.org/Joomla\CMS\Table\Table/getTableName
*
* @return string The name of the database table being modeled.
*
* @since Kunena 6.0
*/
public function getTableName(): string
{
return $this->_tbl;
}
/**
* Method to get the primary key field name for the table.
*
* @link http://docs.joomla.org/Joomla\CMS\Table\Table/getKeyName
*
* @return string The name of the primary key for the table.
*
* @since Kunena 6.0
*/
public function getKeyName(): string
{
return $this->_tbl_key;
}
/**
* Method to get the mapped field name for the table.
*
* @return string The name of the map field for the table.
*
* @since Kunena 6.0
*/
public function getMappedName(): string
{
return $this->_tbl_mapped;
}
/**
* Method to get the DatabaseDriver object.
*
* @link http://docs.joomla.org/Joomla\CMS\Table\Table/getDBO
*
* @return \Joomla\Database\DatabaseDriver|null The internal database driver object.
*
* @since Kunena 6.0
*/
public function getDatabase(): ?DatabaseDriver
{
return $this->_db;
}
/**
* Method to get the primary key.
*
* @return integer Get value for the primary key.
*
* @since Kunena 6.0
*/
public function getKey(): int
{
return $this->{$this->_tbl_key};
}
/**
* Method to set the primary key.
*
* @param int $id Set value for the primary key.
*
* @return $this
*
* @since Kunena 6.0
*/
public function setKey(int $id): KunenaTableMap
{
$this->{$this->_tbl_key} = (int) $id;
return $this;
}
/**
* Method to get the mapped value.
*
* @return array Get array of mapped objects.
*
* @since Kunena 6.0
*/
public function getMapped(): array
{
return (array) $this->{$this->_tbl_mapped};
}
/**
* Method to add relation.
*
* @param int $id Add Id.
*
* @return $this
*
* @since Kunena 6.0
*/
public function add(int $id): KunenaTableMap
{
if (!\in_array($id, $this->{$this->_tbl_mapped})) {
array_push($this->{$this->_tbl_mapped}, (int) $id);
}
return $this;
}
/**
* Method to set the DatabaseDriver object.
*
* @link http://docs.joomla.org/Joomla\CMS\Table\Table/setDbo
*
* @param DatabaseDriver $db A DatabaseDriver object to be used by the table object.
*
* @return boolean True on success.
*
* @since Kunena 6.0
*/
public function setDbo(DatabaseDriver $db): bool
{
$this->_db = $db;
return true;
}
/**
* Method to bind an associative array or object to the Joomla\CMS\Table\Table instance. This
* method only binds properties that are publicly accessible and optionally
* takes an array of properties to ignore when binding.
*
* @link http://docs.joomla.org/Joomla\CMS\Table\Table/bind
*
* @param mixed $src An associative array or object to bind to the Joomla\CMS\Table\Table instance.
* @param mixed $ignore An optional array or space separated list of properties to ignore while binding.
*
* @return boolean True on success.
*
* @since Kunena 6.0
*
* @throws InvalidArgumentException
*/
public function bind($src, $ignore = []): bool
{
// If the source value is not an array or object return false.
if (!\is_object($src) && !\is_array($src)) {
throw new InvalidArgumentException(sprintf('%s::bind(*%s*)', \get_class($this), \gettype($src)));
}
// If the source value is an object, get its accessible properties.
if (\is_object($src)) {
$src = get_object_vars($src);
}
// If the ignore value is a string, explode it over spaces.
if (!\is_array($ignore)) {
$ignore = explode(' ', $ignore);
}
// Bind the source value, excluding the ignored fields.
foreach ($this->getProperties() as $k => $v) {
// Only process fields not in the ignore array.
if (!\in_array($k, $ignore)) {
if (isset($src[$k])) {
$this->{$k} = $src[$k];
}
}
}
return true;
}
/**
* Returns an associative array of public object properties.
*
* @return array
*
* @since Kunena 6.0
*/
public function getProperties(): array
{
$properties = (array) $this;
$list = [];
foreach ($properties as $property => $value) {
if ($property[0] != "\0") {
$list[$property] = $value;
}
}
return $list;
}
/**
* Method to provide a shortcut to binding, checking and storing a Joomla\CMS\Table\Table
* instance to the database table.
*
* @param array|null $map An array of mapped Ids.
* @param array|null $filter Touch only these filtered items.
*
* @return boolean True on success.
*
* @since Kunena 6.0
*/
public function save(?array $map = null, ?array $filter = null): bool
{
if ($map !== null) {
$this->setMapped($map);
}
// Run any sanity checks on the instance and verify that it is ready for storage.
if (!$this->check()) {
return false;
}
// Attempt to store the properties to the database table.
if (!$this->store($filter)) {
return false;
}
return true;
}
/**
* Method to set the mapped value.
*
* @param array $list Set array of mapped objects.
*
* @return void
*
* @since Kunena 6.0
*/
public function setMapped(array $list): void
{
$list = ArrayHelper::toInteger($list);
$this->{$this->_tbl_mapped} = $list;
}
/**
* Method to perform sanity checks on the Joomla\CMS\Table\Table instance properties to ensure
* they are safe to store in the database. Child classes should override this
* method to make sure the data they are storing in the database is safe and
* as expected before storage.
*
* @link http://docs.joomla.org/Joomla\CMS\Table\Table/check
* @return boolean True if the instance is sane and able to be stored in the database.
*
* @since Kunena 6.0
*/
public function check(): bool
{
return true;
}
/**
* Method to store mapped rows in the database from the Joomla\CMS\Table\Table instance properties.
*
* @link http://docs.joomla.org/Joomla\CMS\Table\Table/store
*
* @param array|null $filter Touch only these filtered items.
*
* @return boolean True on success.
*
* @since Kunena 6.0
*/
public function store(?array $filter = null): bool
{
$k = $this->_tbl_key;
$m = $this->_tbl_mapped;
if (0 == $this->{$k}) {
throw new UnexpectedValueException(sprintf('No key specified: %s.', \get_class($this)));
}
$id = $this->{$k};
$items = $this->{$m};
if (!empty($items)) {
// Load currently mapped variables from database.
$this->load();
$filtered = ($filter !== null) ? array_intersect($this->{$m}, $filter) : $this->{$m};
// Calculate difference (added and deleted items).
$added = array_diff($items, $filtered);
$deleted = array_diff($filtered, $items);
// Create all added items.
if ($added) {
$values = [];
foreach ($added as $var) {
$values[] = (int) $id . ',' . (int) $var;
}
$query = $this->_db->createQuery()
->insert($this->_db->quoteName($this->_tbl))
->columns([$this->_db->quoteName($this->_tbl_key), $this->_db->quoteName($this->_tbl_mapped)])
->values($values);
$this->_db->setQuery($query);
$this->_db->execute();
}
// Remove all deleted items.
if ($deleted) {
$query = $this->_db->createQuery()
->delete($this->_db->quoteName($this->_tbl))
->where($this->_db->quoteName($this->_tbl_key) . ' = ' . $this->_db->quote((int) $id))
->andWhere($this->_db->quoteName($this->_tbl_mapped) . ' IN (' . implode(',', $deleted) . ')');
$this->_db->setQuery($query);
$this->_db->execute();
}
} else {
$this->delete();
}
$this->{$m} = $items;
if ($this->_locked) {
$this->_unlock();
}
return true;
}
/**
* Method to load all mapped values from the database by primary key and bind the fields
* to the Joomla\CMS\Table\Table instance properties.
*
* @link http://docs.joomla.org/Joomla\CMS\Table\Table/load
*
* @param mixed $keys An optional primary key value to load the row by, or an array of fields to match. If
* not set the instance property value is used.
* @param boolean $reset True to reset the default values before loading the new row.
*
* @return boolean True if successful. False if no rows were found.
*
* @since Kunena 6.0
*
* @throws UnexpectedValueException
* @throws RuntimeException
*/
public function load($keys = null, $reset = true): bool
{
if (empty($keys)) {
// If empty, use the value of the current key
$keyName = $this->_tbl_key;
$keyValue = $this->{$keyName};
// If empty primary key there's is no need to load anything
if (empty($keyValue)) {
return true;
}
$keys = [$keyName => $keyValue];
} elseif (!\is_array($keys)) {
// Load by primary key.
$keys = [$this->_tbl_key => $keys];
}
if ($reset) {
$this->reset();
}
// Initialise the query.
$query = $this->_db->createQuery()
->select($this->_db->quoteName($this->_tbl_mapped))
->from($this->_db->quoteName($this->_tbl));
$fields = array_keys($this->getProperties());
foreach ($keys as $field => $value) {
// Check that $field is in the table.
if (!\in_array($field, $fields)) {
throw new UnexpectedValueException(sprintf('Missing field in database: %s   %s.', \get_class($this), $field));
}
// Add the search tuple to the query.
$this->{$field} = $value;
$query->where($this->_db->quoteName($field) . ' = ' . $this->_db->quote($value));
}
$this->_db->setQuery($query);
$mapName = $this->_tbl_mapped;
$this->{$mapName} = (array) $this->_db->loadColumn();
return !empty($this->{$mapName});
}
/**
* Method to reset class properties to the defaults set in the class
* definition. It will ignore the primary key as well as any private class
* properties.
*
* @link http://docs.joomla.org/Joomla\CMS\Table\Table/reset
*
* @return void
*
* @since Kunena 6.0
*/
public function reset(): void
{
// Get the default values for the class from the table.
foreach ($this->getFields() as $k => $v) {
// If the property is not the primary key or private, reset it.
if ($k != $this->_tbl_key && (strpos($k, '_') !== 0)) {
$this->{$k} = $v->Default;
}
}
}
/**
* Method to delete a row from the database table by primary key value.
*
* @link http://docs.joomla.org/Joomla\CMS\Table\Table/delete
*
* @param int|array $pk An optional primary key value (or array of key=>value pairs) to delete. If not set the
* instance property value is used.
*
* @return boolean True on success.
*
* @since Kunena 6.0
*
* @throws UnexpectedValueException
*/
public function delete($pk = null): bool
{
$k = $this->_tbl_key;
$pk = (\is_null($pk)) ? $this->{$k} : $pk;
// If no primary key is given, return false.
if ($pk === null) {
throw new UnexpectedValueException('Null primary key not allowed.');
}
// Turn pk into array.
if (!\is_array($pk)) {
$pk = [$k => (int) $pk];
}
// Delete the row by primary key.
$query = $this->_db->createQuery()
->delete()
->from($this->_tbl);
foreach ($pk as $key => $value) {
$query->where($key . ' = ' . $this->_db->quote($value));
}
$this->_db->setQuery($query);
// Delete items.
$this->_db->execute();
return true;
}
/**
* Method to unlock the database table for writing.
*
* @return boolean True on success.
*
* @since Kunena 6.0
*/
protected function _unlock(): bool
{
$this->_db->unlockTables();
$this->_locked = false;
return true;
}
/**
* Method to remove relation.
*
* @param int $id Add Id.
*
* @return $this
*
* @since Kunena 6.0
*/
protected function remove(int $id): KunenaTableMap
{
$key = array_search((int) $id, $this->{$this->_tbl_mapped});
if ($key !== false) {
unset($this->{$this->_tbl_mapped}[$key]);
}
return $this;
}
/**
* Method to lock the database table for writing.
*
* @return boolean True on success.
*
* @since Kunena 6.0
*
* @throws RuntimeException
*/
protected function _lock(): bool
{
$this->_db->lockTable($this->_tbl);
$this->_locked = true;
return true;
}
}