Difference between revisions of "Developing an MVC Component/Adding verifications"
From Joomla! Documentation
< J3.x:Developing an MVC Component
Scionescire (talk | contribs) |
Scionescire (talk | contribs) m (→Adding verifications: added highlight) |
||
(7 intermediate revisions by 3 users not shown) | |||
Line 13: | Line 13: | ||
Forms can be verified on the client side using javascript code. | Forms can be verified on the client side using javascript code. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
In the ''[[#admin/views/helloworld/tmpl/edit.php|admin/views/helloworld/tmpl/edit.php]]'' file, put these lines | In the ''[[#admin/views/helloworld/tmpl/edit.php|admin/views/helloworld/tmpl/edit.php]]'' file, put these lines | ||
Line 23: | Line 18: | ||
<span id="admin/views/helloworld/tmpl/edit.php"> | <span id="admin/views/helloworld/tmpl/edit.php"> | ||
''admin/views/helloworld/tmpl/edit.php'' | ''admin/views/helloworld/tmpl/edit.php'' | ||
− | <source lang="php"> | + | <source lang="php" highlight="12,15"> |
<?php | <?php | ||
+ | /** | ||
+ | * @package Joomla.Administrator | ||
+ | * @subpackage com_helloworld | ||
+ | * | ||
+ | * @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved. | ||
+ | * @license GNU General Public License version 2 or later; see LICENSE.txt | ||
+ | */ | ||
+ | |||
// No direct access | // No direct access | ||
defined('_JEXEC') or die('Restricted access'); | defined('_JEXEC') or die('Restricted access'); | ||
− | |||
JHtml::_('behavior.formvalidation'); | JHtml::_('behavior.formvalidation'); | ||
?> | ?> | ||
Line 43: | Line 45: | ||
</div> | </div> | ||
<?php endforeach; ?> | <?php endforeach; ?> | ||
− | <div> | + | </div> |
− | <div> | + | </div> |
</fieldset> | </fieldset> | ||
− | <div> | + | </div> |
<input type="hidden" name="task" value="helloworld.edit" /> | <input type="hidden" name="task" value="helloworld.edit" /> | ||
<?php echo JHtml::_('form.token'); ?> | <?php echo JHtml::_('form.token'); ?> | ||
</form> | </form> | ||
+ | |||
</source> | </source> | ||
</span> | </span> | ||
Line 58: | Line 61: | ||
<span id="admin/models/forms/helloworld.xml"> | <span id="admin/models/forms/helloworld.xml"> | ||
− | <source lang="xml"> | + | <source lang="xml" highlight="2-4,16-18"> |
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||
<form | <form | ||
− | + | addrulepath="/administrator/components/com_helloworld/models/rules" | |
> | > | ||
<fieldset> | <fieldset> | ||
Line 71: | Line 74: | ||
name="greeting" | name="greeting" | ||
type="text" | type="text" | ||
− | + | label="COM_HELLOWORLD_HELLOWORLD_GREETING_LABEL" | |
− | + | description="COM_HELLOWORLD_HELLOWORLD_GREETING_DESC" | |
size="40" | size="40" | ||
− | + | class="inputbox validate-greeting" | |
− | + | validate="greeting" | |
− | + | required="true" | |
default="" | default="" | ||
/> | /> | ||
Line 91: | Line 94: | ||
''admin/models/forms/helloworld.js'' | ''admin/models/forms/helloworld.js'' | ||
<source lang="javascript"> | <source lang="javascript"> | ||
− | + | jQuery(function() { | |
− | + | document.formvalidator.setHandler('greeting', | |
− | + | function (value) { | |
− | + | regex=/^[^0-9]+$/; | |
− | + | return regex.test(value); | |
− | + | }); | |
}); | }); | ||
</source> | </source> | ||
Line 155: | Line 158: | ||
<span id="admin/views/helloworld/view.html.php"> | <span id="admin/views/helloworld/view.html.php"> | ||
''admin/views/helloworld/view.html.php'' | ''admin/views/helloworld/view.html.php'' | ||
− | <source lang="php"> | + | <source lang="php" highlight="39,103-106"> |
<?php | <?php | ||
+ | /** | ||
+ | * @package Joomla.Administrator | ||
+ | * @subpackage com_helloworld | ||
+ | * | ||
+ | * @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved. | ||
+ | * @license GNU General Public License version 2 or later; see LICENSE.txt | ||
+ | */ | ||
+ | |||
// No direct access to this file | // No direct access to this file | ||
defined('_JEXEC') or die('Restricted access'); | defined('_JEXEC') or die('Restricted access'); | ||
− | |||
− | |||
− | |||
/** | /** | ||
* HelloWorld View | * HelloWorld View | ||
+ | * | ||
+ | * @since 0.0.1 | ||
*/ | */ | ||
class HelloWorldViewHelloWorld extends JViewLegacy | class HelloWorldViewHelloWorld extends JViewLegacy | ||
{ | { | ||
− | + | /** | |
* View form | * View form | ||
* | * | ||
− | * @var | + | * @var form |
*/ | */ | ||
protected $form = null; | protected $form = null; | ||
/** | /** | ||
− | * | + | * Display the Hello World view |
− | * @return void | + | * |
+ | * @param string $tpl The name of the template file to parse; automatically searches through the template paths. | ||
+ | * | ||
+ | * @return void | ||
*/ | */ | ||
public function display($tpl = null) | public function display($tpl = null) | ||
{ | { | ||
− | // | + | // Get the Data |
− | $form = $this->get('Form'); | + | $this->form = $this->get('Form'); |
− | $item = $this->get('Item'); | + | $this->item = $this->get('Item'); |
− | + | $this->script = $this->get('Script'); | |
// Check for errors. | // Check for errors. | ||
Line 193: | Line 206: | ||
return false; | return false; | ||
} | } | ||
− | + | ||
− | |||
− | |||
− | |||
// Set the toolbar | // Set the toolbar | ||
Line 209: | Line 219: | ||
/** | /** | ||
− | * | + | * Add the page title and toolbar. |
+ | * | ||
+ | * @return void | ||
+ | * | ||
+ | * @since 1.6 | ||
*/ | */ | ||
protected function addToolBar() | protected function addToolBar() | ||
{ | { | ||
$input = JFactory::getApplication()->input; | $input = JFactory::getApplication()->input; | ||
+ | |||
+ | // Hide Joomla Administrator Main menu | ||
$input->set('hidemainmenu', true); | $input->set('hidemainmenu', true); | ||
+ | |||
$isNew = ($this->item->id == 0); | $isNew = ($this->item->id == 0); | ||
− | + | ||
+ | if ($isNew) | ||
+ | { | ||
+ | $title = JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW'); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $title = JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT'); | ||
+ | } | ||
+ | |||
+ | JToolBarHelper::title($title, 'helloworld'); | ||
JToolBarHelper::save('helloworld.save'); | JToolBarHelper::save('helloworld.save'); | ||
− | JToolBarHelper::cancel('helloworld.cancel', $isNew ? 'JTOOLBAR_CANCEL' : 'JTOOLBAR_CLOSE'); | + | JToolBarHelper::cancel( |
+ | 'helloworld.cancel', | ||
+ | $isNew ? 'JTOOLBAR_CANCEL' : 'JTOOLBAR_CLOSE' | ||
+ | ); | ||
} | } | ||
/** | /** | ||
Line 229: | Line 259: | ||
$isNew = ($this->item->id < 1); | $isNew = ($this->item->id < 1); | ||
$document = JFactory::getDocument(); | $document = JFactory::getDocument(); | ||
− | $document->setTitle($isNew ? JText::_('COM_HELLOWORLD_HELLOWORLD_CREATING') | + | $document->setTitle($isNew ? JText::_('COM_HELLOWORLD_HELLOWORLD_CREATING') : |
− | + | JText::_('COM_HELLOWORLD_HELLOWORLD_EDITING')); | |
− | + | $document->addScript(JURI::root() . $this->script); | |
$document->addScript(JURI::root() . "/administrator/components/com_helloworld" | $document->addScript(JURI::root() . "/administrator/components/com_helloworld" | ||
. "/views/helloworld/submitbutton.js"); | . "/views/helloworld/submitbutton.js"); | ||
Line 237: | Line 267: | ||
} | } | ||
} | } | ||
+ | |||
</source> | </source> | ||
</span> | </span> | ||
Line 249: | Line 280: | ||
<span id="admin/models/helloworld.php"> | <span id="admin/models/helloworld.php"> | ||
''admin/models/helloworld.php'' | ''admin/models/helloworld.php'' | ||
− | <source lang="php"> | + | <source lang="php" highlight="65-73"> |
<?php | <?php | ||
+ | /** | ||
+ | * @package Joomla.Administrator | ||
+ | * @subpackage com_helloworld | ||
+ | * | ||
+ | * @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved. | ||
+ | * @license GNU General Public License version 2 or later; see LICENSE.txt | ||
+ | */ | ||
+ | |||
// No direct access to this file | // No direct access to this file | ||
defined('_JEXEC') or die('Restricted access'); | defined('_JEXEC') or die('Restricted access'); | ||
− | |||
− | |||
− | |||
/** | /** | ||
* HelloWorld Model | * HelloWorld Model | ||
+ | * | ||
+ | * @since 0.0.1 | ||
*/ | */ | ||
class HelloWorldModelHelloWorld extends JModelAdmin | class HelloWorldModelHelloWorld extends JModelAdmin | ||
{ | { | ||
/** | /** | ||
− | * | + | * Method to get a table object, load it if necessary. |
+ | * | ||
+ | * @param string $type The table name. Optional. | ||
+ | * @param string $prefix The class prefix. Optional. | ||
+ | * @param array $config Configuration array for model. Optional. | ||
* | * | ||
− | * @ | + | * @return JTable A JTable object |
− | |||
− | |||
* | * | ||
− | + | * @since 1.6 | |
− | * @since | ||
*/ | */ | ||
public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array()) | public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array()) | ||
Line 280: | Line 319: | ||
* Method to get the record form. | * Method to get the record form. | ||
* | * | ||
− | * @param | + | * @param array $data Data for the form. |
− | * @param | + | * @param boolean $loadData True if the form is to load its own data (default case), false if not. |
+ | * | ||
+ | * @return mixed A JForm object on success, false on failure | ||
* | * | ||
− | * @ | + | * @since 1.6 |
− | |||
*/ | */ | ||
public function getForm($data = array(), $loadData = true) | public function getForm($data = array(), $loadData = true) | ||
{ | { | ||
// Get the form. | // Get the form. | ||
− | $form = $this->loadForm('com_helloworld.helloworld', 'helloworld', | + | $form = $this->loadForm( |
− | array('control' => 'jform', 'load_data' => $loadData)); | + | 'com_helloworld.helloworld', |
+ | 'helloworld', | ||
+ | array( | ||
+ | 'control' => 'jform', | ||
+ | 'load_data' => $loadData | ||
+ | ) | ||
+ | ); | ||
+ | |||
if (empty($form)) | if (empty($form)) | ||
{ | { | ||
Line 298: | Line 345: | ||
return $form; | return $form; | ||
} | } | ||
− | + | /** | |
* Method to get the script that have to be included on the form | * Method to get the script that have to be included on the form | ||
* | * | ||
Line 310: | Line 357: | ||
* Method to get the data that should be injected in the form. | * Method to get the data that should be injected in the form. | ||
* | * | ||
− | * @return | + | * @return mixed The data for the form. |
− | * @since | + | * |
+ | * @since 1.6 | ||
*/ | */ | ||
protected function loadFormData() | protected function loadFormData() | ||
{ | { | ||
// Check the session for previously entered form data. | // Check the session for previously entered form data. | ||
− | $data = JFactory::getApplication()->getUserState('com_helloworld.edit.helloworld.data', array()); | + | $data = JFactory::getApplication()->getUserState( |
+ | 'com_helloworld.edit.helloworld.data', | ||
+ | array() | ||
+ | ); | ||
+ | |||
if (empty($data)) | if (empty($data)) | ||
{ | { | ||
Line 325: | Line 377: | ||
} | } | ||
} | } | ||
+ | |||
</source> | </source> | ||
</span> | </span> | ||
Line 337: | Line 390: | ||
<source lang="php"> | <source lang="php"> | ||
<?php | <?php | ||
+ | /** | ||
+ | * @package Joomla.Administrator | ||
+ | * @subpackage com_helloworld | ||
+ | * | ||
+ | * @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved. | ||
+ | * @license GNU General Public License version 2 or later; see LICENSE.txt | ||
+ | */ | ||
+ | |||
// No direct access to this file | // No direct access to this file | ||
defined('_JEXEC') or die('Restricted access'); | defined('_JEXEC') or die('Restricted access'); | ||
− | + | ||
− | |||
− | |||
− | |||
/** | /** | ||
* Form Rule class for the Joomla Framework. | * Form Rule class for the Joomla Framework. | ||
Line 357: | Line 415: | ||
protected $regex = '^[^0-9]+$'; | protected $regex = '^[^0-9]+$'; | ||
} | } | ||
+ | |||
</source> | </source> | ||
</span> | </span> | ||
Line 395: | Line 454: | ||
* ''[[J3.2:Developing_a_MVC_Component/Basic_backend#admin/models/helloworlds.php|admin/models/helloworlds.php]]'' | * ''[[J3.2:Developing_a_MVC_Component/Basic_backend#admin/models/helloworlds.php|admin/models/helloworlds.php]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/models/helloworlds.php|admin/models/helloworld.php]]'' | * ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/models/helloworlds.php|admin/models/helloworld.php]]'' | ||
− | * ''[[J3.2:Developing_a_MVC_Component/ | + | * ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/forms/index.html]]'' |
+ | * ''[[J3.2:Developing_a_MVC_Component/Adding_verifications#admin/models/forms/helloworld.js|admin/models/forms/helloworld.js]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/models/forms/helloworld.xml|admin/models/forms/helloworld.xml]]'' | * ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/models/forms/helloworld.xml|admin/models/forms/helloworld.xml]]'' | ||
+ | * ''[[J3.2:Developing_a_MVC_Component/Adding_verifications#admin/models/rules/greeting.php|admin/models/rules/greeting.php]]'' | ||
+ | * ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/rules/index.html]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/controllers/helloworld.php|admin/controllers/helloworld.php]]'' | * ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/controllers/helloworld.php|admin/controllers/helloworld.php]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/controllers/helloworlds.php|admin/controllers/helloworlds.php]]'' | * ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/controllers/helloworlds.php|admin/controllers/helloworlds.php]]'' | ||
− | * ''[[J3.2:Developing_a_MVC_Component/ | + | * ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/controllers/index.html]]'' |
* ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/index.html]]'' | * ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/index.html]]'' | ||
+ | * ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworld/index.html]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/views/helloworld/view.html.php|admin/views/helloworld/view.html.php]]'' | * ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/views/helloworld/view.html.php|admin/views/helloworld/view.html.php]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/views/helloworld/tmpl/edit.php|admin/views/helloworld/tmpl/edit.php]]'' | * ''[[J3.2:Developing_a_MVC_Component/Adding_backend_actions#admin/views/helloworld/tmpl/edit.php|admin/views/helloworld/tmpl/edit.php]]'' | ||
+ | * ''[[J3.2:Developing_a_MVC_Component/Adding_verifications#admin/views/helloworld/submitbutton.js|admin/views/helloworld/submitbutton.js]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/index.html]]'' | * ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/index.html]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Basic_backend#admin/views/helloworlds/view.html.php|admin/views/helloworlds/view.html.php]]'' | * ''[[J3.2:Developing_a_MVC_Component/Basic_backend#admin/views/helloworlds/view.html.php|admin/views/helloworlds/view.html.php]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/tmpl/index.html]]'' | * ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/tmpl/index.html]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Basic_backend#admin/views/helloworlds/tmpl/default.php|admin/views/helloworlds/tmpl/default.php]]'' | * ''[[J3.2:Developing_a_MVC_Component/Basic_backend#admin/views/helloworlds/tmpl/default.php|admin/views/helloworlds/tmpl/default.php]]'' | ||
− | |||
− | |||
− | |||
* ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/tables/index.html]]'' | * ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|admin/tables/index.html]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Using_the_database#admin/tables/helloworld.php|admin/tables/helloworld.php]]'' | * ''[[J3.2:Developing_a_MVC_Component/Using_the_database#admin/tables/helloworld.php|admin/tables/helloworld.php]]'' | ||
Line 416: | Line 477: | ||
* ''[[J3.x:Developing a MVC Component/Adding language management#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.ini|admin/language/en-GB/en-GB.com_helloworld.ini]]'' | * ''[[J3.x:Developing a MVC Component/Adding language management#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.ini|admin/language/en-GB/en-GB.com_helloworld.ini]]'' | ||
* ''[[J3.x:Developing a MVC Component/Adding language management#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.sys.ini|admin/language/en-GB/en-GB.com_helloworld.sys.ini]]'' | * ''[[J3.x:Developing a MVC Component/Adding language management#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.sys.ini|admin/language/en-GB/en-GB.com_helloworld.sys.ini]]'' | ||
− | |||
* ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|media/index.html]]'' | * ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|media/index.html]]'' | ||
* ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|media/images/index.html]]'' | * ''[[J3.2:Developing_a_MVC_Component/Developing_a_Basic_Component#index.html|media/images/index.html]]'' | ||
Line 422: | Line 482: | ||
* ''[[J3.x:Developing_a_MVC_Component/Adding_decorations_to_the_backend#Adding_some_icons|media/images/tux-48x48.png]]'' | * ''[[J3.x:Developing_a_MVC_Component/Adding_decorations_to_the_backend#Adding_some_icons|media/images/tux-48x48.png]]'' | ||
− | Create a compressed file of this directory [ | + | Create a compressed file of this directory [https://github.com/scionescire/Joomla-3.2-Hello-World-Component/archive/step-11-adding-verifications.zip archive] or directly download the archive and install it using the extension manager of Joomla. You can add a menu item of this component using the menu manager in the backend. |
<span id="helloworld.xml"> | <span id="helloworld.xml"> | ||
''helloworld.xml'' | ''helloworld.xml'' | ||
− | <source lang="xml"> | + | <source lang="xml" highlight="13"> |
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||
<extension type="component" version="3.2.0" method="upgrade"> | <extension type="component" version="3.2.0" method="upgrade"> | ||
− | + | ||
<name>COM_HELLOWORLD</name> | <name>COM_HELLOWORLD</name> | ||
<!-- The following elements are optional and free of formatting constraints --> | <!-- The following elements are optional and free of formatting constraints --> | ||
Line 442: | Line 502: | ||
<!-- The description is optional and defaults to the name --> | <!-- The description is optional and defaults to the name --> | ||
<description>COM_HELLOWORLD_DESCRIPTION</description> | <description>COM_HELLOWORLD_DESCRIPTION</description> | ||
− | + | ||
<install> <!-- Runs on install --> | <install> <!-- Runs on install --> | ||
<sql> | <sql> | ||
Line 453: | Line 513: | ||
</sql> | </sql> | ||
</uninstall> | </uninstall> | ||
− | <update> <!-- Runs on update; New | + | <update> <!-- Runs on update; New since J2.5 --> |
<schemas> | <schemas> | ||
<schemapath type="mysql">sql/updates/mysql</schemapath> | <schemapath type="mysql">sql/updates/mysql</schemapath> | ||
</schemas> | </schemas> | ||
</update> | </update> | ||
− | + | ||
<!-- Site Main File Copy Section --> | <!-- Site Main File Copy Section --> | ||
<!-- Note the folder attribute: This attribute describes the folder | <!-- Note the folder attribute: This attribute describes the folder | ||
Line 469: | Line 529: | ||
<folder>views</folder> | <folder>views</folder> | ||
<folder>models</folder> | <folder>models</folder> | ||
− | |||
</files> | </files> | ||
− | + | ||
+ | <languages folder="site/language"> | ||
+ | <language tag="en-GB">en-GB/en-GB.com_helloworld.ini</language> | ||
+ | </languages> | ||
+ | |||
<media destination="com_helloworld" folder="media"> | <media destination="com_helloworld" folder="media"> | ||
<filename>index.html</filename> | <filename>index.html</filename> | ||
<folder>images</folder> | <folder>images</folder> | ||
</media> | </media> | ||
− | + | ||
<administration> | <administration> | ||
<!-- Administration Menu Section --> | <!-- Administration Menu Section --> | ||
− | <menu img="../media/com_helloworld/images/tux-16x16.png">COM_HELLOWORLD_MENU</menu> | + | <menu link='index.php?option=com_helloworld' img="../media/com_helloworld/images/tux-16x16.png">COM_HELLOWORLD_MENU</menu> |
<!-- Administration Main File Copy Section --> | <!-- Administration Main File Copy Section --> | ||
<!-- Note the folder attribute: This attribute describes the folder | <!-- Note the folder attribute: This attribute describes the folder | ||
Line 497: | Line 560: | ||
<!-- views files section --> | <!-- views files section --> | ||
<folder>views</folder> | <folder>views</folder> | ||
− | |||
− | |||
<!-- controllers files section --> | <!-- controllers files section --> | ||
<folder>controllers</folder> | <folder>controllers</folder> | ||
</files> | </files> | ||
+ | <languages folder="admin/language"> | ||
+ | <language tag="en-GB">en-GB/en-GB.com_helloworld.ini</language> | ||
+ | <language tag="en-GB">en-GB/en-GB.com_helloworld.sys.ini</language> | ||
+ | </languages> | ||
</administration> | </administration> | ||
+ | |||
</extension> | </extension> | ||
</source> | </source> |
Revision as of 14:22, 18 February 2015
{{Chunk:Developing a Model-View-Controller (MVC) Component for Joomla!3.1 - Contents/<translate> en</translate>}} <translate> This is a multiple-article series of tutorials on how to develop a Model-View-Controller Component for Joomla! Version.</translate>
<translate> Begin with the Introduction, and navigate the articles in this series by using the navigation button at the bottom or the box to the right (the Articles in This series).</translate>
This page is tagged because it NEEDS REVIEW. You can help the Joomla! Documentation Wiki by contributing to it.
More pages that need help similar to this one are here. NOTE-If you feel the need is satistified, please remove this notice.
This is a multiple-article series of tutorials on how to develop a Model-View-Contoller Component for Joomla! Version .
Introduction[edit]
This tutorial is part of the Developing a MVC Component for Joomla! 3.2 tutorial. You are encouraged to read the previous parts of the tutorial before reading this.
See Form validation for some more general info on form validation (rules).
Verifying the form (client side)[edit]
Forms can be verified on the client side using javascript code.
In the admin/views/helloworld/tmpl/edit.php file, put these lines
admin/views/helloworld/tmpl/edit.php
<?php
/**
* @package Joomla.Administrator
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access
defined('_JEXEC') or die('Restricted access');
JHtml::_('behavior.formvalidation');
?>
<form action="<?php echo JRoute::_('index.php?option=com_helloworld&layout=edit&id=' . (int) $this->item->id); ?>"
method="post" name="adminForm" id="adminForm" class="form-validate">
<div class="form-horizontal">
<fieldset class="adminform">
<legend><?php echo JText::_('COM_HELLOWORLD_HELLOWORLD_DETAILS'); ?></legend>
<div class="row-fluid">
<div class="span6">
<?php foreach ($this->form->getFieldset() as $field): ?>
<div class="control-group">
<div class="control-label"><?php echo $field->label; ?></div>
<div class="controls"><?php echo $field->input; ?></div>
</div>
<?php endforeach; ?>
</div>
</div>
</fieldset>
</div>
<input type="hidden" name="task" value="helloworld.edit" />
<?php echo JHtml::_('form.token'); ?>
</form>
You may have noted that the html form contained in the admin/views/helloworld/tmpl/edit.php file now has the form-validate css class. And that we added a JHTML::_('behavior.formvalidation'); call to tell Joomla to use its javascript form validation.
Modify the admin/models/forms/helloworld.xml file to indicate that the greeting field has to be verified:
<?xml version="1.0" encoding="utf-8"?>
<form
addrulepath="/administrator/components/com_helloworld/models/rules"
>
<fieldset>
<field
name="id"
type="hidden"
/>
<field
name="greeting"
type="text"
label="COM_HELLOWORLD_HELLOWORLD_GREETING_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_GREETING_DESC"
size="40"
class="inputbox validate-greeting"
validate="greeting"
required="true"
default=""
/>
</fieldset>
</form>
Note for the moment that the css class is now "inputbox validate-greeting" and that the attribute required is set to true. It means that this field is required and has to be verified by a handler of the form validator framework of Joomla
With your favorite file manager and editor put a file admin/models/forms/helloworld.js containing
admin/models/forms/helloworld.js
jQuery(function() {
document.formvalidator.setHandler('greeting',
function (value) {
regex=/^[^0-9]+$/;
return regex.test(value);
});
});
It adds a handler to the form validator of Joomla for fields having the "validate-greeting" css class. Each time the greeting field is modified, the handler will be executed to verify its validity (no digits).
The final step is to verify the form when the save button is clicked.
With your favorite file manager and editor put a file admin/views/helloworld/submitbutton.js containing
Joomla.submitbutton = function(task)
{
if (task == '')
{
return false;
}
else
{
var isValid=true;
var action = task.split('.');
if (action[1] != 'cancel' && action[1] != 'close')
{
var forms = $$('form.form-validate');
for (var i=0;i<forms.length;i++)
{
if (!document.formvalidator.isValid(forms[i]))
{
isValid = false;
break;
}
}
}
if (isValid)
{
Joomla.submitform(task);
return true;
}
else
{
alert(Joomla.JText._('COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE',
'Some values are unacceptable'));
return false;
}
}
}
This function will verify that all forms which have the "form-validate" css class are valid. Note that it will display an alert message translated by the Joomla framework.
The HelloWorldViewHelloWorld view class has to be modified to use these javascript files:
admin/views/helloworld/view.html.php
<?php
/**
* @package Joomla.Administrator
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
/**
* HelloWorld View
*
* @since 0.0.1
*/
class HelloWorldViewHelloWorld extends JViewLegacy
{
/**
* View form
*
* @var form
*/
protected $form = null;
/**
* Display the Hello World view
*
* @param string $tpl The name of the template file to parse; automatically searches through the template paths.
*
* @return void
*/
public function display($tpl = null)
{
// Get the Data
$this->form = $this->get('Form');
$this->item = $this->get('Item');
$this->script = $this->get('Script');
// Check for errors.
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}
// Set the toolbar
$this->addToolBar();
// Display the template
parent::display($tpl);
// Set the document
$this->setDocument();
}
/**
* Add the page title and toolbar.
*
* @return void
*
* @since 1.6
*/
protected function addToolBar()
{
$input = JFactory::getApplication()->input;
// Hide Joomla Administrator Main menu
$input->set('hidemainmenu', true);
$isNew = ($this->item->id == 0);
if ($isNew)
{
$title = JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW');
}
else
{
$title = JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT');
}
JToolBarHelper::title($title, 'helloworld');
JToolBarHelper::save('helloworld.save');
JToolBarHelper::cancel(
'helloworld.cancel',
$isNew ? 'JTOOLBAR_CANCEL' : 'JTOOLBAR_CLOSE'
);
}
/**
* Method to set up the document properties
*
* @return void
*/
protected function setDocument()
{
$isNew = ($this->item->id < 1);
$document = JFactory::getDocument();
$document->setTitle($isNew ? JText::_('COM_HELLOWORLD_HELLOWORLD_CREATING') :
JText::_('COM_HELLOWORLD_HELLOWORLD_EDITING'));
$document->addScript(JURI::root() . $this->script);
$document->addScript(JURI::root() . "/administrator/components/com_helloworld"
. "/views/helloworld/submitbutton.js");
JText::script('COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE');
}
}
This view now
- verifies if the model has no error;
- adds two javascript files;
- injects javascript translation using the Joomla JText::script function.
The final step is to implement a getScript function in the HelloWorldModelHelloWorld model:
admin/models/helloworld.php
<?php
/**
* @package Joomla.Administrator
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
/**
* HelloWorld Model
*
* @since 0.0.1
*/
class HelloWorldModelHelloWorld extends JModelAdmin
{
/**
* Method to get a table object, load it if necessary.
*
* @param string $type The table name. Optional.
* @param string $prefix The class prefix. Optional.
* @param array $config Configuration array for model. Optional.
*
* @return JTable A JTable object
*
* @since 1.6
*/
public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array())
{
return JTable::getInstance($type, $prefix, $config);
}
/**
* Method to get the record form.
*
* @param array $data Data for the form.
* @param boolean $loadData True if the form is to load its own data (default case), false if not.
*
* @return mixed A JForm object on success, false on failure
*
* @since 1.6
*/
public function getForm($data = array(), $loadData = true)
{
// Get the form.
$form = $this->loadForm(
'com_helloworld.helloworld',
'helloworld',
array(
'control' => 'jform',
'load_data' => $loadData
)
);
if (empty($form))
{
return false;
}
return $form;
}
/**
* Method to get the script that have to be included on the form
*
* @return string Script files
*/
public function getScript()
{
return 'administrator/components/com_helloworld/models/forms/helloworld.js';
}
/**
* Method to get the data that should be injected in the form.
*
* @return mixed The data for the form.
*
* @since 1.6
*/
protected function loadFormData()
{
// Check the session for previously entered form data.
$data = JFactory::getApplication()->getUserState(
'com_helloworld.edit.helloworld.data',
array()
);
if (empty($data))
{
$data = $this->getItem();
}
return $data;
}
}
Verifying the form (server side)[edit]
Verifying the form on the server side is done by inheritance of JControllerForm class. We have specified in the admin/models/forms/helloworld.xml file that the validate server function will use a greeting.php file.
With your favorite file manager and editor, put a admin/models/rules/greeting.php file containing:
admin/models/rules/greeting.php
<?php
/**
* @package Joomla.Administrator
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
/**
* Form Rule class for the Joomla Framework.
*/
class JFormRuleGreeting extends JFormRule
{
/**
* The regular expression.
*
* @access protected
* @var string
* @since 2.5
*/
protected $regex = '^[^0-9]+$';
}
Note there is no function here - this is inherited from JFormRule (located in: libraries/joomla/form /rule.php). All that is needed is the regex string to test against.
Packaging the component[edit]
Content of your code directory
- helloworld.xml
- site/helloworld.php
- site/index.html
- site/controller.php
- site/views/index.html
- site/views/helloworld/index.html
- site/views/helloworld/view.html.php
- site/views/helloworld/tmpl/index.html
- site/views/helloworld/tmpl/default.xml
- site/views/helloworld/tmpl/default.php
- site/models/index.html
- site/models/helloworld.php
- site/language/index.html
- site/language/en-GB/index.html
- site/language/en-GB/en-GB.com_helloworld.ini
- admin/index.html
- admin/helloworld.php
- admin/controller.php
- admin/sql/index.html
- admin/sql/install.mysql.utf8.sql
- admin/sql/uninstall.mysql.utf8.sql
- admin/sql/updates/index.html
- admin/sql/updates/mysql/index.html
- admin/sql/updates/mysql/0.0.1.sql
- admin/sql/updates/mysql/0.0.6.sql
- admin/models/index.html
- admin/models/fields/index.html
- admin/models/fields/helloworld.php
- admin/models/helloworlds.php
- admin/models/helloworld.php
- admin/models/forms/index.html
- admin/models/forms/helloworld.js
- admin/models/forms/helloworld.xml
- admin/models/rules/greeting.php
- admin/models/rules/index.html
- admin/controllers/helloworld.php
- admin/controllers/helloworlds.php
- admin/controllers/index.html
- admin/views/index.html
- admin/views/helloworld/index.html
- admin/views/helloworld/view.html.php
- admin/views/helloworld/tmpl/edit.php
- admin/views/helloworld/submitbutton.js
- admin/views/helloworlds/index.html
- admin/views/helloworlds/view.html.php
- admin/views/helloworlds/tmpl/index.html
- admin/views/helloworlds/tmpl/default.php
- admin/tables/index.html
- admin/tables/helloworld.php
- admin/language/index.html
- admin/language/en-GB/index.html
- admin/language/en-GB/en-GB.com_helloworld.ini
- admin/language/en-GB/en-GB.com_helloworld.sys.ini
- media/index.html
- media/images/index.html
- media/images/tux-16x16.png
- media/images/tux-48x48.png
Create a compressed file of this directory archive or directly download the archive and install it using the extension manager of Joomla. You can add a menu item of this component using the menu manager in the backend.
helloworld.xml
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.2.0" method="upgrade">
<name>COM_HELLOWORLD</name>
<!-- The following elements are optional and free of formatting constraints -->
<creationDate>January 2014</creationDate>
<author>John Doe</author>
<authorEmail>john.doe@example.org</authorEmail>
<authorUrl>http://www.example.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!-- The version string is recorded in the components table -->
<version>0.0.11</version>
<!-- The description is optional and defaults to the name -->
<description>COM_HELLOWORLD_DESCRIPTION</description>
<install> <!-- Runs on install -->
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall> <!-- Runs on uninstall -->
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update> <!-- Runs on update; New since J2.5 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<!-- Site Main File Copy Section -->
<!-- Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /site/ in the package -->
<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
<folder>models</folder>
</files>
<languages folder="site/language">
<language tag="en-GB">en-GB/en-GB.com_helloworld.ini</language>
</languages>
<media destination="com_helloworld" folder="media">
<filename>index.html</filename>
<folder>images</folder>
</media>
<administration>
<!-- Administration Menu Section -->
<menu link='index.php?option=com_helloworld' img="../media/com_helloworld/images/tux-16x16.png">COM_HELLOWORLD_MENU</menu>
<!-- Administration Main File Copy Section -->
<!-- Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /admin/ in the package -->
<files folder="admin">
<!-- Admin Main File Copy Section -->
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<!-- SQL files section -->
<folder>sql</folder>
<!-- tables files section -->
<folder>tables</folder>
<!-- models files section -->
<folder>models</folder>
<!-- views files section -->
<folder>views</folder>
<!-- controllers files section -->
<folder>controllers</folder>
</files>
<languages folder="admin/language">
<language tag="en-GB">en-GB/en-GB.com_helloworld.ini</language>
<language tag="en-GB">en-GB/en-GB.com_helloworld.sys.ini</language>
</languages>
</administration>
</extension>
J3.x:Developing a MVC Component/Navigate