web-kursus2/app/Http/Controllers/Admin/PageBuilderController.php
2025-10-30 14:17:23 +07:00

210 lines
8.6 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Builder_page;
use App\Models\FileUploader;
use App\Models\FrontendSetting;
use Illuminate\Http\Request;
class PageBuilderController extends Controller
{
function page_list()
{
return view('admin.page_builder.page_list');
}
function page_store(Request $request)
{
$validated = $request->validate([
'name' => 'required'
]);
Builder_page::insert(['name' => $request->name, 'created_at' => date('Y-m-d H:i:s')]);
return redirect(route('admin.pages'))->with('success', get_phrase('New home page layout has been added'));
}
function page_update(Request $request, $id)
{
$validated = $request->validate([
'name' => 'required'
]);
Builder_page::where('id', $id)->update(['name' => $request->name, 'updated_at' => date('Y-m-d H:i:s')]);
return redirect(route('admin.pages'))->with('success', get_phrase('Home page name has been updated'));
}
function page_delete($id)
{
Builder_page::where('id', $id)->delete();
return redirect(route('admin.pages'))->with('success', get_phrase('The page name has been updated'));
}
function page_status($id)
{
$query = Builder_page::where('id', $id);
if ($query->first()->status == 1) {
$query->update(['status' => 0]);
$response = [
'success' => get_phrase('Home page deactivated')
];
} else {
FrontendSetting::where('key', 'home_page')->update(['value' => $query->first()->identifier]);
$query->update(['status' => 1]);
$response = [
'success' => get_phrase('Home page activated')
];
}
Builder_page::where('id', '!=', $id)->update(['status' => 0]);
return json_encode($response);
}
function page_layout_edit($id)
{
return view('admin.page_builder.page_layout_edit', ['id' => $id]);
}
function page_layout_update(Request $request, $id)
{
$validated = $request->validate([
'developer_elements' => 'required',
'builder_elements' => 'required',
]);
$built_file_names = [];
foreach($request->builder_elements as $file_name => $builder_elements){
$built_file_names[] = $file_name;
$developer_file_content = file_get_contents(base_path('resources/views/components/home_made_by_developer/'.$file_name.'.blade.php'));
$developer_file_content = $this->replace_special_character($developer_file_content);
foreach($builder_elements as $key => $builder_element){
$developer_element = $request->developer_elements[$file_name][$key];
if($builder_element['tag'] == 'img'){
$builder_element_src = explode('/public/', $builder_element['src']);
if(array_key_exists(1, $builder_element_src)){
$updated_url_from_builder = "{{asset('".$builder_element_src[1]."')}}";
}else{
$updated_url_from_builder = "{{asset('".$builder_element['src']."')}}";
}
$prepared_single_element = str_replace($developer_element['src'], $updated_url_from_builder, $developer_element['element']);
$developer_file_content = str_replace($developer_element['element'], $prepared_single_element, $developer_file_content);
}elseif($builder_element['tag'] != 'null'){
$developer_element_tag = $this->replace_special_character($developer_element['element']);
$developer_element_content = $this->replace_special_character($developer_element['content']);
$prepared_single_element = str_replace($developer_element_content, '{{ get_phrase("'.$builder_element['content'].'") }}', $developer_element_tag);
$prepared_single_element = str_replace('(""', '("', $prepared_single_element);
$prepared_single_element = str_replace('"")', '")', $prepared_single_element);
$developer_file_content = str_replace($developer_element_tag, $prepared_single_element, $developer_file_content);
}
}
file_put_contents(base_path("resources/views/components/home_made_by_builder/".$file_name.'.blade.php'), $developer_file_content);
}
Builder_page::where('id', $id)->update(['html' => json_encode($built_file_names)]);
return redirect(route('admin.pages'))->with('success', get_phrase('Page layout has been updated'));
}
function replace_special_character($text){
if($text){
$text = str_replace('&amp;', '&', $text);
}
return $text;
}
function replace_builder_content($html_1 = "", $html_2 = "")
{
//REPLACE $html_1 BY $html_2
// Extract src and builder-identity attributes from html_2
preg_match_all('/<img\s+class="builder-editable"\s+builder-identity="(\d+)"\s+src="([^"]+)"/', $html_2, $matches2, PREG_SET_ORDER);
// Create an associative array to map builder-identity to src
$srcMap = [];
foreach ($matches2 as $match) {
$srcMap[$match[1]] = $match[2];
}
// Replace src attributes in html_1 using the srcMap
$html_1 = preg_replace_callback('/<img\s+class="builder-editable"\s+builder-identity="(\d+)"\s+src="([^"]+)"/', function ($matches) use ($srcMap) {
$identity = $matches[1];
if (isset($srcMap[$identity])) {
return '<img class="builder-editable" builder-identity="' . $identity . '" src="{{asset("' . $srcMap[$identity] . '")}}"';
}
return $matches[0];
}, $html_1);
// Extract content and builder-identity attributes from html_2 (excluding img tags)
preg_match_all('/<([^img][^>]*)builder-identity="(\d+)"[^>]*>(.*?)<\/[^>]+>/', $html_2, $matches2, PREG_SET_ORDER);
// Create an associative array to map builder-identity to content
$contentMap = [];
foreach ($matches2 as $match) {
$contentMap[$match[2]] = $match[3];
}
// Replace content in html_1 using the contentMap
$html_1 = preg_replace_callback('/<([^img][^>]*)builder-identity="(\d+)"[^>]*>(.*?)<\/[^>]+>/', function ($matches) use ($contentMap) {
$identity = $matches[2];
if (isset($contentMap[$identity])) {
return '<' . $matches[1] . 'builder-identity="' . $identity . '">' . $contentMap[$identity] . '<' . substr(strrchr($matches[0], '<'), 1);
}
return $matches[0];
}, $html_1);
return $html_1;
}
function find_builder_block_elements($html)
{
// Define a regex pattern to match all divs with builder-block-file-name attribute
$pattern = '/<div\s+[^>]*builder-block-file-name="([^"]+)"[^>]*>(.*?)<\/div>/s';
// Use preg_match_all to find all matches
preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);
// Collect the file name and HTML content inside each matched element
$elements = [];
foreach ($matches as $match) {
$elements[] = [
'file_name' => $match[1], // The value of the builder-block-file-name attribute
'content' => $match[2] // The inner HTML content of the div
];
}
return $elements;
}
function developer_file_content(){
//return developer file content
$developer_file_content = '';
$files = array_diff(scandir(base_path('resources/views/components/home_made_by_developer')), array('.', '..'));
foreach ($files as $file){
$file_name = str_replace('.blade.php', '', $file);
$developer_file_content .= '<div builder-block-file-name="'.$file_name.'">'.file_get_contents(base_path('resources/views/components/home_made_by_developer/'.$file)).'</div>';
}
return $developer_file_content;
}
function page_layout_image_update(Request $request)
{
$remove_file_arr = explode('/', $request->remove_file);
$previous_image_path = 'uploads/home-page-builder/' . end($remove_file_arr);
remove_file($previous_image_path);
$image_path = FileUploader::upload($request->file, 'uploads/home-page-builder');
return get_image($image_path);
}
function preview($page_id)
{
$page_data['page_id'] = $page_id;
return view('frontend.default.home.preview', $page_data);
}
}