diff --git a/administrator/components/com_finder/src/Indexer/Taxonomy.php b/administrator/components/com_finder/src/Indexer/Taxonomy.php index 5091a21b92d4a..eaecd1b29d692 100644 --- a/administrator/components/com_finder/src/Indexer/Taxonomy.php +++ b/administrator/components/com_finder/src/Indexer/Taxonomy.php @@ -13,6 +13,7 @@ use Joomla\CMS\Factory; use Joomla\CMS\Tree\NodeInterface; use Joomla\Component\Finder\Administrator\Table\MapTable; +use Joomla\Utilities\ArrayHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; @@ -256,7 +257,7 @@ protected static function storeNode($node, $parentId) $nodeTable->rebuildPath($nodeTable->id); // Add the node to the cache. - static::$nodes[$parentId . ':' . $nodeTable->title] = (object) $nodeTable->getProperties(); + static::$nodes[$parentId . ':' . $nodeTable->title] = (object) ArrayHelper::fromObject($nodeTable, false); return static::$nodes[$parentId . ':' . $nodeTable->title]->id; } diff --git a/administrator/components/com_finder/src/Table/MapTable.php b/administrator/components/com_finder/src/Table/MapTable.php index 5586fb818f8e6..85a82100f319a 100644 --- a/administrator/components/com_finder/src/Table/MapTable.php +++ b/administrator/components/com_finder/src/Table/MapTable.php @@ -16,6 +16,7 @@ use Joomla\CMS\Table\Nested; use Joomla\Database\DatabaseInterface; use Joomla\Event\DispatcherInterface; +use Joomla\Utilities\ArrayHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; @@ -72,7 +73,7 @@ public function check() $this->alias = ApplicationHelper::stringURLSafe($this->title, $this->language); if (trim($this->alias) == '') { - $this->alias = md5(serialize($this->getProperties())); + $this->alias = md5(serialize(ArrayHelper::fromObject($this, false))); } return true; diff --git a/administrator/components/com_guidedtours/src/Model/TourModel.php b/administrator/components/com_guidedtours/src/Model/TourModel.php index bf2173805ceb9..8aeb58943afe4 100644 --- a/administrator/components/com_guidedtours/src/Model/TourModel.php +++ b/administrator/components/com_guidedtours/src/Model/TourModel.php @@ -219,7 +219,7 @@ public function getItem($pk = null) } // Convert to an object before adding other data. - $properties = $table->getProperties(1); + $properties = ArrayHelper::fromObject($table, false); $item = ArrayHelper::toObject($properties); if (property_exists($item, 'params')) { diff --git a/administrator/components/com_languages/src/Model/LanguageModel.php b/administrator/components/com_languages/src/Model/LanguageModel.php index 50357e8ade301..7def218b74bcf 100644 --- a/administrator/components/com_languages/src/Model/LanguageModel.php +++ b/administrator/components/com_languages/src/Model/LanguageModel.php @@ -127,7 +127,7 @@ public function getItem($langId = null) $table->access = (int) Factory::getApplication()->get('access'); } - $properties = $table->getProperties(1); + $properties = ArrayHelper::fromObject($table, false); $value = ArrayHelper::toObject($properties); return $value; diff --git a/administrator/components/com_mails/src/Model/TemplateModel.php b/administrator/components/com_mails/src/Model/TemplateModel.php index 99e486edab21c..d49920ab16253 100644 --- a/administrator/components/com_mails/src/Model/TemplateModel.php +++ b/administrator/components/com_mails/src/Model/TemplateModel.php @@ -173,7 +173,7 @@ public function getItem($pk = null) } // Convert to an object before adding other data. - $properties = $table->getProperties(1); + $properties = ArrayHelper::fromObject($table, false); $item = ArrayHelper::toObject($properties); if (property_exists($item, 'params')) { @@ -219,7 +219,7 @@ public function getMaster($pk = null) } // Convert to an object before adding other data. - $properties = $table->getProperties(1); + $properties = ArrayHelper::fromObject($table, false); $item = ArrayHelper::toObject($properties); if (property_exists($item, 'params')) { diff --git a/administrator/components/com_menus/src/Model/ItemModel.php b/administrator/components/com_menus/src/Model/ItemModel.php index 16bfd2ef0baa5..79e6a92bf8d80 100644 --- a/administrator/components/com_menus/src/Model/ItemModel.php +++ b/administrator/components/com_menus/src/Model/ItemModel.php @@ -713,7 +713,7 @@ public function getItem($pk = null) $this->setState('item.type', $table->type); // Convert to the \Joomla\CMS\Object\CMSObject before adding the params. - $properties = $table->getProperties(1); + $properties = ArrayHelper::fromObject($table, false); $result = ArrayHelper::toObject($properties); // Convert the params field to an array. @@ -1022,7 +1022,7 @@ protected function getMenuType($menutype) $table->load(['menutype' => $menutype]); - return (object) $table->getProperties(); + return (object) ArrayHelper::fromObject($table, false); } /** diff --git a/administrator/components/com_menus/src/Model/MenuModel.php b/administrator/components/com_menus/src/Model/MenuModel.php index 626fd18738ae8..610c58ade1b72 100644 --- a/administrator/components/com_menus/src/Model/MenuModel.php +++ b/administrator/components/com_menus/src/Model/MenuModel.php @@ -141,7 +141,7 @@ public function getItem($itemId = null) return false; } - $properties = $table->getProperties(1); + $properties = ArrayHelper::fromObject($table, false); $value = ArrayHelper::toObject($properties); return $value; diff --git a/administrator/components/com_modules/src/Model/ModuleModel.php b/administrator/components/com_modules/src/Model/ModuleModel.php index b3f10591053ec..c6ddf288e32c7 100644 --- a/administrator/components/com_modules/src/Model/ModuleModel.php +++ b/administrator/components/com_modules/src/Model/ModuleModel.php @@ -695,7 +695,7 @@ public function getItem($pk = null) } // Convert to an object before adding other data. - $properties = $table->getProperties(1); + $properties = ArrayHelper::fromObject($table, false); $this->_cache[$pk] = ArrayHelper::toObject($properties); // Convert the params field to an array. diff --git a/administrator/components/com_plugins/src/Model/PluginModel.php b/administrator/components/com_plugins/src/Model/PluginModel.php index 5a4f9bb16d1ec..92cfcb07e3e29 100644 --- a/administrator/components/com_plugins/src/Model/PluginModel.php +++ b/administrator/components/com_plugins/src/Model/PluginModel.php @@ -174,7 +174,7 @@ public function getItem($pk = null) } // Convert to an object before adding other data. - $properties = $table->getProperties(1); + $properties = ArrayHelper::fromObject($table, false); $this->_cache[$cacheId] = ArrayHelper::toObject($properties); // Convert the params field to an array. diff --git a/administrator/components/com_users/src/Model/GroupModel.php b/administrator/components/com_users/src/Model/GroupModel.php index 17ca3f701cc55..82e4932014d70 100644 --- a/administrator/components/com_users/src/Model/GroupModel.php +++ b/administrator/components/com_users/src/Model/GroupModel.php @@ -277,7 +277,7 @@ public function delete(&$pks) if ($allow) { // Fire the before delete event. $beforeDeleteEvent = new UserGroupBeforeDeleteEvent($this->event_before_delete, [ - 'data' => $table->getProperties(), // @TODO: Remove data argument in Joomla 6, see UserGroupBeforeDeleteEvent + 'data' => ArrayHelper::fromObject($table, false), // @TODO: Remove data argument in Joomla 6, see UserGroupBeforeDeleteEvent 'context' => $context, 'subject' => $table, ]); @@ -297,7 +297,7 @@ public function delete(&$pks) // Trigger the after delete event. $dispatcher->dispatch($this->event_after_delete, new UserGroupAfterDeleteEvent($this->event_after_delete, [ - 'data' => $table->getProperties(), // @TODO: Remove data argument in Joomla 6, see UserGroupAfterDeleteEvent + 'data' => ArrayHelper::fromObject($table, false), // @TODO: Remove data argument in Joomla 6, see UserGroupAfterDeleteEvent 'deletingResult' => true, // @TODO: Remove deletingResult argument in Joomla 6, see UserGroupAfterDeleteEvent 'errorMessage' => $this->getError(), // @TODO: Remove errorMessage argument in Joomla 6, see UserGroupAfterDeleteEvent 'context' => $context, diff --git a/administrator/components/com_users/src/Model/UserModel.php b/administrator/components/com_users/src/Model/UserModel.php index f28e035f44271..a83c102b4a2d9 100644 --- a/administrator/components/com_users/src/Model/UserModel.php +++ b/administrator/components/com_users/src/Model/UserModel.php @@ -339,7 +339,7 @@ public function delete(&$pks) $user_to_delete = $this->getUserFactory()->loadUserById($pk); // Fire the before delete event. - Factory::getApplication()->triggerEvent($this->event_before_delete, [$table->getProperties()]); + Factory::getApplication()->triggerEvent($this->event_before_delete, [ArrayHelper::fromObject($table, false)]); if (!$table->delete($pk)) { $this->setError($table->getError()); @@ -399,7 +399,7 @@ public function block(&$pks, $value = 1) unset($pks[$i]); Factory::getApplication()->enqueueMessage(Text::_('COM_USERS_USERS_ERROR_CANNOT_BLOCK_SELF'), 'error'); } elseif ($table->load($pk)) { - $old = $table->getProperties(); + $old = ArrayHelper::fromObject($table, false); $allow = $user->authorise('core.edit.state', 'com_users'); // Don't allow non-super-admin to delete a super admin @@ -428,7 +428,7 @@ public function block(&$pks, $value = 1) } // Trigger the before save event. - $result = Factory::getApplication()->triggerEvent($this->event_before_save, [$old, false, $table->getProperties()]); + $result = Factory::getApplication()->triggerEvent($this->event_before_save, [$old, false, ArrayHelper::fromObject($table, false)]); if (\in_array(false, $result, true)) { // Plugin will have to raise its own error or throw an exception. @@ -447,7 +447,7 @@ public function block(&$pks, $value = 1) } // Trigger the after save event - Factory::getApplication()->triggerEvent($this->event_after_save, [$table->getProperties(), false, true, null]); + Factory::getApplication()->triggerEvent($this->event_after_save, [ArrayHelper::fromObject($table, false), false, true, null]); } catch (\Exception $e) { $this->setError($e->getMessage()); @@ -542,7 +542,7 @@ public function activate(&$pks) // Activate and send the notification email foreach ($pks as $i => $pk) { if ($table->load($pk)) { - $prevUserData = $table->getProperties(); + $prevUserData = ArrayHelper::fromObject($table, false); $allow = $user->authorise('core.edit.state', 'com_users'); // Don't allow non-super-admin to edit the active status of a super admin @@ -569,7 +569,7 @@ public function activate(&$pks) } // Trigger the before save event. - $result = Factory::getApplication()->triggerEvent($this->event_before_save, [$prevUserData, false, $table->getProperties()]); + $result = Factory::getApplication()->triggerEvent($this->event_before_save, [$prevUserData, false, ArrayHelper::fromObject($table, false)]); if (\in_array(false, $result, true)) { // Plugin will have to raise it's own error or throw an exception. @@ -584,7 +584,7 @@ public function activate(&$pks) } // Fire the after save event - Factory::getApplication()->triggerEvent($this->event_after_save, [$table->getProperties(), false, true, null]); + Factory::getApplication()->triggerEvent($this->event_after_save, [ArrayHelper::fromObject($table, false), false, true, null]); // Send the email if (!$sendMailTo($prevUserData)) { diff --git a/administrator/components/com_workflow/src/Model/StagesModel.php b/administrator/components/com_workflow/src/Model/StagesModel.php index 8a600e5cd225a..651358b525488 100644 --- a/administrator/components/com_workflow/src/Model/StagesModel.php +++ b/administrator/components/com_workflow/src/Model/StagesModel.php @@ -17,6 +17,7 @@ use Joomla\CMS\MVC\Model\ListModel; use Joomla\Database\ParameterType; use Joomla\Database\QueryInterface; +use Joomla\Utilities\ArrayHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; @@ -201,7 +202,7 @@ public function getWorkflow() $table->load($workflowId); } - return (object) $table->getProperties(); + return (object) ArrayHelper::fromObject($table, false); } /** diff --git a/administrator/components/com_workflow/src/Model/TransitionModel.php b/administrator/components/com_workflow/src/Model/TransitionModel.php index 448625d4dc658..9242a22b3920f 100644 --- a/administrator/components/com_workflow/src/Model/TransitionModel.php +++ b/administrator/components/com_workflow/src/Model/TransitionModel.php @@ -17,6 +17,7 @@ use Joomla\CMS\Plugin\PluginHelper; use Joomla\Registry\Registry; use Joomla\String\StringHelper; +use Joomla\Utilities\ArrayHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; @@ -298,7 +299,7 @@ public function getWorkflow() $workflow->load($workflow_id); - return (object) $workflow->getProperties(); + return (object) ArrayHelper::fromObject($workflow, false); } /** diff --git a/administrator/components/com_workflow/src/Model/TransitionsModel.php b/administrator/components/com_workflow/src/Model/TransitionsModel.php index 68c8349e55c0a..142081d9ce105 100644 --- a/administrator/components/com_workflow/src/Model/TransitionsModel.php +++ b/administrator/components/com_workflow/src/Model/TransitionsModel.php @@ -16,6 +16,7 @@ use Joomla\CMS\MVC\Model\ListModel; use Joomla\Database\ParameterType; use Joomla\Database\QueryInterface; +use Joomla\Utilities\ArrayHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; @@ -246,6 +247,6 @@ public function getWorkflow() $table->load($workflowId); } - return (object) $table->getProperties(); + return (object) ArrayHelper::fromObject($table, false); } } diff --git a/components/com_contact/src/Model/FormModel.php b/components/com_contact/src/Model/FormModel.php index 9ea86cd1b9f01..280d88320a1b2 100644 --- a/components/com_contact/src/Model/FormModel.php +++ b/components/com_contact/src/Model/FormModel.php @@ -105,7 +105,7 @@ public function getItem($itemId = null) return false; } - $properties = $table->getProperties(); + $properties = ArrayHelper::fromObject($table, false); $value = ArrayHelper::toObject($properties); // Convert field to Registry. diff --git a/components/com_content/src/Model/FormModel.php b/components/com_content/src/Model/FormModel.php index 35933a855684e..3d1d28440f5e9 100644 --- a/components/com_content/src/Model/FormModel.php +++ b/components/com_content/src/Model/FormModel.php @@ -98,7 +98,7 @@ public function getItem($itemId = null) return false; } - $properties = $table->getProperties(1); + $properties = ArrayHelper::fromObject($table, false); $value = ArrayHelper::toObject($properties); // Convert attrib field to Registry. diff --git a/components/com_tags/src/Model/TagModel.php b/components/com_tags/src/Model/TagModel.php index 8fe1181846741..d11e9d437cc8b 100644 --- a/components/com_tags/src/Model/TagModel.php +++ b/components/com_tags/src/Model/TagModel.php @@ -294,7 +294,7 @@ public function getItem($pk = null) } // Convert the Table to a clean object. - $properties = $table->getProperties(1); + $properties = ArrayHelper::fromObject($table, false); $this->item[] = ArrayHelper::toObject($properties); } catch (\RuntimeException $e) { $this->setError($e->getMessage()); diff --git a/libraries/src/Table/Table.php b/libraries/src/Table/Table.php index c3864603ad58d..a2b6998f71108 100644 --- a/libraries/src/Table/Table.php +++ b/libraries/src/Table/Table.php @@ -26,6 +26,7 @@ use Joomla\Event\DispatcherInterface; use Joomla\Filesystem\Path; use Joomla\String\StringHelper; +use Joomla\Utilities\ArrayHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; @@ -45,7 +46,6 @@ abstract class Table extends \stdClass implements TableInterface, DispatcherAwar use LegacyErrorHandlingTrait; use LegacyPropertyManagementTrait; - /** * Include paths for searching for Table classes. * @@ -728,7 +728,7 @@ public function bind($src, $ignore = []) } // Bind the source value, excluding the ignored fields. - foreach ($this->getProperties() as $k => $v) { + foreach (ArrayHelper::fromObject($this, false) as $k => $v) { // Only process fields not in the ignore array. if (!\in_array($k, $ignore)) { if (\array_key_exists($k, $src)) { @@ -816,7 +816,7 @@ public function load($keys = null, $reset = true) $query = $db->createQuery() ->select('*') ->from($db->quoteName($this->_tbl)); - $fields = array_keys($this->getProperties()); + $fields = array_keys(ArrayHelper::fromObject($this, false)); foreach ($keys as $field => $value) { // Check that $field is in the table. diff --git a/libraries/src/User/User.php b/libraries/src/User/User.php index cef076750124b..1b06de8fd4b03 100644 --- a/libraries/src/User/User.php +++ b/libraries/src/User/User.php @@ -881,7 +881,7 @@ public function load($id) } // Assuming all is well at this point let's bind the data - foreach ($table->getProperties() as $key => $value) { + foreach (ArrayHelper::fromObject($table, false) as $key => $value) { $this->$key = $value; } diff --git a/plugins/content/joomla/src/Extension/Joomla.php b/plugins/content/joomla/src/Extension/Joomla.php index 48aeab9715f08..65e3402dc1251 100644 --- a/plugins/content/joomla/src/Extension/Joomla.php +++ b/plugins/content/joomla/src/Extension/Joomla.php @@ -735,7 +735,7 @@ private function canDeleteCategories($data) $table = $tableInfo[$extension]['table_name']; // See if this category has any content items - $count = $this->countItemsInCategory($table, $data->get('id')); + $count = $this->countItemsInCategory($table, $data->id); // Return false if db error if ($count === false) { @@ -743,7 +743,7 @@ private function canDeleteCategories($data) } else { // Show error if items are found in the category if ($count > 0) { - $msg = Text::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED', $data->get('title')) + $msg = Text::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED', $data->title) . ' ' . Text::plural('COM_CATEGORIES_N_ITEMS_ASSIGNED', $count); $this->getApplication()->enqueueMessage($msg, 'error'); $result = false; @@ -751,12 +751,12 @@ private function canDeleteCategories($data) // Check for items in any child categories (if it is a leaf, there are no child categories) if (!$data->isLeaf()) { - $count = $this->countItemsInChildren($table, $data->get('id'), $data); + $count = $this->countItemsInChildren($table, $data->id, $data); if ($count === false) { $result = false; } elseif ($count > 0) { - $msg = Text::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED', $data->get('title')) + $msg = Text::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED', $data->title) . ' ' . Text::plural('COM_CATEGORIES_HAS_SUBCATEGORY_ITEMS', $count); $this->getApplication()->enqueueMessage($msg, 'error'); $result = false; diff --git a/tests/Integration/Libraries/Cms/Table/TableTest.php b/tests/Integration/Libraries/Cms/Table/TableTest.php index 9937ab281a166..abef0abf7a68d 100644 --- a/tests/Integration/Libraries/Cms/Table/TableTest.php +++ b/tests/Integration/Libraries/Cms/Table/TableTest.php @@ -209,7 +209,11 @@ public function testBindJSONEncodesFields() ], ]; - $this->object->set('_jsonEncode', ['params']); + $reflection = new \ReflectionClass($this->object); + $reflection_property = $reflection->getProperty('_jsonEncode'); + $reflection_property->setAccessible(true); + + $reflection_property->setValue($this->object, ['params']); $this->object->bind($data);