Yii2 Form submission through ajax - ajax

I have used check boxes in my gridview,like this
<?php
if(isset($dataProvider) && !empty($dataProvider)) {
echo \yii\grid\GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
['class' => 'yii\grid\SerialColumn',
'header' => 'No.'],
[
'class' => 'yii\grid\CheckboxColumn',
'header'=>'Select',
'checkboxOptions' => function ($model, $key, $index, $column) {
return ['value' => $model->dsItemId];
}
],
[
'label'=>'Category',
'value' => function ($model) {
return $model->getdscategoryName();
},
],
'dsItemName',
'qty',
[
'attribute' => 'image',
'enableSorting' => false,
'format' => 'image',
'value' => function ($model) {
return $model->getImageUrl();
},
],
],
]);
echo Html::submitButton('Save',['id' => 'saveBtn','class' => 'btn btn-danger']);
}?>
When I'm selecting check boxes and select savebutton, it will go to this function given below,
<script>
$( document ).ready(function() {
$('#saveBtn').click(function() {
var idVar = '';
$("input[name='selection[]']").each( function () {
if($(this).is(':checked')) {
if(idVar != '') {
idVar += ',' + $(this).val();
}else {
idVar = $(this).val();
}
}
});
$.ajax({
type: "POST",
url:"<?php echo Yii::$app->urlManager->createAbsoluteUrl(['dsproductitems/setproduct'])?>",
data: { dsItemId : idVar },
success:function(data) {
location.reload();
}
});
});
});
</script>
Here I'm trying to redirect my form to controller through ajax and the problem is, program control is failing to enter into flowing code.
$.ajax({
type: "POST",
url:"<?php echo Yii::$app->urlManager->createAbsoluteUrl(['dsproductitems/setproduct'])?>",
data: { dsItemId : idVar },
success:function(data) {
location.reload();
}
});
});
i'm failing to figure out why.. please help..

Related

Dropzone.js vuejs laravel message: "Undefined index: width"

When I select a file it is uploaded to the public/upload-images folder. In the laravel Controller the validation fails because the params are not included in the request. When I dump and die. This is what I get. As you can see... the params are missing. Below that is the Dropzone setup.
echo '<pre>';
print_r(request()->all());
echo '</pre>';
die();
$data = request()->validate([
'image' => '',
'width' => '',
'height' => '',
'location' => '',
]);
$image = $data['image']->store('user-images', 'public');
$userImage = auth()->user()->images()->create([
'path' => $image,
'width' => $data['width'],
'height' => $data['height'],
'location' => $data['location'],
]);
return new UserImageResource($userImage);
(
[image] => Illuminate\Http\UploadedFile Object
(
[test:Symfony\Component\HttpFoundation\File\UploadedFile:private] =>
[originalName:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 20220406_125155.jpg
[mimeType:Symfony\Component\HttpFoundation\File\UploadedFile:private] => image/jpeg
[error:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 0
[hashName:protected] =>
[pathName:SplFileInfo:private] => /tmp/phpdAwZvd
[fileName:SplFileInfo:private] => phpdAwZvd
)
)
props: [
'imageWidth',
'imageHeight',
'location',
],
data: () => {
return {
dropzone: null,
}
},
mounted() {
this.dropzone = new Dropzone(this.$refs.userImage, this.settings);
},
computed: {
settings() {
return {
paramName: 'image',
url: '/api/user-images',
acceptedFiles: 'image/*',
params: {
'width': this.imageWidth,
'height': this.imageHeight,
'location': this.location,
},
headers: {
'X-CSRF-TOKEN': document.head.querySelector('meta[name=csrf-token]').content,
},
success: (e, res) => {
alert('uploaded!');
},
error: (e, error) => {
console.log(error);
}
};
}
}

Display Each Column sum on footer Yajra Laravel

The following screenshot shows the list of database results by enabling server-side processing. It shows the column total computed by using the Yajra DataTables.
HTML Code for DataTables with Column Total
To display the footer using html builder, pass true as 2nd argument on $builder->table([], true) api.
{!! $dataTable->table([], true) !!}
script
update th values
#push('scripts')
{!! $dataTable->scripts() !!}
<script>
var hours = JSON.parse("{{json_encode($hours)}}");
$(document).ready(function(){
$("tfoot tr>th:nth-child(2)").text("Total")
for (let i = 0; i < hours.length; i++) {
$('tfoot tr>th:nth-child('+ (i+3) +')').text(hours[i])
}
})
</script>
#endpush
Report Datatable File
In Query function we are getting reports record from database and use query result in dataTable function make column according to our requirement and finally set values to getColumns function.
public function dataTable($query)
{
$reports = ($query['data']);
return datatables()->make($reports)
->addColumn('name', function ($reports) {
return isset($reports['user_name']) ? $reports['user_name'] : null;
})
->addColumn('monday', function ($reports) {
return isset($reports['Mon']) ? ($reports['Mon']) : '-';
})
->addColumn('tuesday', function ($reports) {
return isset($reports['Tue']) ? $reports['Tue'] : '-';
})
->addColumn('wednesday', function ($reports) {
return isset($reports['Wed']) ? $reports['Wed'] : '-';
})
->addColumn('thursday', function ($reports) {
return isset($reports['Thu']) ? $reports['Thu'] : '-';
})
->addColumn('friday', function ($reports) {
return isset($reports['Fri']) ? $reports['Fri'] : '-';
})
->addColumn('total', function ($reports) {
return (isset($reports['Mon']) ? $reports['Mon'] : 0) +
(isset($reports['Tue']) ? $reports['Tue'] : 0) +
(isset($reports['Wed']) ? $reports['Wed'] : 0) +
(isset($reports['Thu']) ? $reports['Thu'] : 0) +
(isset($reports['Fri']) ? $reports['Fri'] : 0);
})
->addIndexColumn();
}
public function query(Lot $model)
{
$data = Reports.....;
return compact('data');
}
public function html()
{
return $this->builder()
->setTableId('userrequestdatatable-table')
->columns($this->getColumns())
->minifiedAjax()
->dom('Bfrtip')
->orderBy(1)
->buttons(
Button::make('export'),
);
}
protected function getColumns()
{
return [
'#' => [
'data' => 'DT_RowIndex',
'name' => 'DT_RowIndex',
'orderable' => false,
'searchable' => false
],
'user name'=> [
'data' => 'name',
'name' => 'name',
],
'monday'=> [
'data' => 'monday',
'name' => 'monday',
],
'tuesday'=> [
'data' => 'tuesday',
'name' => 'tuesday',
],
'wednesday'=> [
'data' => 'wednesday',
'name' => 'wednesday',
],
'thursday'=> [
'data' => 'thursday',
'name' => 'thursday',
],
'friday'=> [
'data' => 'friday',
'name' => 'friday',
],
'total'=> [
'data' => 'total',
'name' => 'total',
]
];
}

double insert in database while submiting form using Ajax in laravel

I'm trying to submit my form with ajax.
So I'm using the following ajax code:
<script>
if ($("#castingform").length > 0) {
$("#castingform").validate({
rules: {
casting_name: {
required: true,
maxlength: 50
},
casting_photo: {
required: true
},
},
messages: {
casting_name: {
required: "Please enter name",
maxlength: "Name should be 50 characters long."
},
casting_photo: {
required: "Please enter photo"
},
},
submitHandler: function(form) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$('#castingform').on('submit', function(event) {
event.preventDefault();
$.ajax({
url:"{{ url('castings') }}",
method:"POST",
data:new FormData(this),
dataType:'JSON',
contentType: false,
cache: false,
processData: false,
success:function(res) {
$("#createBtn").removeClass("disabled");
$("#createBtn").text("Sign in");
if (res.status == "success") {
$(".result").html("<div class='alert alert-success rounded'><button type='button' class='close' data-dismiss='alert'>×</button>" + res.message+ "</div>");
/* location.reload();*/
} else if(res.status == "failed") {
$(".result").html("<div class='alert alert-danger alert-dismissible'><button type='button' class='close' data-dismiss='alert'>×</button>" + res.message+ "</div>");
}
}
});
});
}
})
}
</script>
But when I click for the first time on the button submit, the success message doesn't show, and for the second time I get the success message but I find a double insert in the database.
My Controller
EDIT
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'casting_name' => 'required',
'casting_photo' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);
if ($validator->passes()) {
$input['casting_photo'] = time().'.'.$request->casting_photo->extension();
$request->casting_photo->move(public_path('castingimages'), $input['casting_photo']);
$data = [
'casting_name' => $request->casting_name,
'casting_photo'=> $input['casting_photo']
];
Casting::create($data);
return response()->json([
"status" => "success",
"message" => "Success! post created."
]);
}
return response()->json([
"status" => "failed",
"message" => "Alert! post not created"
]);
}
I think the problem is in this line submitHandler: function(form) and this line $('#castingform').on('submit', function(event) {, but I don't know how to solve it.

In ajax post request my app blocked by CORS policy error

I encountered CORS policy error in my laravel 5.8 / jquery 3.4.1 app when I need send post request to create google calendar event with api like:
public function calendar_add_event(Request $request)
{
session_start();
$startDateTime = $request->start_date;
$endDateTime = $request->end_date;
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$this->client->setAccessToken($_SESSION['access_token']);
$service = new Google_Service_Calendar($this->client);
$calendarId = 'primary';
$event = new Google_Service_Calendar_Event([
'summary' => $request->title,
'description' => $request->description,
'start' => ['dateTime' => $startDateTime],
'end' => ['dateTime' => $endDateTime],
'reminders' => ['useDefault' => true],
]);
$results = $service->events->insert($calendarId, $event);
if (!$results) {
return response()->json(['status' => 'error', 'message' => 'Something went wrong']);
}
return response()->json(['status' => 'success', 'message' => 'Event Created']);
} else {
return redirect()->route('oauthCallback');
}
}
In js code I send post request :
backendCalendar.prototype.saveCalendarAddEvent = function (user_id) {
var href = this_backend_home_url + "/admin/calendar_add_event";
$.ajax( {
type: "POST",
dataType: "json",
url: href,
data: { "title": $('#new_event_title').val(), "description": $('#new_event_description').val(), "start_date": $('#new_event_start_date').val(), "end_date": $('#new_event_end_date').val(), "_token": this_csrf_token},
success: function( response )
{
popupAlert("New event was added successfully !", 'success')
},
error: function( error )
{
popupErrorMessage(error.responseJSON.message)
}
});
} // backendCalendar.prototype.saveCalendarAddEvent
I installed https://github.com/barryvdh/laravel-cors package and left file config/cors.php without changes :
<?php
return [
'supportsCredentials' => false,
'allowedOrigins' => ['*'],
'allowedOriginsPatterns' => [],
'allowedHeaders' => ['*'],
'allowedMethods' => ['*'],
'exposedHeaders' => [],
'maxAge' => 0,
];
in routes/web.php I added HandleCors middleware :
Route::group(['middleware' => ['auth', 'isVerified', 'CheckUserStatus'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
...
Route::post('calendar_add_event', 'gCalendarController#calendar_add_event')->middleware(\Barryvdh\Cors\HandleCors::class);
and I hoped that would fix my problems, but I still have this error : https://imgur.com/a/uyTy30Y
How to fix it ?
I found a decision here : Access-Control-Allow-Origin error sending a jQuery Post to Google API's
by additing additive parameters crossDomain and modification of dataType :
$.ajax({
url: 'https://www.googleapis.com/moderator/v1/series?key='+key,
data: myData,
type: 'GET',
crossDomain: true,
dataType: 'jsonp',
success: function() { alert("Success"); },
error: function() { alert('Failed!'); },
beforeSend: setHeader
});

yii2 pjax gridview issue

I am using gridview with pjax in yii2 advanced. When i add/update/delete any record the pjax loads the very first html of page. For example, i have 10 records after deleting a record there should be 9 records, but it still loads 10 records and this continues even if you have deleted all the records. Same goes for add and update as well.
But if i hit F5 then it loads the actual records fetched from the database table and if i do any of the actions again then it again shows 10 records.
Here is the Gridview code with Pjax
$this->registerJs("$('.js-delete').on('click', function(e) {
ajax_actions(this, true, {
'pjax_container': '#products-grid'
});
return false;
});");
Pjax::begin([
"id" => "products-grid",
"enablePushState" => false
]);
echo GridView::widget([
'dataProvider' => $dataProvider,
"summary" => '',
"rowOptions" => function($model) {
if($model->status == Common::STATUS_INACTIVE)
{
return ["class" => "inactive"];
}
},
'columns' => [
[
"class" => 'yii\grid\SerialColumn',
"headerOptions" => [
"class" => 'hidden-480'
],
"contentOptions" => [
"class" => 'hidden-480'
]
], [
"attribute" => "title",
"label" => "Product"
], [
"attribute" => "companies_id",
"label" => "Companies",
"value" => "companies.title"
], [
"attribute" => "product_types_id",
"header" => "Category",
"value" => "productTypes.title"
], [
"attribute" => "part_number",
"header" => "<span class=\"hidden-360\">Part </span>Number"
], [
"attribute" => "created_on",
"label" => "Added On",
"format" => ["date", "php:" . Common::DATETIME_FORMAT_DISPLAY],
"headerOptions" => [
"class" => 'textRight hidden-360'
],
"contentOptions" => [
"class" => 'textRight hidden-360'
]
], [
"class" => 'yii\grid\ActionColumn',
"header" => "Actions",
"headerOptions" => [
"class" => "textRight actions"
],
"contentOptions" => [
"class" => "textRight actions"
],
"template" => "{view} {edit} {delete}",
"buttons" => [
'view' => function($url, $model) {
return Html::a('<i class="' . Common::ICON_VIEW . '"></i> <span class="hidden-640">View</span>', ['view', 'token' => $model->token], ["class" => "call-ajax"]);
},
'edit' => function($url, $model) {
return Html::a('<i class="' . Common::ICON_EDIT . '"></i> <span class="hidden-640">Edit</span>', ['update', 'token' => $model->token], ["class" => "call-ajax"]);
},
'delete' => function($url, $model) {
return Html::a('<i class="' . Common::ICON_DELETE . '"></i> <span class="hidden-640">Delete</span>', ['delete', 'token' => $model->token], [
'class' => 'js-delete'
]);
}
]
]
]
]);
Pjax::end();
functions
function ajax_submit(element, pjax_container)
{
var form = $(element);
if(form.find('.has-error').length) return false;
$.post(form.attr('action'),form.serialize()).done(function(result){
var result = JSON.parse(result);
if(result.type=='error')
{
result.container = '.error-container';
messages(result)
}
else
{
if(pjax_container) $.pjax.reload({container: pjax_container});
$('.overlay').click();
result.container = '.message-container';
messages(result);
}
});
return false;
}
function ajax_actions(element, ask_me, params)
{
if(ask_me == true && ask() == false)
{
return false;
}
var $this = $(element);
var $params = {
callBacks: {
beforeSendAfter: function() {},
completeAfter: function() {}
}
};
if(params != undefined) $.extend(true, $params, params);
$.ajax({
type: 'POST',
url: $this.attr("href"),
cache: false,
beforeSend: function() {
if($params.callBacks.beforeSendAfter != undefined && $.isFunction($params.callBacks.beforeSendAfter)) $params.callBacks.beforeSendAfter();
},
success: function(response) {},
complete: function(response) {
var result = $.parseJSON(JSON.parse(response.responseText));
if(result.type=='error')
{
result.container = '.error-container';
messages(result)
}
else
{
result.container = '.message-container';
$('.overlay').click();
$.pjax.reload({container: $params.pjax_container});
messages(result);
}
if($params.callBacks.completeAfter != undefined && $.isFunction($params.callBacks.completeAfter)) $params.callBacks.completeAfter();
}
})
return false;
}

Resources