1. Getting Started
      1. Basic Installation
      2. What is MODx
    2. Content Editing
      1. Editing Documents
      2. MODx Tags
        1. Document Variables
      3. Terminology
      4. The Manager
      5. Who Should Read This
    3. Designing
      1. Adding Chunks
      2. Adding MODx Tags
        1. Resource Fields
      3. Adding Snippets
      4. Document Caching
      5. Template Basics
    4. Administration
      1. Friendly URL Solutions
      2. Manager Users
        1. Manager Roles And Groups
        2. Reset your Password - Unblock your User
        3. Why Manager Users, Roles and Groups
      3. Moving Site
      4. Taking sites down for maintenance
      5. Upgrading
      6. Web Users
        1. Creating a Web User
        2. Web User Groups and Document Groups
        3. Why Web Users and Groups
    5. Developer's Guide
      1. API Reference
        1. DBAPI
          1. delete
          2. escape
          3. getInsertId
          4. query
          5. select
          6. update
        2. Document Object
        3. DocumentParser Object
          1. addEventListener
          2. changeWebUserPassword
          3. documentContent
          4. documentGenerated
          5. documentIdentifier
          6. documentListing
          7. documentMethod
          8. documentObject
          9. getAllChildren
          10. getCachePath
          11. getChildIds
          12. getDocumentChildren
          13. getDocumentChildrenTVarOutput
          14. getDocumentChildrenTVars
          15. getLoginUserID
          16. getLoginUserName
          17. getLoginUserType
          18. getManagerPath
          19. getParent
          20. getParentIds
          21. getUserData
          22. hasPermission
          23. isBackend
          24. isFrontend
          25. logEvent
          26. maxParserPasses
          27. minParserPasses
          28. regClientCSS
          29. runSnippet
          30. table_prefix
          31. tstart
          32. webAlert
      2. Chunks
      3. Modules
        1. How to create and run a module from within the Content Manager
        2. Managing module dependencies
        3. Setting up configuration parameters
        4. Writing the module code
      4. Plugins
      5. Snippets
      6. Template Variables
        1. (at) Binding
          1. (at)CHUNK
          2. (at)DIRECTORY
          3. (at)DOCUMENT
          4. (at)EVAL
          5. (at)FILE
          6. (at)INHERIT
          7. (at)SELECT
          8. What are (at) Bindings
        2. Creating a Template Variable
        3. What are Template Variables
        4. Widgets
          1. Misc. Widget
          2. DataGrid Widget
          3. Floater Widget
          4. Hyperlink Widget
          5. Marquee Widget
          6. RichTextBox Widget
          7. Ticker Widget
          8. Viewport Widget
          9. What are Widgets

Writing the module code

There are many ways to roll your own code but for this tutorial we are going to code our module so that it can make use of the MODx APIs.

When a module is first executed the code stored inside the PHP field is evaluated or called from within the execute_module.inc.php file. This means that our module can reference the $modx variable when it's executed.

For example:

$doc = $modx->getDocument(1);
echo $doc['pagetitle'];

In the above example we can either use the echo keyword or the return keyword to render text on the screen.

If you where to paste the above code inside the phone book module you would see the page title of document 1 been displayed. In my case you would display the following:

Introduction

We would also rewrite the above as:

$doc = $modx->getDocument(1);
return $doc['pagetitle'];

This time we are using the return keyword to render text on the screen.

Using the echo keyword might be more convenient for your specific need.

For example:

echo '<h1>Phone book</h1>';
echo '<h3>Manage your contacts with ease</h3>';
echo '<hr />';

Now that you have gotten the basic idea of how a module works you can proceed to write your module the same way you would any PHP app with exception that your app will be running inside a frame and will have access to the MODx APIs.

Another thing to bear in mind is that the content manager will execute your module for every postback, providing that you send your postbacks to the page where the module was first executed.

In other words if you load or link to an external page after the module have been executed then the MODx APIs will not be available for those pages.

In order to use the MODx APIs you should postback to the initial page. To do this you could just simply wrap my pages inside a single

and use the following postForm function posting form data or calling another page from the module:

<script language="JavaScript" type="text/javascript">

   function postForm(opcode){

        document.module.opcode.value=opcode;

        document.module.submit();

   }

</script>



<form name="module" method="post">

<input name="opcode" type="hidden" value="" />

<!-- content goes here -->

</form>

Note: The opcode field can be used as a function directive for calling an action from within the module.

When sending information back to the server you can use:

<a href="javascript:;" onclick="postForm('save')">Save</a>

<a href="javascript:;" onclick="postForm('delete')">Delete</a>

<a href="javascript:;" onclick="postForm('search')">Search List</a>

Here's what the final module code might look like.

/* A simple module */



$opcode = isset($_POST['opcode']) ? $_POST['opcode']:'';



// action directive

switch($opcode) {

        case 'save':

                // save code here

                echo 'Save action';

        break;



        case 'delete':

                // delete code here

                echo 'Delete action';

        break;



        case 'search':

                // search code here

                echo 'Search action';

        break;



        default: // display module page

                echo '<html>';

                echo '<head></head>';

                echo '<body>';

                echo '<script language="JavaScript" type="text/javascript">';

                echo '   function postForm(opcode){';

                echo '        document.module.opcode.value=opcode;';

                echo '        document.module.submit();';

                echo '   }';

                echo '</script>';

                echo '<form name="module" method="post">';

                echo '<input name="opcode" type="hidden" value="" />';

                echo '<h1>Phone book</h1>';

                echo '<h3>Manage your contacts with ease</h3>';

                echo '<hr />';

                echo '<a href="javascript:;" onclick="postForm(\'save\');return
false;">Save</a> | ';
                echo '<a href="javascript:;" onclick="postForm(\'delete\');return
false;">Delete</a> | ';
                echo '<a href="javascript:;" onclick="postForm(\'search\');return
false;">Search List</a> | ';
                echo '<a href="javascript:;" onclick="postForm(\'\');return
false;">Main</a>';
                echo '</form>';

                echo '</body>';

                echo '</html>';

        break;


}


Suggest an edit to this page on GitHub (Requires GitHub account. Opens a new window/tab).