Today, I was using Validation in Laravel 4 and I encountered (maybe) a bug.
This is my validation rules in controller:
$rules = array(
'title' => 'min:3|max:30|required',
'price' => 'numeric|required',
'avatar' => 'mimes:jpeg,jpg,png,JPG|max:300',
'category_id' => 'numeric'
);
When I tried to upload an Image greater than 2 MB, Laravel didn't show me image_size error.
But for Images less than 2 MB it worked well.
Then I changed max rule to max:2000, and uploaded an Image greater than 2 MB again. This time Laravel showed me correct message.
What is wrong with my code?
Your issue is related to this closed Github issue, which is because the way PHP reports the way file sizes are when they exceed your post_max_size.
You need to add 'min' to your rules.
$rules = array(
'title' => 'min:3|max:30|required',
'price' => 'numeric|required',
'avatar' => 'mimes:jpeg,jpg,png,JPG|max:300|min:1',
'category_id' => 'numeric'
);
Related
I use a versioning system to save multiple versions of a 'minor' (a model in my application). It contains quite a few fields, like name, goals, requirements, subject and many more. When I save a new version, or 'version 2', using eloquent, it also changes the other version.
I have tried multiple ways of saving the minor, like requesting the first one and updating it like below, or changing each individual item one-by-one.
Minor::limit(1)
->where("id", $id)
->where('version', $_POST['version'])
->first()
->update([
'name' => $_POST['name'],
'ects' => floatval($_POST['ects']),
'contact_hours' => intval($_POST['contact_hours']),
'education_type' => $_POST['education_type'],
'language' => $_POST['language'],
'subject' => Input::get('subject'),
'goals' => Input::get('goals'),
'requirements' => Input::get('requirements'),
]);
It should only save the selected version, but instead, it overwrites all versions of the minor with the same ID and saves them to the database.
How can I prevent this, or does anyone have an idea on how to fix this?
You can try using updateOrCreate method:
Minor::updateOrCreate([
'id' => $id,
'version' => $_POST['version']
],[
'name' => $_POST['name'],
'ects' => floatval($_POST['ects']),
'contact_hours' => intval($_POST['contact_hours']),
'education_type' => $_POST['education_type'],
'language' => $_POST['language'],
'subject' => Input::get('subject'),
'goals' => Input::get('goals'),
'requirements' => Input::get('requirements'),
]);
I still don't know why this happened or how to fix it using the same method. I have however found a way around it. I now update and save the minor with the ->update([...]) method build into eloquent.
Minor::where([["id", "139858"], ["version", Input::get('version')]])
->update([
'name' => Input::get('name'),
'ects' => Input::get('ects'),
'contact_hours' => Input::get('contact_hours'),
'education_type' => Input::get('education_type'),
'language' => Input::get('language'),
'subject' => Input::get('subject'),
'requirements' => Input::get('requirements'),
'goals' => Input::get('goals')
]);
This doesn't seem to alter the other versions. This is the only way I found to make it work, you can't make a variable of the object, change values and then save it. That would overwrite the other versions.
Laravel Image validation not working. When I try to upload ai or PSD file it's showing error:
Illuminate \ Http \ Exceptions \ PostTooLargeException No message
Also not working when trying to upload a 3Mb image file.
$this->validate($request, [
'company_name' => 'required',
'logo' => 'mimes:jpeg,jpg,png|max:1024|image',
'address' => 'required',
'phone' => 'required|numeric',
'currency_code' => 'required',
'vat_rate' => 'required|numeric'
]);
Default file upload size is 2MB
Open the php.ini file. Find these lines in the php.ini file and replace it following numbers: upload_max_filesize = 64M Save the changes and try uploading the file again. You will now get success.
You can find the path of your PHP configuration file in your xampp/php/php.ini(Windows User) file And don't forget to restart your server
Try using size validation Rule instead of max, from the docs:
size:value
The field under validation must have a size matching the given value.
For string data, value corresponds to the number of characters. For
numeric data, value corresponds to a given integer value. For an
array, size corresponds to the count of the array. For files, size
corresponds to the file size in kilobytes.
$this->validate($request, [
'company_name' => 'required',
'logo' => 'mimes:jpeg,jpg,png|size:1024|image',
'address' => 'required',
'phone' => 'required|numeric',
'currency_code' => 'required',
'vat_rate' => 'required|numeric'
]);
I'm using CodeIngiter 2.1 and I wanna define custom validation errors for each rule per each field. The fields are as follows.
array(
'field' => 'firstname',
'rules' => 'required',
'error' => 'This field cannot be empty.'
),
array(
'field' => 'email',
'rules' => 'required',
'error' => 'The email cannot be empty.'
)
But In CodeIgniter only one error message is defined for one rule. So how to override that one and Please suggest some solutions for getting different errors for perticular field. The work is more appreciated.
Try using the CI function :
set_message();
All of the native error messages are located in the following language file:
language/english/form_validation_lang.php
To set your own custom message you can either edit that file, or use the following function:
$this->form_validation->set_message('rule', 'Error Message');
for more about set_message here
Hope it will help;
I recently made this custom error message option for my codeigniter 3.0-dev applicaiton. Hope this helps anyone out there.
https://gist.github.com/abdmaster/7287962
To use it (example),
$this->form_validation->set_rules('name','Name','required|alpha',array('required' => 'Please fill the field %s .');`
It will work with Base models like jamierumbelow's MY_Model. In your model, you do something like this:
public $validate = array(
'display_name' => array(
'field' => 'display_name',
'label' => 'Display Name',
'rules' => 'trim|required|xss_clean|valid_fullname|is_unique[users_model.display_name]',
'error_msg' => array(
'is_unique' => 'The name in %s is already being used by someone.',
),
),
);
Rest are how we are use normally. Hope these examples are enough.
I haven't tried in v2.1.x but hopefully this will work. Maybe have to do some minor adjustments.
I've been at this most of the day now, and I cannot get this working for the life of me (well I can get it 1/2 working but not fully correctly).
Basically, I am trying to use Validation on a search form field like so:
if(isset($search['ApplicantAge']) && !empty($search['ApplicantAge'])) {
if ($this->Plan->validates()) {
$ApplicantAge = $search['ApplicantAge'];
}
}
And here is my model code:
...
'ApplicantAge' => array(
'required' => true,
'allowEmpty' => false,
'rule' => 'numeric',
'message' => 'A valid Age is required. Please enter a valid Age.'),
...
The validation is working BUT when I enter a number (numeric), it displays my error! And when it's blank NO error displays, and when I enter letters it seems to work : ( ??
Does anyone know a trick to this odd behavior?
Try using the 'notEmpty' rule instead of the required/allowEmpty stuff.
'ApplicantAge' => array(
'applicant-age-numeric'=> array(
'rule' => 'numeric',
'message' => 'A valid Age is required. Please enter a valid Age.'
),
'applicant-age-not-empty'=> array(
'rule' => 'notEmpty',
'message' => 'This field cannot be left blank'
)
)
firstly why are you using the field 'ApplicantAge' when the conventions say its should be lower case under scored?
to answer your question the best way to do validation like that is http://book.cakephp.org/view/410/Validating-Data-from-the-Controller
the other option is to do $this->Model->save($data, array('validate' => 'only'));
The manual did not assist me at all : (
But your suggestion on the validate => only array seems to have done the trick. This is how I got it working:
plans_controller.php
if (isset($search['ApplicantAge'])) {
$this->Plan->save($search, array('validate' => 'only'));
if ($this->Plan->validates($this->data)) {
$ApplicantAge = $search['ApplicantAge'];
}
}
plan.php (model)
var $validate = array(
'ApplicantAge' => array(
'applicant-age-numeric' => array(
'rule' => 'numeric',
'message' => 'A valid Age is required. Please enter a valid Age.'),
'applicant-age-not-empty' => array(
'rule' => 'notEmpty',
'message' => 'This field cannot be left blank'),
),
Now, if no data is entered in the ApplicateAge field, the proper message is displayed. And if a non-numeric is entered, the correct message is also displayed.
This was a lot more challenging than I thought it would be!
For the record, I'll make a correction to my earlier accepted post. Little did I know the validate => only on the save() was actually still saving data to my plans table.
I was able to get it working using set(). Here is the code that completely solved the problem:
plans_controller.php
if (isset($search['ApplicantAge'])) {
$this->Plan->set($this->data);
if ($this->Plan->validates()) {
$ApplicantAge = $search['ApplicantAge'];
}
}
plan.php (model):
var $validate = array(
'ApplicantAge' => array(
'applicant-age-numeric' => array(
'rule' => 'numeric',
'message' => 'A valid Age is required. Please enter a valid Age.'),
'applicant-age-not-empty' => array(
'rule' => 'notEmpty',
'message' => 'This field cannot be left blank'),
)
How to make file uploading as optional with validation?
The code below validates even if i didn't selected any file.
I want to check the extension only if i selected the the file.
If i am not selecting any file it should not return any validation error.
class Catalog extends AppModel{
var $name = 'Catalog';
var $validate = array(
'name' => array(
'rule' => '/^[a-z0-9 ]{0,}$/i',
'allowEmpty' => false,
'message' => 'Invalid Catalog name'
),
'imageupload' => array(
'rule' => array('extension',array('jpeg','jpg','png','gif')),
'required' => false,
'allowEmpty' => true,
'message' => 'Invalid file'
),
);
}
thanks in advance
"I assign $this->data['Catalog']['image'] = $this->data['Catalog']['imageupload']['name'];"
So by the time you save your data array, it looks something like this I assume:
array(
'image' => 'foobar',
'imageupload' => array(
'name' => 'foobar',
'size' => 1234567,
'error' => 0,
...
)
)
Which means, the imageupload validation rule is trying to work on this data:
array(
'name' => 'foobar',
'size' => 1234567,
'error' => 0,
...
)
I.e. the value it's trying to validate is an array of stuff, not just a string. And that is unlikely to pass the specified validation rule. It's also probably never "empty".
Either you create a custom validation rule that can handle this array, or you need to do some more processing in the controller before you try to validate it.
Concept:
In Controller, before validating, or saving (which does validation automatically by default) check if any file is uploaded. If not uploaded, then unset validator for the file field.
Sample code:
Controller
// is any image uploaded?
$isNoFileUploaded = ($this->request->data['Model']['field_name']['error'] == UPLOAD_ERR_NO_FILE) ? true : false ;
if ($isNoFileUploaded) {
$this->Model->validator()->remove('field_name');
}
Notes:
This solution comes under preprocessing as one of the two alternative approaches (preprocessing in controller, custom validation in model) suggested by #deceze's answer