Exlord
Exlord

Reputation: 5381

Joomla3 custom server side form validation rule

I am new to joomla component development(J3 , MVC) and i am trying to create a custom server side form validation rule.

I added validate="machinename" to my forms field and created a the file models\rules\machinename.php

defined('_JEXEC') or die('Restricted access');

jimport('joomla.form.formrule');

class JFormRuleMachinename extends JFormRule
{
    protected $regex = '/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/';
}

I have a empty controller in controllers\field.php

defined('_JEXEC') or die('Restricted access');

// import Joomla controllerform library
jimport('joomla.application.component.controllerform');

class SampleControllerField extends JControllerForm
{

}

and the model is in models\field.php

defined('_JEXEC') or die('Restricted access');

// import Joomla modelform library
jimport('joomla.application.component.modeladmin');

/**
 * HelloWorld Model
 */
class SampleModelField extends JModelAdmin
{
    public function getTable($type = 'Field', $prefix = 'SampleTable', $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       2.5
     */
    public function getForm($data = array(), $loadData = true)
    {
        // Get the form.
        $form = $this->loadForm('com_sample.field', 'field',
            array('control' => 'jform', 'load_data' => $loadData));
        if (empty($form))
        {
            return false;
        }
        return $form;
    }

    /**
     * Method to get the data that should be injected in the form.
     *
     * @return      mixed   The data for the form.
     * @since       2.5
     */
    protected function loadFormData()
    {
        // Check the session for previously entered form data.
        $data = JFactory::getApplication()->getUserState('com_sample.edit.field.data', array());
        if (empty($data))
        {
            $data = $this->getItem();
        }
        return $data;
    }
}

my components name is com_sample and everything was working fine (new,edit,delete) but then i added the validation rule to the form's field and now i am getting a error when submitting the form :

JForm::validateField() rule `machinename` missing. 

my best guess is that i have a mistake in naming or the file location but i am not sure and can't find anything with googleing .

so help me pliz ...

Upvotes: 2

Views: 2058

Answers (2)

mhall
mhall

Reputation: 21

I was struggling with this problem. I read the error as meaning that Joomla couldn't find the rule file, but when I single-stepped through the core I realised that after loading the rule file, Jommla checks that an appropriately named class is within the rule. I'd introduced a typo to the class name. So my advice to anyone struggling with server-side validation is to check the rule file is where you'd expect, AND that the class name is correct. Obvious I know, but it took me ages to figure.

Upvotes: 1

Exlord
Exlord

Reputation: 5381

Find the solution myself, it seems that you need to add the rules folder pathto the form definition so :

<form addrulepath="/administrator/components/com_sample/models/rules">

this solved my problem .

Upvotes: 1

Related Questions