why foreach in laravel 8 not work, its not looping - laravel

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;
})

Related

problem with livewire and arrays when trying to print to pdf

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 !!

Dependent dropdown, second dropdown not populated, Codeigniter

I have a dependent drop down that get the category on the first drop down and should get the subcategory on the second drop down but the subcategory drop down isn't populated. I have something like this in my Model:
public function category()
{
$response = array();
$this->search(array(), 'date_created');
$this->db->select('*');
$query = $this->db->get('categories');
$response = $query->result_array();
return $response;
}
public function sub_category($parent_id)
{
$query = $this->db->get_where('sub_categories', array('parent_id' => $parent_id));
return $query->result_array();
}
And then something like this on my Controller:
public function edit_product($id)
{
$data['title'] = 'Update Product';
$this->load->view('../admin/template/admin_header');
$products = new Admin_model;
$data['products'] = $products->edit_product($id);
$data['category'] = $this->Admin_model->category();
$data['subcategory'] = $this->Admin_model->sub_category($data['products']->category_id);
$this->load->view('../admin/template/admin_topnav');
$this->load->view('../admin/template/admin_sidebar');
$this->load->view('../admin/products/manage_product', $data);
$this->load->view('../admin/template/admin_footer');
}
function get_subcategory()
{
if ($this->input->post('parent_id')) {
echo $this->Admin_model->get_subcategory($this->input->post('parent_id'));
}
}
public function insert_product()
{
$productData = array();
if ($this->input->post('productData')) {
$this->form_validation->set_rules('category_id', 'Category', 'required');
$this->form_validation->set_rules('sub_category_id', 'Sub Category', 'required');
$this->form_validation->set_rules('product_name', 'Product Name', 'required');
$this->form_validation->set_rules('department', 'Department', 'required');
$this->form_validation->set_rules('description', 'Description', 'trim|required');
$this->form_validation->set_rules('status', 'Status', 'required');
if ($this->form_validation->run() == true) {
$ori_filename = $_FILES['product_image']['name'];
$update_image = time() . "" . str_replace(' ', '-', $ori_filename);
$config = [
'upload_path' => './images/products',
'allowed_types' => 'gif|jpg|png',
'file_name' => $update_image,
];
$this->load->library('upload', $config);
if (!$this->upload->do_upload('product_image')) {
$error = array('error' => $this->upload->display_errors());
$this->load->view(base_url('admin/products'), $error);
} else {
$image = $this->upload->data('file_name');
$productData = array(
'category_id' => $this->input->post('category_id'),
'sub_category_id' => $this->input->post('sub_category_id'),
'product_name' => $this->input->post('product_name'),
'department' => $this->input->post('department'),
'description' => $this->input->post(htmlentities('description')),
'status' => $this->input->post('status'),
'upload_path' => $image
);
$img = new Admin_model;
$img->insert_product($productData);
$this->session->set_flashdata('status', 'Package InsertedSuccesfully');
redirect(base_url('admin/products'));
}
}
}
$data['title'] = 'Insert Product';
$data['category'] = $this->Admin_model->category();
$data['subcategory'] = $this->Admin_model->get_subcategory();
$this->load->view('../admin/template/admin_header');
$this->load->view('../admin/template/admin_topnav');
$this->load->view('../admin/template/admin_sidebar');
$this->load->view('../admin/products/manage_product', $data);
$this->load->view('../admin/template/admin_footer');
}
And then the view:
<div class="form-group">
<label for="" class="control-label"> Category</label>
<select name="category_id" id="category" class="custom-select select">
<option value="">Select Category</option>
<?php
foreach ($category as $row) {
echo '<option value="' . $row['id'] . '"';
if (isset($products) && $row['id'] == $products->category_id) {
echo ' selected';
}
echo '>' . $row['category'] . '</option>';
}
?>
</select>
</div>
<div class="form-group">
<label for="" class="control-label">Sub Category</label>
<select name="sub_category_id" id="subcategory" class="custom-select select">
<option value="">Select Sub Category</option>
<?php
foreach ($subcategory as $row) {
echo '<option value="' . $row['id'] . '"';
if ($row['id'] == $products->sub_category_id) {
echo ' selected';
}
echo '>' . $row['sub_category'] . '</option>';
}
?>
</select>
</div>
And here's the script. I'm not really familiar at AJAX so i tried to ask and get answers here which helps me progress but I still can't populate the subcategory drop down.
<script type="text/javascript">
$(document).ready(function() {
$('#category').change(function() {
var parent_id = $('#category').val();
console.log(parent_id)
if (parent_id != '') {
$.ajax({
url: "<?php echo base_url(); ?>admin/get_subcategory",
method: "POST",
data: {
parent_id: parent_id
},
success: function(data) {
$('#subcategory').html(data);
console.log(data)
}
});
} else {
$('#subcategory').html('<option value="">Select Category First</option>');
}
});
});
Also, here's what I get in the console
The result from $this->Admin_model->sub_category(...) is an array.
echo works on string values only, which is why you're getting the error. You'll need to loop over the result array (in admin/get_subcategory) and print the values one by one. Also surround each value with an <option> tag so the result can be placed in the select box without further modification:
public function get_subcategory() {
if ($this->input->post('parent_id')) {
$subcategories = $this->Admin_model->sub_category($this->input->post('parent_id'));
foreach ($subcategories as $subcategory) {
echo '<option value="'.$subcategory['id'].'">'.$subcategory['sub_category'].'</option>';
}
}
}

Permission in Laravel controller

if ($request->ajax()) {
$data = User::latest()->get();
return Datatables::of($data)
->addIndexColumn()
->addColumn('FullName', function($row){
$name = $row->fname.' '.$row->lname;
return $name;
})
->addColumn('action', function($row){
//#can('user-show')
$btn = '<div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
<div class="btn-group" role="group">
<a href="'.route("users.showrole",$row->id).'" data-toggle="tooltip" title="Show" class="btn btn-default btn-flat btn-sm">
<span class="icon-size-fullscreen"></span>
Show
</a>';
//#endcan
//#can('user-edit')
$btn = $btn.'<a href="'.route("users.editrole",$row->id).'" data-toggle="tooltip" id="'.$row->id.'" title="Edit" data-id="'.$row->id.'" class="edit btn btn-primary btn-flat btn-sm CategoryEdit" onclick="CategoryEdit()">
<span class="icon-pencil"></span>
</a>';
//#endcan
$btn = $btn.'<a href="javascript:void(0)" data-toggle="tooltip" id="'.$row->id.'" title="Edit" data-id="'.$row->id.'" onclick="DeleteRole('.$row->id.')" class="btn btn-flat btn-danger btn-sm">
<span class="icon-trash"></span>
</a>
</div>
</div>';
return $btn;
})
->rawColumns(['FullName'])
->rawColumns(['action'])
->escapeColumns([])
->make(true);
}
Hello, I want to use #can('user-create') in Controller datatable Yajra so that a user does not see the button in he has no access.
I can do it in blade but not in controller.
I want to check if the role has the permission to perform tasks in that way.
Otherwise my code is running fine only this is making it tiresome.
You can do it in 2 ways :
checking permission in the controller
Eg. :
if ($request->ajax()) {
$data = User::latest()->get();
// get logged user
$user = auth()->user();
return Datatables::of($data)
->addColumn('action', function($row) use ($user) {
$btn = '';
if ($user->can('user-show') {
$btn = '<div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups"><div class="btn-group" role="group">
<span class="icon-size-fullscreen"></span> Show';
}
if ($user->can('user-edit') {
$btn = $btn.'<span class="icon-pencil"></span>';
}
$btn = $btn.'<span class="icon-trash"></span> </div></div>';
return $btn;
})
->rawColumns(['action'])
->make(true);
}
or Another Way
if ($request->ajax()) {
$data = User::latest()->get();
return Datatables::of($data)
->addIndexColumn()
->addColumn('FullName', function($row){
$name = $row->fname.' '.$row->lname;
return $name;
})
->addColumn('actions', 'path.actions')
->rawColumns(['FullName'])
->escapeColumns([])
->make(true);
}
and your blade file be like
#can('user-edit')
Your code
#endcan
If you use spatie permission plugin, you can use $user->can('permission') in your controllers.
Here :
if ($request->ajax()) {
$data = User::latest()->get();
// get logged user
$user = auth()->user();
return Datatables::of($data)
->addIndexColumn()
->addColumn('FullName', function($row){
$name = $row->fname.' '.$row->lname;
return $name;
})
->addColumn('action', function($row) use ($user) {
$btn = '';
if ($user->can('user-show') {
$btn = '<div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups"><div class="btn-group" role="group">
<span class="icon-size-fullscreen"></span> Show';
}
if ($user->can('user-edit') {
$btn = $btn.'<span class="icon-pencil"></span>';
}
$btn = $btn.'<span class="icon-trash"></span> </div></div>';
return $btn;
})
->rawColumns(['FullName'])
->rawColumns(['action'])
->escapeColumns([])
->make(true);
}

Codeigniter image lib not resizing multiple images at once

I am trying to resize multiple images at once in my foreach loop but does not do it. It only resizes some of them per page.
Question how can I make sure it resizes the multiple images at once in my foreach loop on index()
As you can see it only resizes some of them the filemanager code is run/loaded ajax
<?php
class Filemanager extends MX_Controller {
public function __construct()
{
parent::__construct();
$this->load->library('pagination');
}
public function index()
{
$data['resize_error'] ='';
$input_get_directory = $this->input->get('directory');
$input_get_page = $this->input->get('page');
$input_get_filter = $this->input->get('filter_name');
$input_get_target = $this->input->get('target');
$input_get_thumb = $this->input->get('thumb');
if (isset($input_get_filter)) {
$filter_name = $input_get_filter;
} else {
$filter_name = null;
}
// Make sure we have the correct directory
if (isset($input_get_directory)) {
$directory = FCPATH . 'image/catalog/' . $input_get_directory;
} else {
// Do not add extra tralier slash at end /
$directory = FCPATH . 'image/catalog';
}
if (isset($input_get_page)) {
$page = $input_get_page;
} else {
$page = 1;
}
$data['images'] = array();
// Get directories
$directories = glob($directory . '/' . $filter_name . '*', GLOB_ONLYDIR);
if (!$directories) {
$directories = array();
}
// Get files
$files = glob($directory . '/' . $filter_name . '*.{jpg,jpeg,png,gif,JPG,JPEG,PNG,GIF}', GLOB_BRACE);
if (!$files) {
$files = array();
}
// Merge directories and files
$images = array_merge($directories, $files);
// Get total number of files and directories
$image_total = count($images);
$per_page = 8;
$segment = $this->input->get('per_page');
$segment += $per_page;
foreach ($images as $key => $image) {
if ($key < $segment && $key >= $segment - $per_page) {
$name = str_split(basename($image), 18);
if (is_dir($image)) {
$url = '';
if (isset($input_get_target)) {
$url .= '&target=' . $input_get_target;
}
if (isset($input_get_thumb)) {
$url .= '&thumb=' . $input_get_thumb;
}
$data['images'][] = array(
'thumb' => '',
'name' => implode(' ', $name),
'type' => 'directory',
'path' => utf8_substr($image, utf8_strlen(FCPATH . 'image/')),
'href' => site_url('admin/common/filemanager') . '/?&directory=' . utf8_substr($image, utf8_strlen(FCPATH . 'image/' . 'catalog/')) . $url
);
} elseif (is_file($image)) {
// Resize function here
$data['images'][] = array(
'thumb' => $this->resize($image),
'name' => implode(' ', $name),
'type' => 'image',
'test' => '',
'path' => utf8_substr($image, utf8_strlen(FCPATH . 'image/')),
'href' => base_url() . 'image/' . utf8_substr($image, utf8_strlen(FCPATH . 'image/'))
);
}
}
}
$this->load->view('common/filemanager_view', $data);
}
public function resize($filename) {
$this->load->library('image_lib');
$width = 100;
$height = 100;
$old_filename = substr($filename, strlen(FCPATH . 'image/'));
$extension = pathinfo($old_filename, PATHINFO_EXTENSION);
$new_image = substr($old_filename, 0, strrpos($old_filename, '.')) . '-' . $width . 'x' . $height . '.' . $extension;
$config['image_library'] = 'gd2';
$config['source_image'] = $filename;
$config['create_thumb'] = FALSE;
$config['maintain_ratio'] = FALSE;
$config['width'] = $width;
$config['height'] = $height;
$config['new_image'] = FCPATH . 'image/cache/' . $new_image;
$this->image_lib->clear();
$this->image_lib->initialize($config);
$this->image_lib->resize();
return base_url('image/cache/') . $new_image;
}
}
This function below is called in the foreach loop on index
public function resize($filename) {
$this->load->library('image_lib');
$width = 100;
$height = 100;
$old_filename = substr($filename, strlen(FCPATH . 'image/'));
$extension = pathinfo($old_filename, PATHINFO_EXTENSION);
$new_image = substr($old_filename, 0, strrpos($old_filename, '.')) . '-' . $width . 'x' . $height . '.' . $extension;
$config['image_library'] = 'gd2';
$config['source_image'] = $filename;
$config['create_thumb'] = FALSE;
$config['maintain_ratio'] = FALSE;
$config['width'] = $width;
$config['height'] = $height;
$config['new_image'] = FCPATH . 'image/cache/' . $new_image;
$this->image_lib->clear();
$this->image_lib->initialize($config);
$this->image_lib->resize();
return base_url('image/cache/') . $new_image;
}
Just the view for any one who wants it
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<div class="btn-toolbar mb-3" role="toolbar" aria-label="Toolbar with button groups">
<div class="btn-group mr-2" role="group" aria-label="First group">
<a class="btn btn-dark" href="<?php echo $parent;?>" data-toggle="tooltip" data-placement="top" title="<?php echo $button_parent; ?>" id="button-parent" class="btn btn-default"><i class="fa fa-level-up"></i></a>
<button type="button" data-toggle="tooltip" data-placement="top" title="<?php echo $button_upload; ?>" id="button-upload" class="btn btn-primary"><i class="fa fa-upload"></i></button>
<button type="button" data-toggle="tooltip" data-placement="top" title="<?php echo $button_folder; ?>" id="button-folder" class="btn btn-dark"><i class="fa fa-folder"></i></button>
<button type="button" data-toggle="tooltip" data-placement="top" title="<?php echo $button_delete; ?>" id="button-delete" class="btn btn-danger"><i class="fa fa-trash-o"></i></button>
</div>
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-secondary" type="button"><i class="fa fa-search" aria-hidden="true"></i></button>
</span>
<input type="text" class="form-control" placeholder="Search for..." aria-label="Search for...">
</div>
</div>
</div>
<div class="modal-header justify-content-center">
<ol class="breadcrumb">
<?php foreach ($breadcrumbs as $breadcrumb) { ?>
<li class="breadcrumb-item"><?php echo $breadcrumb['text']; ?></li>
<?php } ?>
</ol>
</div>
<div class="modal-body">
<!--
<div class="row">
<div class="col-sm-5">
<i class="fa fa-refresh"></i>
</div>
</div>
-->
<?php foreach (array_chunk($images, 4) as $image) { ?>
<div class="row">
<?php foreach ($image as $image) { ?>
<div class="col-sm-3 text-center">
<?php if ($image['type'] == 'directory') { ?>
<div class="text-center"><i class="fa fa-folder fa-5x"></i></div>
<label>
<input type="checkbox" name="path[]" value="<?php echo $image['path']; ?>" />
<?php echo $image['name']; ?></label>
<?php } ?>
<?php if ($image['type'] == 'image') { ?>
<a href="<?php echo $image['href']; ?>" class="thumbnail">
<?php echo $image['thumb']; ?></a>
<label>
<input type="hidden" name="cache[]" value="<?php echo $image['cache']; ?>" />
<input type="checkbox" name="path[]" value="<?php echo $image['path']; ?>" />
<?php echo $image['name']; ?></label>
<?php } ?>
</div>
<?php } ?>
</div>
<?php } ?>
</div>
<div class="modal-footer justify-content-center">
<?php echo $pagination; ?>
</div>
</div>
</div>
<script type="text/javascript"><!--
$('a.thumbnail').on('click', function(e) {
e.preventDefault();
<?php if ($thumb) { ?>
$('#<?php echo $thumb; ?>').find('img').attr('src', $(this).find('img').attr('src'));
<?php } ?>
<?php if ($target) { ?>
$('#<?php echo $target; ?>').attr('value', $(this).parent().find('input').attr('value'));
<?php } else { ?>
var range, sel = document.getSelection();
if (sel.rangeCount) {
var img = document.createElement('img');
img.src = $(this).attr('href');
range = sel.getRangeAt(0);
range.insertNode(img);
}
<?php } ?>
$('#modal-image').modal('hide');
});
$('a.directory').on('click', function(e) {
e.preventDefault();
$('#modal-image').load($(this).attr('href'));
});
$('.pagination a').on('click', function(e) {
e.preventDefault();
$('#modal-image').load($(this).attr('href'));
});
$('.breadcrumb-item a').on('click', function(e) {
e.preventDefault();
$('#modal-image').load($(this).attr('href'));
});
$('#button-parent').on('click', function(e) {
e.preventDefault();
$('#modal-image').load($(this).attr('href'));
});
$('#button-refresh').on('click', function(e) {
e.preventDefault();
$('#modal-image').load($(this).attr('href'));
});
$('input[name=\'search\']').on('keydown', function(e) {
if (e.which == 13) {
$('#button-search').trigger('click');
}
});
$('#button-search').on('click', function(e) {
var url = 'admin/common/filemanager?&directory=<?php echo $directory; ?>';
var filter_name = $('input[name=\'search\']').val();
if (filter_name) {
url += '&filter_name=' + encodeURIComponent(filter_name);
}
<?php if ($thumb) { ?>
url += '&thumb=' + '<?php echo $thumb; ?>';
<?php } ?>
<?php if ($target) { ?>
url += '?target=' + '<?php echo $target; ?>';
<?php } ?>
$('#modal-image').load(url);
});
//--></script>
<script type="text/javascript"><!--
$('#button-upload').on('click', function() {
$('#form-upload').remove();
$('body').prepend('<form enctype="multipart/form-data" id="form-upload" style="display: none;"><input type="file" name="file" value="" /></form>');
$('#form-upload input[name=\'file\']').trigger('click');
if (typeof timer != 'undefined') {
clearInterval(timer);
}
timer = setInterval(function() {
if ($('#form-upload input[name=\'file\']').val() != '') {
clearInterval(timer);
$.ajax({
url: '<?php echo base_url('admin/common/filemanager/upload?');?>directory=<?php echo $directory; ?>',
type: 'post',
dataType: 'json',
data: new FormData($('#form-upload')[0]),
cache: false,
contentType: false,
processData: false,
beforeSend: function() {
$('#button-upload i').replaceWith('<i class="fa fa-circle-o-notch fa-spin"></i>');
$('#button-upload').prop('disabled', true);
},
complete: function() {
$('#button-upload i').replaceWith('<i class="fa fa-upload"></i>');
$('#button-upload').prop('disabled', false);
},
success: function(json) {
if (json['error']) {
alert(json['error']);
}
if (json['success']) {
alert(json['success']);
$('#button-refresh').trigger('click');
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
}
}, 500);
});
$('#button-folder').popover({
html: true,
placement: 'bottom',
trigger: 'click',
title: 'New Folder',
content: function() {
html = '<div class="input-group">';
html += ' <input type="text" name="folder" value="" placeholder="New Folder" class="form-control">';
html += ' <span class="input-group-btn"><button type="button" title="" id="button-create" class="btn btn-primary"><i class="fa fa-plus-circle"></i></button></span>';
html += '</div>';
return html;
}
});
$('#button-folder').on('shown.bs.popover', function() {
$('#button-create').on('click', function() {
$.ajax({
url: 'admin/common/filemanager/folder?directory=<?php echo $directory; ?>',
type: 'post',
dataType: 'json',
data: 'folder=' + encodeURIComponent($('input[name=\'folder\']').val()),
beforeSend: function() {
$('#button-create').prop('disabled', true);
},
complete: function() {
$('#button-create').prop('disabled', false);
},
success: function(json) {
if (json['error']) {
alert(json['error']);
}
if (json['success']) {
alert(json['success']);
$('#button-refresh').trigger('click');
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
});
});
$('#modal-image #button-delete').on('click', function(e) {
if (confirm('Are You Sure')) {
$.ajax({
url: 'admin/common/filemanager/delete/',
type: 'post',
dataType: 'json',
data: {
path: $('input[name^=\'path\']:checked'),
cache: $('input[name^=\'cache\']').val()
},
beforeSend: function() {
$('#button-delete').prop('disabled', true);
},
complete: function() {
$('#button-delete').prop('disabled', false);
},
success: function(json) {
if (json['error']) {
alert(json['error']);
}
if (json['success']) {
alert(json['success']);
$('#button-refresh').trigger('click');
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
}
});
//--></script>
Try adding an error handler on resize() to see if there's an error that's preventing an image from getting resized:
$this->image_lib->clear();
$this->image_lib->initialize($config);
if (!$this->image_lib->resize()) {
echo $this->image_lib->display_errors();
}
Update
It seems the segment is not initialized correctly
$segment = $this->input->get('per_page');
Instead try
$segment = $this->input->get('page') * $this->input->get('per_page');
Solution
I have working solution now
I have had to make a check of the directory
if (!is_dir(DIR_IMAGE . 'cache/' . $new_image)) {
if ($this->input->get('directory')) {
#mkdir(DIR_IMAGE . 'cache/catalog/' . $this->input->get('directory') .'/', 0777, true);
} else {
#mkdir(DIR_IMAGE . 'cache/catalog/', 0777, true);
}
}
And also use use a if file exists for resize check and also codeigniter img() helper function helped also.
Full Controller
<?php
class Filemanager extends MX_Controller {
public function __construct()
{
parent::__construct();
$this->load->library('pagination');
$this->load->library('image_lib');
$this->load->helper('html');
define('DIR_IMAGE', FCPATH . 'image/');
}
public function index()
{
$data['resize_error'] ='';
$input_get_directory = $this->input->get('directory');
$input_get_page = $this->input->get('page');
$input_get_filter = $this->input->get('filter_name');
$input_get_target = $this->input->get('target');
$input_get_thumb = $this->input->get('thumb');
if (isset($input_get_filter)) {
$filter_name = $input_get_filter;
} else {
$filter_name = null;
}
// Make sure we have the correct directory
if (isset($input_get_directory)) {
$directory = FCPATH . 'image/catalog/' . $input_get_directory;
} else {
// Do not add extra tralier slash at end /
$directory = FCPATH . 'image/catalog';
}
if (isset($input_get_page)) {
$page = $input_get_page;
} else {
$page = 1;
}
$data['images'] = array();
// Get directories
$directories = glob($directory . '/' . $filter_name . '*', GLOB_ONLYDIR);
if (!$directories) {
$directories = array();
}
// Get files
$files = glob($directory . '/' . $filter_name . '*.{jpg,jpeg,png,gif,JPG,JPEG,PNG,GIF}', GLOB_BRACE);
if (!$files) {
$files = array();
}
// Merge directories and files
$images = array_merge($directories, $files);
// Get total number of files and directories
$image_total = count($images);
$per_page = 8;
$segment = $this->input->get('per_page');
$segment += $per_page;
$this->load->model('admin/tool/image_model');
$this->load->helper('string');
foreach ($images as $key => $image) {
if ($key < $segment && $key >= $segment - $per_page) {
$name = basename(preg_replace("/\.[^.]+$/", "", $image));
if (is_dir($image)) {
$url = '';
if (isset($input_get_target)) {
$url .= '&target=' . $input_get_target;
}
if (isset($input_get_thumb)) {
$url .= '&thumb=' . $input_get_thumb;
}
$data['images'][] = array(
'thumb' => '',
'name' => $name,
'href' => '',
'type' => 'directory',
'path' => substr($image, strlen(FCPATH . 'image/')),
'href' => site_url('admin/common/filemanager/?&directory=' . substr($image, strlen(FCPATH . 'image/' . 'catalog/')) . $url)
);
} elseif (is_file($image)) {
$width = 100;
$height = 100;
$old_filename = substr($image, strlen(DIR_IMAGE));
$extension = pathinfo($old_filename, PATHINFO_EXTENSION);
$new_image = substr($old_filename, 0, strrpos($old_filename, '.')) . '-' . $width . 'x' . $height . '.' . $extension;
if (!is_dir(DIR_IMAGE . 'cache/' . $new_image)) {
if ($this->input->get('directory')) {
#mkdir(DIR_IMAGE . 'cache/catalog/' . $this->input->get('directory') .'/', 0777, true);
} else {
#mkdir(DIR_IMAGE . 'cache/catalog/', 0777, true);
}
}
if (!file_exists(DIR_IMAGE . 'cache/' . $new_image)) {
$config = array(
'image_library' => 'gd2',
'source_image' => $image,
'create_thumb' => false,
'maintain_ratio' => false,
'width' => $width,
'height' => $height,
'overwrite' => true,
'new_image' => DIR_IMAGE . 'cache/' . $new_image
);
$this->image_lib->initialize($config);
$this->image_lib->resize();
$this->image_lib->clear();
}
$data['images'][] = array(
'type' => 'image',
'href' => '',
'thumb' => img('image/cache/'. $new_image),
'name' => (strlen($name) > 13) ? substr($name,0,10).'...' : $name,
'path' => substr($image, strlen(DIR_IMAGE))
);
}
}
}
$data['heading_title'] = "Image Manager";
$data['text_no_results'] = "No Results";
$data['text_confirm'] = "Are You Sure";
$data['entry_search'] = "Search..";
$data['entry_folder'] = "New Folder";
$data['button_parent'] = "Parent";
$data['button_refresh'] = "Refresh";
$data['button_upload'] = "Upload";
$data['button_folder'] = "New Folder";
$data['button_delete'] = "Delete";
$data['button_search'] = "Search";
if (isset($input_get_directory)) {
$data['directory'] = $input_get_directory;
} else {
$data['directory'] = '';
}
// Return the filter name
if (isset($input_get_filter)) {
$data['filter_name'] = $input_get_filter;
} else {
$data['filter_name'] = '';
}
// Return the target ID for the file manager to set the value
if (isset($input_get_target)) {
$data['target'] = $input_get_target;
} else {
$data['target'] = '';
}
// Return the thumbnail for the file manager to show a thumbnail
if (isset($input_get_thumb)) {
$data['thumb'] = $input_get_thumb;
} else {
$data['thumb'] = '';
}
// Parent
$url = '';
if (isset($input_get_directory)) {
$pos = strrpos($input_get_directory, '/');
if ($pos) {
$url .= '/?&directory=' . substr($input_get_directory, 0, $pos);
}
}
$data['parent'] = site_url('admin/common/filemanager' . $url);
// Refresh
$url = '';
if (isset($input_get_directory)) {
$url .= '/?&directory=' . $input_get_directory;
}
if (isset($input_get_target)) {
$url .= '&target=' . $input_get_target;
}
if (isset($input_get_thumb)) {
$url .= '&thumb=' . $input_get_thumb;
}
$data['refresh'] = site_url('admin/common/filemanager' . $url);
$url = '';
if (isset($input_get_directory)) {
$url .= '?&directory=' . $input_get_directory;
}
if (isset($input_get_filter)) {
$url .= '&filter_name=' . $input_get_filter;
}
if (isset($input_get_target)) {
$url .= '/?&target=' . $input_get_target;
}
if (isset($input_get_thumb)) {
$url .= '&thumb=' . $input_get_thumb;
}
$this->load->library('pagination');
$config['base_url'] = base_url('admin/common/filemanager' . $url);
$config['total_rows'] = $image_total;
$config['per_page'] = $per_page;
$config['page_query_string'] = TRUE;
$config['num_links'] = "16";
$config['full_tag_open'] = "<ul class='pagination'>";
$config['full_tag_close'] = "</ul>";
$config['num_tag_open'] = '<li>';
$config['num_tag_close'] = '</li>';
$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
$config['next_tag_open'] = "<li>";
$config['next_tagl_close'] = "</li>";
$config['prev_tag_open'] = "<li>";
$config['prev_tagl_close'] = "</li>";
$config['first_tag_open'] = "<li>";
$config['first_tagl_close'] = "</li>";
$config['last_tag_open'] = "<li>";
$config['last_tagl_close'] = "</li>";
$this->pagination->initialize($config);
$data['pagination'] = $this->pagination->create_links();
$this->load->view('common/filemanager_view', $data);
}
public function resize($filename) {
$this->load->library('image_lib');
//foreach ($filename as $key => $file) {}
$width = 100;
$height = 100;
$old_filename = substr($filename, strlen(FCPATH . 'image/'));
$extension = pathinfo($old_filename, PATHINFO_EXTENSION);
$new_image = substr($old_filename, 0, strrpos($old_filename, '.')) . '-' . $width . 'x' . $height . '.' . $extension;
$config['image_library'] = 'gd2';
$config['source_image'] = $filename;
$config['create_thumb'] = FALSE;
$config['maintain_ratio'] = FALSE;
$config['width'] = $width;
$config['height'] = $height;
$config['new_image'] = FCPATH . 'image/cache/' . $new_image;
$this->image_lib->clear();
$this->image_lib->initialize($config);
if (!$this->image_lib->resize()) {
return $this->image_lib->display_errors();
} else {
return base_url('image/cache/') . $new_image;
}
}
/**
* Codeigniter upload library with json and config_item
*/
public function upload()
{
$json = array();
$input_get_directory = $this->input->get('directory');
if (isset($input_get_directory)) {
$directory = 'image/catalog/' . $input_get_directory;
} else {
$directory = 'image/catalog';
}
$config['upload_path'] = './' . $directory . '/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 5000;
$config['max_width'] = '0';
$config['max_height'] = '0';
$config['overwrite'] = FALSE;
$this->load->library('upload', $config);
$this->upload->initialize($config);
$input_name = "file";
if ($this->upload->do_upload($input_name) == FALSE) {
$json['error'] = $this->upload->display_errors();
} else {
$file_data = $this->upload->data();
$json['success'] = "This file" . ' ' . $file_data['file_name'] . ' ' . "has been uploaded";
}
$this->output->set_content_type('Content-Type: application/json');
$this->output->set_output(json_encode($json));
}
public function folder()
{
$json = array();
$input_get_directory = $this->input->get('directory');
// Make sure we have the correct directory
if (isset($input_get_directory)) {
$directory = FCPATH . 'image/catalog/' . $input_get_directory;
} else {
// Do not add extra tralier slash at end /
$directory = FCPATH . 'image/catalog';
}
// Check its a directory
if (!is_dir($directory)) {
$json['error'] = $this->lang->line('error_directory');
}
if (!$json) {
$input_get_folder = $this->input->post('folder');
// Sanitize the folder name
$folder = str_replace(array('../', '..\\', '..'), '', basename(html_entity_decode($input_get_folder, ENT_QUOTES, 'UTF-8')));
// Validate the filename length
if ((utf8_strlen($folder) < 3) || (utf8_strlen($folder) > 128)) {
$json['error'] = $this->lang->line('error_folder');
}
// Check if directory already exists or not
if (is_dir($directory . '/' . $folder)) {
$json['error'] = $this->lang->line('error_exists');
}
}
if (!$json) {
mkdir($directory . '/' . $folder, 0777);
$json['success'] = $this->lang->line('text_directory');
}
$this->output->set_content_type('Content-Type: application/json');
$this->output->set_output(json_encode($json));
}
public function delete()
{
$json = array();
$input_path_post = $this->input->post('path');
if (isset($input_path_post)) {
$paths = $input_path_post;
} else {
$paths = array();
}
// Loop through each path to run validations
foreach ($paths as $path) {
$path = rtrim(FCPATH . 'image/' . str_replace(array('../', '..\\', '..'), '', $path), '/');
// Check path exsists
if ($path == FCPATH . 'image/' . 'catalog') {
$json['error'] = $this->lang->line('error_delete');
break;
}
}
if (!$json) {
// Loop through each path
foreach ($paths as $path) {
$path = rtrim(FCPATH . 'image/' . str_replace(array('../', '..\\', '..'), '', $path), '/');
// If path is just a file delete it
if (is_file($path)) {
unlink($path);
// If path is a directory beging deleting each file and sub folder
} elseif (is_dir($path)) {
$files = array();
// Make path into an array
$path = array($path . '*');
// While the path array is still populated keep looping through
while (count($path) != 0) {
$next = array_shift($path);
foreach (glob($next) as $file) {
// If directory add to path array
if (is_dir($file)) {
$path[] = $file . '/*';
}
// Add the file to the files to be deleted array
$files[] = $file;
}
}
// Reverse sort the file array
rsort($files);
foreach ($files as $file) {
// If file just delete
if (is_file($file)) {
unlink($file);
// If directory use the remove directory function
} elseif (is_dir($file)) {
rmdir($file);
}
}
}
}
$json['success'] = $this->lang->line('text_delete');
}
$this->output->set_content_type('Content-Type: application/json');
$this->output->set_output(json_encode($json));
}
}

Show multiple levels of forums / categories in select with only one or two foreach loops

I have this menu function below that I use to get a list of forums and categories.
Each time i need to get a new level I have to add a foreach loop in the menu function. I would like to be able to only have one or two foreach loops that can get ever level belonging to that forum
Question: How can I Only have one or two foreach loops in my menu
function that can get multiple levels of categories
Menu Function
public function menu() {
$html = '';
$html .= '<select class="form-control">';
$html .= '<option value="0" selected="selected">None</option>';
foreach ($this->get_parent_forums() as $parent) {
if ($parent->pid == '0') {
$html .= '<option value="" class="optionParent">' . $parent->name . '</option>';
foreach ($this->get_child_forums($parent->fid) as $childs) {
if ($childs->pid == $parent->fid) {
$html .= '<option value="" class="optionChild">' .$childs->name. '</option>';
foreach ($this->get_child_forums($childs->fid) as $grandchilds) {
if ($grandchilds->pid == $childs->fid) {
$html .= '<option value="" class="optionChild">' .$grandchilds->name. '</option>';
}
}
}
}
}
}
$html .= '</select>';
return $html;
}
Full Controller Code
<?php
class Forum_management extends MX_Controller {
public function __construct() {
parent::__construct();
$this->load->library('form_validation');
$this->load->model('admin/forum/forum_model');
}
public function add() {
$data['header'] = Modules::run('admin/common/header/index');
$data['footer'] = Modules::run('admin/common/footer/index');
$this->form_validation->set_rules('title', 'title', 'required');
if ($this->form_validation->run() == TRUE) {
$this->forum_model->insert();
}
$data['forums_select'] = $this->menu();
$this->load->view('template/forums/forum_add_view', $data);
}
public function menu() {
$html = '';
$html .= '<select class="form-control">';
$html .= '<option value="0" selected="selected">None</option>';
foreach ($this->get_forums() as $parent) {
if ($parent->pid == '0') {
$html .= '<option value="" class="optionParent">' . $parent->name . '</option>';
foreach ($this->get_child_forums($parent->fid) as $childs) {
if ($childs->pid == $parent->fid) {
$html .= '<option value="" class="optionChild">' .$childs->name. '</option>';
foreach ($this->get_child_forums($childs->fid) as $grandchilds) {
if ($grandchilds->pid == $childs->fid) {
$html .= '<option value="" class="optionChild">' .$grandchilds->name. '</option>';
}
}
}
}
}
}
$html .= '</select>';
return $html;
}
public function get_forums() {
$this->db->select('*');
$this->db->from('forum');
$this->db->where('pid', '0');
$query = $this->db->get();
return $query->result();
}
public function get_child_forums($fid) {
$this->db->select('*');
$this->db->from('forum');
$this->db->where('pid', $fid);
$query = $this->db->get();
return $query->result();
}
public function has_parent($fid) {
$this->db->select('pid');
$this->db->from('forum');
$this->db->where('fid', $fid);
$query = $this->db->get();
if ($query->num_rows() > 0) {
return true;
} else {
return false;
}
}
}
You can use directly option tag in your get_forums($pid) method. I hope it's can helpful for you.
Forum_model.php
<?php
public function get_forums($pid) {
$forums = '';
$this->db->select('*');
$this->db->from('forum');
$this->db->or_where('pid', $pid);
$query = $this->db->get();
foreach($query->result_array() as $result){
$forums .= '<option value="'.$result['fid'].'" class="optionChild">'.$result['name'].'</option>';
$this->get_forums($result['fid'])
}
return $forums;
}
?>
In View Page :
<select name="pid" class="form-control">
<option value="0">None</option>
<?php foreach ($categories as $category) {?>
<option value="<?php echo $category['fid'];?>" class="optionParent"><?php echo $category['name'];?></option>
<?php echo $category['forums']; ?>
<?php } ?>
</select>
I have a solution.
I got the idea from here https://gist.github.com/YavorK/5578b4f1b32fe125e0f7eab214270c30
Some small changes for a select option instead of ul. And made library instead.
<?php
class Forum_select {
private $CI;
public function __construct() {
$this->CI =& get_instance();
}
public function generate($name = 'pid') {
$html = '';
$html .= '<select name="'.$name.'" class="form-control">';
$html .= $this->create_option($this->getforums());
$html .= '</select>';
return $html;
}
function create_option($items, $startingParentId = 0)
{
$htmlOutput = '';
foreach ($items as $item) {
if ($item['pid'] != $startingParentId) {
continue;
}
$htmlOutput .= '<option value="'. $item['fid'] .'">' . $item['name'] . '</option>';
$htmlOutput .= $this->create_option($items, $item['fid']);
}
return $htmlOutput;
}
public function getforums() {
$this->CI->db->select('*');
$this->CI->db->from('forum');
$query = $this->CI->db->get();
if ($query->num_rows() > 0) {
return $query->result_array();
} else {
return false;
}
}
}

Resources