0
votes

Question: How can I use the same code in the model validation (in particular for child models) for both SaveAssociated and Save function calls in CakePHP,... given that SaveAssociated implementations expect the form data array to contain a numeric index [0] for data fields belonging to a child model?

Scenario:

Assuming I have a parent model with a hasMany relationship to several child models.

Typically if you use SaveAssociated to save data to all models at once, you would need to specify an index number (typically 0) on the view form input. Example:

echo $this->Form->input('MerchantControl.0.startdate', array('type' => 'text', 'class' => 'datepicker_start'));

As a result, any custom child model validation code will need to be written with [0] as well. See function urlParamNotUsedByOtherMerchants in the code sample below.

public $validate = array(
    'urlparam' => array(
        'In Use by other Merchants' => array(
            'rule' => 'urlParamNotUsedByOtherMerchants',
            'message' => 'URLPARAM belongs to another Merchant'
        )
    )
);


public function urlParamNotUsedByOtherMerchants($data) {
    $searchfilter = array(
                        //Because of SaveAssociated, need to refer to index [0] 
                        'MerchantControl.id !=' => $this->data['MerchantControl'][0]['merchant_id'],
                        'MerchantControl.urlparam ' => $data,
                        );        
    $merchantcontrol = $this->find('all', array('conditions' => $searchfilter));
    if (sizeof($merchantcontrol) > 0) {
        return false;
    } else {
        return true;
    }
}

The problem is there are many other instances where I will also be using a "Save" and not a "SaveAssociated" in maintainence views where i directly update or create the child model only. In this case, this model validation code is going to fail with an error saying index "[0]" not defined or something similar.

How can I use the same code in the model validation (in particular for child models) for both SaveAssociated and Save function calls in CakePHP?

1
Why would MerchantControl.id ever be equal to MerchantControl.merchant_id if not by chance? Shouldn't you compare against the foreign key column? Also what validate setting are you using, true or first? And is the merchant_id value obtained from an insert, or is the value passed from the view? ps, please always mention your exact CakePHP version! - ndm

1 Answers

0
votes

If I understand you correctly you want to check whether the urlparam is already used by another merchant or in other words whether it is unique.

Why don't you use the built-in validation rule isUnique?

Example:

public $validate = array(
    'urlparam' => array(
        'In Use by other Merchants' => array(
            'rule' => 'isUnique',
            'message' => 'URLPARAM belongs to another Merchant'
         )
    )
);