Files
wticreatorstudio/Modules/LaraBuilder/Http/Controllers/PageBuilderController.php
T

326 lines
11 KiB
PHP

<?php
namespace Modules\LaraBuilder\Http\Controllers;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\LaraBuilder\Entities\Page;
use Modules\LaraBuilder\Entities\Revision;
use Modules\LaraBuilder\Entities\Template;
use Modules\LaraBuilder\Facades\PageSettings;
use Modules\LaraBuilder\Facades\Settings;
class PageBuilderController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(): Renderable
{
return view('larabuilder::index');
}
/**
* Show the form for creating a new resource.
*/
public function create(): Renderable
{
return view('larabuilder::create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): Renderable
{
//
}
/**
* Show the specified resource.
*
* @param int $id
*/
public function show($id): Renderable
{
return view('larabuilder::show');
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
*/
public function edit($id): Renderable
{
return view('larabuilder::edit');
}
/**
* Update the specified resource in storage.
*
* @param int $id
*/
public function update(Request $request, $id): Renderable
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
*/
public function destroy($id): Renderable
{
//
}
public function build($pageId, Request $request)
{
$page = PageSettings::getPage($pageId);
[$grid_templates, $componentTabs, $components] = $this->pageSettings($page);
$revisions = Revision::where('page_id', $page->id)->latest()->get();
$templates = Template::whereNotNull('title')->orderBy('created_at', 'desc')->get();
$blocks = [];
return view('larabuilder::pagebuilder', compact('grid_templates', 'components', 'blocks', 'page', 'componentTabs', 'revisions', 'templates'));
}
/**
* @return array[]
*/
public function pageSettings($page): array
{
if (! $page) {
abort(404);
}
$grid_templates = [];
foreach (getGrids() as $grid) {
$columns = getColumnInfo($grid);
$grid_templates[$grid] = view('larabuilder::components.add-grid-placeholder',
compact('columns', 'grid'))->render();
}
$components = $componentDirectories = $templates = $componentTabs = [];
if (file_exists(module_path('LaraBuilder', 'Resources/views/widgets'))) {
$componentDirectories = array_diff(scandir(module_path('LaraBuilder', 'Resources/views/widgets')),
['..', '.']);
}
foreach ($componentDirectories as $directory) {
if (file_exists(module_path('LaraBuilder', 'Resources/views/widgets/'.$directory.'/settings.php'))) {
$currentSettings = include module_path('LaraBuilder',
'Resources/views/widgets/'.$directory.'/settings.php');
if (! empty($currentSettings['id']) && $directory == $currentSettings['id']) {
setCurrentDirectory($currentSettings['id']);
$components[$currentSettings['id']] = [
'directory' => $directory,
'settings' => $currentSettings,
'template' => view()->exists('larabuilder::widgets.'.$directory.'.view') ? view('larabuilder::widgets.'.$directory.'.view')->render() : view('larabuilder::components.no-view')->render(),
];
$componentTabs[$currentSettings['tab']][$currentSettings['id']] = $currentSettings['id'];
}
}
}
setCurrentPageId($page->id);
return [$grid_templates, $componentTabs, $components];
}
public function iframe($pageId, Request $request)
{
$page = PageSettings::getPage($pageId);
$edit = true;
[$grid_templates, $componentTabs, $components] = $this->pageSettings($page);
return view('larabuilder::pagebuilder-iframe', compact('grid_templates', 'components', 'page', 'componentTabs', 'edit'));
}
public function renderPage($pageSlug)
{
$page = Page::select('id', 'name', 'title', 'description', 'slug', 'settings', 'status')
->whereSlug(str_replace('larabuilder/', '', $pageSlug))
->when(empty(request()->get('preview')), function ($q) {
return $q->whereStatus('published');
})
->firstOrFail();
$pageSections = view('larabuilder::components.page-components', compact('page'));
setCurrentPageId($page->id);
return view('larabuilder::page', compact('page', 'pageSections'));
}
public function getSettings(Request $request)
{
$pageId = $request->input('page_id');
$directory = $request->input('directory');
$sectionId = $request->input('id');
$gridId = $request->input('grid_id');
if (file_exists(module_path('LaraBuilder', 'Resources/views/widgets/'.$directory.'/settings.php'))) {
$settings = include module_path('LaraBuilder', 'Resources/views/widgets/'.$directory.'/settings.php');
}
if (! empty($settings['fields'])) {
$settingsHtml = $this->getPageSectionSettings($pageId, $sectionId, $settings['fields']);
}
$styles = $this->getSectionStyles($pageId, $gridId);
$json = ['type' => 'success', 'section_data' => PageSettings::getPageSettings($pageId) ?? [], 'settings' => $settingsHtml ?? '', 'styles' => $styles];
return response(json_encode($json), 200);
}
public function getPageSectionSettings($pageId, $sectionId, $fields)
{
$html = $db_value = '';
if (is_array($fields) && ! empty($fields)) {
$tab_key = ! empty($params['tab_key']) ? $params['tab_key'] : '';
$html = '<ul class="op-themeform__wrap">';
foreach ($fields as $field) {
$field['tab_key'] = $tab_key;
if (empty($params['repeater_id'])) {
$id = ! empty($field['id']) ? $field['id'] : '';
$db_value = PageSettings::getPageSectionSettings($pageId, $sectionId, $id);
$field['db_value'] = $db_value;
if (! empty($db_value)) {
$field['value'] = $db_value;
}
} else {
$field['repeater_id'] = ! empty($params['repeater_id']) ? $params['repeater_id'] : '';
$field['index'] = ! empty($params['repeater_id']) ? $params['index'] : '';
}
$html .= Settings::getField($field);
}
$html .= '</ul>';
}
return $html;
}
public function getSectionStyles($pageId, $sectionId)
{
$page = PageSettings::getPage($pageId);
$styles = $page->settings['section_data'][$sectionId]['styles'] ?? [];
return view('larabuilder::components.styles', ['styles' => $styles])->render();
}
public function setPageSettings(Request $request)
{
$status = $request->input('status');
$settings = $sectionId = null;
if (! empty($request->get('settings'))) {
$settings = $request->get('settings');
}
if (! empty($request->get('current_section_data'))) {
parse_str($request->get('current_section_data'), $form_data);
parse_str($request->get('current_advanced_settings'), $advanced_form_data);
$sectionId = $form_data['section_id'];
unset($form_data['_method']);
unset($form_data['_token']);
unset($form_data['section_id']);
$settings['section_data'][$sectionId]['settings'] = [];
foreach ($form_data as $key => $value) {
$isArray = 0;
if (is_array($value)) {
$isArray = 1;
}
$settings['section_data'][$sectionId]['settings'][$key]['value'] = $isArray ? $value : (is_null($value) ? '' : trim($value));
$settings['section_data'][$sectionId]['settings'][$key]['is_array'] = (int) $isArray;
}
$grid_id = $advanced_form_data['grid_id'] ?? null;
unset($advanced_form_data['grid_id']);
$settings['section_data'][$grid_id]['styles'] = [];
foreach ($advanced_form_data as $key => $value) {
if ($value != 'rgba(0,0,0,0)') {
$settings['section_data'][$grid_id]['styles'][$key] = $value;
}
}
if (empty($settings['section_data'][$grid_id]['styles']['content_width']) || (! empty($settings['section_data'][$grid_id]['styles']['content_width']) && $settings['section_data'][$grid_id]['styles']['content_width'] == 'full_width')) {
unset($settings['section_data'][$grid_id]['styles']['boxed_slider_input']);
}
}
$page = PageSettings::setPageSettings($request->input('page_id'), $settings);
if (! empty($sectionId)) {
setCurrentPageId($request->input('page_id'));
$sectionHtml = $this->getSectionHtml($sectionId, $request->input('directory'));
}
if ($status == 'template') {
Template::create([
'settings' => $settings,
'title' => $request->input('template_name'),
]);
} else {
$page->status = 'published';
$page->save();
}
return response()->json(
[
'success' => [
'type' => 'success',
'title' => __('Congratulations'),
'message' => __('Page settings updated successfully'),
],
'html' => $sectionHtml ?? '',
'css' => ! empty($grid_id) ? getComponentStyles($grid_id) : '',
'custom_attributes' => ! empty($grid_id) ? getCustomAttributes($grid_id) : '',
'bgOverlay' => ! empty($grid_id) ? getBgOverlay($grid_id) : '',
'classes' => ! empty($grid_id) ? getClasses($grid_id) : '',
'sectionData' => $page->settings['section_data'] ?? [],
]
);
}
public function getSectionHtml($sectionId, $directory = null)
{
$html = '';
if ($sectionId && $directory) {
$edit = true;
setSectionId($sectionId);
$html = view()->exists('larabuilder::widgets.'.$directory.'.view') ? view('larabuilder::widgets.'.$directory.'.view', compact('edit'))->render() : __('larabuilder::pagebuilder.no_view', ['block' => $directory]);
}
return $html;
}
public function getPageSectionSettingsArray($pageId, $sectionId, $fields, $directory)
{
$settings = [];
if (is_array($fields) && ! empty($fields)) {
foreach ($fields as $field) {
$id = ! empty($field['id']) ? $field['id'] : '';
$db_value = PageSettings::getPageSectionSettings($pageId, $sectionId, $id);
if (empty($db_value)) {
$db_value = getDefaultValues($directory, $id);
}
$settings[$id] = $db_value;
}
}
return $settings;
}
}