Reputation:
I'm trying to make page in admin panel from where the admin can change site settings such as: site title
, default country
etc.
I've created table in database called settings
without ID because I don't really need it. It will be only one row which will be updated. No inserts of new rows.
I have add this lines in my route.php
Route::get('settings', 'SettingsController@index')->name('admin.settings');
Route::post('settings/update', 'SettingsController@update')->name('admin.settings.update');
This is my update function in SettingsController.php
public function index()
{
$settings = Settings::all();
return view('backend.settings',compact('settings'));
}
public function update( Request $request)
{
$settings->settings_site_title = $request['site_title'];
$settings->settings_item_per_page = $request['item_per_page'];
$settings->settings_default_country = $request['default_country'];
$settings->settings_max_image_post = $request['max_image_post'];
$settings->save();
return redirect()->route('admin.settings')->with('alert-success', ' Success');
}
and the form
@foreach ($settings as $preferences)
{!! Form::open(['route' => 'admin.settings.update','files' => true , 'class' =>'form-horizontal']) !!}
<div class="form-group">
{!! Form::label('site_title', 'Site Name', array('class'=> 'col-sm-2 control-label')) !!}
<div class="col-sm-10">
{!! Form::text('site_title', $preferences->settings_site_title, ['class'=>'form-control', 'placeholder'=>'Enter site name', 'id'=>'site_title']) !!}
</div>
</div>
... some more inputs like ^
{!! Form::close() !!}
@endforeach
When I submit the form I've got this error:
Creating default object from empty value
Update: Model
class Settings extends Model
{
protected $table = 'settings';
public $timestamps = false;
protected $fillable = [
'settings_site_title',
'settings_item_per_page',
'settings_default_country',
'settings_max_image_post',
];
}
Controller
public function update( Request $request)
{
$settings = Settings::first(); //missed line
$settings->settings_site_title = $request['site_title'];
$settings->settings_item_per_page = $request['item_per_page'];
$settings->settings_default_country = $request['default_country'];
$settings->settings_max_image_post = $request['max_image_post'];
$settings->save();
return redirect()->route('admin.settings')->with('alert-success', ' Success');
}
Upvotes: 3
Views: 8817
Reputation: 4795
You have forgot to set $settings
variable in update
method
public function update( Request $request)
{
$settings = Settings::first(); //missed line
$settings->settings_site_title = $request['site_title'];
$settings->settings_item_per_page = $request['item_per_page'];
$settings->settings_default_country = $request['default_country'];
$settings->settings_max_image_post = $request['max_image_post'];
$settings->save();
return redirect()->route('admin.settings')->with('alert-success', ' Success');
}
or even better and shorter
public function update( Request $request)
{
$settings = Settings::first()->update($request->all());
return redirect()->route('admin.settings')->with('alert-success', ' Success');
}
of course this will work only if you fill fillable
property of Settings
model with columns you need to mass assign.
class Settings extends Model
{
// ...
protected $fillable = [
'site_title',
'item_per_page',
'default_country',
'max_image_post',
];
// ...
}
Edit
Try this
public function update( Request $request)
{
$settings = Settings::first(); //missed line
$settings->settings_site_title = $request->input('site_title');
$settings->settings_item_per_page = $request->input('item_per_page');
$settings->settings_default_country = $request->input('default_country');
$settings->settings_max_image_post = $request->input('max_image_post');
$settings->save();
return redirect()->route('admin.settings')->with('alert-success', ' Success');
}
Edit
add this to your Settings
model
protected $primaryKey = null;
public $incrementing = false;
Upvotes: 2
Reputation: 917
if(count($settings)>0){
}
Use this if condition before foreach. I think the $setting variable is empty.
Upvotes: 0