<?php
/**
* @package Helix3 Framework
* @author JoomShaper http://www.joomshaper.com
* @copyright Copyright (c) 2010 - 2015 JoomShaper
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later
*/
//no direct accees
defined ('_JEXEC') or die ('resticted aceess');
jimport('joomla.plugin.plugin');
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');
jimport('joomla.registry.registry');
jimport('joomla.image.image');
require_once __DIR__ . '/classes/image.php';
class plgAjaxHelix3 extends JPlugin
{
function onAjaxHelix3()
{
$input = JFactory::getApplication()->input;
$action = $input->post->get('action', '', 'STRING');
if($action=='upload_image') {
$this->upload_image();
return;
} else if($action=='remove_image') {
$this->remove_image();
return;
}
if ($_POST['data']) {
$data = json_decode(json_encode($_POST['data']), true);;
$action = $data['action'];
$layoutName = '';
if (isset($data['layoutName'])) {
$layoutName = $data['layoutName'];
}
$template = self::getTemplate()->template;
$layoutPath = JPATH_SITE.'/templates/'.$template.'/layout/';
$filepath = $layoutPath.$layoutName;
$report = array();
$report['action'] = 'none';
$report['status'] = 'false';
switch ($action) {
case 'remove':
if (file_exists($filepath)) {
unlink($filepath);
$report['action'] = 'remove';
$report['status'] = 'true';
}
$report['layout'] = JFolder::files($layoutPath, '.json');
break;
case 'save':
if ($layoutName) {
$layoutName = strtolower(str_replace(' ','-',$layoutName));
}
$content = $data['content'];
if ($content && $layoutName) {
$file = fopen($layoutPath.$layoutName.'.json', 'wb');
fwrite($file, $content);
fclose($file);
}
$report['layout'] = JFolder::files($layoutPath, '.json');
break;
case 'load':
if (file_exists($filepath)) {
$content = file_get_contents($filepath);
}
if (isset($content) && $content) {
echo $layoutHtml = self::loadNewLayout(json_decode($content));
}
die();
break;
case 'resetLayout':
if($layoutName){
echo self::resetMenuLayout($layoutName);
}
die();
break;
// Upload Image
case 'upload_image':
echo "Joomla";
die();
break;
default:
break;
case 'voting':
if (JSession::checkToken()) {
return json_encode($report);
}
$rate = -1;
$pk = 0;
if (isset($data['user_rating'])) {
$rate = (int)$data['user_rating'];
}
if (isset($data['id'])) {
$id = str_replace('post_vote_','',$data['id']);
$pk = (int)$id;
}
if ($rate >= 1 && $rate <= 5 && $id > 0)
{
$userIP = $_SERVER['REMOTE_ADDR'];
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
->from($db->quoteName('#__content_rating'))
->where($db->quoteName('content_id') . ' = ' . (int) $pk);
$db->setQuery($query);
try
{
$rating = $db->loadObject();
}
catch (RuntimeException $e)
{
return json_encode($report);
}
if (!$rating)
{
$query = $db->getQuery(true);
$query->insert($db->quoteName('#__content_rating'))
->columns(array($db->quoteName('content_id'), $db->quoteName('lastip'), $db->quoteName('rating_sum'), $db->quoteName('rating_count')))
->values((int) $pk . ', ' . $db->quote($userIP) . ',' . (int) $rate . ', 1');
$db->setQuery($query);
try
{
$db->execute();
$data = self::getItemRating($pk);
$rating = $data->rating;
$report['action'] = $rating;
$report['status'] = 'true';
return json_encode($report);
}
catch (RuntimeException $e)
{
return json_encode($report);;
}
}
else
{
if ($userIP != ($rating->lastip))
{
$query = $db->getQuery(true);
$query->update($db->quoteName('#__content_rating'))
->set($db->quoteName('rating_count') . ' = rating_count + 1')
->set($db->quoteName('rating_sum') . ' = rating_sum + ' . (int) $rate)
->set($db->quoteName('lastip') . ' = ' . $db->quote($userIP))
->where($db->quoteName('content_id') . ' = ' . (int) $pk);
$db->setQuery($query);
try
{
$db->execute();
$data = self::getItemRating($pk);
$rating = $data->rating;
$report['action'] = $rating;
$report['status'] = 'true';
return json_encode($report);
}
catch (RuntimeException $e)
{
return json_encode($report);
}
}
else
{
$report['status'] = 'invalid';
return json_encode($report);
}
}
}
$report['action'] = 'failed';
$report['status'] = 'false';
return json_encode($report);
break;
//Font variant
case 'fontVariants':
$template_path = JPATH_SITE . '/templates/' . self::getTemplate()->template . '/webfonts/webfonts.json';
$plugin_path = JPATH_PLUGINS . '/system/helix3/assets/webfonts/webfonts.json';
if(JFile::exists( $template_path )) {
$json = JFile::read( $template_path );
} else {
$json = JFile::read( $plugin_path );
}
$webfonts = json_decode($json);
$items = $webfonts->items;
$output = array();
$fontVariants = '';
$fontSubsets = '';
foreach ($items as $item) {
if($item->family==$layoutName) {
//Variants
foreach ($item->variants as $variant) {
$fontVariants .= '<option value="'. $variant .'">' . $variant . '</option>';
}
//Subsets
foreach ($item->subsets as $subset) {
$fontSubsets .= '<option value="'. $subset .'">' . $subset . '</option>';
}
}
}
$output['variants'] = $fontVariants;
$output['subsets'] = $fontSubsets;
return json_encode($output);
break;
//Font variant
case 'updateFonts':
jimport( 'joomla.filesystem.folder' );
jimport('joomla.http.http');
$template_path = JPATH_SITE . '/templates/' . self::getTemplate()->template . '/webfonts';
if(!JFolder::exists( $template_path )) {
JFolder::create( $template_path, 0755 );
}
$url = 'https://www.googleapis.com/webfonts/v1/webfonts?key=AIzaSyBVybAjpiMHzNyEm3ncA_RZ4WETKsLElDg';
$http = new JHttp();
$str = $http->get($url);
if ( JFile::write( $template_path . '/webfonts.json', $str->body )) {
echo "<p class='font-update-success'>Google Webfonts list successfully updated! Please refresh your browser.</p>";
} else {
echo "<p class='font-update-failed'>Google Webfonts update failed. Please make sure that your template folder is writable.</p>";
}
die();
break;
//Template setting import
case 'import':
$template_id = filter_var( $data['template_id'], FILTER_VALIDATE_INT );
if ( !$template_id ) {
die();
break;
}
$settings = $data['settings'];
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$fields = array(
$db->quoteName( 'params' ) . ' = ' . $db->quote( $settings )
);
$conditions = array(
$db->quoteName( 'id' ) . ' = '. $db->quote( $template_id ),
$db->quoteName('client_id') . ' = 0'
);
$query->update($db->quoteName('#__template_styles'))->set($fields)->where($conditions);
$db->setQuery($query);
$db->execute();
die();
break;
}
return json_encode($report);
}
}
static public function getItemRating($pk = 0){
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('ROUND(rating_sum / rating_count, 0) AS rating, rating_count')
->from($db->quoteName('#__content_rating'))
->where($db->quoteName('content_id') . ' = ' . (int) $pk);
$db->setQuery($query);
$data = $db->loadObject();
return $data;
}
static public function resetMenuLayout($current_menu_id = 0){
if (!$current_menu_id) {
return;
}
$items = self::menuItems();
$item = array();
if (isset($items[$current_menu_id]) && !empty($items[$current_menu_id])) {
$item = $items[$current_menu_id];
}
$menuItems = new JMenuSite;
$no_child = true;
$count = 0;
$x_key = 0;
$y_key = 0;
$check_child = 0;
$item_array = array();
foreach ($item as $key => $id){
$status = 0;
if (isset($items[$id]) && is_array($items[$id])){
$no_child = false;
$count = $count + 1;
$check_child = $check_child+1;
$status = 1;
}
if ($check_child === 2){
$y_key = 0;
$x_key = $x_key + 1;
$check_child = 1;
}
$item_array[$x_key][$y_key] = array($id,$status);
$y_key = $y_key + 1;
}
if ($no_child === true){
$count = 1;
}
if($count > 4 && $count != 6){
$count = 4;
}
ob_start();
if($no_child === true)
{
echo '<div class="menu-section">';
echo '<span class="row-move"><i class="fa fa-bars"></i></span>';
echo '<div class="spmenu sp-row">';
echo '<div class="column sp-col-md-12" data-column="12">';
echo '<div class="column-items-wrap">';
if (!empty($item)) {
echo '<h4 style="display:none" data-current_child="'.$current_menu_id.'" >'.$menuItems->getItem($current_menu_id)->title.'</h4>';
echo '<ul class="child-menu-items">';
foreach ($item as $key => $id)
{
echo '<li>'.$menuItems->getItem($id)->title.'</li>';
}
echo '</ul>';
}
echo '<div class="modules-container">';
echo '</div>';
echo '</div>';
echo '</div>';
echo '</div>';
echo '</div>';
}
else
{
echo '<div class="menu-section">';
echo '<span class="row-move"><i class="fa fa-bars"></i></span>';
echo '<div class="spmenu sp-row">';
$columnNumber = 12 / $count;
foreach ($item_array as $key => $item_array)
{
echo '<div class="column sp-col-md-'.$columnNumber.'" data-column="'.$columnNumber.'">';
echo '<div class="column-items-wrap">';
foreach ($item_array as $key => $item)
{
$id = $item[0];
echo '<h4 data-current_child="'.$id.'" >'.$menuItems->getItem($id)->title.'</h4>';
if ($item[1])
{
echo '<ul class="child-menu-items">';
echo self::create_menu($id);
echo '</ul>';
}
}
echo '<div class="modules-container"></div>';
echo '</div>';
echo '</div>';
}
echo '</div>';
echo '</div>';
}
$output = ob_get_contents();
ob_clean();
return $output;
}
static public function create_menu($current_menu_id)
{
$items = self::menuItems();
$menus = new JMenuSite;
if (isset($items[$current_menu_id]))
{
$item = $items[$current_menu_id];
foreach ($item as $key => $item_id)
{
echo '<li>';
echo $menus->getItem($item_id)->title;
echo '</li>';
}
}
}
static public function menuItems()
{
$menus = new JMenuSite;
$menus = $menus->getMenu();
$new = array();
foreach ($menus as $item) {
$new[$item->parent_id][] = $item->id;
}
return $new;
}
static public function loadNewLayout($layout_data = null){
$lang = JFactory::getLanguage();
$lang->load('tpl_' . self::getTemplate()->template, JPATH_SITE, $lang->getName(), true);
ob_start();
$colGrid = array(
'12' => '12',
'66' => '6,6',
'444' => '4,4,4',
'3333' => '3,3,3,3',
'48' => '4,8',
'39' => '3,9',
'363' => '3,6,3',
'264' => '2,6,4',
'210' => '2,10',
'57' => '5,7',
'237' => '2,3,7',
'255' => '2,5,5',
'282' => '2,8,2',
'2442' => '2,4,4,2',
);
if ($layout_data) {
foreach ($layout_data as $row) {
$rowSettings = self::getSettings($row->settings);
$name = JText::_('HELIX_SECTION_TITLE');
if (isset($row->settings->name)) {
$name = $row->settings->name;
}
?>
<div class="layoutbuilder-section" <?php echo $rowSettings; ?>>
<div class="settings-section clearfix">
<div class="settings-left pull-left">
<a class="row-move" href="#"><i class="fa fa-arrows"></i></a>
<strong class="section-title"><?php echo $name; ?></strong>
</div>
<div class="settings-right pull-right">
<ul class="button-group">
<li>
<a class="btn btn-small add-columns" href="#"><i class="fa fa-columns"></i> <?php echo JText::_('HELIX_ADD_COLUMNS'); ?></a>
<ul class="column-list">
<?php
$_active = '';
foreach ($colGrid as $key => $grid){
if($key == $row->layout){
$_active = 'active';
}
echo '<li><a href="#" class="column-layout column-layout-' .$key. ' '.$_active.'" data-layout="'.$grid.'"></a></li>';
$_active ='';
} ?>
<?php
$active = '';
$customLayout = '';
if (!isset($colGrid[$row->layout])) {
$active = 'active';
$split = str_split($row->layout);
$customLayout = implode(',',$split);
}
?>
<li><a href="#" class="hasTooltip column-layout-custom column-layout custom <?php echo $active; ?>" data-layout="<?php echo $customLayout; ?>" data-type='custom' data-original-title="<strong>Custom Layout</strong>"></a></li>
</ul>
</li>
<li><a class="btn btn-small add-row" href="#"><i class="fa fa-bars"></i> <?php echo JText::_('HELIX_ADD_ROW'); ?></a></li>
<li><a class="btn btn-small row-ops-set" href="#"><i class="fa fa-gears"></i> <?php echo JText::_('HELIX_SETTINGS'); ?></a></li>
<li><a class="btn btn-danger btn-small remove-row" href="#"><i class="fa fa-times"></i> <?php echo JText::_('HELIX_REMOVE'); ?></a></li>
</ul>
</div>
</div>
<div class="row ui-sortable">
<?php foreach ($row->attr as $column) { $colSettings = self::getSettings($column->settings); ?>
<div class="<?php echo $column->className; ?>" <?php echo $colSettings; ?>>
<div class="column">
<?php if (isset($column->settings->column_type) && $column->settings->column_type) {
echo '<h6 class="col-title pull-left">Component</h6>';
}else{
if (!isset($column->settings->name)) {
$column->settings->name = 'none';
}
echo '<h6 class="col-title pull-left">'.$column->settings->name.'</h6>';
}
?>
<a class="col-ops-set pull-right" href="#" ><i class="fa fa-gears"></i></a>
</div>
</div>
<?php } ?>
</div>
</div>
<?php
}
}
$items = ob_get_contents();
ob_end_clean();
return $items;
}
static public function getSettings($config = null){
$data = '';
if (count($config)) {
foreach ($config as $key => $value) {
$data .= ' data-'.$key.'="'.$value.'"';
}
}
return $data;
}
//Get template name
private static function getTemplate() {
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName(array('template', 'params')));
$query->from($db->quoteName('#__template_styles'));
$query->where($db->quoteName('client_id') . ' = '. $db->quote(0));
$query->where($db->quoteName('home') . ' = '. $db->quote(1));
$db->setQuery($query);
return $db->loadObject();
}
// Upload File
private function upload_image() {
$input = JFactory::getApplication()->input;
$image = $input->files->get('image');
$imageonly = $input->post->get('imageonly', false, 'BOOLEAN');
$tplRegistry = new JRegistry();
$tplParams = $tplRegistry->loadString(self::getTemplate()->params);
$report = array();
// User is not authorised
if (!JFactory::getUser()->authorise('core.create', 'com_media'))
{
$report['status'] = false;
$report['output'] = JText::_('You are not authorised to upload file.');
echo json_encode($report);
die;
}
if(count($image)) {
if ($image['error'] == UPLOAD_ERR_OK) {
$error = false;
$params = JComponentHelper::getParams('com_media');
// Total length of post back data in bytes.
$contentLength = (int) $_SERVER['CONTENT_LENGTH'];
// Instantiate the media helper
$mediaHelper = new JHelperMedia;
// Maximum allowed size of post back data in MB.
$postMaxSize = $mediaHelper->toBytes(ini_get('post_max_size'));
// Maximum allowed size of script execution in MB.
$memoryLimit = $mediaHelper->toBytes(ini_get('memory_limit'));
// Check for the total size of post back data.
if (($postMaxSize > 0 && $contentLength > $postMaxSize) || ($memoryLimit != -1 && $contentLength > $memoryLimit)) {
$report['status'] = false;
$report['output'] = JText::_('Total size of upload exceeds the limit.');
$error = true;
echo json_encode($report);
die;
}
$uploadMaxSize = $params->get('upload_maxsize', 0) * 1024 * 1024;
$uploadMaxFileSize = $mediaHelper->toBytes(ini_get('upload_max_filesize'));
if (($image['error'] == 1) || ($uploadMaxSize > 0 && $image['size'] > $uploadMaxSize) || ($uploadMaxFileSize > 0 && $image['size'] > $uploadMaxFileSize))
{
$report['status'] = false;
$report['output'] = JText::_('This file is too large to upload.');
$error = true;
}
// Upload if no error found
if(!$error) {
// Organised folder structure
$date = JFactory::getDate();
$folder = JHtml::_('date', $date, 'Y') . '/' . JHtml::_('date', $date, 'm') . '/' . JHtml::_('date', $date, 'd');
if(!file_exists( JPATH_ROOT . '/images/' . $folder )) {
JFolder::create(JPATH_ROOT . '/images/' . $folder, 0755);
}
$name = $image['name'];
$path = $image['tmp_name'];
// Do no override existing file
$file = pathinfo($name);
$i = 0;
do {
$base_name = $file['filename'] . ($i ? "$i" : "");
$ext = $file['extension'];
$image_name = $base_name . "." . $ext;
$i++;
$dest = JPATH_ROOT . '/images/' . $folder . '/' . $image_name;
$src = 'images/' . $folder . '/' . $image_name;
$data_src = 'images/' . $folder . '/' . $image_name;
} while(file_exists($dest));
// End Do not override
if(JFile::upload($path, $dest)) {
$sizes = array();
if($tplParams->get('image_small', 0)) {
$sizes['small'] = strtolower($tplParams->get('image_small_size', '100X100'));
}
if($tplParams->get('image_thumbnail', 1)) {
$sizes['thumbnail'] = strtolower($tplParams->get('image_thumbnail_size', '200X200'));
}
if($tplParams->get('image_medium', 0)) {
$sizes['medium'] = strtolower($tplParams->get('image_medium_size', '300X300'));
}
if($tplParams->get('image_large', 0)) {
$sizes['large'] = strtolower($tplParams->get('image_large_size', '600X600'));
}
if(count($sizes)) {
$image = new Helix3Image($dest);
$image->createThumbs($sizes, 5);
}
if(file_exists(JPATH_ROOT . '/images/' . $folder . '/' . $base_name . '_thumbnail.' . $ext)) {
$src = 'images/' . $folder . '/' . $base_name . '_thumbnail.' . $ext;
}
$report['status'] = true;
if($imageonly) {
$report['output'] = '<img src="'. JURI::root(true) . '/' . $src . '" data-src="'. $data_src .'" alt="">';
} else {
$report['output'] = '<li data-src="'. $data_src .'"><a href="#" class="btn btn-mini btn-danger btn-remove-image">Delete</a><img src="'. JURI::root(true) . '/' . $src . '" alt=""></li>';
}
}
}
}
} else {
$report['status'] = false;
$report['output'] = JText::_('Upload Failed!');
}
echo json_encode($report);
die;
}
// Delete File
private function remove_image() {
$report = array();
if (!JFactory::getUser()->authorise('core.delete', 'com_media'))
{
$report['status'] = false;
$report['output'] = JText::_('You are not authorised to delete file.');
echo json_encode($report);
die;
}
$input = JFactory::getApplication()->input;
$src = $input->post->get('src', '', 'STRING');
$path = JPATH_ROOT . '/' . $src;
if(file_exists($path)) {
if(JFile::delete($path)) {
$basename = basename($src);
$small = JPATH_ROOT . '/' . dirname($src) . '/' . JFile::stripExt($basename) . '_small.' . JFile::getExt($basename);
$thumbnail = JPATH_ROOT . '/' . dirname($src) . '/' . JFile::stripExt($basename) . '_thumbnail.' . JFile::getExt($basename);
$medium = JPATH_ROOT . '/' . dirname($src) . '/' . JFile::stripExt($basename) . '_medium.' . JFile::getExt($basename);
$large = JPATH_ROOT . '/' . dirname($src) . '/' . JFile::stripExt($basename) . '_large.' . JFile::getExt($basename);
if(file_exists($small)) {
JFile::delete($small);
}
if(file_exists($thumbnail)) {
JFile::delete($thumbnail);
}
if(file_exists($medium)) {
JFile::delete($medium);
}
if(file_exists($large)) {
JFile::delete($large);
}
$report['status'] = true;
} else {
$report['status'] = false;
$report['output'] = JText::_('Delete failed');
}
} else {
$report['status'] = true;
}
echo json_encode($report);
die;
}
}