ProductController.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\SaveProductRequest;
  4. use App\Jobs\ImportXlsxJob;
  5. use App\Models\Product;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Facades\Redirect;
  8. use Illuminate\Support\Facades\URL;
  9. use Illuminate\Support\Str;
  10. class ProductController extends Controller
  11. {
  12. public function index(Request $request)
  13. {
  14. $data = $request->validate([
  15. 's' => 'nullable|string',
  16. 's_series' => 'nullable|string',
  17. 's_price_min' => 'nullable|integer',
  18. 's_price_max' => 'nullable|integer',
  19. 'perpage' => 'nullable|string',
  20. ]);
  21. $query = Product::query();
  22. if (!empty($data['s'])) {
  23. $query->whereRaw(" (`article` LIKE '%{$data['s']}%' OR `name` LIKE '%{$data['s']}%' OR
  24. `name_for_form` LIKE '%{$data['s']}%' OR `product_group` LIKE '%{$data['s']}%' OR
  25. `characteristics` LIKE '%{$data['s']}%' OR `tech_description` LIKE '%{$data['s']}%'
  26. OR `tech_description_short` LIKE '%{$data['s']}%') ");
  27. }
  28. if (!empty($data['s_series'])) {
  29. $query->where('series', '=', $data['s_series']);
  30. }
  31. if (!empty($data['s_price_min'])) {
  32. $query->where('price', '>=', $data['s_price_min']);
  33. }
  34. if (!empty($data['s_price_max'])) {
  35. $query->where('price', '<=', $data['s_price_max']);
  36. }
  37. $query->orderBy('series');
  38. $data['products'] = $query->paginate($data['perpage'] ?? 20)->withQueryString();
  39. // get all series for select field
  40. $data['series'] = Product::query()->select('series')->distinct()->OrderBy('series')->get();
  41. return view('products.index', $data);
  42. }
  43. public function upload_xls(Request $request)
  44. {
  45. $file = $request->file('file');
  46. $path = storage_path('import');
  47. $filename = 'import_' . date('YmdHis') . '.' . $file->extension();
  48. $file->move($path, $filename);
  49. $info = ['count' => 0, 'updated' => 0, 'created' => 0, 'no_image' => []];
  50. $f = fopen(storage_path('import/') . $filename . '.txt', 'w+');
  51. fwrite($f, serialize($info));
  52. fclose($f);
  53. ImportXlsxJob::dispatch(storage_path('import/' . $filename));
  54. return redirect()->route('import_result', ['filename' => $filename]);
  55. }
  56. public function import_result(Request $request){
  57. $filename = $request->filename . '.txt';
  58. $data = unserialize(file_get_contents(storage_path('import/') . $filename));
  59. return view('products.import_result', $data);
  60. }
  61. private $allfiles; // remember files list
  62. private function find_images($article)
  63. {
  64. $path_to_files = './' . env('IMAGES_PATH', '---') . '/';
  65. if (!isset($this->allfiles) || empty($this->allfiles)) {
  66. $this->allfiles = scandir($path_to_files);
  67. }
  68. $images = [];
  69. foreach ($this->allfiles as $filename) {
  70. if ((mb_strpos($filename, $article) === 0) || (
  71. mb_strpos(Str::lower($filename), Str::slug($article)) === 0))
  72. $images[] = $filename;
  73. }
  74. return (!empty($images)) ? $images : '';
  75. }
  76. public function product(Request $request, $id)
  77. {
  78. $data['product'] = Product::query()->findOrFail($id);
  79. $data['images'] = $this->find_images($data['product']->article);
  80. return view('products.product', $data);
  81. }
  82. public function save_product(SaveProductRequest $request)
  83. {
  84. Product::query()->where('id', $request->validated('id'))->update($request->validated());
  85. return redirect($request->prev_url);
  86. }
  87. public function upload_image(Request $request){
  88. $path = public_path() . '/' . env('IMAGES_PATH');
  89. // dd($path);
  90. $file = $request->file('filename');
  91. $new_filename = $request->article . '.' . date('YmdHis') . '.' . $file->extension();
  92. $file->move($path, $new_filename);
  93. Product::query()->where('article', $request->article)->update(['image_path' => $new_filename]);
  94. return redirect()->back();
  95. }
  96. public function update_image(Request $request, $id){
  97. $validated = $request->validate(['image_path' => 'required|string']);
  98. Product::query()->where('id', $id)->update($validated);
  99. return redirect()->route('view_product', $id);
  100. }
  101. public function select_export(Request $request){
  102. $data['ids'] = json_decode($request->ids, true);
  103. $data['products'] = Product::query()->whereIn('id', $data['ids'])->get();
  104. $data['templates'] = $this->get_templates();
  105. return view('products.select_export', $data);
  106. }
  107. private function get_templates(){
  108. $files = scandir(storage_path('templates'));
  109. $result = [];
  110. foreach ($files as $f){
  111. if(Str::endsWith($f, '.docx'))
  112. $result[] = $f;
  113. }
  114. return$result;
  115. }
  116. }