Add namespaces

The module name of the included files is set by default as 'myexample'.

In this description we say, that the name of the module, which you want to adapt, is 'mymodule'. So, if you copy the code from this tutorial then replace 'mymodule' by your module name.

Pay attention to upper case: if in the tutorial there is 'Mymodule' then your module name must also starts with upper case.

In this example we say mymodule contains categories and items

1) copy the folder /preloads to your module and change the name of the class in core.php

replace

class MyexampleCorePreload extends XoopsPreloadItem

by

class MymoduleCorePreload extends XoopsPreloadItem

the first character must be capital (MymoduleCorePreload, not mymoduleCorePreload)

2) split each class in your folder /class folder into Class and ClassHandler

e.g. you have till now "items.php"

  • split into Items.php and ItemsHandler.php (first character of module name must be capital, and "Handler" must also start with capital)

    add to each

    namespace XoopsModules\Mymodule;

    (first character of module name must be capital)

  • in Items.php

    • remove the ItemsHandler code (all from "class MymodulesItemsHandler extends XoopsPersistableObjectHandler")

    • change

      class MymoduleItems extends XoopsObject

      into

      class Items extends \XoopsObject
    • in ItemsHandler.php

      • remove the Class code (all from "class MymodulesItems extends XoopsObject")

      • change

        • replace

          class MymoduleItemsHandler extends XoopsPersistableObjectHandler

          by

          class ItemsHandler extends \XoopsPersistableObjectHandler
        • change in: public function __construct(\XoopsDatabase $db)

          replace

          parent::__construct($db, 'mymodule_items', 'mymoduleitemss', 'item_id', 'item_title');

          by

          parent::__construct($db, 'mymodule_items', Items::class, 'item_id', 'item_title');"
      • the same for categories.php

3) add or replace Helper.php class

for consistency we call the class "Helper" and the variable "$helper" in all modules. Because it will be in namespace, we'll know exactly from which module it is coming from during debugging, so there is no need anymore to call it "$publisher", etc.

replace in Helper.php

namespace XoopsModules\Myexample;

by

namespace XoopsModules\Mymodule;

4) replace all instantiation calls to the ClassHandler classes using XOOPS

to call directly, e.g calling handler for items in mymodule

  • as

    new \Mymodule\ItemsHandler()
  • or using Helper

    $itemsHandler = \XoopsModules\Mymodule\Helper::getInstance()->getHandler('Items');

Please note: use the exact name of the class, incl. first letter in CAPS, because we don't want the Helper to deal with it, since some classes might have names like "ClassBestInTheWorld"

5) when you using a namespaced Class, add on top the import code, e.g.:

use XoopsModules\Mymodule\Items;
use XoopsModules\Mymodule\Categories;

6) replace all Xoops classes by calling the namespaces

  • general Xoops objects

    XoopsUser by \XoopsUser
    XoopsLists by \XoopsLists
    XoopsDatabase by \XoopsDatabase
    XoopsMediaUploader by \XoopsMediaUploader
    XoopsPageNav by \XoopsPageNav
    XoopsTpl by \XoopsTpl
    XoopsModule by \XoopsModule
    XoopsPreloadItem by \XoopsPreloadItem
    CriteriaCompo by \CriteriaCompo
    Criteria by \Criteria
  • Xoops form objects

    XoopsThemeForm by \XoopsThemeForm
    XoopsFormSelect by \XoopsFormSelect
    XoopsFormText by \XoopsFormText
    and so on for each XoopsForm...

7) Usage of Xmf\Request

Add to each file where you want to replace XoopsRequest by Xmf\Request the call

use Xmf\Request;

now you can repace e.g.

$op = XoopsRequest::getString('op', 'list');

by

$op = Request::getString('op', 'list');

One more thing

in few cases you might include in header.php the call:

include dirname(__DIR__) . '/preloads/autoloader.php';

Because some files might not be aware of the namespaces.