NexusLeads Webshell
NexusLeads


Server : LiteSpeed
System : Linux server 3.10.0-1160.90.1.el7.x86_64 #1 SMP Thu May 4 15:21:22 UTC 2023 x86_64
User : alsaif ( 1057)
PHP Version : 7.4.33
Disable Function : show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Directory :  /home/alsaif/public_html/plugins/system/sppagebuildertranslate/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/alsaif/public_html/plugins/system/sppagebuildertranslate/sppagebuildertranslate.php
<?php
/**


 * @author      Stéphane Bouey <stephane.bouey@faboba.com> - http://www.faboba.com
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 * @copyright   Copyright (C) 2012-2021 Faboba. All rights reserved.
 */

defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;


/**
 * To work need 3 files to be overrdien
 * components/com_sppagebuilder/parser/addon-parser.php
 * administrator/components/com_sppagebuilder/views/page/tmpl/edit.php
 * plugins/system/sppagebuilder/sppagebuilder.php
 */

/**
 * Joomla! System Logging Plugin.
 *
 * @since  1.5
 */
class PlgSystemSppagebuildertranslate extends JPlugin
{
	var $sppbVersion = 3;

	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);
        //load plugin language
        $this->loadLanguage();
        //display update message on sppagebuilder pages
        $this->displayUpdateMessage();
	}


	public function getSppbVersion(){
		$db = JFactory::getDbo();
		$query = $db->getQuery(true);
		$query->select('manifest_cache');
		$query->from($db->quoteName('#__extensions'));
		$query->where('element = "com_sppagebuilder"');
		$db->setQuery($query);

		$manifest = json_decode($db->loadResult(), true);
		$version = $manifest['version'];

		if (version_compare($version,'3','<'))
		{
			$this->sppbVersion = 2;
		}
	}

	public function displayUpdateMessage(){
        if ( JFactory::getApplication()->isClient('site')){return;}

        $input = JFactory::getApplication()->input;
        $option = $input->get('option');
        $view = $input->get('view');
        if ($option == 'com_sppagebuilder' && ($view == 'pages' || empty($view))){

            //get exteinsion id for sppagebuilder
            $db = JFactory::getDbo();
            $query = $db->getQuery(true);
            $query->select('extension_id')
                ->from($db->quoteName('#__extensions'))
                ->where($db->quoteName('element') . ' = '. $db->quote('sppagebuildertranslate'))
                ->andWhere($db->quoteName('type') .' = '. $db->quote('plugin'));
            $db->setQuery($query);
            $eid = $db->loadResult();

            if ($eid){
                JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR.'/components/com_installer/models', 'InstallerModelUpdate');
                $model = JModelLegacy::getInstance('Update', 'InstallerModel', array('ignore_request'=>true));
                $items = $model->getItems();

                foreach ($items as $item){
                    if ($item->extension_id == $eid){
                        JFactory::getApplication()->enqueueMessage(sprintf(JText::_('PLG_SPPAGEBUILDERTRANSLATE_NEW_VERSION'),$item->version), 'warning');
                        break;
                    }
                }

            }
        }
    }

	//render is for front-end
	public function onBeforeAddonRender(&$addon)
	{
		if ($this->sppbVersion == 3) {
			$this->onBeforeAddonRenderv3($addon);
		} else {
			$this->onBeforeAddonRenderv2($addon);
		}
	}

	public function onBeforeAddonRenderv3(&$addon)
	{
        $lang = JFactory::getLanguage()->getTag();
        $default_lang = ComponentHelper::getParams('com_languages')->get('site', 'en-GB');

		require_once JPATH_PLUGINS .'/system/sppagebuildertranslate/config.php';

		if ( file_exists(JPATH_PLUGINS . '/system/sppagebuildertranslate/addons/'.$addon->name.'.php') ) {
			require_once JPATH_PLUGINS . '/system/sppagebuildertranslate/addons/'.$addon->name.'.php';
		}

		$translated_fields = SpAddonsConfigTranslation::$addons;

		//manage addon's filter by language
		if (isset(SpAddonsConfigTranslation::$addons[$addon->name]['language']) &&  SpAddonsConfigTranslation::$addons[ $addon->name ]['language'] == true) {
			if (isset($translated_fields[$addon->name]['language']) && $translated_fields[$addon->name]['language']) {
				if (isset($addon->settings->language) && ($addon->settings->language != '*' && $addon->settings->language != $lang)) {
					$addon = null;
					return;
				}
			}
		}

        //nothing to do for default langauge
        if ($lang == $default_lang ){
            return;
        }

		if (empty($translated_fields)){return;}
		//is no transalted addon is make make for this addon return
		//todo find a nicer way
		if (empty($translated_fields[$addon->name])){return;}


		if (isset($translated_fields[$addon->name]['repeatable_item_name'])){
			$repeatable_item_name = $translated_fields[$addon->name]['repeatable_item_name'];
			$repeatable_items = $addon->settings->$repeatable_item_name;
		}

		$fields = $translated_fields[$addon->name]['attr'];


		if (empty($fields)){return;}

		//replace this with an recursive process

		foreach ($fields as $field){
			if (!is_array($field)) {
				$translatedFieldName =  $this->getTranslatedFieldName($field,$lang);
				if (!empty($addon->settings->{$translatedFieldName}))
				{
					$addon->settings->{$field} = $addon->settings->{$translatedFieldName};
				}
			} else {
				$addon_repeatable_items =$addon->settings->{$repeatable_item_name};
				$addon_repeatable_items_count = count($addon_repeatable_items);

				//loop on each repeatable item
				for ($idx = 0 ;$idx < $addon_repeatable_items_count; $idx++)
				{
					//loop on each repeatable translated item
					//check if a translation exist and replace it in the original value
					foreach ($field['attr'] as $translatedItem)
					{
						//normally all $afield are array
						$fieldLangValue     = null;
						$translatedKey = 'translate_' . $translatedItem . '_' . $lang;
						if (isset($addon->settings->{$repeatable_item_name}[$idx]->{$translatedKey}))
						{
							$fieldLangValue = $addon->settings->{$repeatable_item_name}[$idx]->{$translatedKey};
						}
						if (!empty($fieldLangValue))
						{
							$addon->settings->{$repeatable_item_name}[$idx]->{$translatedItem} = $fieldLangValue;
						}
					}
				}
			}
		}
	}

	public function onBeforeAddonRenderv2(&$addon)
	{

		require_once JPATH_PLUGINS .'/system/sppagebuildertranslate/config.php';

		$lang = JFactory::getLanguage()->getTag();

		if ( file_exists(JPATH_PLUGINS . '/system/sppagebuildertranslate/addons/'.$addon->name.'.php') ) {
			require_once JPATH_PLUGINS . '/system/sppagebuildertranslate/addons/'.$addon->name.'.php';
		}

		$translated_fields = SpAddonsConfigTranslation::$addons;

		//manage addon's filter by language
		if (isset(SpAddonsConfigTranslation::$addons[$addon->name]['language']) &&  SpAddonsConfigTranslation::$addons[ $addon->name ]['language'] == true) {
			if (isset($translated_fields[$addon->name]['language']) && $translated_fields[$addon->name]['language']) {
				if ($addon->settings->language != '*' && $addon->settings->language != $lang) {
					$addon = null;
					return;
				}
			}
		}

		if (empty($translated_fields)){return;}
		//is no transalted addon is make make for this addon return
		//todo find a nicer way
		if (empty($translated_fields[$addon->name])){return;}


		if (isset($translated_fields[$addon->name]['repeatable_item_name'])){
			$repeatable_item_name = $translated_fields[$addon->name]['repeatable_item_name'];
			$repeatable_items = $addon->settings->$repeatable_item_name;
		}

		$fields = $translated_fields[$addon->name]['attr'];

		if (empty($fields)){return;}

		//replace this with an recursive process

		foreach ($fields as $field){
			if (!is_array($field)) {
				$field_lang = 'translate_' . $field . '_' . $lang;
				if (!empty($addon->settings->{$field_lang}))
				{
					$addon->settings->{$field} = $addon->settings->{$field_lang};
				}
			} else {
				foreach ($field as $afield){
					//normally all $afield are array
					if (is_array($afield))
					{
						foreach ($afield as $i => $aafield)
						{
							//on multiple $repeatable_items is set / give the number of item
							foreach ($repeatable_items as $key => $repeatable_item)
							{
								$field_lang = 'translate_' . $repeatable_item_name . '_' . $aafield . '_' . $key . '_' . $lang;
								if (!empty($addon->settings->{$field_lang}))
								{
									$addon->settings->{$repeatable_item_name}[$key]->{$aafield} = $addon->settings->{$field_lang};
								}
							}
						}
					}

				}
			}
		}
	}

	/*
	 * SP Page Builder 3.0 event use to add translate option
	 * backend
	 */
	public function onBeforeAddonConfigure($addon_name, &$addon)
	{
		require_once JPATH_PLUGINS .'/system/sppagebuildertranslate/config.php';

		if ( file_exists(JPATH_PLUGINS . '/system/sppagebuildertranslate/addons/'.$addon_name.'.php') ) {
			require_once JPATH_PLUGINS . '/system/sppagebuildertranslate/addons/'.$addon_name.'.php';
		}

		if (isset(SpAddonsConfigTranslation::$addons[$addon_name])){
			$translated_fields = SpAddonsConfigTranslation::$addons[$addon_name];
		}

		//manage addon's filter by language
		if (isset(SpAddonsConfigTranslation::$addons[$addon_name]['language']) &&  SpAddonsConfigTranslation::$addons[ $addon_name ]['language'] == true) {
			$languages_list = $this->getSelectLanguagesArray();

			$language_array = array(
				'language' => array(
					'type'   => 'select',
					'title'  => JText::_( 'Language' ),
					'desc'   => JText::_( 'Select the language to display' ),
					'std'    => '*',
					'values' => $languages_list,
				)
			);

			//set default to all language (don't work with the std parameter above
			$addon['default']['language'] = '*';

			$addon['attr']['languages'] = $language_array;
			return;
		}


		//if no translation need for this addons stop here.
		if (empty($translated_fields)){return;}

		$output = array();

		$languages = $this->getLanguages();

		foreach ($languages as $language )
		{
			$this->visit($addon['attr'], $translated_fields['attr'],$language, $output);
		}



		$addon['attr']['languages'] = $output;



/*
		foreach ($translated_fields['attr'] as $field )
		{//sbou
			if (is_array($field)){
				return;
			} else	{
				$field_name_translated      = $this->getTranslatedFieldName($field, 'fr_FR');
				$addon['attr']['languages'] = array(
					$field_name_translated => $addon['attr']['general'][$field]

				);
			}
		}
*/
	}


    /*
     * Backend
     * Allow row option translation title and subtitle
     * @since 2.12
     *
     * */
	public function onBeforeRowConfigure(&$rowSettings){

		//Row can translate title and subtitle
        $translated_fields = array('attr'=>array('title','subtitle'));

		$output = array();

		$languages = $this->getLanguages();

		foreach ($languages as $language )
		{
			$this->visit($rowSettings['attr'], $translated_fields['attr'],$language, $output);
		}

        $rowSettings['attr']['languages'] = $output;

	}

    /*
     * Front-end
     * Allow row option translation title and subtitle
     * @since 2.12
     *
     * */
    public function onBeforeRowRender(&$row){

        $lang = JFactory::getLanguage()->getTag();
        $default_lang = ComponentHelper::getParams('com_languages')->get('site', 'en-GB');

        //nothing to do for default langauge
        if ($lang == $default_lang ){
            return;
        }

        $translated_fields = array('title','subtitle');
        foreach ($translated_fields as $field){
            $translatedFieldName =  $this->getTranslatedFieldName($field,$lang);
            if (!empty($row->settings->{$translatedFieldName}))
            {
                $row->settings->{$field} = $row->settings->{$translatedFieldName};
            }
        }

    }

	private function getLanguages(){
		$languages = JLanguageHelper::getLanguages();
		$default_lang = JComponentHelper::getParams('com_languages')->get('site', 'en-GB');
		//remove default language from $languages
		foreach ($languages as $i => $language) {
			if ($language->lang_code == $default_lang) {
				unset($languages[$i]);
				break;
			}
		}
		return $languages;
	}

	//format the language list for the language select

	private function getSelectLanguagesArray(){
		$languages = \JHtml::_('contentlanguage.existing',true);
		$result = array();

		foreach ($languages as $language){
			$result[$language->value]= JText::_($language->text);
		}

		return $result;

	}

	/**
	 * get the internal name to store translation
	 * @param $name
	 * @param $language
	 *
	 * @return string
	 * 	 */
	private function getTranslatedFieldName($name, $language_code)
	{
		return 'translate_' . $name . '_' . $language_code;
	}

	/*
	 * use to format the Title of field for a translated item
	 */
	private function getTranslatedFieldTitle($name, $language)
	{
		return $name .' '.$language->lang_code;
	}


	/**
	 * Use for SP Pagebuilder 2.5
	 * @param $addon_name
	 * @param $form_fields
	 * @param $options
	 */
    public function onBeforeAddonOptionsRender($addon_name,&$form_fields, &$options)
    {

        require_once JPATH_PLUGINS .'/system/sppagebuildertranslate/config.php';

        if ( file_exists(JPATH_PLUGINS . '/system/sppagebuildertranslate/addons/'.$addon_name.'.php') ) {
           require_once JPATH_PLUGINS . '/system/sppagebuildertranslate/addons/'.$addon_name.'.php';
        }

        $translated_fields = SpAddonsConfigTranslation::$addons;


        //if no translation need for this addons stop here.
        if (empty($translated_fields)){return;}

        //todo is it necessary to have the field or the cound is enought
	    $grouped_fields = $this->get_grouped_input_fields($addon_name,$options,$translated_fields);

        //load addon translated field
        $fields = $translated_fields[$addon_name]['attr'];
        if (isset($translated_fields[$addon_name]['repeatable_item_name']))
        {
	        $repeatable_item_name = $translated_fields[$addon_name]['repeatable_item_name'];
        }

        if (empty($fields)){return;}

	    $languages = $this->getLanguages();

        $translate_language = array();
        foreach ($languages as $language) {
        	//loop on field

		        foreach ($fields as $field)
		        {
		        	//$field is an array for repeatable item
		        	if (!is_array($field))
			        {
				        $hint = '';
				        //get the type from the default addon
				        if (!empty($form_fields[$addon_name]['attr']['general']))
				        {
					        $type = $form_fields[$addon_name]['attr']['general'][$field]['type'];
					        $hint  = $form_fields[$addon_name]['attr']['general'][$field]['title'];
				        }
				        else
				        {
					        //progress_bar don't have general
					        $type = $form_fields[$addon_name]['attr'][$field]['type'];
					        $hint  = $form_fields[$addon_name]['attr'][$field]['title'];
				        }

				        //don't display hint all all type field
				        if ($type == 'textarea')
				        {
				        	$hint = '';
				        }
				        else{
				        	$hint = '<span class="small"> ('.$hint.')</span>';
				        }

				        $format = empty($form_fields[$addon_name]['attr']['general'][$field]['format']) ? '' : $form_fields[$addon_name]['attr']['general'][$field]['format'];
				        $placeholder = empty($form_fields[$addon_name]['attr']['general'][$field]['placeholder']) ? '' : $form_fields[$addon_name]['attr']['general'][$field]['placeholder'];
				        $translate_language['translate_' . $field . '_' . $language->lang_code] = array(
					        'type'  => $type,
					        'title' => JText::_($field . ' ' . $language->lang_code).$hint,
					        'std'   => '',
					        'format' => $format,
					        'placeholder' => $placeholder
				        );
			        } else
			        {
				        foreach ($grouped_fields as $key => $grouped_field )
				        {
					        foreach ($fields[$repeatable_item_name]['attr'] as $field)
					        {
						        $attr_field  = $form_fields[$addon_name]['attr']['general'][$repeatable_item_name]['attr'][$field];
						        $type        = $attr_field['type'];
						        $format      = empty($attr_field['format']) ? '' : $attr_field['format'];
						        $placeholder = empty($attr_field['placeholder']) ? '' : $attr_field['placeholder'];
						        $hint = '<span class="small"> ('.$grouped_field[$field].')</span>';;
						        $translate_language['translate_' . $repeatable_item_name . '_' . $field . '_'.$key.'_' . $language->lang_code] = array(
							        'type'        => $type,
							        'title'       => JText::_($field . ' ' . $language->lang_code) . $hint,
							        'std'         => '',
							        'format'      => $format,
							        'placeholder' => $placeholder
						        );
					        }
				        }
			        }
		        }
        }

        $options['languages'] = $translate_language;
    }

	/**
	 * Grouped input filed generator
	 * use for v2
	 * @since 1.0
	 * @access private
	 * @return fields
	 */
	private function get_grouped_input_fields( $addon_name, $options,$translated_fields ) {
		//get grouped fields (see get_grouped_input_fields administrator/components/com_sppagebuilder/builder/classes/ajax.php
		$input = JFactory::getApplication()->input;
		$post = $input->post;
		$grouped = array();

        //TODO FIND A BETTER WAY BY POST
		$settings = null;
	      if (isset($_POST['settings'])) {
		      $settings = $_POST['settings'];
	      }

		if (isset($translated_fields[$addon_name]['repeatable_item_name'])){
			$repeatable_item_name = $translated_fields[$addon_name]['repeatable_item_name'];
			if (isset($settings[$repeatable_item_name]))
			{
				$grouped = $settings[$repeatable_item_name];

			}

			$count = count($grouped);
			if ($count <= 0) {$count = 1;}

		}

		return $grouped;
	}

	/**
	 * @param $addon
	 * @param $translated_fields
	 *
	 * @return mixed
	 */
	private function visit(&$addon, $translated_fields,$language,&$output)
	{
		foreach ($translated_fields as $name => $field)
		{
			if (is_array($field))
			{
					foreach ($field['attr'] as $key)
					{
						$field_name_translated          = $this->getTranslatedFieldName($name . '_' . $key . '_' , $language->lang_code);//translate_sp_accordion_item_content_1_fr-FR
						$translatedField                = $addon['general'][$name]['attr'][$key];
						$translatedField['title']       = $this->getTranslatedFieldTitle($translatedField['title'], $language);
						//$output[$field_name_translated] = $translatedField;
						$addon['general'][$name]['attr']['translate_'.$key.'_'.$language->lang_code] =  $translatedField ;

					}
			}
			else
			{
				$field_name_translated      = $this->getTranslatedFieldName($field, $language->lang_code);
				if (!isset($addon['general'])){continue;}
				$translatedField = $addon['general'][$field];
				$translatedField['title'] = $this->getTranslatedFieldTitle($translatedField['title'],$language);
				$output[$field_name_translated] =$translatedField;
			}

		}

		return $addon;
	}


}

NexusLeads