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/domains/alsaif.group/private_html/plugins/system/falangdriver/ |
<?php
/**
* @package Falang for Joomla!
* @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) 2010-2017. Faboba.com All rights reserved.
*/
// No direct access to this file
defined('_JEXEC') or die;
//Global definitions use for front
if( !defined('DS') ) {
define( 'DS', DIRECTORY_SEPARATOR );
}
jimport('joomla.plugin.plugin');
/**
* Falang Driver Plugin
*/
class plgSystemFalangdriver extends JPlugin
{
public function __construct(&$subject, $config = array())
{
parent::__construct($subject, $config);
//load plugin language
$this->loadLanguage();
$this->setupCoreFileOverride();
// This plugin is only relevant for use within the frontend!
if (JFactory::getApplication()->isAdmin())
{
return;
}
//@since 2.9.0
//add this setup in the constuctor due to system plugin who use $this->db (constucted by reflexion of JPlugin)
//and no more in the onAfterInitialise
if (!$this->isFalangDriverActive())
{
$this->setupDatabaseDriverOverride();
}
}
/**
* System Event: onAfterInitialise
*
* @return string
*/
function onAfterInitialise()
{
// This plugin is only relevant for use within the frontend!
if (JFactory::getApplication()->isAdmin())
{
return;
}
//fix for joomla > 3.4.0
$app = JFactory::getApplication();
if ($app->isSite()) {
$router = $app->getRouter();
// attach build rules for translation on SEF
$router->attachBuildRule(array($this, 'buildRule'));
// attach build rules for translation on SEF
$router->attachParseRule(array($this, 'parseRule'));
}
//end fix
//override joomla compoenent routeur
$this->setupAdvancedRouter();
}
public function buildRule(&$router, &$uri)
{
$lang = $uri->getVar('lang');
$default_lang = JComponentHelper::getParams('com_languages')->get('site', 'en-GB');
//we build the route for category list article
if ($lang != $default_lang && $uri->getVar('id') != null && $uri->getVar('catid') != null &&
$uri->getVar('option') == 'com_content' ) {//&& $uri->getVar('view') == 'article'
$fManager = FalangManager::getInstance();
$id_lang = $fManager->getLanguageID($lang);
// Make sure we have the id and the alias
if (strpos($uri->getVar('id'), ':') > 0)
{
list($tmp, $id) = explode(':', $uri->getVar('id'), 2);
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true)
->select('fc.value')
->from('#__falang_content fc')
->where('fc.reference_id = '.(int)$tmp)
->where('fc.language_id = '.(int) $id_lang )
->where('fc.reference_field = \'alias\'')
->where('fc.published = 1')
->where('fc.reference_table = \'content\'');
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('id',$tmp. ':' . $alias);
}
}
// Make sure we have the id and the alias
if (strpos($uri->getVar('catid'), ':') > 0)
{
list($tmp2, $catid) = explode(':', $uri->getVar('catid'), 2);
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true)
->select('fc.value')
->from('#__falang_content fc')
->where('fc.reference_id = '.(int)$tmp2)
->where('fc.language_id = '.(int) $id_lang )
->where('fc.reference_field = \'alias\'')
->where('fc.published = 1')
->where('fc.reference_table = \'categories\'');
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('catid',$tmp2. ':' . $alias);
}
}
}
//fix canonical if sef plugin is enabled
$sef_plugin = JPluginHelper::getPlugin('system', 'sef');
if (!empty($sef_plugin)) {
if ($lang != $default_lang && $uri->getVar('id') != null && $uri->getVar('catid') != null &&
$uri->getVar('option') == 'com_content' ) {//&& $uri->getVar('view') == 'article'
$fManager = FalangManager::getInstance();
$id_lang = $fManager->getLanguageID($lang);
// Make sure we have the id and the alias
if (strpos($uri->getVar('id'), ':') === false)
{
//we use id in the query to be translated.
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true)
->select('alias,id')
->from('#__content')
->where('id=' . (int) $uri->getVar('id'));
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('id',$uri->getVar('id') . ':' . $alias);
}
}
}
}
//build route for hikashop product
if ( $uri->getVar('option') == 'com_hikashop' && $uri->getVar('ctrl') == 'product' && $uri->getVar('task')== 'show' ) {
// on native language look in falang table
if ($default_lang != $lang ){
$fManager = FalangManager::getInstance();
$id_lang = $fManager->getLanguageID($lang);
$id = $uri->getVar('cid');
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true)
->select('fc.value')
->from('#__falang_content fc')
->where('fc.reference_id = '.(int)$id)
->where('fc.language_id = '.(int) $id_lang )
->where('fc.reference_field = \'product_alias\'')
->where('fc.published = 1')
->where('fc.reference_table = \'hikashop_product\'');
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('name', $alias);
}
} else {
// translated languague look in native table
$id = $uri->getVar('cid');
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true)
->select('product_alias')
->from('#__hikashop_product')
->where('product_id = '.(int)$id);
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('name', $alias);
}
}
//
}
//build route for hikahsop category list
if ( $uri->getVar('option') == 'com_hikashop' && $uri->getVar('ctrl') == 'category' && $uri->getVar('task')== 'listing' ) {
// on native language look in falang table
if ($default_lang != $lang) {
$fManager = FalangManager::getInstance();
$id_lang = $fManager->getLanguageID($lang);
$id = $uri->getVar('cid');
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true)
->select('fc.value')
->from('#__falang_content fc')
->where('fc.reference_id = ' . (int)$id)
->where('fc.language_id = ' . (int)$id_lang)
->where('fc.reference_field = \'category_alias\'')
->where('fc.published = 1')
->where('fc.reference_table = \'hikashop_category\'');
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('name', $alias);
}
} else {
// translated languague look in native table
$id = $uri->getVar('cid');
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true)
->select('category_alias')
->from('#__hikashop_category')
->where('category_id = ' . (int)$id);
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('name', $alias);
}
}
}
//build route for k2 category list
//v2.2.2 add download test due to download link bug in other case.
if ( $uri->getVar('option') == 'com_k2' && $uri->getVar('view') == 'item' && $uri->getVar('task') != 'download' ) {
// on native language look in falang table
if ($default_lang != $lang ) {
$fManager = FalangManager::getInstance();
$id_lang = $fManager->getLanguageID($lang);
// Make sure we have the id and the alias
if (strpos($uri->getVar('id'), ':') > 0) {
list($tmp, $id) = explode(':', $uri->getVar('id'), 2);
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true)
->select('fc.value')
->from('#__falang_content fc')
->where('fc.reference_id = ' . (int)$tmp)
->where('fc.language_id = ' . (int)$id_lang)
->where('fc.reference_field = \'alias\'')
->where('fc.published = 1')
->where('fc.reference_table = \'k2_items\'');
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('id', $tmp . ':' . $alias);
}
}
} else {
// translated languague look in native table
$tmp = $uri->getVar('id');
// Make sure we have the id and the alias
if (strpos($tmp, ':') > 0) {
list($tmp, $id) = explode(':', $tmp, 2);
}
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true)
->select('alias')
->from('#__k2_items')
->where('id = '.(int)$tmp);
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('id', $tmp . ':' . $alias);
}
}
}
if ( $uri->getVar('option') == 'com_djcatalog2' && $uri->getVar('view') == 'item') {
$this->buildRuleAlias($uri,'djc2_items','alias');
}
return array();
}
public function buildRuleAlias(&$uri,$reference_table,$alias_name){
$lang = $uri->getVar('lang');
$default_lang = JComponentHelper::getParams('com_languages')->get('site', 'en-GB');
//look in Falang Table
if ($default_lang != $lang ) {
$fManager = FalangManager::getInstance();
$id_lang = $fManager->getLanguageID($lang);
// Make sure we have the id and the alias
if (strpos($uri->getVar('id'), ':') > 0) {
list($id,$tmp) = explode(':', $uri->getVar('id'), 2);
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true);
$dbQuery->select('fc.value')
->from('#__falang_content fc')
->where('fc.reference_id = ' . $dbQuery->q($id))
->where('fc.language_id = ' . $dbQuery->q($id_lang))
->where('fc.reference_field = '.$dbQuery->q($alias_name))
->where('fc.published = 1')
->where('fc.reference_table = '.$dbQuery->q($reference_table));
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('id', $id . ':' . $alias);
}
}
} else {
// translated languague look in native table
$tmp = $uri->getVar('id');
// Make sure we have the id and the alias
if (strpos($tmp, ':') > 0) {
list($tmp, $id) = explode(':', $tmp, 2);
}
$db = JFactory::getDbo();
$dbQuery = $db->getQuery(true);
$dbQuery->select($dbQuery->qn($alias_name))
->from( $dbQuery->qn('#__' .$reference_table))
->where('id = ' . $dbQuery->q($tmp));
$db->setQuery($dbQuery);
$alias = $db->loadResult();
if (isset($alias)) {
$uri->setVar('id', $tmp . ':' . $alias);
}
}
}
public function parseRule(&$router, &$uri) {
static $done = false;
if (!$done)
{
$done = true;
$conf = JFactory::getConfig();
$lang = JFactory::getLanguage();
$default_lang = JComponentHelper::getParams('com_languages')->get('site', 'en-GB');
// Workaround for Joomla > 3.7.0, we need to set the correct language for the cache handler because the menu get already cached with the
// language defined in JApplicationSite::initialiseApp(), but this language is the wrong if we change the language because language detection
// is done in the Joomla system plugin languagefilter. The solution is to load the com_menus cache and set the correct language and reload
// the menu, this is already done for Jooma 3.4.0, it seams that the cache works since 3.7.0
if ($conf->get('caching',0) > 0)
{
$cache = JFactory::getCache('com_menus', 'callback');
$cache->options['language'] = $lang->getTag();
if ($lang->getTag() != $default_lang)
{
$cache->options['caching'] = false;
}
}
//reload menu
JFactory::getApplication()->getMenu()->__construct();
//rewrite Menu route with translated alias
$app = JFactory::getApplication();
$menu = $app->getMenu()->getMenu();
//workaround for Joomla > 3.7.0 continue.
if ($conf->get('caching',0) > 0)
{
foreach($menu as &$item) {
$item->route = '';
if ($item->level > 1) {
if (array_key_exists($item->parent_id, $menu)) {
$item->route = $menu[$item->parent_id]->route.'/';
}
}
$item->route .= $item->alias;
}
}
//fix for virtuemart / lang must be reset
if (JComponentHelper::isEnabled('com_virtuemart', true)){
if (!class_exists( 'VmConfig' )) require(JPATH_ROOT .'/administrator/components/com_virtuemart/helpers/config.php');
VmConfig::loadConfig();
vmLanguage::$jSelLangTag = false;
vmLanguage::initialise(true);
}
}
return array();
}
public function isFalangDriverActive()
{
$db = JFactory::getDBO();
return is_a($db, 'JFalangDatabase');
}
function onAfterDispatch()
{
if (JFactory::getApplication()->isSite() && $this->isFalangDriverActive()) {
include_once( JPATH_ADMINISTRATOR . '/components/com_falang/version.php');
$version = new FalangVersion();
if ($version->_versiontype == 'free' ) {
FalangManager::setBuffer();
}
return true;
}
}
function setupDatabaseDriverOverride()
{
//override only the override file exist
if (file_exists(dirname(__FILE__) . '/falang_database.php'))
{
require_once( dirname(__FILE__) . '/falang_database.php');
$conf = JFactory::getConfig();
$host = $conf->get('host');
$user = $conf->get('user');
$password = $conf->get('password');
$db = $conf->get('db');
$dbprefix = $conf->get('dbprefix');
$driver = $conf->get('dbtype');
$debug = $conf->get('debug');
$options = array('driver' => $driver,"host" => $host, "user" => $user, "password" => $password, "database" => $db, "prefix" => $dbprefix, "select" => true);
$db = new JFalangDatabase($options);
$db->setDebug($debug);
if ($db->getErrorNum() > 2)
{
JError::raiseError('joomla.library:' . $db->getErrorNum(), 'JDatabase::getInstance: Could not connect to database <br/>' . $db->getErrorMsg());
}
// replace the database handle in the factory
JFactory::$database = null;
JFactory::$database = $db;
$test = JFactory::getDBO();
}
}
private function setBuffer()
{
$doc = JFactory::getDocument();
$cacheBuf = $doc->getBuffer('component');
$cacheBuf2 =
'<div><a title="Faboba : Création de composant'.
'Joomla" style="font-size: 9px;; visibility: visible;'.
'display:inline;" href="http://www.faboba'.
'.com" target="_blank">FaLang tra'.
'nslation syste'.
'm by Faboba</a></div>';
if ($doc->_type == 'html')
$doc->setBuffer($cacheBuf . $cacheBuf2,'component');
}
/*
* Use trigger to activate the language selection in the template
*/
function onContentPrepareForm($form, $data)
{
if (JFactory::getApplication()->isSite()){return;}
$this->enabledTplTranslation($form,$data);
$custom_fields = JPluginHelper::isEnabled('system', 'fields');
if ($custom_fields){
$this->loadCustomFields($form, $data);
}
}
//use to set the value of the custom fields to the falang translation form
//custom fields exist only since Joomla 3.7
//actually can't work because fields_values table don't have id key
private function loadCustomFields($form, $data){
//custom field valid only since 3.7.0
if (version_compare(JVERSION, '3.7.0', 'lt')){return true;}
$input = JFactory::getApplication()->input;
$option = $input->get('option');
$task = $input->get('task');
$catid = $input->get('catid');
$reference_id = $input->get('reference_id');
$cid = $input->get('cid');
$language_id = $input->get('language_id'); //from quickump it's this one
$select_language_id = $input->get('select_language_id');//from falang list it's selectec langauge
if ($option == 'com_falang' && ($task == 'translate.edit' || ($task == 'translate.apply') )) {
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
$context = $form->getName();
// When a category is edited, the context is com_categories.categorycom_content
if (strpos($context, 'com_categories.category') === 0) {
$context = str_replace('com_categories.category', '', $context) . '.categories';
}
$parts = FieldsHelper::extract($context, $form);
if (!$parts) {
return true;
}
if (empty($reference_id)){
$reference_id = current($cid);
}
//load category from original item to set to the translation
//necessary to load the related custom fields even if a translation for them don't exist.
if ( !empty($reference_id) && $catid == 'content'){
JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_content/models', 'ContentModel');
$model = JModelLegacy::getInstance('Article', 'ContentModel', array('ignore_request'=>true));
$item = $model->getItem($reference_id);
$data->catid = $item->catid;
}
// Getting the fields
$fields = FieldsHelper::getFields($parts[0] . '.' . $parts[1], $data);
$db = JFactory::getDbo();
$fManager = FalangManager::getInstance();
$content_element = $fManager->getContentElement($catid);
if (empty($content_element)){
return;
}
if (empty($language_id)){
$language_id = $select_language_id;
}
//load com_fields values (json format)
$translations = $fManager->getRawFieldTranslations($content_element->getTableName(),'com_fields',$reference_id,$language_id);
if (empty($translations)) {
$params = JComponentHelper::getParams('com_falang');
$copy_cusom_fields = $params->get('copy_custom_fields',false);
if ($copy_cusom_fields == false){
return true;
}
$original = $fManager->getRawFieldOrigninal($reference_id);
//load orinal customfield to translation
foreach ($fields as $field)
{
if (isset($original[$field->id])){
$value = $original[$field->id];
$form->setValue($field->name, 'com_fields', $value);
}
}
}
$json_value = json_decode($translations);
foreach ($fields as $field)
{
if (isset($json_value->{$field->name})) {
$form->setValue($field->name, 'com_fields', $json_value->{$field->name});
}
}
}
return true;
}
//use to enable template by langugage (paid version only)
private function enabledTplTranslation($form, $data){
jimport('joomla.application.component.helper');
$params = JComponentHelper::getParams('com_falang');
$show_tpl_lang = $params->get('show_tpl_lang');
if (!isset($show_tpl_lang) || $show_tpl_lang == '0' ) {return;}
if (!($form instanceof JForm))
{
$this->_subject->setError('JERROR_NOT_A_FORM');
return false;
}
if ((is_array($data) && array_key_exists('home', $data))
|| ((is_object($data) && isset($data->home) ))) {
$form->setFieldAttribute('home', 'readonly', 'false');
}
}
//throw by Falang
// use for joomla 3.7+ to save the custom fields in th custom fields table
public function onAfterTranslationSave($post){
//custom field valid only since 3.7.0
if (version_compare(JVERSION, '3.7.0', 'lt')){return true;}
//system fields plugins need to be published.
$fields_plugin = JPluginHelper::getPlugin('system', 'fields');
if (empty($fields_plugin)){return true;}
$input = JFactory::getApplication()->input;
$catid = $input->get('catid');
$language_id = $input->get('select_language_id');
$reference_id = $input->get('reference_id');
$formData = new JRegistry($input->get('jform', '', 'array'));
$context = $catid;
//First release only content supported.
if ($context != 'content'){return;}
//TODO not set article here
//load the content item to have the custom field associated with the categories of this item.
if ( !empty($reference_id) && $catid == 'content'){
//load default cateogry for this content
//need to use admin model
JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR.'/components/com_content/models', 'ContentModel');
$model = JModelLegacy::getInstance('Article', 'ContentModel', array('ignore_request'=>true));
$contentParams = JComponentHelper::getParams('com_content');
$model->setState('params', $contentParams);
$item = $model->getItem($reference_id);
}
$fields = FieldsHelper::getFields('com_'.$context. '.' . 'article', $item);
if (!$fields) {
return true;
}
// Get the translated fields data
$fieldsData = !empty($formData) ? (array)$formData['com_fields'] : array();
// Loading the model
$model = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));
$db = JFactory::getDbo();
$user = JFactory::getUser();
$values = array();
// Loop over the fields
foreach ($fields as $field) {
// Determine the value if it is available from the data
$value = key_exists($field->name, $fieldsData) ? $fieldsData[$field->name] : null;
$values[$field->name] = $value;
}
//save $values array in json format
if (!empty($values)){
//get previous com_fields falang translation
//get previous value if exit to make update or insert
$query = $db->getQuery(true);
$query->select($query->qn('id'))
->from($query->qn('#__falang_content'))
->where($db->qn('language_id') . ' = ' . $db->q($language_id))
->where($db->qn('reference_id') . ' = ' . $reference_id)
->where($db->qn('reference_field') . ' = ' . $db->q('com_fields'))
->where($db->qn('reference_table') . ' = ' . $db->q($context));
$db->setQuery($query);
$falangId = $db->loadResult();
$jsonValues = json_encode($values);
$fieldContent = new falangContent($db);
if (isset($falangId)){$fieldContent->id = $falangId;}
$fieldContent->reference_id = $reference_id ;
$fieldContent->language_id = $language_id;
$fieldContent->reference_table= $context;
$fieldContent->reference_field= 'com_fields';
$fieldContent->value = $jsonValues;
// the original value don't exist for custom_fields.
$fieldContent->original_value = md5(null);
//$fieldContent->original_text = !is_null($originalText)?$originalText:"";
$fieldContent->modified = JFactory::getDate()->toSql();
$fieldContent->modified_by = $user->id;
$fieldContent->published= true;
$fieldContent->store();
}
return true;
}
/**
* We need to prepare custom fields per plugin because #__fields_values doesn't have a primary key
*
* @param $context
* @param $item
* @param $field
*/
public function onCustomFieldsBeforePrepareField($context, $item, $field) {
// We only work in frontend
if (!JFactory::getApplication()->isSite()) {
return;
}
list($component, $view) = explode('.', $context, 2);
if (strpos($component, "com_")=== 0) {
$component_name = substr($component, 4);
} else {
$component_name = $component;
}
$fManager = FalangManager::getInstance();
$content_element = $fManager::getInstance()->getContentElement($component_name);
if (empty($content_element)){
return;
}
$languageTag = JFactory::getLanguage()->getTag();
$id_lang = $fManager->getLanguageID($languageTag);
$translations = FalangManager::getInstance()->getRawFieldTranslations($content_element->getTableName(),'com_fields',$item->{$content_element->getReferenceId()},$id_lang);
if (empty($translations)) {
return;
}
//supposed to be array
$json_value = json_decode($translations,true);
if (isset($json_value[$field->name])) {
$field->valueUntranslated = $field->value;
$field->rawvalueUntranslated = $field->rawvalue;
if ($field->type != 'repeatable'){
$field->value = $json_value[$field->name];
$field->rawvalue = $json_value[$field->name];
} else {
//repeatable value are json encoded
$field->value = json_encode($json_value[$field->name]);
$field->rawvalue = json_encode($json_value[$field->name]);
}
}
}
//@since 2.9.7
public function setupAdvancedRouter()
{
//support advanced router
jimport('joomla.application.component.helper');
$params = JComponentHelper::getParams('com_falang');
$advanced_router = $params->get('advanced_router', 0);
if (!isset($advanced_router) || $advanced_router == '0')
{
return;
}
$app = JFactory::getApplication();
$router = $app->getRouter();
//loop on folder to override each component router.
jimport('joomla.filesystem.folder');
$folders = JFolder::folders(JPATH_PLUGINS . '/system/falangdriver/routers/');
if (count($folders))
{
foreach ($folders as $folder)
{
$router_file_path = JPATH_PLUGINS . '/system/falangdriver/routers/' . $folder . '/router.php';
if (file_exists($router_file_path))
{
require_once $router_file_path;
$router_name = 'Falang'.str_replace('com_','',$folder).'Router';
$crouter = new $router_name($app, $app->getMenu());
$router->setComponentRouter($folder, $crouter);
}
}
}
}
//@since 3.4.3
public function setupCoreFileOverride(){
//for front and back
//override Front-end Language file for site and admin section. use for user language configuration
JLoader::register('Joomla\CMS\Form\Field\FrontendlanguageField', dirname(__FILE__).'/overrides/libraries/src/Form/Field/FrontendlanguageField.php', true);
//for back
//for front
}
}