├── ProcessHello.css ├── ProcessHello.info.php ├── ProcessHello.js ├── ProcessHello.module.php ├── README.md ├── extras └── ProcessHello.config.php ├── languages ├── de.csv └── es.csv └── views ├── execute.php └── something-else.php /ProcessHello.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This optional CSS file is only loaded when the ProcessHello module is run 3 | * 4 | * Remove it if you have no CSS styles to add. 5 | * 6 | */ 7 | 8 | 9 | -------------------------------------------------------------------------------- /ProcessHello.info.php: -------------------------------------------------------------------------------- 1 | Refresh before you see them. 14 | * 15 | */ 16 | 17 | $info = array( 18 | 19 | // Your module's title 20 | 'title' => 'Hello: Process Module Example', 21 | 22 | // A 1 sentence description of what your module does 23 | 'summary' => 'A starting point module skeleton from which to build your own Process module.', 24 | 25 | // Module version number (integer) 26 | 'version' => 2, 27 | 28 | // Name of person who created this module (change to your name) 29 | 'author' => 'Ryan Cramer', 30 | 31 | // Icon to accompany this module (optional), uses font-awesome icon names, minus the "fa-" part 32 | 'icon' => 'thumbs-up', 33 | 34 | // Indicate any requirements as CSV string or array containing [RequiredModuleName][Operator][Version] 35 | 'requires' => 'ProcessWire>=3.0.164', 36 | 37 | // URL to more info: change to your full modules.processwire.com URL (if available), or something else if you prefer 38 | 'href' => 'https://processwire.com/modules/process-hello/', 39 | 40 | // name of permission required of users to execute this Process (optional) 41 | 'permission' => 'helloworld', 42 | 43 | // permissions that you want automatically installed/uninstalled with this module (name => description) 44 | 'permissions' => array( 45 | 'helloworld' => 'Run the HelloWorld module' 46 | ), 47 | 48 | // page that you want created to execute this module 49 | 'page' => array( 50 | 'name' => 'helloworld', 51 | 'parent' => 'setup', 52 | 'title' => 'Hello World' 53 | ), 54 | 55 | // optional extra navigation that appears in admin drop down menus 56 | 'nav' => array( 57 | array( 58 | 'url' => '', 59 | 'label' => 'Hello', 60 | 'icon' => 'smile-o', 61 | ), 62 | array( 63 | 'url' => 'something/', 64 | 'label' => 'Something', 65 | 'icon' => 'beer', 66 | ), 67 | array( 68 | 'url' => 'something-else/', 69 | 'label' => 'Something Else', 70 | 'icon' => 'glass', 71 | ), 72 | array( 73 | 'url' => 'form/', 74 | 'label' => 'Simple form', 75 | 'icon' => 'building', 76 | ), 77 | ) 78 | 79 | // for more options that you may specify here, see the file: /wire/core/Process.php 80 | // and the file: /wire/core/Module.php 81 | 82 | ); 83 | -------------------------------------------------------------------------------- /ProcessHello.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This JS file is only loaded when the ProcessHello module is run 3 | * 4 | * You should delete it if you have no javascript to add. 5 | * 6 | */ 7 | 8 | jQuery(document).ready(function($) { 9 | // do something 10 | }); 11 | -------------------------------------------------------------------------------- /ProcessHello.module.php: -------------------------------------------------------------------------------- 1 | set('greeting', 'Happy hello world to you'); 26 | $this->set('greetingType', 'message'); 27 | } 28 | 29 | /** 30 | * This is an optional initialization function called before any execute functions. 31 | * 32 | * If you don't need to do any initialization common to every execution of this module, 33 | * you can simply remove this init() method. 34 | * 35 | */ 36 | public function init() { 37 | parent::init(); // always remember to call the parent init 38 | } 39 | 40 | /** 41 | * This method is executed when a page with your Process assigned is accessed. 42 | * 43 | * This can be seen as your main or index function. You'll probably want to replace 44 | * everything in this function. 45 | * 46 | * Return value is typically direct HTML markup. But it can also be an associative 47 | * array of variables to pass to a view file named either 'ProcessHello.view.php' 48 | * or 'views/execute.php' (demonstrated here). 49 | * 50 | * @return string|array 51 | * 52 | */ 53 | public function ___execute() { 54 | 55 | if($this->greetingType == 'error') { 56 | $this->error($this->greeting); 57 | } else if($this->greetingType == 'warning') { 58 | $this->warning($this->greeting); 59 | } else { 60 | $this->message($this->greeting); 61 | } 62 | 63 | // send variable(s) to the view file 64 | return [ 65 | 'subhead' => $this->_('What do you want to do today?'), 66 | 'actions' => [ 67 | './something/' => $this->_('Something'), 68 | './something-else/' => $this->_('Something else'), 69 | './form/' => $this->_('Simple form'), 70 | ] 71 | ]; 72 | } 73 | 74 | /** 75 | * Called when the URL is this module’s page URL + "/something/" 76 | * 77 | * For this method, we are demonstrate returning markup directly, without 78 | * using a separate view file (this is much more common). 79 | * 80 | * @return string|array 81 | * 82 | */ 83 | public function ___executeSomething() { 84 | 85 | // Set a new headline, replacing the one used by our page. 86 | // This is optional as PW will auto-generate a headline. 87 | $this->headline($this->_('This is something')); 88 | 89 | // Add a breadcrumb that returns to our main page . 90 | // This is optional as PW will auto-generate breadcrumbs 91 | $this->breadcrumb('../', $this->_('Hello')); 92 | 93 | // example values we will include in our output 94 | $users = $this->users->find('sort=name, limit=50'); 95 | 96 | // Demonstrates using markup (string) as the return value, 97 | // rather than a separate view file. 98 | return 99 | "

" . sprintf($this->_('Your system has %d users'), $users->getTotal()) . "

" . 100 | ""; 101 | } 102 | 103 | /** 104 | * Handles the ./something-else/ URL 105 | * 106 | * In this case we are again using a separate view file, like we did 107 | * in the execute() method. The view can be named any of the following 108 | * (your choice): 109 | * 110 | * 1. views/something-else.php (this is the one we're using) 111 | * 2. views/execute-something-else.php 112 | * 3. ProcessHello-something-else.php 113 | * 114 | * @return string|array 115 | * 116 | */ 117 | public function ___executeSomethingElse() { 118 | 119 | $pages = $this->wire()->pages; 120 | 121 | $this->headline($this->_('This is something else!')); 122 | $this->message(sprintf($this->_('There are %d pages in this site'), $pages->count())); 123 | 124 | // send variables to our something-else.php view file: 125 | return [ 126 | 'subhead' => $this->_('Here are the last 10 created pages:'), 127 | 'newPages' => $pages->find("sort=-created, limit=10"), 128 | ]; 129 | } 130 | 131 | /** 132 | * Handles the ./form/ URL 133 | * 134 | * This is a simple example of creating and processing a form that 135 | * uses ProcessWire’s Inputfield modules. 136 | * 137 | * @return string 138 | * 139 | */ 140 | public function ___executeForm() { 141 | 142 | $modules = $this->wire()->modules; 143 | $input = $this->wire()->input; 144 | 145 | $this->headline($this->_('Here is a simple form')); // the

headline 146 | $this->browserTitle($this->_('Simple form example')); // The tag 147 | 148 | /** @var InputfieldForm $form */ 149 | $form = $modules->get('InputfieldForm'); 150 | $form->description = $this->_('Please fill this out and submit'); 151 | 152 | /** @var InputfieldText $field */ 153 | $field = $modules->get('InputfieldText'); 154 | $field->attr('name', 'notice_text'); 155 | $field->label = $this->_('Text to display in a notification'); 156 | $field->icon = 'file-text-o'; 157 | $field->required = true; 158 | $form->add($field); 159 | 160 | /** @var InputfieldSubmit $submit */ 161 | $submit = $modules->get('InputfieldSubmit'); 162 | $submit->attr('name', 'submit_now'); 163 | $submit->val($this->_('Submit now')); 164 | $submit->icon = 'smile-o'; 165 | $submit->addActionValue('exit', $this->_('Submit and exit'), 'frown-o'); // after-submit actions 166 | $submit->addActionValue('pages', $this->_('Submit and go to page list'), 'meh-o'); 167 | $form->add($submit); 168 | 169 | // check if form has been submitted 170 | if($input->post($submit->name)) $this->processForm($form); 171 | 172 | return $form->render(); 173 | } 174 | 175 | /** 176 | * Process an Inputfields form and respond to requested submit action 177 | * 178 | * @param InputfieldForm $form 179 | * 180 | */ 181 | protected function processForm(InputfieldForm $form) { 182 | 183 | $input = $this->wire()->input; 184 | $session = $this->wire()->session; 185 | $config = $this->wire()->config; 186 | 187 | // process the form 188 | $form->processInput($input->post); 189 | 190 | // return now if form had errors 191 | if(count($form->getErrors())) return; 192 | 193 | // no errors: display notification with user’s entered text 194 | $value = $form->getChildByName('notice_text')->val(); 195 | $this->message($this->_('Your notification text') . " - $value"); 196 | 197 | /** @var InputfieldSubmit $submit */ 198 | $submit = $form->getChildByName('submit_now'); 199 | 200 | // user selected: submit and exit 201 | if($submit->submitValue === 'exit') $session->redirect('../'); 202 | 203 | // user selected: submit and go to page list 204 | if($submit->submitValue === 'pages') $session->redirect($config->urls->admin); 205 | } 206 | 207 | 208 | /** 209 | * Called only when your module is installed 210 | * 211 | * If you don't need anything here, you can simply remove this method. 212 | * 213 | */ 214 | public function ___install() { 215 | parent::___install(); // Process modules must call parent method 216 | } 217 | 218 | /** 219 | * Called only when your module is uninstalled 220 | * 221 | * This should return the site to the same state it was in before the module was installed. 222 | * 223 | * If you don't need anything here, you can simply remove this method. 224 | * 225 | */ 226 | public function ___uninstall() { 227 | parent::___uninstall(); // Process modules must call parent method 228 | } 229 | 230 | /** 231 | * Get module configuration inputs 232 | * 233 | * As an alternative, configuration can also be specified in an external file 234 | * with a PHP array. See an example in the /extras/ProcessHello.config.php file. 235 | * 236 | * @param InputfieldWrapper $inputfields 237 | * 238 | */ 239 | public function getModuleConfigInputfields(InputfieldWrapper $inputfields) { 240 | $modules = $this->wire()->modules; 241 | 242 | /** @var InputfieldText $f */ 243 | $f = $modules->get('InputfieldText'); 244 | $f->attr('name', 'greeting'); 245 | $f->label = $this->_('Hello greeting'); 246 | $f->description = $this->_('What would you like to say to people using this module?'); 247 | $f->attr('value', $this->greeting); 248 | $inputfields->add($f); 249 | 250 | /** @var InputfieldRadios $f */ 251 | $f = $modules->get('InputfieldRadios'); 252 | $f->attr('name', 'greetingType'); 253 | $f->label = $this->_('Greeting type'); 254 | $f->addOption('message', $this->_('Message')); 255 | $f->addOption('warning', $this->_('Warning')); 256 | $f->addOption('error', $this->_('Error')); 257 | $f->optionColumns = 1; // make it display options on 1 line 258 | $f->notes = $this->_('Choose wisely'); // like description but appears under field 259 | $f->attr('value', $this->greetingType); 260 | $inputfields->add($f); 261 | } 262 | 263 | } 264 | 265 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # “Hello World” Process Module for ProcessWire 2 | 3 | A starting point skeleton from which to build your own Process module. 4 | Process modules are used primarily for building admin applications and tools 5 | in ProcessWire. This module also creates a page in the ProcessWire admin to 6 | run itself from. Requires ProcessWire 3.x. 7 | 8 | ## What this modules demonstrates 9 | 10 | This module demonstrates everything you would need to create a Process module. 11 | It also demonstrates many things that you may not need, but things that are 12 | still good to know about. 13 | 14 | - How to create an index `execute()` method that are called for your Process 15 | module’s main/index URL. 16 | - How to create `executeMethodName()` methods that are automatically called 17 | when URL segment matches `method-name/`. 18 | - How to return markup from your URL handling methods directly. 19 | - How to use separate markup “view” files your URL handling methods. 20 | - How to create message, warning and error notifications in the admin. 21 | - How to set the admin headline, breadcrumbs and browser `<title>` tag. 22 | - How to define drop-down navigation for your Process module. 23 | - How to create and process a simple form that uses Inputfield modules. 24 | - How to provide additional submit actions in the form submit button. 25 | - How to make the Process module configurable. 26 | - How to provide multi-language translations for the module. 27 | - And more… 28 | 29 | 30 | ## How to install this module 31 | 32 | 1. Copy all of the module files to `/site/modules/ProcessHello/`. 33 | 34 | 2. In your admin, go to Modules > Refresh. 35 | 36 | 3. Click “Install” for the “Process > Hello” module (on the “Site” tab). 37 | 38 | 39 | ## How to test this module 40 | 41 | 1. Configure the module from the module configuration screen and Save. 42 | 43 | 3. Click to Setup > Hello. 44 | 45 | 4. After testing it, open the `.module.php` file in your editor and 46 | see how it works. Use it as a starting point for your own Process module. 47 | 48 | *If in a multi-language environment running ProcessWire 3.0.181 or newer, 49 | see the “install translations” link in the “Module Information” fieldset, 50 | when on the module configuration screen. Here you can optionally install 51 | other language translations for the module.* 52 | 53 | 54 | ## How to use this to make your own Process module 55 | 56 | To see exactly what this module does, you may want to install it as-is first. 57 | Then uninstall and follow the instructions below. 58 | 59 | 1. Rename the `ProcessHello.module.php` file to be `ProcessModuleName.module.php`, 60 | replacing the `ModuleName` portion with your module/class name you wish to use. 61 | 62 | 2. In the `.module.php` file change the class name at the top to be to be 63 | `ProcessModuleName`, again replacing the `ModuleName` portion with your own. 64 | 65 | 3. Edit the `ProcessModuleName.module.php` file to do what you want. In addition: 66 | 67 | - Remove and/or repurpose methods you don’t need. 68 | - Remove the `/extras/` dir as it only is there for extra examples. 69 | - If you don’t want to use separate view files, you can remove the `/views/` dir. 70 | - If you don’t want to bundle languages you can remove the `/languages/` dir. 71 | 72 | 4. If your module needs its own CSS and/or JS files, rename those included to be the same as 73 | your module name and modify them to do whatever you want. If your module does NOT need 74 | CSS and/or JS files then delete them. 75 | 76 | 5. Rename the `ProcessHello.info.php` file to `ProcessModuleName.info.php` and edit it, 77 | updating it specific to your module and information. 78 | 79 | 6. If you DO want your module to be configurable: 80 | 81 | - Update the `getModuleConfigInputfields()` method at the botton of the module file. 82 | - Update the `$this->set('property', 'value')` statements in the `__construct()` 83 | method to specify your default configuration values. 84 | - Update the phpdoc comments above the class to document your configuration properties. 85 | 86 | *Note: If you prefer a separate configuration file, see the example and instructions in the 87 | `/extras/ProcessHello.config.php` file rather than the steps above.* 88 | 89 | 7. If you DO NOT want your module to be configurable: 90 | 91 | - Remove the `ConfigurableModule` interface/text from the module’s class definition. 92 | - Remove the `getModuleConfigInputfields()` method at the bottom of the module file. 93 | - Remove the `$this->set('property', 'value')` statements from the `__construct()` method. 94 | If that leaves the method blank (other than the parent call) you can just remove the 95 | method construct entirely. 96 | - Remove the phpdoc comments at the top of the class referring to configuration variables. 97 | 98 | 8. If you do want to bundle translations of your module for other languages see the section 99 | after this one. 100 | 101 | 9. Update this README.md file to contain information specific to your module. 102 | 103 | When you've got something you'd like to share, post your module to GitHub and to 104 | the ProcessWire modules directory at: <https://processwire.com/modules/>`. 105 | 106 | 107 | ## Bundling multi-language translations with your module 108 | 109 | This requires ProcessWire 3.0.181+ and that you have multi-language support installed. 110 | 111 | - Locate the files you want to translate from your admin: Setup > Languages > 112 | language > Site files > Find files to translate. Select the file(s) and submit. 113 | ProcessWire will generate new empty `.json` files for the files you selected to 114 | translate. 115 | 116 | - In Setup > Languages > language, click the "edit" link for file(s) added for 117 | your module. Translate the text into the desired language and save. Near the top 118 | of the translation screen is a link to "Download a CSV file". Click that to save 119 | the CSV file of translations. 120 | 121 | - Copy the CSV file(s) you downloaded in the previous step into a `/languages/` 122 | directory in your module’s path. For instance `/site/modules/ProcessHello/languages/` 123 | is the one you'll see with this module. While not required, I recommend naming 124 | your files with the ISO-639-1 language code. For instance, German would be 125 | `de.csv`, Spanish would be `es.csv`, Finnish would be `fi.csv`, etc. 126 | 127 | - If your module has multiple translatable files, you can bundle all the translations 128 | into a single CSV file (just copy and paste into one), or you can have multiple 129 | `.csv` files for each language. For instance, if this module had both 130 | `Helloworld.module` and `ProcessHelloworld.module` files, we might choose to name our 131 | csv files `es-main.csv` and `es-process.csv`. Or we could just have an `es.csv` 132 | file that merges that translations from both of them. 133 | 134 | - In your module’s documentation, instruct the user to install translations from 135 | your module’s info/config screen. It’s in the “Module Information” fieldset 136 | “Languages” row, where there is an “install translations” link. When new versions 137 | of your module also update the translations, make note of that in your changelog 138 | so that users will know to click the “install translations” again to update 139 | the translations. 140 | 141 | 142 | ## Other ProcessWire demo modules by Ryan: 143 | 144 | - Hello World general module demonstration: <https://processwire.com/modules/helloworld/> 145 | - Fieldtype and Inputfield module demonstration: <https://processwire.com/modules/fieldtype-events/> 146 | 147 | Stop by the [ProcessWire forums](https://processwire.com/talk/) anytime and we will be glad 148 | to help with any questions. 149 | 150 | ------ 151 | [ProcessWire](https://processwire.com) Copyright 2021 by Ryan Cramer 152 | 153 | 154 | 155 | -------------------------------------------------------------------------------- /extras/ProcessHello.config.php: -------------------------------------------------------------------------------- 1 | <?php namespace ProcessWire; 2 | 3 | /** 4 | * Configure the Hello World module 5 | * 6 | * This is an example of using an external configuration file for a module. 7 | * 8 | * If you want to use this rather than the getModuleConfigInputfields() method 9 | * in the module, do the following: 10 | * 11 | * - Move this file into the same directroy as the ProcessHello.module.php file. 12 | * - Remove the getModuleConfigInputfields() method from the module file. 13 | * - Remove the $this->set(...) calls in the __construct() method of the module file. 14 | * 15 | */ 16 | 17 | $config = [ 18 | // Text field: greeting 19 | 'greeting' => [ 20 | 'type' => 'text', // type of field (any Inputfield module name) 21 | 'label' => __('Hello Greeting'), // field label 22 | 'description' => __('What would you like to say to people using this module?'), 23 | 'required' => true, 24 | 'value' => __('A very happy hello world to you.'), // default value 25 | ], 26 | 27 | // Radio buttons: greetingType 28 | 'greetingType' => [ 29 | 'type' => 'radios', 30 | 'label' => __('Greeting Type'), 31 | 'options' => [ 32 | // options array of value => label 33 | 'message' => __('Message'), 34 | 'warning' => __('Warning'), 35 | 'error' => __('Error'), 36 | ], 37 | 'value' => 'warning', // default value 38 | 'optionColumns' => 1, // make options display on one line 39 | 'notes' => __('Choose wisely'), // like description but appears under field 40 | ] 41 | ]; 42 | -------------------------------------------------------------------------------- /languages/de.csv: -------------------------------------------------------------------------------- 1 | en,de,description,file,hash 2 | "What do you want to do today?","Was willst Du heute machen?",,site/modules/ProcessHello/ProcessHello.module.php,7fee16fad9f38b1729454ce94ca3c7b2 3 | Something,Etwas,,site/modules/ProcessHello/ProcessHello.module.php,73f9977556584a369800e775b48f3dbe 4 | "Something else","Etwas anderes",,site/modules/ProcessHello/ProcessHello.module.php,bf086eb471716d6e62b731268d06807d 5 | "Simple form","Einfache Form",,site/modules/ProcessHello/ProcessHello.module.php,e3679dc84f9d6931e09488a7c52c8815 6 | "This is something","Das ist etwas",,site/modules/ProcessHello/ProcessHello.module.php,a2ddd156f3c1267455edd51407fb6e62 7 | Hello,Hallo,,site/modules/ProcessHello/ProcessHello.module.php,8b1a9953c4611296a827abf8c47804d7 8 | "Your system has %d users","Ihr System hat %d Benutzer",,site/modules/ProcessHello/ProcessHello.module.php,264ba2a8e101571c519a9b1caeb24a71 9 | "This is something else!","Das ist etwas anderes!",,site/modules/ProcessHello/ProcessHello.module.php,aae56b6966ff8e4a12e2fc5c7598d5c0 10 | "There are %d pages in this site","Es gibt %d Seiten auf dieser Site",,site/modules/ProcessHello/ProcessHello.module.php,b11a5d947f20ec730b927da7761ee998 11 | "Here are the last 10 created pages:","Hier sind die letzten 10 erstellten Seiten:",,site/modules/ProcessHello/ProcessHello.module.php,f6027c2b38901f5589683c94cd94441c 12 | "Here is a simple form","Hier ist ein einfaches Formular","the <h1> headline",site/modules/ProcessHello/ProcessHello.module.php,a41ef3b4257d7587595cb19999be692f 13 | "Simple form example","Einfaches Formularbeispiel","The <title> tag",site/modules/ProcessHello/ProcessHello.module.php,f9ab6477b5602fd9dbd9f74145162a3f 14 | "Please fill this out and submit","Bitte ausfüllen und absenden",,site/modules/ProcessHello/ProcessHello.module.php,6e81d468def9d2595367b8f9a86511bd 15 | "Text to display in a notification","Text, der in einer Benachrichtigung angezeigt werden soll",,site/modules/ProcessHello/ProcessHello.module.php,43e656eecbd70ec8e7fb2dbf2dcf5035 16 | "Submit now","Jetzt Absenden",,site/modules/ProcessHello/ProcessHello.module.php,f4c6249c1ee4f56d258f0df42d53b5d6 17 | "Submit and exit","Abschicken und beenden","after-submit actions",site/modules/ProcessHello/ProcessHello.module.php,ea1aa9759098b06b3390767525016f3d 18 | "Submit and go to page list","Absenden und zur Seitenliste gehen",,site/modules/ProcessHello/ProcessHello.module.php,77c4dfe2c81738c5be7016bc6fbc2e36 19 | "Your notification text","Ihr Benachrichtigungstext",,site/modules/ProcessHello/ProcessHello.module.php,164d6bc93c69ffb92c864d0075a89194 20 | "Hello greeting",Gruß,,site/modules/ProcessHello/ProcessHello.module.php,d45a185f39ebf2d9c038c79319c4862a 21 | "What would you like to say to people using this module?","Was möchten Sie den Nutzern dieses Moduls sagen?",,site/modules/ProcessHello/ProcessHello.module.php,3140300e109e122fe267a7866f3c2d81 22 | "Greeting type",Begrüßungstyp,,site/modules/ProcessHello/ProcessHello.module.php,b372ad4948d8265b4ca3796845eb2248 23 | Message,Botschaft,,site/modules/ProcessHello/ProcessHello.module.php,4c2a8fe7eaf24721cc7a9f0175115bd4 24 | Warning,Warnung,,site/modules/ProcessHello/ProcessHello.module.php,0eaadb4fcb48a0a0ed7bc9868be9fbaa 25 | Error,=,,site/modules/ProcessHello/ProcessHello.module.php,902b0d55fddef6f8d651fe1035b7d4bd 26 | "Choose wisely","Wähle mit Bedacht","like description but appears under field",site/modules/ProcessHello/ProcessHello.module.php,10a0bec7ff2c573bc34c97cfe5e76a6a -------------------------------------------------------------------------------- /languages/es.csv: -------------------------------------------------------------------------------- 1 | en,es,description,file,hash 2 | "What do you want to do today?","¿Qué quieres hacer hoy?",,site/modules/ProcessHello/ProcessHello.module.php,7fee16fad9f38b1729454ce94ca3c7b2 3 | Something,"Alguna cosa",,site/modules/ProcessHello/ProcessHello.module.php,73f9977556584a369800e775b48f3dbe 4 | "Something else","Algo más",,site/modules/ProcessHello/ProcessHello.module.php,bf086eb471716d6e62b731268d06807d 5 | "Simple form","Forma simple",,site/modules/ProcessHello/ProcessHello.module.php,e3679dc84f9d6931e09488a7c52c8815 6 | "This is something","Esto es algo",,site/modules/ProcessHello/ProcessHello.module.php,a2ddd156f3c1267455edd51407fb6e62 7 | Hello,Hola,,site/modules/ProcessHello/ProcessHello.module.php,8b1a9953c4611296a827abf8c47804d7 8 | "Your system has %d users","Su sistema tiene %d usuarios",,site/modules/ProcessHello/ProcessHello.module.php,264ba2a8e101571c519a9b1caeb24a71 9 | "This is something else!","¡Esto es otra cosa!",,site/modules/ProcessHello/ProcessHello.module.php,aae56b6966ff8e4a12e2fc5c7598d5c0 10 | "There are %d pages in this site","aquí hay %d páginas en este sitio",,site/modules/ProcessHello/ProcessHello.module.php,b11a5d947f20ec730b927da7761ee998 11 | "Here are the last 10 created pages:","Aquí están las últimas 10 páginas creadas:",,site/modules/ProcessHello/ProcessHello.module.php,f6027c2b38901f5589683c94cd94441c 12 | "Here is a simple form","Aquí hay un formulario simple","the <h1> headline",site/modules/ProcessHello/ProcessHello.module.php,a41ef3b4257d7587595cb19999be692f 13 | "Simple form example","Ejemplo de forma simple","The <title> tag",site/modules/ProcessHello/ProcessHello.module.php,f9ab6477b5602fd9dbd9f74145162a3f 14 | "Please fill this out and submit","Por favor complete esto y envíelo",,site/modules/ProcessHello/ProcessHello.module.php,6e81d468def9d2595367b8f9a86511bd 15 | "Text to display in a notification","Texto para mostrar en una notificación",,site/modules/ProcessHello/ProcessHello.module.php,43e656eecbd70ec8e7fb2dbf2dcf5035 16 | "Submit now","Aplique ahora",,site/modules/ProcessHello/ProcessHello.module.php,f4c6249c1ee4f56d258f0df42d53b5d6 17 | "Submit and exit","Enviar y salir","after-submit actions",site/modules/ProcessHello/ProcessHello.module.php,ea1aa9759098b06b3390767525016f3d 18 | "Submit and go to page list","Enviar e ir a la lista de páginas",,site/modules/ProcessHello/ProcessHello.module.php,77c4dfe2c81738c5be7016bc6fbc2e36 19 | "Your notification text","Su texto de notificación",,site/modules/ProcessHello/ProcessHello.module.php,164d6bc93c69ffb92c864d0075a89194 20 | "Hello greeting",Saludo,,site/modules/ProcessHello/ProcessHello.module.php,d45a185f39ebf2d9c038c79319c4862a 21 | "What would you like to say to people using this module?","¿Qué le gustaría decirles a las personas que utilizan este módulo?",,site/modules/ProcessHello/ProcessHello.module.php,3140300e109e122fe267a7866f3c2d81 22 | "Greeting type","Tipo de saludo",,site/modules/ProcessHello/ProcessHello.module.php,b372ad4948d8265b4ca3796845eb2248 23 | Message,Mensaje,,site/modules/ProcessHello/ProcessHello.module.php,4c2a8fe7eaf24721cc7a9f0175115bd4 24 | Warning,Advertencia,,site/modules/ProcessHello/ProcessHello.module.php,0eaadb4fcb48a0a0ed7bc9868be9fbaa 25 | Error,=,,site/modules/ProcessHello/ProcessHello.module.php,902b0d55fddef6f8d651fe1035b7d4bd 26 | "Choose wisely","Elegir sabiamente","like description but appears under field",site/modules/ProcessHello/ProcessHello.module.php,10a0bec7ff2c573bc34c97cfe5e76a6a -------------------------------------------------------------------------------- /views/execute.php: -------------------------------------------------------------------------------- 1 | <?php namespace ProcessWire; 2 | /** @var string $subhead */ 3 | /** @var array $actions */ 4 | ?> 5 | <h2><?=$subhead?></h2> 6 | <ul> 7 | <?php foreach($actions as $url => $label): ?> 8 | <li><a href='<?=$url?>'><?=$label?></a></li> 9 | <?php endforeach; ?> 10 | </ul> -------------------------------------------------------------------------------- /views/something-else.php: -------------------------------------------------------------------------------- 1 | <?php namespace ProcessWire; 2 | /** @var string $subhead */ 3 | /** @var PageArray $newPages */ 4 | ?> 5 | <h2><?=$subhead?></h2> 6 | <ul> 7 | <?=$newPages->each("<li><a href='{url}'>{title|name}</a></li>")?> 8 | </ul> 9 | --------------------------------------------------------------------------------