cms-token/@core/app/WidgetsBuilder/WidgetBase.php

256 lines
7.5 KiB
PHP

<?php
namespace App\WidgetsBuilder;
use App\Language;
use App\Widgets;
abstract class WidgetBase
{
protected $args;
protected $rand_number;
public function __construct(array $args=[])
{
$defaults = [
'id' => '',
'name' => $this->widget_name(),
'type' =>'',
'order' =>'',
'location' =>'',
'before' => true,
'after' => true
];
$this->args = array_merge($defaults,$args);
try {
$this->rand_number = random_int(999, 99999);
} catch (\Exception $e) {
}
}
/**
* admin_render
* this method must have to implement by all widget to render admin panel widget content
* @since 1.0.0
* */
abstract public function admin_render();
/**
* frontend_render
* this method must have to implement by all widget to render frontend widget content
* @since 1.0.0
* */
abstract public function frontend_render();
/**
* widget_title
* this method must have to implement by all widget to register widget title
* @since 1.0.0
* */
abstract public function widget_title();
/**
* widget_name
* this method must have to implement by all widget to register widget name
* @since 1.0.0
* */
public function widget_name()
{
// TODO: Implement widget_name() method.
return substr(strrchr(get_called_class(), "\\"), 1);
}
/**
* default_fields
* this method will return all the default field required by any widget
* @since 1.0.0
* */
public function default_fields()
{
//all initial field
$output = '';
$output .= !empty($this->args['id']) ? '<input type="hidden" name="id" value="' . $this->args['id'] . '">' : '';
$output .= '<input type="hidden" value="' . $this->args['name'] . '" name="widget_name">';
$output .= '<input type="hidden" value="' . $this->args['type'] . '" name="widget_type">';
$output .= '<input type="hidden" value="' . $this->args['location'] . '" name="widget_location">';
$output .= '<input type="hidden" value="' . $this->args['order'] . '" name="widget_order">';
return $output;
}
/**
* get_settings
* this method will return all the settings value saved for widget
* @since 1.0.0
* */
public function get_settings()
{
$widget_data = !empty($this->args['id']) ? Widgets::find($this->args['id']) : null;
$widget_content_data = $this->repairSerializeString($widget_data?->widget_content);
$widget_data = !empty($widget_data) ? unserialize($widget_content_data,['class' => false]) : [];
return $widget_data;
}
/**
* widget_column_start
* this method will add widget column markup for frontend
* @since 1.0.0
*/
public function widget_column_start()
{
if (isset($this->args['column']) && $this->args['column']){
return '<div class="col-lg-3 col-md-6">';
}
}
/**
* widget_column_end
* this method will add widget column markup for frontend
* @since 1.0.0
*/
public function widget_column_end()
{
if (isset($this->args['column']) && $this->args['column']){
return '</div>';
}
}
/**
* widget_before
* this method will add widget before html markup for widget in frontend
* @since 1.0.0
*/
public function widget_before($class = null)
{
return $this->widget_column_start().'<div class="'.$class.' '.$this->args['location'].'-widget widget">';
}
/**
* widget_after
* this method will add widget after html markup for widget in frontend
* @since 1.0.0
*/
public function widget_after()
{
return $this->widget_column_end().'</div>';
}
/**
* admin_form_start
* this method will init form markup for admin panel
* @since 1.0.0
*/
public function admin_form_start()
{
return '<form method="post" action="' . route('admin.widgets.' . $this->args['type']). '" enctype="multipart/form-data"><input type="hidden" value="' . csrf_token() . '" name="_token">';
}
/**
* admin_form_end
* this method will end tag form markup for admin panel
* @since 1.0.0
*/
public function admin_form_end()
{
return '</form>';
}
/**
* admin_form_submit_button
* this method will add a submit button for widget in admin panel
* @since 1.0.0
*/
public function admin_form_submit_button($text = null){
$button_text = $text ?? __('Save Changes');
return '<button class="btn btn-success widget_save_change_button">' . $button_text . '</button>';
}
/**
* admin_form_submit_button
* this method will add a submit button for widget in admin panel
* @since 1.0.0
*/
public function admin_language_tab(){
$all_languages = Language::all();
$output = '<nav><div class="nav nav-tabs" role="tablist">';
foreach ($all_languages as $key => $lang) {
$active_class = $key == 0 ? 'nav-item nav-link active' : 'nav-item nav-link';
$output .= '<a class="' . $active_class . '" data-toggle="tab" href="#nav-home-'. $lang->slug .$this->rand_number. '" role="tab" aria-selected="true">' . $lang->name . '</a>';
}
$output .= '</div></nav>';
return $output;
}
/**
* admin_language_tab_start
* this method will add language tab content start wrapper
* @since 1.0.0
* */
public function admin_language_tab_start(){
return '<div class="tab-content margin-top-30" >';
}
/**
* admin_language_tab_end
* this method will add language tab content end wrapper
* @since 1.0.0
* */
public function admin_language_tab_end(){
return '</div>';
}
/**
* admin_language_tab_content_start
* this method will add language tab panel start
* @since 1.0.0
* */
public function admin_language_tab_content_start($args){
return '<div class="' . $args['class'] . '" id="'. $args['id'] .$this->rand_number .'" role="tabpanel">';
}
/**
* admin_language_tab_content_end
* this method will add language tab panel end
* @since 1.0.0
* */
public function admin_language_tab_content_end(){
return '</div>';
}
public function admin_form_before(){
$markup = '';
if ($this->args['before']){
$markup .= '<li class="ui-state-default widget-handler" data-name="'.$this->widget_name().'">';
}
$markup .= '<h4 class="top-part"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>'.str_replace(['-','_'],[' ',' '],$this->widget_title()).'</h4>
<span class="expand"><i class="ti-angle-down"></i></span>
<span class="remove-widget"><i class="ti-close"></i></span>
<div class="content-part">';
return $markup;
}
public function admin_form_after(){
$markup = '</div>';
if ($this->args['after']){
$markup .= '</li>';
}
return $markup;
}
public function repairSerializeString($value)
{
$data = preg_replace_callback(
'/(?<=^|\{|;)s:(\d+):\"(.*?)\";(?=[asbdiO]\:\d|N;|\}|$)/s',
function($m){
return 's:' . strlen($m[2]) . ':"' . $m[2] . '";';
},
$value
);
return $data;
}
}