__Ve_Element_Manager=$elementManager;
$this->__Ve_Manager=$elementManager->getVeManager();
$this->__Ve_Feature_Manager=$this->__Ve_Manager->get('FeatureManager');
return $this;
}
/**
* @return VE_Element_Manager
*/
function getElementManager(){
return $this->__Ve_Element_Manager;
}
/**
* @return VE_Manager
*/
function getVeManager(){
return $this->__Ve_Manager;
}
/**
* @return VE_Feature_Manager
*/
function getFeatureManager(){
return $this->__Ve_Feature_Manager;
}
function setVeModule($module){
$this->__Ve_Element_Module=$module;
return $this;
}
function getVeModule(){
return $this->__Ve_Element_Module;
}
//End VE_Element_Trait
var $name;
var $lv;
var $icon_class;
var $default_icon_class = 'fa fa-cubes';
/**
* @var string base id for shortcode
*/
var $id_base;
/**
* @var array element options: title, descriptions,...
*/
var $options;
var $wp_widget;
var $wp_widget_args;
/**
* @var Ve_Feature_Abstract[]
*/
var $features;
var $primary_feature_title='Setting';
/**
* Element inline style
* @var array
*/
var $css=array();
/**
* Element html id
* @var array
*/
var $id=array();
/**
* Element html class
* @var array
*/
var $classes=array();
/**
* Element Default class
*/
var $default_class=array();
/**
* Element html attributes
* @var array()
*/
var $attributes=array();
var $before=array();
var $after=array();
/**
* Element form scripts
* @var array
*/
var $scripts;
var $instance=0;
var $inlineScript='';
var $previewEnable=false;
var $updateStack=array();
function __construct($id_base='',$name='',$options=array()){
$this->id_base = empty($id_base) ? str_replace('ve_core_','',strtolower(preg_replace('/([^A-Z])([A-Z])/', "$1_$2", get_class($this))))
: strtolower($id_base);
$this->id_base = trim($this->id_base,'_');
$class_name=''.$this->id_base;
if(empty($name)){
$name=ucwords(str_replace('_',' ',$this->id_base));
}
$this->name=$name;
$this->options=wp_parse_args( $options);
if(!empty($this->options['container_element'])){
$this->options['container']=1;
}
$this->default_class[]=$class_name;
if(isset($this->options['classname'])){
$this->default_class[]=$this->options['classname'];
unset($this->options['classname']);
}
if(isset($this->options['lv'])){
$this->_setLv($this->options['lv']);
unset($this->options['lv']);
}
$this->icon_class = $this->default_icon_class;
if(isset($this->options['icon_class'])){
$this->icon_class = $this->options['icon_class'];
unset($this->options['icon_class']);
}
if(!isset($this->lv)){
$this->lv=10;
}
add_action('ve_elements_init',array($this,'_init'));
$this->instance=0;
}
function _init(){
$this->init();
if(!ve_is_iframe()) {
add_action('wp_footer', array($this,'add_front_js'));
add_action('wp_footer', 've_print_front_inline_js',1000);
}
do_action('ve_element_init',$this);
}
function init(){
$this->support('CssEditor');
}
function support($feature,$title=''){
if(!$this->supported($feature)) {
$featureInstance = $this->getFeatureManager()->feature($feature, $this);
if(!$featureInstance){
wp_die('Feature '.$feature." is not available!");
}
$featureInstance->_init($this);
$this->addFeature($featureInstance, $feature, $title);
}
return $this;
}
function supported($feature){
if($feature instanceof Ve_Feature_Abstract){
$feature=$feature->getId();
}
$feature=sanitize_key($feature);
return isset($this->features[$feature]);
}
/**
* @param $class
* @use $wp_widget_factory
* @return $this
*/
function setWpWidget($class){
global $wp_widget_factory;
if($wp_widget_factory instanceof WP_Widget_Factory){
if(isset($wp_widget_factory->widgets[$class])){
$this->wp_widget=$wp_widget_factory->widgets[$class];
return $this;
}
}
if(is_string($class)){
$class=new $class();
}
if(is_object($class)&&$class instanceof WP_Widget){
$this->wp_widget=$class;
}
return $this;
}
/**
* @return WP_Widget
*/
function getWpWidget(){
return $this->wp_widget;
}
/**
* Extra wrapper class on editor mode
* @param array $atts
* @return string Extra class
*/
function getEditWrapperClass($atts){
return '';
}
protected function _setLv($lv){
$this->lv=intval($lv);
}
/**
* update element before it's display
* @param $atts
* @param $content
*/
public function update( $atts,$content ) {
if($this->features){
foreach($this->features as $f){
$f->update($atts,$content);
}
}
do_action('ve_update_element',$this,$atts,$content);
}
/**
* display element
* @param $instance
* @param $content
*
*/
function element($instance,$content){
if($widget=$this->getWpWidget()){
$widget->_set(-1);
$widget->widget($this->get_widget_args(),$instance);
}
}
function form($instance){
if($widget=$this->getWpWidget()){
$widget->_set(-1);
$widget->form($instance);
}else {
echo '
' . __('There are no options for this element.') . '
';
}
}
function addFeature(Ve_Feature_Abstract $instance,$id='',$title=''){
if(!$id){
$id=$title;
}
if($id){
$instance->setId($id);
}
if($title){
$instance->setTitle($title);
}
$id=$instance->getId();
if(isset($this->features[$id])){
return $this;
}
if($id) {
$this->features[$id] = $instance;
}
return $this;
}
function removeFeature($feature){
$id=$feature;
$id=sanitize_key($id);
if(isset($this->features[$id])){
unset($this->features[$id]);
}
return $this;
}
public function display_callback($atts, $content='' ) {
return $this->display_element($atts,$content);
}
function default_settings(){
$this->addClass($this->default_class);
}
function display_element($atts, $content='' ){
$this->next_instance();
$this->update($atts,$content);
ob_start();
if(ve_element_editing()&&method_exists($this,'preview')){
$this->preview($atts,$content);
}else {
$this->element($atts, $content);
}
if(ve_element_editing()){
$this->print_inline_js();
}
$output= ob_get_clean();
$this->the_instance();
$output= $this->before().$this->element_wrapper_start($atts,$content).$output.$this->element_wrapper_end($atts,$content).$this->after();
return $output;
}
/**
* Set js code to call when element ready
* @param String $jsCode
*/
function ready($jsCode){
$this->inlineScript=$jsCode;
}
function add_front_js(){
ve_add_front_js_inline($this->inlineScript);
}
/**
* print element inline js
* @param string $jsCode code to print
*
*/
function print_inline_js($jsCode=''){
if(empty($jsCode)){
$jsCode=$this->inlineScript;
}
if(empty($jsCode)){
return ;
}
?>
inlineScript;
}
function element_wrapper_start($instance,$content=''){
return sprintf('',$this->get_attributes());
}
function element_wrapper_end($instance,$content=''){
return '
';
}
/**###########################
* Instance related functions
*****************************/
/**
* Next instance
*/
function next_instance(){
static $id=-1;
$id++;
$this->instance=$id;
array_push($this->updateStack,$this->instance);
$this->default_settings();
}
function the_instance(){
$this->instance=array_pop($this->updateStack);
}
function get_attributes($att=null){
$attributes=array();
if(!empty($this->attributes[$this->instance])){
foreach($this->attributes[$this->instance] as $k=>$v){
$attributes[$k]=$v;
}
}
$output=array();
if(isset($this->id[$this->instance])){
$attributes['id']=$this->id;
}
if(!isset($attributes['style'])&&isset($this->css[$this->instance])){
$attributes['style']=$this->css[$this->instance];
}
if(!isset($attributes['class'])&&isset($this->classes[$this->instance])){
$attributes['class']=$this->classes[$this->instance];
}
if(isset($attributes['style'])&&is_array($attributes['style'])){
$attributes['style']=ve_style_string($attributes['style']);
}
if(isset($attributes['class'])&&is_array($attributes['class'])){
$attributes['class']=ve_class_string($attributes['class']);
}
$remove_empty_attributes=array('id','class','style');
if($attributes) {
foreach ($attributes as $k => $v) {
if (is_array($v)) {
$v = ve_attr_string($v);
}
if(in_array($k,$remove_empty_attributes)&&empty($v)){
continue;
}
if($att){
if(is_array($att)){
if(in_array($k,$att)){
$output[] = sprintf('%s="%s"', $k, esc_attr($v));
}
}else if($att==$k){
$output[] = sprintf('%s="%s"', $k, esc_attr($v));
break;
}
}else {
$output[] = sprintf('%s="%s"', $k, esc_attr($v));
}
}
}
$output=join(' ',$output);
return $output;
}
function setId($id){
$this->id[$this->instance]=$id;
return $this;
}
function addClass($class){
if(empty($class)){
return $this;
}
if(is_string($class)&&($class=trim($class))&&strpos($class,' ')){
$class=explode(' ',$class);
}
if(!isset($this->classes[$this->instance])||!is_array($this->classes[$this->instance])){
$this->classes[$this->instance]=array();
}
if(is_array($class)){
$class=array_map('sanitize_html_class',$class);
$class=array_filter($class);
$this->classes[$this->instance]=array_merge($this->classes[$this->instance],$class);
$this->classes[$this->instance]=array_unique($this->classes[$this->instance]);
return $this;
}
$class=sanitize_html_class($class);
if($class&&!in_array($class,$this->classes[$this->instance])){
$this->classes[$this->instance][]=$class;
}
$this->attributes[$this->instance]['class']=$this->classes[$this->instance];
return $this;
}
function removeClass($class){
if(empty($class)){
return $this;
}
if(is_string($class)&&strpos($class,' ')){
$class=explode(' ',$class);
}
if(is_array($class)){
$class=array_map('sanitize_html_class',$class);
$this->classes[$this->instance]=array_diff($this->classes[$this->instance],$class);
return $this;
}
$class=sanitize_html_class($class);
if($class) {
$this->classes[$this->instance] = array_diff($this->classes[$this->instance], array($class));
}
return $this;
}
function attr($k,$v=null){
$k=sanitize_key($k);
if($k){
unset($this->attributes[$this->instance][$k]);//unset to remove link to previous value if any
$this->attributes[$this->instance][$k]=$v;
}
return $this;
}
function removeAttr($k){
$k=sanitize_key($k);
if(isset($this->attributes[$this->instance][$k])){
unset($this->attributes[$this->instance][$k]);
}
return $this;
}
function css($name,$val='__ve_get_value'){
if($val==='__ve_get_value'){
return isset($this->css[$this->instance][$name])?$this->css[$this->instance][$name]:'';
}
if($val) {
$this->css[$this->instance][$name] = $val;
}else{
unset($this->css[$this->instance][$name]);
}
if(isset($this->css[$this->instance]))
$this->attributes[$this->instance]['style']=$this->css[$this->instance];
return $this;
}
function before($before=VE_DEFAULT_FUNCTION_PARAM){
if($before===VE_DEFAULT_FUNCTION_PARAM){
return isset($this->before[$this->instance])?$this->before[$this->instance]:'';
}
$this->before[$this->instance]=$before;
return $this;
}
function after($after=VE_DEFAULT_FUNCTION_PARAM){
if($after===VE_DEFAULT_FUNCTION_PARAM){
return isset($this->after[$this->instance])?$this->after[$this->instance]:'';
}
$this->after[$this->instance]=$after;
return $this;
}
function enqueue_js($handle, $src = false, $deps = array('ve_front'), $ver = false, $footer=true){
$this->getVeManager()->getResourceManager()->addJs($handle,$src,$deps,$ver,$footer);
}
function enqueue_form_script( $handle, $src = false, $deps = array(), $ver = false){
if(! is_a( $this->scripts, 'WP_Scripts' )){
$this->scripts= new WP_Scripts();
}
if ( $src ) {
$_handle = explode('?', $handle);
$this->scripts->add( $_handle[0], $src, $deps, $ver );
}
$this->scripts->enqueue( $handle );
return $this;
}
function print_form_scripts(){
if(!$this->scripts){
$this->scripts=new WP_Scripts();
}
return $this->scripts->do_items();
}
function _form($atts,$content,$args){
do_action('ve_element_form_before',$this,$atts,$content,$args);
$this->form($atts,$content,$args);
do_action('ve_element_form',$this,$atts,$content,$args);
}
public function form_callback($atts, $content='') {
$args=$this->get_widget_args();
ob_start();
if(!empty($this->features)){
include VE_CORE.'/templates/element-form.phtml';
}else{
$this->_form($atts,$content,$args);
}
$this->print_form_scripts();
return ob_get_clean();
}
function export($instance,$content=''){
return $this->get_shortcode_tree($instance,$content);
}
function import($instance,$content=''){
return $this->get_shortcode_tree($instance,$content);
}
function get_shortcode_tree($instance,$content=''){
$close="[/$this->id_base]";
$attr=array($this->id_base);
if($instance) {
foreach ($instance as $k => $v) {
$k = sanitize_key($k);
if (is_array($v)) {
$v = json_encode($v);
} else {
$v = esc_attr($v);
}
$attr[] = sprintf('%s="%s"', $k, $v);
}
}
$atts=join(' ',$attr);
$short_code='['.$atts.' /]';//use self closing if no content
if(!empty($content)){
$short_code='['.$atts.']'.do_shortcode($content).$close;
}
return $short_code;
}
function get_shortcode($instance,$content=''){
$close="[/$this->id_base]";
$attr=array($this->id_base);
if($instance) {
foreach ($instance as $k => $v) {
$k = sanitize_key($k);
if (is_array($v)) {
$v = json_encode($v);
} else {
$v = esc_attr($v);
}
$attr[] = sprintf('%s="%s"', $k, $v);
}
}
$atts=join(' ',$attr);
$short_code='['.$atts.']';
if(!empty($content)){
$short_code.=$content.$close;
}
return $short_code;
}
function get_shortcode_array(){
$shortcode=array(
'tag'=>$this->id_base,
);
return $shortcode;
}
public function _get_display_callback() {
return array($this, 'display_callback');
}
public function _get_export_callback(){
return array($this, 'export');
}
public function _get_import_callback(){
return array($this, 'import');
}
public function _get_form_callback() {
return array($this, 'form_callback');
}
function element_title($title){
if(!empty($title)) {
printf('%s
', $title);
}
}
function element_content($content){
printf('%s
',$content);
}
/**
* Get all element configuration
* @return array
*/
function get_settings(){
$settings=array_merge($this->options,array(
'id_base'=>$this->id_base,
'name'=>$this->name,
'lv'=>intval($this->lv),
'icon_class' => $this->icon_class
));
if(empty($settings['defaults'])){
$settings['defaults']=new stdClass();
}
return apply_filters('element_settings',$settings);
}
function get_field_key(){
return 've-' . $this->id_base;
}
public function get_field_name($field_name) {
return $this->get_field_key() . '[' . $field_name . ']';
}
function field_name($field_name){
echo $this->get_field_name($field_name);
}
public function get_field_id( $field_name ) {
return $this->get_field_key() . '-' . $field_name;
}
function field_id($field_name){
echo $this->get_field_id($field_name);
}
function field_value($instance_or_value,$key=''){
if(is_array($instance_or_value)){
$instance_or_value=isset($instance_or_value[$key])?$instance_or_value[$key]:'';
}
echo esc_attr($instance_or_value);
}
function option($name){
return isset($this->options[$name])?$this->options[$name]:null;
}
function is_container(){
return (bool)$this->option('container');
}
function has_content(){
return !$this->is_container()&&$this->option('has_content');
}
function get_widget_args(){
$args=array();
$args['before_widget']=sprintf('');
$args['before_title']='
';
$args['after_title']='
';
$args['after_widget']='';
return wp_parse_args($this->wp_widget_args,$args);
}
function enablePreview($preview=true){
$this->previewEnable=$preview;
return $this;
}
}