Karl
Karl

Reputation: 410

CakePHP throws validation error for fields which are not in the request

I understood the CakePHP validation that way: Only fields which are in the request (e.g. ['Post']['NAME'] and ['Post']['STREET']) are validated in the appmodel, even if in the appmodel there are declarations for many more fields.

Now I call this->Post->save($this->request->data) and Cake throws validation errors for fields which are not in the request and now I don´t know what to do.

Controller:

debug of this->request->data:

array(
    'Post' => array(
        'TYPE' => '1',
        'B/S' => 'S',
        'LATITUDE' => '50.98549',
        'LONGITUDE' => '11.31551',
        'CART' => 'jkl',
        'MARKET' => 'jk',
        'INCOMETYPE' => '1',
        'INCOME' => '8',
        'DEADLINE' => '1',
        'DATE' => '31.08.2014',
        'TIME' => '',
        'PREFERREDDATES' => 'nach Absprache',
        'address' => 'Fuldaer Straße, 99423, Weimar',
        'STREET' => 'Fuldaer Straße',
        'DELIVERYAREA' => '99423',
        'CITY' => 'Weimar',
        'TEL' => '1234567654321',
        'saveAppendix' => 'edit'
    )
)

Controller:

debug of $this->Post-validationErrors:

array(
    'ZIPCODE' => array(
        (int) 0 => 'Bitte eine gültige Postleitzahl eingeben.'
    ),
    'VEHICLE' => array(
        (int) 0 => 'Bitte das Fahrzeug angeben'
    ),
    'SPACE' => array(
        (int) 0 => 'Bitte den verfügbaren Platz angeben'
    )
)

Controller:

Code with debug-statements:

if (isset($this->request->data['Post']['saveAppendix']) && $this->request->data['Post']['saveAppendix'] == "edit") {
                    debug($this->request->data);
                    if ($this->Post->save($this->request->data)) {
                        $this->Session->setFlash('Dein Inserat wurde erfolgreich bearbeitet.', 'flash_success');
                        $this->set('action', 'goToIndex');
                        $this->render('addRedirect', 'ajax');
                    } else {
                        debug($this->Post->validationErrors);
                        ...further code...
                    }
}

EDIT As requested by burzum, the validation rules:

class Post extends AppModel {

    public function beforeValidate(array $options = array()) {
        $request = $this->data[$this->alias];
        if (isset($request['INCOMETYPE']) && ($request['INCOMETYPE'] == "1" || isset($request['INCOMETYPE']) && $request['INCOMETYPE'] == "2")) {
            $this->data[$this->alias]['INCOME'] = preg_replace(
                '/^([^,]*).*$/', '$1', $request['INCOME']
            );
            $this->data[$this->alias]['INCOME'] = preg_replace(
                '/\D/', '', $request['INCOME']
            );
        };
        //für validation die schaltungsart-variablen setzen
        if (isset($request['DEADLINE']) && $request['DEADLINE'] == "1") {
            $this->validator()->remove('TIME');
            $date = $request['DATE'];           
        };
        if (isset($request['DEADLINE']) && $request['DEADLINE'] == "2") {
            $this->validator()->remove('PREFERREDDATES');
            $date = $request['DATE'];
        };
        if (isset($request['DEADLINE']) && $request['DEADLINE'] == "3") {
            $this->validator()->remove('DATE');
            $this->validator()->remove('TIME');
        };
        if (isset($date) && $date <> "") {
            //datepicker date in sortierbares datum wandeln: Y M D
            $tmpdate = list($day, $month, $year) = explode('.', $date);
            $altdate = $year.$month.$day;
            $this->data[$this->alias]['ALTDATE'] = $altdate;
        };          
        if (isset($request['INCOMETYPE']) && $request['INCOMETYPE'] == "4") {
            $this->validator()->remove('INCOME');
        };
        if (isset($request['INCOMETYPE']) && $request['INCOMETYPE'] == "5") {
            $this->validator()->remove('INCOME');
        };
        // B/S-Feld füllen mit entsprechendem String
        if (isset($request['TYPE']) && isset($request['B/S'])) {
            if ($request['TYPE'] == 1 && $request['B/S'] == "S") {
                $this->data[$this->alias]['B/S'] = "Suche Kurier";
            };
            if ($request['TYPE'] == 2 && $request['B/S'] == "S") {
                $this->data[$this->alias]['B/S'] = "Suche Bildungsdienstleistung";
            };
            if ($request['TYPE'] == 3 && $request['B/S'] == "S") {
                $this->data[$this->alias]['B/S'] = "Suche Elektronik & Technik";
            };
            if ($request['TYPE'] == 4 && $request['B/S'] == "S") {
                $this->data[$this->alias]['B/S'] = "Suche Freizeit & Sport";
            };
            if ($request['TYPE'] == 5 && $request['B/S'] == "S") {
                $this->data[$this->alias]['B/S'] = "Suche Haushalt und Garten";
            };
            if ($request['TYPE'] == 6 && $request['B/S'] == "S") {
                $this->data[$this->alias]['B/S'] = "Suche Soziales";
            };
            if ($request['TYPE'] == 1 && $request['B/S'] == "B") {
                $this->data[$this->alias]['B/S'] = "Biete Kurier";
            };
            if ($request['TYPE'] == 2 && $request['B/S'] == "B") {
                $this->data[$this->alias]['B/S'] = "Biete Bildungsdienstleistung";
            };
            if ($request['TYPE'] == 3 && $request['B/S'] == "B") {
                $this->data[$this->alias]['B/S'] = "Biete Elektronik & Technik";
            };
            if ($request['TYPE'] == 4 && $request['B/S'] == "B") {
                $this->data[$this->alias]['B/S'] = "Biete Freizeit & Sport";
            };
            if ($request['TYPE'] == 5 && $request['B/S'] == "B") {
                $this->data[$this->alias]['B/S'] = "Biete Haushalt & Garten";
            };
            if ($request['TYPE'] == 6 && $request['B/S'] == "B") {
                $this->data[$this->alias]['B/S'] = "Biete Soziales";
            };
        };

        //inserat-datum darf nicht in vergangenheit liegen
        /*if ($request['DATE'] == date("d.m.Y") && $request['TIME'] < date("H:i")) {
            unset($this->data[$this->alias]['TIME']);
        };*/
        return parent::beforeValidate($options);
    }

   var $validate = array(
        'STREET' => array(
            'rule-1' => array(
                'rule' => 'notEmpty',
                'message' => 'Hidden input B/S wurde geändert'
            ),
            'rule-2' => array(
                'rule'    => '/^[a-z]{1,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),
        'STREET' => array(
            'rule-1' => array(
                'rule' => 'notEmpty',
                'message' => 'Bitte eine Straße angeben'
            ),
            'rule-2' => array(
                'rule'    => '/^[a-z0-9_äÄöÖüÜߧ$%&*\/\d\w\s?!\.:,\'"\(\)=\+-]{1,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),
        'HOUSENUMBER' => array(
           'rule-1' => array(
                'rule' => 'notEmpty',
                'message' => 'Bitte eine Hausnummer angeben'
            ),
            'rule-2' => array(
                'rule'    => '/^[a-z0-9_äÄöÖüÜߧ$%&*\/\d\w\s?!\.:,\'"\(\)=\+-]{1,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),
        'ZIPCODE' => array(
            'rule-1' => array(
                'rule' => array('postal', null, 'de'),
                'message' => 'Bitte eine gültige Postleitzahl eingeben.',
                'last' => true
            ),
            'rule-2' => array(
                'rule' => array('ZipExists'),
                'message' => 'Postleitzahl existiert nicht!'  
            )
        ),
        'CITY' => array(
            'rule-1' => array(
                'rule' => 'notEmpty',
                'message' => 'Bitte eine Stadt angeben'
            ),
            'rule-2' => array(
                'rule'    => '/^[a-z0-9_äÄöÖüÜߧ$%&*\/\d\w\s?!\.:,\'"\(\)=\+-]{1,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),
        'CART' => array(
            'rule-1' => array(
                'rule' => 'notEmpty',
                'message' => 'Bitte etwas eingeben'
            ),
            'rule-2' => array(
                'rule'    => '/^[a-z0-9_äÄöÖüÜߧ$%&*\/\d\w\s?!\.:,\'"\(\)=\+-]{1,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),
        'MISC' => array(
            'rule-1' => array(
                'allowEmpty' => true
            ),
            'rule-2' => array(
                'rule'    => '/^[a-z0-9_äÄöÖüÜߧ$%&*\/\d\w\s?!\.:,\'"\(\)=\+-]{1,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),
        'MARKET' => array(
            'rule-1' => array(
                'rule' => 'notEmpty',
                'message' => 'Bitte einen Markt angeben'
            ),
            'rule-2' => array(
                'rule'    => '/^[a-z0-9_äÄöÖüÜߧ$%&*\/\d\w\s?!\.:,\'"\(\)=\+-]{1,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),
        'DATE' => array(
            'rule' => 'notEmpty',
            'required' => 'true',
            'message' => 'Bitte das Datum eingeben'
        ),
        'PREFERREDDATES' => array(
            'rule' => 'notEmpty',
            'required' => 'true',
            'message' => 'Bitte die passenden Zeiten eingeben'
        ),
        'DEADLINE' => array(
            'rule' => 'notEmpty',
            'required' => 'true',
            'message' => 'Bitte die Art der Schaltung festlegen'
        ),
        'TIME' => array(
            'rule' => 'time',
            'required' => 'true',
            'message' => 'Bitte die Zeit eingeben'
        ),
        'INCOME' => array(
            'rule' => 'notEmpty',
            'required' => 'true',
            'message' => 'Bitte die Bezahlung eingeben'
        ),
        /*'INCOME' => array(
            'rule-1' => array(
                'rule' => 'notEmpty',
                'message' => 'Bitte die Bezahlung angeben'
            ),
            'rule-2' => array(
                'rule'    => '/^[a-z0-9_äÄöÖüÜߧ$%&*\/\d\w\s?!\.:,\'"\(\)=\+-]{1,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),*/
        'INCOMETYPE' => array(
            'rule' => 'notEmpty',
            'required' => 'true',
            'message' => 'Bitte die Art der Bezahlung festlegen'
        ),
        'VEHICLE' => array(
            'rule-1' => array(
                'rule' => 'notEmpty',
                'message' => 'Bitte das Fahrzeug angeben'
            ),
            'rule-2' => array(
                'rule'    => '/^[a-z0-9_äÄöÖüÜߧ$%&*\/\d\w\s?!\.:,\'"\(\)=\+-]{1,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),
        'DELIVERYAREA' => array(
           'rule-1' => array(
                'rule' => array('postal', null, 'de'),
                'message' => 'Bitte eine gültige Postleitzahl eingeben.',
                'last' => true
            ),
            'rule-2' => array(
                'rule' => array('ZipExists'),
                'message' => 'Postleitzahl existiert nicht!'  
            )
        ),
        'SPACE' => array(
            'rule-1' => array(
                'rule' => 'notEmpty',
                'message' => 'Bitte den verfügbaren Platz angeben'
            ),
            'rule-2' => array(
                'rule'    => '/^[a-z0-9_äÄöÖüÜߧ$%&*\/\d\w\s?!\.:,\'"\(\)=\+-]{1,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),
        'TEL' => array(
            'rule-1' => array(
                'rule' => 'notEmpty',
                'message' => 'Bitte die Telefonnummer eingeben'
            ),
            'rule-2' => array(
                'rule'    => '/^[0-9_\/\d\w\s?!\.:,\'"\(\)=\+-]{0,}$/i',
                'message' => 'Hacker kommen hier nicht weit!'
            )
        ),
        'NAME' => array(
            'rule'    => '/^[a-z0-9_äÄöÖüÜߧ$%&*\/\d\w\s?!\.:,\'"\(\)=\+-]{0,}$/i',
            'message' => 'Hacker kommen hier nicht weit!'
        ),
        'LATITUDE' => array(
            'rule-1' => array(
                    'rule' => 'notEmpty',
                    'message' => 'Bitte gültige Adresse angeben'
                ),
            'rule-2' => array(
                    'rule'    => 'numeric',
                    'message' => 'Bitte gültige Adresse angeben'
                )
        ),
        'LONGITUDE' => array(
            'rule-1' => array(
                    'rule' => 'notEmpty',
                    'message' => 'Bitte gültige Adresse angeben'
                ),
            'rule-2' => array(
                    'rule'    => 'numeric',
                    'message' => 'Bitte gültige Adresse angeben'
                )
        ),
        'TYPE' => array(
            'rule-1' => array(
                    'rule' => 'numeric'
                ),
            'rule-2' => array(
                    'rule'    => array('maxLength', 1)
                )
        )   
    );

    public function ZipExists($zipcode){
        $value = array_values($zipcode);
        $value = $value[0];
        $Zipcode = ClassRegistry::init('Zipcode');
        $valid = $Zipcode->find('count', array('conditions'=> array('Zipcode.zipcode' =>$value)));
        if ($valid >= 1){
          return true;
        }
        else{
          return false;
        }
    }
};

Upvotes: 1

Views: 352

Answers (1)

yossi
yossi

Reputation: 3164

If i understand you correctly, than you got it all wrong.
cake will validate everything that is in the validation rules, and required. keep in mind that omitting a field, might be a validation error for itself..


edit: Validation works in the context of the model, not the request. it validates the data that will be saved to the database, against the validation rules.
The meaning is: it will compare the POST data to the rules.

and, if a field is required in the validation-rules, it will throw an error.

Please attach the validation errors

Upvotes: 1

Related Questions