I'm having a problem with Livewire passing an array to a route so I can print it to pdf. I've got:
public $selectedProducts = [];
public $selectedAlm = [];
public $nombreComponente, $data, $categoriaId;
public function mount()
{
$this->categoriaId = "0";
$this->nombreComponente = 'Reportes';
$this->data = [];
$this->artcero = 'si';
}
where $selectedProducts and $selectedAlm are arrays and my intention is to pass them to another controller to be able to print them to pdf, but I can't seem to find a way
here is my controller:
public function reportearticuloPDF($categoriaId, $artcero, $selectedAlm, $selectedProducts)
{
if ($selectedProducts > 0) {
$data = $selectedProducts;
} else {
if ($categoriaId == null) {
$data = Articulo::join('categorias as c', 'c.id', 'articulos.categoria_id')
->select('articulos.*', 'c.nombre as catnom')
->whereHas('detallearticulos', function($q) {
$q->whereIn('almacen_id', $selectedAlm);
})
->when($artcero == 'no', function($query){
return $query->where('stock', '>', 0);
})
->OrderBy('id', 'ASC')
->get();
} elseif ($categoriaId !== null) {
$data = Articulo::join('categorias as c', 'c.id', 'articulos.categoria_id')
->select('articulos.*', 'c.nombre as catnom')
->whereHas('detallearticulos', function($q) {
$q->whereIn('almacen_id', $selectedAlm);
})->with('detallearticulos')
->when($artcero == 'no', function($query){
return $query->where('stock', '>', 0);
})
->where('categoria_id', $categoriaId)
->OrderBy('id', 'ASC')
->get();
}
}
$pdf = PDF::loadView('admin.report.articulopdf', compact('data'));
return $pdf->stream('Reporte_de_articulo.pdf');
}
my routes in web.php:
Route::get('report/articulopdf/{categoriaId}/{artcero}/{selectedAlm}/{selectedProducts}', [ReportController::class, 'reportearticuloPDF'])->name('reportearticulo.pdf');
Route::get('report/articulopdf/{categoriaId}/{artcero}/{selectedAlm}', [ReportController::class, 'reportearticuloPDF'])->name('reportearticulo.pdf');
my button:
<a href="{{ url('report/articulopdf' . '/' . $categoriaId . '/' . $artcero . '/' . $selectedAlm . '/' . $selectedProducts) }}"
class="btn btn-danger btn-sm btn-block {{ count($data) < 1 ? 'disabled' : '' }}" target="_blank">
Exportar reporte a PDF <i class="fas fa-file-pdf"></i></a>
that's the one that gives me the Array to string conversion error. I also tried it this way:
<a href="{{ route('reportearticuloPDF', $categoriaId, $artcero, $selectedAlm, $selectedProducts) }}"
class="btn btn-danger btn-sm btn-block {{ count($data) < 1 ? 'disabled' : '' }}" target="_blank">
Exportar reporte a PDF <i class="fas fa-file-pdf"></i></a>
but it gives me the error Too few arguments to function App\Http\Controllers\ReportController::reportearticuloPDF(), 0 passed in C:\xampp\htdocs\sistemainventarioGDS\vendor\laravel\framework\src\Illuminate\Routing\Controller.php on line 54 and exactly 4 expected
In your routes you create two routes with the same method and same function reportearticuloPDF in the controller with different params !!
Related
foreach not working, only displays the first data and does not display the next data, what is the solution? is there something wrong with the code?
this my database
and this my view
public function index(Request $request)
{
if ($request->ajax()) {
$data = Rek_medik::latest()->get();
return Datatables::of($data)
->addIndexColumn()
->addColumn('action', function($row){
$button = '</i> Edit';
$button .= ' ';
$button .= '<i class="far fa-paper-plane"></i> Detail';
$button .= ' ';
$button .= '<button type="button" name="delete" id="'.$row->id.'" class="delete btn btn-danger btn-xs"><i class="far fa-trash-alt"></i> Delete</button>';
return $button;
})
->addColumn('resep', function($row) {
$resep2 = json_decode($row->resep , true);
foreach ($resep2 as $data) {
return '<span class="badge badge-success">'.$data.'</span>';
}
})
->rawColumns(['action','resep'])
->make(true);
}
$register = Register::all();
$pasien = Pasien::all();
$pegawai = Pegawai::all();
$obat = Obat::all();
$koderekmed = IdGenerator::generate(['table' => 'rek_mediks','field'=>'kode_rekmed', 'length' => 9, 'prefix' =>'RKMD-']);
return view('admin/rek_medik/index', compact('koderekmed','register','pasien','pegawai','obat'));
}
If you use return, then it will die after the first loop. You need to change :
$resep2 = json_decode($row->resep , true);
$query = [];
foreach ($resep2 as $data) {
$query[] = '<span class="badge badge-success">'.$data.'</span>';
}
$query = implode(', ', $query);
return $query;
})
I am trying to put a download button within a dataTable in Laravel but am getting the following error: "DataTables warning: table id=dataTableBuilder - Exception Message: Undefined variable: fileName".
This is my ReportController snippet:
public function store(CreateReportRequest $request)
{
$request->validate([
'file_path' => 'required|mimes:pdf|max:2048'
]);
$report = new Report;
if($request->file()) {
$fileName = time().'_'.$request->file_path->getClientOriginalName();
$filePath = $request->file('file_path')->storeAs('reports', $fileName, 'public');
$report->name = time().'_'.$request->file_path->getClientOriginalName();
$report->file_path = '/storage/' . $filePath;
$report->save();
Flash::success('Pop saved successfully.');
}
return redirect(route('reports.index'));
}
public function download($fileName)
{
$file_path = storage_path('reports') . "/" . $fileName;
return Response::download($file_path);
}
This is my view snippet (button for the download):
<a href="{{ route('reports.download', $fileName) }}" class='btn btn-ghost-info'>
<i class="fa fa-download"></i>
</a>
And this is my routes snippet:
Route::post('/reportdownload/{fileName}', [App\Http\Controllers\ReportController::class, 'download'])->name('reports.download');
Please help me figure out what I am doing wrong.
try catching file with its {ID} in web.php and view as well
for example: WEB.PHP
Route::post('/reportdownload/{id}', [App\Http\Controllers\ReportController::class, 'download'])->name('reports.download');
view:
<a href="{{ route('reports.download', $id) }}" class='btn btn-ghost-info'>
<i class="fa fa-download"></i>
</a>
In my Laravel-5.8 project I have this code
Controller
public function index()
{
$userCompany = Auth::user()->company_id;
$userEmployee = Auth::user()->employee_id;
$identities = DB::table('appraisal_identity')->select('id')->where('company_id', $userCompany)->where('is_current', 1)->first();
$currentstatus = AppraisalGoal::select('is_approved')->where('employee_id', $userEmployee)->where('appraisal_identity_id', $identities->id)->first();
$goals = AppraisalGoal::where('employee_id', $userEmployee)->where('appraisal_identity_id', $identities->id)->get();
$incompleteCount = $goals->filter(function($item) {
return ($item->is_approved == 0 || $item->is_approved == 2);
})->count();
return view('appraisal.appraisal_goals.index')->with(['goals' => $goals, 'incompleteCount' => $incompleteCount])->with('currentstatus', $currentstatus);
}
View
#foreach($goals as $key => $goal)
#if(in_array($goal->is_approved, [0, 2]))
<a class="btn btn-xs btn-info" href="{{ route('appraisal.appraisal_goals.edit', ['id'=>$goal->id]) }}">
Edit
</a>
#endif
#endforeach
<div class="row no-print">
<div class="col-12">
#if ($incompleteCount)
<i class="fas fa-arrow-right"></i> Publish
#endif
</div>
</div>
What I want to achieve is that when the page is loaded Edit and Publish buttons should only be visible when is_approved is 0 or 2.
Instead of seeing this I got this error:
Trying to get property 'is_approved' of non-object
How do I resolve it?
Thank you.
it looks like your query is not returning any result.
$goals = AppraisalGoal::where('employee_id', $userEmployee)->where('appraisal_identity_id', $identities->id)->get();
You can put an extra check to avoid this error
if(count($goals)){
$incompleteCount = $goals->filter(function($item) {
return ($item->is_approved == 0 || $item->is_approved == 2);
})->count();
}
else {
$incompleteCount = 0;
}
return view('appraisal.appraisal_goals.index')->with(['goals' =>
$goals, 'incompleteCount' => $incompleteCount])->with('currentstatus', $currentstatus);
Okay I have a small problem.
When user clicks on a link it goes to website/create/business which is fine however if nothing is done but the link is clicked again, it goes to website/create/business/create/business for whatever reason.
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
{{ Auth::user()->name }} <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
Profile
Add Business
<a href="{{ url('/logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
Logout
</a>
<form id="logout-form" <a href="{{ url('home') }}" action="{{ url('/logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
</li>
</ul>
</li>
Routes:
Route::get('profile/{user_id}', 'ProfileController#checkid');
Route::post('update', 'ProfileController#updateProfile');
Route::get('create/business', 'BusinessController#addBusiness');
Route::post('create', 'BusinessController#createBusiness');
ProfileController:
public function checkid($user_id) {
if (Auth::check())
{
$user_id = Auth::id();
return view('profile', [
'id' => $user_id
]);
}
}
function updateProfile(Request $request) {
$user = $request->user();
$twitter = $request->input('twitter');
$facebook = $request->input('facebook');
$instagram = $request->input('instagram');
$telephone = $request->input('telephone');
$user->twitter_personal = $twitter;
$user->facebook_personal = $facebook;
$user->instagram_personal = $instagram;
$user->telephone = $telephone;
$result = $user->save();
if($result) {
$message = 'success';
}else{
$message = 'error';
}
return redirect()->back()->withInput()->with('message', $message);
}
BusinessController:
function addBusiness() {
return view('addBusiness');
}
function createBusiness(Request $request) {
$name = $request->input('name');
$type = $request->input('type');
$email = $request->input('email');
$user_id = Auth::id();
$business = new Business();
$business->name = $name;
$business->type = $type;
$business->email = $email;
$business->user_id = $user_id;
$business->save();
$address1 = $request->input('address1');
$address2 = $request->input('address2');
$town = $request->input('town');
$city = $request->input('city');
$postcode = $request->input('postcode');
$telephone = $request->input('telephone');
$address = new Address();
$address->firstline_address = $address1;
$address->secondline_address = $address2;
$address->town = $town;
$address->city = $city;
$address->postcode = $postcode;
$address->telephone = $telephone;
$address->save();
$result = $business->save();
$result2 = $address->save();
$business_id = $business->id;
$address_id = $address->id;
DB::table('business_address')->insert(array('business_id' => $business_id, 'address_id' => $address_id));
DB::table('user_business')->insert(array('user_id' => $user_id, 'business_id' => $business_id));
if($result && $result2) {
$message = 'success';
}else{
$message = 'error';
}
return redirect()->back()->withInput()->with('message', $message);
}
<a href="create/business/"> must be <a href="/create/business/"> to solve this, because your current link is relative, not absolute, so when you click it again, the same reference is added at the end of your current URL.
Anyway, you should generate links in the Laravel way to avoid other issues in the future:
Route::get('create/business', 'BusinessController#addBusiness');
<a href="{{ url('create/business') }}">
or
Route::get('create/business', 'BusinessController#addBusiness')->name('createBusiness');
<a href="{{ route('createBusiness') }}">
Personally I prefer the second one, so if I change the route URL the links will still work, but it requires to add name('yourRoute') on your route definition.
Try to use the route() function. For this example: Add Business. When your route changes it is automatically changed throughout the application.
You can name your routes like this:
Route::get('create/bussiness', [
'as' => 'my_route_name',
'uses' => 'BusinessController#createBusiness'
]);
I'm using laravel 4 and I'm getting this error when I attempt to create a menu with a dropdown
Trying to get property of non-object (View: /Applications/MAMP/htdocs/test/app/views/layouts/master.blade.php) (View: /Applications/MAMP/htdocs/test/app/views/layouts/master.blade.php)
I can't see where I'm going wrong
My master.blade.php
<li class="dropdown">
work<span class="caret"></span>
<ul class="dropdown-menu" role="menu">
#foreach($dropdowns as $dropdown)
<li>
{{ $dropdown->title }}
</li>
#endforeach
</ul>
</li>
My PageController
$currentPage = new Page($pages[0]->id);
$dropdowns = $currentPage->getPagesSelectList("parent", "", "");
return View::make('index', compact('dropdowns'));
My Page model
public function getPagesSelectList($name, $default = "", $js = "", $flag = true)
{
$list = array(
'name' => $name,
'default' => $default,
'js' => $js,
'pages' => $this->getSubPages($flag, $default)
);
return (object)$list;
}
public function getSubPages($flag, $default, $parent = 0, $num = 1)
{
$pages = array();
$pageSql = \Page::where('parent', '=', $parent)->orderBy('num', 'ASC')->get();
foreach ($pageSql as $result)
{
$page = new Page($result->id);
$page->setFromDatabase();
$page->default = $default;
$page->select = '';
if( $page->id == $default )
$page->select = $default;
$page->space = $num;
if(!empty($page))
$pages[] = $page;
$children = $page->getSubPages($flag, $default, $page->id, $num + 1);
if(!empty($children))
$pages[] = $children;
}
return array_flatten($pages);
}
Assuming that the other code works fine, in Blade instead of:
#foreach($dropdowns as $dropdown)
<li>
{{ $dropdown->title }}
</li>
#endforeach
you should use:
#foreach($dropdowns->pages as $dropdown)
<li>
{{ $dropdown->title }}
</li>
#endforeach
This is because in getPagesSelectList you assign result of getSubPages to pages index of array and then you convert array to object.