By Fabian Mendoza on Sunday, 20 April 2014
Posted in General
Replies 15
Likes 0
Views 29.5K
Votes 0
Hello guys,

I bought Komento recently for my website... i installed properly i think, with the k2 integration.. recaptcha settigs, etc.. in the frontend everything looks great but when i try to testit, it showsme an error..

I send you the error printscreen, and the text of the error window highlight.. i hope you can helpme.

Thanks in advance

The error text:

Status:
200
Status Text:
OK
Response Text:

emarketingrules.com - INICIO

#jusertube-scroller-1 div.vid_icon, #jusertube-scroller-1 div.imgbox, #jusertube-scroller-1 div.imgbox a img{
width: 120px;
height: 90px;
border: 0;
position: relative;
}
#jusertube-scroller-1 div.titlebelow{
width: 120px;
height: 100px;
overflow: hidden;
}
#jusertube-scroller-1 img,#jusertube-scroller-1 table, #jusertube-scroller-1 tr, #jusertube-scroller-1 td{
border: 0;margin: 0;padding: 0;
}
#jusertube-scroller-1 table, #jusertube-scroller-1 table tr{
direction: ltr;
}
#jusertube-scroller-1 div.imgbox a, div.imgbox a:hover, div.imgbox a:active, div.imgbox a:focus{
background:none;
border:none;
text-decoration:none;
font-size:0;
}#jusertube-scroller-1 div.imgbox a{
position: absolute;
left: 0;
top: 0;
}#jusertube-scroller-1 div.imgbox{
-moz-box-shadow: 0px 0px 5px #666;
-webkit-box-shadow: 0px 0px 5px #666;
box-shadow: 0px 0px 5px #666;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
}
#jusertube-scroller-1 div.imgbox:hover{
-moz-box-shadow: 0px 0px 10px #111;
-webkit-box-shadow: 0px 0px 10px #111;
box-shadow: 0px 0px 10px #111;}
#jusertube-scroller-1 div.imgbox img{
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
}
#jusertube-scroller-1 div.vid_icon{
background-position: 50% 50%;
background-repeat: no-repeat;
background-image: url("http://emarketingrules.com/media/jusertube/images/vid_icon.png");
z-index: 5;
position: absolute;
overflow: hidden;
top:0px;
left:0px;
opacity: 0.5;
-moz-opacity: 0.5;
filter:alpha(opacity=50);
cursor: pointer;
}
#jusertube-scroller-1 div.vid_icon:hover{
opacity: 0.9;
-moz-opacity: 0.9;
filter:alpha(opacity=90);
}#jusertube-scroller-1 div.boxsinglethumb{
position:absolute;
width:804px;
}
#jusertube-scroller-1 div.boxsinglethumb > div{
display:block;
float:left;
}
#jusertube-scroller-1 div.masksinglethumb{
position:relative;
width:402px;
height:408px;
overflow:hidden;
}
#jusertube-scroller-1 div.imgbox a img{
display:block;
}
#jusertube-scroller-1 .prev1, .next1 {
cursor: pointer;
}
#jusertube-scroller-1 div.prev1, #jusertube-scroller-1 div.next1{
background-image: url("http://emarketingrules.com/media/jusertube/images/nav_s.png");width: 32px;
height: 65px;
margin: 5px;
}

#jusertube-scroller-1 div.prev1{
background-position: 0px -76px;
}
#jusertube-scroller-1 div.prev1:hover{
background-position: -51px -76px;
}
#jusertube-scroller-1 div.next1{
background-position: 0px 0px;
}
#jusertube-scroller-1 div.next1:hover{
background-position: -51px 0px;
}


window.addEvent('domready', function() {

SqueezeBox.initialize({});
SqueezeBox.assign($$('a.modal'), {
parse: 'rel'
});
});
var K2SitePath = '/';
window.addEvent('load', function() {
new JCaption('img.caption');
});
var flexy = jQuery.noConflict();
flexy(window).load(function() {
flexy("#flexslide").flexslider({
animation: "fade", //String: Select your animation type, "fade" or "slide"
slideDirection: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical"
slideshow: true, //Boolean: Animate slider automatically
slideshowSpeed: 9000, //Integer: Set the speed of the slideshow cycling, in milliseconds
animationDuration: 600, //Integer: Set the speed of animations, in milliseconds
directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false)
controlNav: true, //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage
keyboardNav: true, //Boolean: Allow slider navigating via keyboard left/right keys
mousewheel: false, //Boolean: Allow slider navigating via mousewheel
prevText: "Previous", //String: Set the text for the "previous" directionNav item
nextText: "Next", //String: Set the text for the "next" directionNav item
pausePlay: false, //Boolean: Create pause/play dynamic element
pauseText: "Pause", //String: Set the text for the "pause" pausePlay item
playText: "Play", //String: Set the text for the "play" pausePlay item
randomize: false, //Boolean: Randomize slide order
slideToStart: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide)
animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
controlsContainer: ".flex-containerflexslide"
});
});

// TOGGLE NAVIGATION
jQuery("#navOpener").live('click', function () {
jQuery("#mainMenu").slideToggle("slow");
});

function myOrientResizeFunction(){
var docWidth = jQuery(document).width;
if ((docWidth=1024)) {
jQuery('#mainMenu').css('display', '');
}
}

jQuery(window).bind( 'resize', function(e) {
myOrientResizeFunction()
});

if (window.DeviceOrientationEvent) {
window.addEventListener('orientationchange', myOrientResizeFunction, false);
};

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-33517695-1']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();


var srztb_pathToImage = "/media/jusertube/loadingAnimation.gif";


(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/es_LA/all.js#xfbml=1&appId=330696747017397";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));


Ver Menú


INICIOREDES SOCIALESMARKETING DIGITALAPLICACIONESDISPOSITIVOSCONTACTO



Noticias de Marketing Digital en Colombia

.flex-caption p, .flex-caption p a {
font-family: 'BebasNeueRegular';
font-size: 20px !important;
}
.flex-caption{
background-color: rgba(0,0,0, 0.8) !important;
}
.flex-caption a:link,.flex-caption a:visited
{
color:#ffffff !important;
text-decoration:none !important;
}


Apple y Su Crisis de Innovación


Como Redactar Contenidos Para Posicionamiento Web


#GraciasGabo se toma Twitter Como Tendencia Mundial


Mark Zuckerberg presenta el nuevo diseño de Facebook para inicio de 2013


Samsung lanza al ruedo su nuevo toro El Galaxy S4




MARKETING DIGITAL

Next Prev


Marketing Digital

Como redactar contenidos para pos...



Cuando trabajamos en un proyecto web gran parte de nuestra preocupación está centrada en la manera como lograremos posicionarlo en los busca



Marketing Digital

¿Cómo hacer un plan de Marketing ...



Actualmente el marketing digital se consolida como una de las más eficientes maneras de alcanzar los objetivos comerciales y de posicionamie

if(typeof(btcModuleIds)=='undefined'){var btcModuleIds = new Array();var btcModuleOpts = new Array();}
btcModuleIds.push(99);
btcModuleOpts.push({
preload: true,
slideEasing : 'easeOutQuad',
fadeEasing : 'easeOutQuad',
effect: 'fade, slide',
preloadImage: 'modules/mod_bt_contentslider/tmpl/images/loading.gif',
generatePagination: true,
paginationClass: 'bt_handles',
generateNextPrev:false,
prependPagination:true,
play: 10000,
hoverPause: true,
pause: 100,
slideSpeed : 500,
autoHeight:true,
fadeSpeed : 500
});


#btcontentslider99{
padding-top:32px;
}
#btcontentslider99 .bt_handles{
top:14px!important;
right:5px!important;
}
#btcontentslider99 a.next{
top:12px!important;
right:38px!important;
}
#btcontentslider99 a.prev{
top:12px!important;
right:52px!important;
}
#btcontentslider99 .bt_handles li{
background:none;
padding:0;
margin:0 1px;
}


DISPOSITIVOS


Next Prev


Dispositivos

Apple y su crisis de Innovación


¿Pero que es lo que está pasando en Apple? Fluctuaciones indeseadas en las acciones, documentos secretos revelados con cuestionamientos int


Dispositivos

Sale al ruedo el nuevo toro de Sa...



El jueves 14 de marzo se realizó en Nueva York el lanzamiento más esperado por la comunidad tecnológica mundial, especialmente la de los


if(typeof(btcModuleIds)=='undefined'){var btcModuleIds = new Array();var btcModuleOpts = new Array();}
btcModuleIds.push(128);
btcModuleOpts.push({
preload: true,
slideEasing : 'jswing',
fadeEasing : 'jswing',
effect: 'slide, slide',
preloadImage: 'modules/mod_bt_contentslider/tmpl/images/loading.gif',
generatePagination: true,
paginationClass: 'bt_handles',
generateNextPrev:false,
prependPagination:true,
play: 10000,
hoverPause: true,
pause: 100,
slideSpeed : 500,
autoHeight:true,
fadeSpeed : 500
});


#btcontentslider128{
padding-top:32px;
}
#btcontentslider128 .bt_handles{
top:14px!important;
right:5px!important;
}
#btcontentslider128 a.next{
top:12px!important;
right:38px!important;
}
#btcontentslider128 a.prev{
top:12px!important;
right:52px!important;
}
#btcontentslider128 .bt_handles li{
background:none;
padding:0;
margin:0 1px;
}



ESTRATEGIAS



Next Prev



Estrategias

#GraciasGabo se Toma Twitter Como...



El jueves en horas de la tarde el mundo se sorprendió con la noticia del fallecimiento de uno de los escritores más importantes en la histor


Estrategias

El estreno de Breaking Bad, quími...


Este 11 de agosto regreso uno de los dramas televisivos más impactantes y originales que haya pasado por la televisión en las últimas década


if(typeof(btcModuleIds)=='undefined'){var btcModuleIds = new Array();var btcModuleOpts = new Array();}
btcModuleIds.push(144);
btcModuleOpts.push({
preload: true,
slideEasing : 'easeOutQuad',
fadeEasing : 'easeOutQuad',
effect: 'fade, slide',
preloadImage: 'modules/mod_bt_contentslider/tmpl/images/loading.gif',
generatePagination: true,
paginationClass: 'bt_handles',
generateNextPrev:false,
prependPagination:true,
play: 10000,
hoverPause: true,
pause: 100,
slideSpeed : 500,
autoHeight:true,
fadeSpeed : 500
});


#btcontentslider144{
padding-top:32px;
}
#btcontentslider144 .bt_handles{
top:14px!important;
right:5px!important;
}
#btcontentslider144 a.next{
top:12px!important;
right:38px!important;
}
#btcontentslider144 a.prev{
top:12px!important;
right:52px!important;
}
#btcontentslider144 .bt_handles li{
background:none;
padding:0;
margin:0 1px;
}


Conceptos Básicos

Básicos

Contenido Web


CONTENIDO WEB
El contenido web es para la práctica el valor más importante de un e-proyecto, incluso más que el buen diseño de su sitio web...


(function(){
jQuery('#btcontentslider142').fadeIn("fast");
})();

REDES SOCIALES

Redes Sociales

Nuevo diseño de Facebook par...


A final de esta semana Mark Zuckerberg, fundador de la Red Social Facebook, realizo una breve presentación para mostrar la nueva imagen

(function(){
jQuery('#btcontentslider141').fadeIn("fast");
})();


APLICACIONES

Aplicaciones

Combinación de correspondencia y ...

Muchas veces en nuestro día a día laboral se nos generan necesidades que se convierten en labores repetitivas, como por ejp el envío de corr

(function(){
jQuery('#btcontentslider143').fadeIn("fast");
})();

Está aquí: Home INICIO

TODO GOOGLE

Google Analytics


Google Analytics
Conozca una de las herramientas más poderosas de Google para la gestión y optimización de su página web.



¿Cómo f


Optimizador de Conversiones Google


¿Cómo funciona?
Ajusta sus ofertas de CPC de AdWords automáticamente, en función de la oferta de CPA máximo que ha establecido para su gr

(function(){
jQuery('#btcontentslider140').fadeIn("fast");
})();


Videos #MustSee Did You Know 2014Facebook Data CenterSocial and Digital Media Revolution Stat...Did You Know 2013 (Officially Updated fo...Google Analytics In Real Life - Landing ...Google Analytics In Real Life - Site Sea...Inside Google's Data CenterLife at Google. Inside Google's lair - H...The Future of Online Digital Marketing 2...The Social Media Revolution 2014estadisticas de facebook.Online Marketing vs Traditional Marketin...
srizonjq(document).ready(function() {
if(srizonjq('.magpopif').length){
srizonjq('.magpopif').magnificPopup({type:'iframe'});
}
});


srizonjq(function() {
srizonjq('#jusertube-scroller-1').juserSlider({
'speed':1000,
'auto':5000,
'easing':'easeInOutElastic',
'total':2,
'srzn_juser_cont_width': 402,
'vertical': false });
});



Ingrese o cree una cuenta!

Identificarse
Login to your account

Identificarse

Recuérdeme

¿Recordar contraseña?

o

Use Facebook account
Use Google account
Use Twitter account
Use LinkedIn account

Registrar


o

Use Facebook account
Use Google account
Use Twitter account
Use LinkedIn account



Redes Sociales EMR

Tweets por @Fabianmendoza


Buscar

Escriba algo aquí
Hello Fabian Mendoza,

I am really sorry for the delay of this reply as it is a weekend for us here.
Are you using the latest version of Komento? If yes, try download my attachment here and paste to this file location
>>JoomlaFolder\components\com_komento\helpers\easysocial.php
And see how it goes? It the issues still persists, can you pass me with your Joomla backend and FTP access so we can help you check on this ? Please advise.
·
Sunday, 20 April 2014 11:24
·
0 Likes
·
0 Votes
·
0 Comments
·
Hi Alex Thnaks... there is holidays over here too!

Yes im using the latest version, in fact i bought it just a few days ago.

I have uploaded the file you sendme but the error persist

I send you the ftp acces privately in order you can helpme.

Another think is that i need to edit the text of "Terms and conditions" ... where can i do this?


Thanks so much!
·
Sunday, 20 April 2014 22:24
·
0 Likes
·
0 Votes
·
0 Comments
·
Hello Fabian Mendoza,

Is it possible provide us with your Joomla backend access as well? Please advise.
·
Sunday, 20 April 2014 22:28
·
0 Likes
·
0 Votes
·
0 Comments
·
Hello Fabian,

Another think is that i need to edit the text of "Terms and conditions" ... where can i do this?

You can go to your backend > Extension > Language manager > Override > New > Search " Terms and Condition " > select " COM_KOMENTO_FORM_TNC " > Then modify your text
Check my screenshot : http://screencast.com/t/kZ0pQwNVN
·
Sunday, 20 April 2014 23:43
·
0 Likes
·
0 Votes
·
0 Comments
·
Hi Alex,

I send the joomla acces privetly... Now, with the terms and condition isuue, i do what you indicatesme... the modification was done, but the terms and condition still the same. Ill try to find the constant with the search option but i did not findit, but the modification appears in the "modifications" tab of the Language management.

With the acces you can find out.

Thanks
·
Monday, 21 April 2014 00:35
·
0 Likes
·
0 Votes
·
0 Comments
·
Hello Fabian Mendoza,

I'm really sorry that i think i misunderstanding in your previous reply,

Do you mean you would like to edit inside the term and condition content right? If yes you can modify from your backend > Komento > integration > select your component > Layout > Comment Form > Text for Terms and Condition (So you have to remove just you did from backend > language manager > override > COM_KOMENTO_FORM_TNC )

Also, can you set the user have a Super Administrator privilege so i can turn on the error_reporting from your backend global configuration and check the Komento configuration setting? Please advise.
·
Monday, 21 April 2014 00:53
·
0 Likes
·
0 Votes
·
0 Comments
·
Hi Arlex,

Yes about the terms and conditions stuf, and i already editit and delete what i had done... Now i can read my terms and conditions text, but i hope i didn't broke something, with the thing i did with that constant.

Super user permissions updated, for the error message fix.

Thanks!.
·
Monday, 21 April 2014 01:34
·
0 Likes
·
0 Votes
·
0 Comments
·
Hello Arlex,

Can you do something?... Im still having the issue in the comments. You were very diligent before so i would like to hear from you. I update the super user permission for the user i gave you hours ago.
Thanks for your help.
·
Monday, 21 April 2014 11:19
·
0 Likes
·
0 Votes
·
0 Comments
·
Hello Fabian,

I'm really sorry that delayed of your reply to this,
I have tried to turn on your error reporting to Maximum, then i getting this :

Status:
406
Status Text:
Not Acceptable
Response Text:


406 Not Acceptable

Not Acceptable
An appropriate representation of the requested resource / could not be found on this server.
Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.

Apache Server at emarketingrules.com Port 80


Based on this "406 Not Acceptable" server error response,
It seems like your hosting provider is blocking "websites" input from being submitted to the server. This is a security layer from the hosting server side and you will have to consult your hosting provider regarding this and see how it goes.
·
Monday, 21 April 2014 11:48
·
0 Likes
·
0 Votes
·
0 Comments
·
HI Arlex..

I transcript my chat with hosting support:

.... hello
Fabian: like i said this is a component for comments so basicly in every page
Fabian: i can give you an example
LiveHelp_ts2: Sure, that'll clear my doubt. Please proceed on with it
Fabian: http://emarketingrules.com/index.php/dispositivos/item/29-apple-y-su-crisis-de-innovacion
LiveHelp_ts2: Please hold on for a moment, let me check.
LiveHelp_ts2: I'd request you to please let me know the requirements you need for it
LiveHelp_ts2: because everything is enabled already for it
Fabian: did you mean the Komento component requirements?
LiveHelp_ts2: Yes, your right
Fabian: ok wait a second... ill get it
LiveHelp_ts2: sure
Fabian: this is the link for rquirements of Komento
Fabian: http://stackideas.com/docs/komento/installation/system-requirements
LiveHelp_ts2: Let me check for it
Fabian: ok thanks
LiveHelp_ts2: All the settings are there except one, which I've did now
LiveHelp_ts2: Try to please check
Fabian: wait
Fabian: the same error
LiveHelp_ts2: The rest things are same, nor there is any server side issue for it, let me cross-check it up again
Fabian: thanks
LiveHelp_ts2: I just tried and debug the error and found an error given below :
LiveHelp_ts2: Invalid argument supplied for foreach() in /home/republic/public_html/libraries/joomla/database/table.php on line 406
LiveHelp_ts2: This is stopping you from getting in
Fabian: mmmm ok... so what can i do to fix it
Fabian: or what how can you helpem to fix it
LiveHelp_ts2: I'm sorry we do not have the php coding knowledge
Fabian: but accordng to this what is the problem
Fabian: is anything in this file that is making conflict with the component?
LiveHelp_ts2: You need to check with the developer, it is not conflicting though
Fabian: ok ill tell them this thanks
LiveHelp_ts2: Sure
Fabian: thanks i hope they can helpme well see. Bye bye Scott. Thanks for your time.


I let you the code so you can see what the file says on line 406:

<?php
/**
* @package Joomla.Platform
* @subpackage Database
*
* @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
*/

defined('JPATH_PLATFORM') or die;

/**
* Abstract Table class
*
* Parent class to all tables.
*
* @package Joomla.Platform
* @subpackage Table
* @link http://docs.joomla.org/JTable
* @since 11.1
* @tutorial Joomla.Platform/jtable.cls
*/
abstract class JTable extends JObject
{
/**
* Name of the database table to model.
*
* @var string
* @since 11.1
*/
protected $_tbl = '';

/**
* Name of the primary key field in the table.
*
* @var string
* @since 11.1
*/
protected $_tbl_key = '';

/**
* JDatabase connector object.
*
* @var JDatabase
* @since 11.1
*/
protected $_db;

/**
* Should rows be tracked as ACL assets?
*
* @var boolean
* @since 11.1
*/
protected $_trackAssets = false;

/**
* The rules associated with this record.
*
* @var JAccessRules A JAccessRules object.
* @since 11.1
*/
protected $_rules;

/**
* Indicator that the tables have been locked.
*
* @var boolean
* @since 11.1
*/
protected $_locked = false;

/**
* Object constructor to set table and key fields. In most cases this will
* be overridden by child classes to explicitly set the table and key fields
* for a particular database table.
*
* @param string $table Name of the table to model.
* @param string $key Name of the primary key field in the table.
* @param JDatabase &$db JDatabase connector object.
*
* @since 11.1
*/
public function __construct($table, $key, &$db)
{
// Set internal variables.
$this->_tbl = $table;
$this->_tbl_key = $key;
$this->_db = &$db;

// Initialise the table properties.
if ($fields = $this->getFields())
{
foreach ($fields as $name => $v)
{
// Add the field if it is not already present.
if (!property_exists($this, $name))
{
$this->$name = null;
}
}
}

// If we are tracking assets, make sure an access field exists and initially set the default.
if (property_exists($this, 'asset_id'))
{
$this->_trackAssets = true;
}

// If the access property exists, set the default.
if (property_exists($this, 'access'))
{
$this->access = (int) JFactory::getConfig()->get('access');
}
}

/**
* Get the columns from database table.
*
* @return mixed An array of the field names, or false if an error occurs.
*
* @since 11.1
*/
public function getFields()
{
static $cache = null;

if ($cache === null)
{
// Lookup the fields for this table only once.
$name = $this->_tbl;
$fields = $this->_db->getTableColumns($name, false);

if (empty($fields))
{
$e = new JException(JText::_('JLIB_DATABASE_ERROR_COLUMNS_NOT_FOUND'));
$this->setError($e);
return false;
}
$cache = $fields;
}

return $cache;
}

/**
* Static method to get an instance of a JTable class if it can be found in
* the table include paths. To add include paths for searching for JTable
* classes @see JTable::addIncludePath().
*
* @param string $type The type (name) of the JTable class to get an instance of.
* @param string $prefix An optional prefix for the table class name.
* @param array $config An optional array of configuration values for the JTable object.
*
* @return mixed A JTable object if found or boolean false if one could not be found.
*
* @link http://docs.joomla.org/JTable/getInstance
* @since 11.1
*/
public static function getInstance($type, $prefix = 'JTable', $config = array())
{
// Sanitize and prepare the table class name.
$type = preg_replace('/[^A-Z0-9_\.-]/i', '', $type);
$tableClass = $prefix . ucfirst($type);

// Only try to load the class if it doesn't already exist.
if (!class_exists($tableClass))
{
// Search for the class file in the JTable include paths.
jimport('joomla.filesystem.path');

if ($path = JPath::find(JTable::addIncludePath(), strtolower($type) . '.php'))
{
// Import the class file.
include_once $path;

// If we were unable to load the proper class, raise a warning and return false.
if (!class_exists($tableClass))
{
JError::raiseWarning(0, JText::sprintf('JLIB_DATABASE_ERROR_CLASS_NOT_FOUND_IN_FILE', $tableClass));
return false;
}
}
else
{
// If we were unable to find the class file in the JTable include paths, raise a warning and return false.
JError::raiseWarning(0, JText::sprintf('JLIB_DATABASE_ERROR_NOT_SUPPORTED_FILE_NOT_FOUND', $type));
return false;
}
}

// If a database object was passed in the configuration array use it, otherwise get the global one from JFactory.
$db = isset($config['dbo']) ? $config['dbo'] : JFactory::getDbo();

// Instantiate a new table class and return it.
return new $tableClass($db);
}

/**
* Add a filesystem path where JTable should search for table class files.
* You may either pass a string or an array of paths.
*
* @param mixed $path A filesystem path or array of filesystem paths to add.
*
* @return array An array of filesystem paths to find JTable classes in.
*
* @link http://docs.joomla.org/JTable/addIncludePath
* @since 11.1
*/
public static function addIncludePath($path = null)
{
// Declare the internal paths as a static variable.
static $_paths;

// If the internal paths have not been initialised, do so with the base table path.
if (!isset($_paths))
{
$_paths = array(dirname(__FILE__) . '/table');
}

// Convert the passed path(s) to add to an array.
settype($path, 'array');

// If we have new paths to add, do so.
if (!empty($path) && !in_array($path, $_paths))
{
// Check and add each individual new path.
foreach ($path as $dir)
{
// Sanitize path.
$dir = trim($dir);

// Add to the front of the list so that custom paths are searched first.
array_unshift($_paths, $dir);
}
}

return $_paths;
}

/**
* Method to compute the default name of the asset.
* The default name is in the form table_name.id
* where id is the value of the primary key of the table.
*
* @return string
*
* @since 11.1
*/
protected function _getAssetName()
{
$k = $this->_tbl_key;
return $this->_tbl . '.' . (int) $this->$k;
}

/**
* Method to return the title to use for the asset table. In
* tracking the assets a title is kept for each asset so that there is some
* context available in a unified access manager. Usually this would just
* return $this->title or $this->name or whatever is being used for the
* primary name of the row. If this method is not overridden, the asset name is used.
*
* @return string The string to use as the title in the asset table.
*
* @link http://docs.joomla.org/JTable/getAssetTitle
* @since 11.1
*/
protected function _getAssetTitle()
{
return $this->_getAssetName();
}

/**
* Method to get the parent asset under which to register this one.
* By default, all assets are registered to the ROOT node with ID 1.
* The extended class can define a table and id to lookup. If the
* asset does not exist it will be created.
*
* @param JTable $table A JTable object for the asset parent.
* @param integer $id Id to look up
*
* @return integer
*
* @since 11.1
*/
protected function _getAssetParentId($table = null, $id = null)
{
// For simple cases, parent to the asset root.
if (empty($table) || empty($id))
{
return 1;
}

return 1;
}

/**
* Method to get the database table name for the class.
*
* @return string The name of the database table being modeled.
*
* @since 11.1
*
* @link http://docs.joomla.org/JTable/getTableName
*/
public function getTableName()
{
return $this->_tbl;
}

/**
* Method to get the primary key field name for the table.
*
* @return string The name of the primary key for the table.
*
* @link http://docs.joomla.org/JTable/getKeyName
* @since 11.1
*/
public function getKeyName()
{
return $this->_tbl_key;
}

/**
* Method to get the JDatabase connector object.
*
* @return JDatabase The internal database connector object.
*
* @link http://docs.joomla.org/JTable/getDBO
* @since 11.1
*/
public function getDbo()
{
return $this->_db;
}

/**
* Method to set the JDatabase connector object.
*
* @param object &$db A JDatabase connector object to be used by the table object.
*
* @return boolean True on success.
*
* @link http://docs.joomla.org/JTable/setDBO
* @since 11.1
*/
public function setDBO(&$db)
{
// Make sure the new database object is a JDatabase.
if (!($db instanceof JDatabase))
{
return false;
}

$this->_db = &$db;

return true;
}

/**
* Method to set rules for the record.
*
* @param mixed $input A JAccessRules object, JSON string, or array.
*
* @return void
*
* @since 11.1
*/
public function setRules($input)
{
if ($input instanceof JAccessRules)
{
$this->_rules = $input;
}
else
{
$this->_rules = new JAccessRules($input);
}
}

/**
* Method to get the rules for the record.
*
* @return JAccessRules object
*
* @since 11.1
*/
public function getRules()
{
return $this->_rules;
}

/**
* Method to reset class properties to the defaults set in the class
* definition. It will ignore the primary key as well as any private class
* properties.
*
* @return void
*
* @link http://docs.joomla.org/JTable/reset
* @since 11.1
*/
public function reset()
{
// Get the default values for the class from the table.
foreach ($this->getFields() as $k => $v)
{
// If the property is not the primary key or private, reset it.
if ($k != $this->_tbl_key && (strpos($k, '_') !== 0))
{
$this->$k = $v->Default;
}
}
}

/**
* Method to bind an associative array or object to the JTable instance.This
* method only binds properties that are publicly accessible and optionally
* takes an array of properties to ignore when binding.
*
* @param mixed $src An associative array or object to bind to the JTable instance.
* @param mixed $ignore An optional array or space separated list of properties to ignore while binding.
*
* @return boolean True on success.
*
* @link http://docs.joomla.org/JTable/bind
* @since 11.1
*/
public function bind($src, $ignore = array())
{
// If the source value is not an array or object return false.
if (!is_object($src) && !is_array($src))
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_BIND_FAILED_INVALID_SOURCE_ARGUMENT', get_class($this)));
$this->setError($e);
return false;
}

// If the source value is an object, get its accessible properties.
if (is_object($src))
{
$src = get_object_vars($src);
}

// If the ignore value is a string, explode it over spaces.
if (!is_array($ignore))
{
$ignore = explode(' ', $ignore);
}

// Bind the source value, excluding the ignored fields.
foreach ($this->getProperties() as $k => $v)
{
// Only process fields not in the ignore array.
if (!in_array($k, $ignore))
{
if (isset($src[$k]))
{
$this->$k = $src[$k];
}
}
}

return true;
}

/**
* Method to load a row from the database by primary key and bind the fields
* to the JTable instance properties.
*
* @param mixed $keys An optional primary key value to load the row by, or an array of fields to match. If not
* set the instance property value is used.
* @param boolean $reset True to reset the default values before loading the new row.
*
* @return boolean True if successful. False if row not found or on error (internal error state set in that case).
*
* @link http://docs.joomla.org/JTable/load
* @since 11.1
*/
public function load($keys = null, $reset = true)
{
if (empty($keys))
{
// If empty, use the value of the current key
$keyName = $this->_tbl_key;
$keyValue = $this->$keyName;

// If empty primary key there's is no need to load anything
if (empty($keyValue))
{
return true;
}

$keys = array($keyName => $keyValue);
}
elseif (!is_array($keys))
{
// Load by primary key.
$keys = array($this->_tbl_key => $keys);
}

if ($reset)
{
$this->reset();
}

// Initialise the query.
$query = $this->_db->getQuery(true);
$query->select('*');
$query->from($this->_tbl);
$fields = array_keys($this->getProperties());

foreach ($keys as $field => $value)
{
// Check that $field is in the table.
if (!in_array($field, $fields))
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_CLASS_IS_MISSING_FIELD', get_class($this), $field));
$this->setError($e);
return false;
}
// Add the search tuple to the query.
$query->where($this->_db->quoteName($field) . ' = ' . $this->_db->quote($value));
}

$this->_db->setQuery($query);

try
{
$row = $this->_db->loadAssoc();
}
catch (RuntimeException $e)
{
$je = new JException($e->getMessage());
$this->setError($je);
return false;
}

// Legacy error handling switch based on the JError::$legacy switch.
// @deprecated 12.1
if (JError::$legacy && $this->_db->getErrorNum())
{
$e = new JException($this->_db->getErrorMsg());
$this->setError($e);
return false;
}

// Check that we have a result.
if (empty($row))
{
$e = new JException(JText::_('JLIB_DATABASE_ERROR_EMPTY_ROW_RETURNED'));
$this->setError($e);
return false;
}

// Bind the object with the row and return.
return $this->bind($row);
}

/**
* Method to perform sanity checks on the JTable instance properties to ensure
* they are safe to store in the database. Child classes should override this
* method to make sure the data they are storing in the database is safe and
* as expected before storage.
*
* @return boolean True if the instance is sane and able to be stored in the database.
*
* @link http://docs.joomla.org/JTable/check
* @since 11.1
*/
public function check()
{
return true;
}

/**
* Method to store a row in the database from the JTable instance properties.
* If a primary key value is set the row with that primary key value will be
* updated with the instance property values. If no primary key value is set
* a new row will be inserted into the database with the properties from the
* JTable instance.
*
* @param boolean $updateNulls True to update fields even if they are null.
*
* @return boolean True on success.
*
* @link http://docs.joomla.org/JTable/store
* @since 11.1
*/
public function store($updateNulls = false)
{
// Initialise variables.
$k = $this->_tbl_key;

// The asset id field is managed privately by this class.
if ($this->_trackAssets)
{
unset($this->asset_id);
}

// If a primary key exists update the object, otherwise insert it.
if ($this->$k)
{
$stored = $this->_db->updateObject($this->_tbl, $this, $this->_tbl_key, $updateNulls);
}
else
{
$stored = $this->_db->insertObject($this->_tbl, $this, $this->_tbl_key);
}

// If the store failed return false.
if (!$stored)
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_STORE_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);
return false;
}

// If the table is not set to track assets return true.
if (!$this->_trackAssets)
{
return true;
}

if ($this->_locked)
{
$this->_unlock();
}

//
// Asset Tracking
//

$parentId = $this->_getAssetParentId();
$name = $this->_getAssetName();
$title = $this->_getAssetTitle();

$asset = JTable::getInstance('Asset', 'JTable', array('dbo' => $this->getDbo()));
$asset->loadByName($name);

// Re-inject the asset id.
$this->asset_id = $asset->id;

// Check for an error.
if ($error = $asset->getError())
{
$this->setError($error);
return false;
}

// Specify how a new or moved node asset is inserted into the tree.
if (empty($this->asset_id) || $asset->parent_id != $parentId)
{
$asset->setLocation($parentId, 'last-child');
}

// Prepare the asset to be stored.
$asset->parent_id = $parentId;
$asset->name = $name;
$asset->title = $title;

if ($this->_rules instanceof JAccessRules)
{
$asset->rules = (string) $this->_rules;
}

if (!$asset->check() || !$asset->store($updateNulls))
{
$this->setError($asset->getError());
return false;
}

if (empty($this->asset_id))
{
// Update the asset_id field in this table.
$this->asset_id = (int) $asset->id;

$query = $this->_db->getQuery(true);
$query->update($this->_db->quoteName($this->_tbl));
$query->set('asset_id = ' . (int) $this->asset_id);
$query->where($this->_db->quoteName($k) . ' = ' . (int) $this->$k);
$this->_db->setQuery($query);

if (!$this->_db->execute())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_STORE_FAILED_UPDATE_ASSET_ID', $this->_db->getErrorMsg()));
$this->setError($e);
return false;
}
}

return true;
}

/**
* Method to provide a shortcut to binding, checking and storing a JTable
* instance to the database table. The method will check a row in once the
* data has been stored and if an ordering filter is present will attempt to
* reorder the table rows based on the filter. The ordering filter is an instance
* property name. The rows that will be reordered are those whose value matches
* the JTable instance for the property specified.
*
* @param mixed $src An associative array or object to bind to the JTable instance.
* @param string $orderingFilter Filter for the order updating
* @param mixed $ignore An optional array or space separated list of properties
* to ignore while binding.
*
* @return boolean True on success.
*
* @link http://docs.joomla.org/JTable/save
* @since 11.1
*/
public function save($src, $orderingFilter = '', $ignore = '')
{
// Attempt to bind the source to the instance.
if (!$this->bind($src, $ignore))
{
return false;
}

// Run any sanity checks on the instance and verify that it is ready for storage.
if (!$this->check())
{
return false;
}

// Attempt to store the properties to the database table.
if (!$this->store())
{
return false;
}

// Attempt to check the row in, just in case it was checked out.
if (!$this->checkin())
{
return false;
}

// If an ordering filter is set, attempt reorder the rows in the table based on the filter and value.
if ($orderingFilter)
{
$filterValue = $this->$orderingFilter;
$this->reorder($orderingFilter ? $this->_db->quoteName($orderingFilter) . ' = ' . $this->_db->Quote($filterValue) : '');
}

// Set the error to empty and return true.
$this->setError('');

return true;
}

/**
* Method to delete a row from the database table by primary key value.
*
* @param mixed $pk An optional primary key value to delete. If not set the instance property value is used.
*
* @return boolean True on success.
*
* @link http://docs.joomla.org/JTable/delete
* @since 11.1
*/
public function delete($pk = null)
{
// Initialise variables.
$k = $this->_tbl_key;
$pk = (is_null($pk)) ? $this->$k : $pk;

// If no primary key is given, return false.
if ($pk === null)
{
$e = new JException(JText::_('JLIB_DATABASE_ERROR_NULL_PRIMARY_KEY'));
$this->setError($e);
return false;
}

// If tracking assets, remove the asset first.
if ($this->_trackAssets)
{
// Get and the asset name.
$this->$k = $pk;
$name = $this->_getAssetName();
$asset = JTable::getInstance('Asset');

if ($asset->loadByName($name))
{
if (!$asset->delete())
{
$this->setError($asset->getError());
return false;
}
}
else
{
$this->setError($asset->getError());
return false;
}
}

// Delete the row by primary key.
$query = $this->_db->getQuery(true);
$query->delete();
$query->from($this->_tbl);
$query->where($this->_tbl_key . ' = ' . $this->_db->quote($pk));
$this->_db->setQuery($query);

// Check for a database error.
if (!$this->_db->execute())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_DELETE_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);
return false;
}

return true;
}

/**
* Method to check a row out if the necessary properties/fields exist. To
* prevent race conditions while editing rows in a database, a row can be
* checked out if the fields 'checked_out' and 'checked_out_time' are available.
* While a row is checked out, any attempt to store the row by a user other
* than the one who checked the row out should be held until the row is checked
* in again.
*
* @param integer $userId The Id of the user checking out the row.
* @param mixed $pk An optional primary key value to check out. If not set
* the instance property value is used.
*
* @return boolean True on success.
*
* @link http://docs.joomla.org/JTable/checkOut
* @since 11.1
*/
public function checkOut($userId, $pk = null)
{
// If there is no checked_out or checked_out_time field, just return true.
if (!property_exists($this, 'checked_out') || !property_exists($this, 'checked_out_time'))
{
return true;
}

// Initialise variables.
$k = $this->_tbl_key;
$pk = (is_null($pk)) ? $this->$k : $pk;

// If no primary key is given, return false.
if ($pk === null)
{
$e = new JException(JText::_('JLIB_DATABASE_ERROR_NULL_PRIMARY_KEY'));
$this->setError($e);
return false;
}

// Get the current time in MySQL format.
$time = JFactory::getDate()->toSql();

// Check the row out by primary key.
$query = $this->_db->getQuery(true);
$query->update($this->_tbl);
$query->set($this->_db->quoteName('checked_out') . ' = ' . (int) $userId);
$query->set($this->_db->quoteName('checked_out_time') . ' = ' . $this->_db->quote($time));
$query->where($this->_tbl_key . ' = ' . $this->_db->quote($pk));
$this->_db->setQuery($query);

if (!$this->_db->execute())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_CHECKOUT_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);
return false;
}

// Set table values in the object.
$this->checked_out = (int) $userId;
$this->checked_out_time = $time;

return true;
}

/**
* Method to check a row in if the necessary properties/fields exist. Checking
* a row in will allow other users the ability to edit the row.
*
* @param mixed $pk An optional primary key value to check out. If not set the instance property value is used.
*
* @return boolean True on success.
*
* @link http://docs.joomla.org/JTable/checkIn
* @since 11.1
*/
public function checkIn($pk = null)
{
// If there is no checked_out or checked_out_time field, just return true.
if (!property_exists($this, 'checked_out') || !property_exists($this, 'checked_out_time'))
{
return true;
}

// Initialise variables.
$k = $this->_tbl_key;
$pk = (is_null($pk)) ? $this->$k : $pk;

// If no primary key is given, return false.
if ($pk === null)
{
$e = new JException(JText::_('JLIB_DATABASE_ERROR_NULL_PRIMARY_KEY'));
$this->setError($e);
return false;
}

// Check the row in by primary key.
$query = $this->_db->getQuery(true);
$query->update($this->_tbl);
$query->set($this->_db->quoteName('checked_out') . ' = 0');
$query->set($this->_db->quoteName('checked_out_time') . ' = ' . $this->_db->quote($this->_db->getNullDate()));
$query->where($this->_tbl_key . ' = ' . $this->_db->quote($pk));
$this->_db->setQuery($query);

// Check for a database error.
if (!$this->_db->execute())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_CHECKIN_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);
return false;
}

// Set table values in the object.
$this->checked_out = 0;
$this->checked_out_time = '';

return true;
}

/**
* Method to increment the hits for a row if the necessary property/field exists.
*
* @param mixed $pk An optional primary key value to increment. If not set the instance property value is used.
*
* @return boolean True on success.
*
* @link http://docs.joomla.org/JTable/hit
* @since 11.1
*/
public function hit($pk = null)
{
// If there is no hits field, just return true.
if (!property_exists($this, 'hits'))
{
return true;
}

// Initialise variables.
$k = $this->_tbl_key;
$pk = (is_null($pk)) ? $this->$k : $pk;

// If no primary key is given, return false.
if ($pk === null)
{
return false;
}

// Check the row in by primary key.
$query = $this->_db->getQuery(true);
$query->update($this->_tbl);
$query->set($this->_db->quoteName('hits') . ' = (' . $this->_db->quoteName('hits') . ' + 1)');
$query->where($this->_tbl_key . ' = ' . $this->_db->quote($pk));
$this->_db->setQuery($query);

// Check for a database error.
if (!$this->_db->execute())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_HIT_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);
return false;
}

// Set table values in the object.
$this->hits++;

return true;
}

/**
* Method to determine if a row is checked out and therefore uneditable by
* a user. If the row is checked out by the same user, then it is considered
* not checked out -- as the user can still edit it.
*
* @param integer $with The userid to preform the match with, if an item is checked
* out by this user the function will return false.
* @param integer $against The userid to perform the match against when the function
* is used as a static function.
*
* @return boolean True if checked out.
*
* @link http://docs.joomla.org/JTable/isCheckedOut
* @since 11.1
* @todo This either needs to be static or not.
*/
public function isCheckedOut($with = 0, $against = null)
{
// Handle the non-static case.
if (isset($this) && ($this instanceof JTable) && is_null($against))
{
$against = $this->get('checked_out');
}

// The item is not checked out or is checked out by the same user.
if (!$against || ($against == $with))
{
return false;
}

$db = JFactory::getDBO();
$db->setQuery('SELECT COUNT(userid)' . ' FROM ' . $db->quoteName('#__session') . ' WHERE ' . $db->quoteName('userid') . ' = ' . (int) $against);
$checkedOut = (boolean) $db->loadResult();

// If a session exists for the user then it is checked out.
return $checkedOut;
}

/**
* Method to get the next ordering value for a group of rows defined by an SQL WHERE clause.
* This is useful for placing a new item last in a group of items in the table.
*
* @param string $where WHERE clause to use for selecting the MAX(ordering) for the table.
*
* @return mixed Boolean false an failure or the next ordering value as an integer.
*
* @link http://docs.joomla.org/JTable/getNextOrder
* @since 11.1
*/
public function getNextOrder($where = '')
{
// If there is no ordering field set an error and return false.
if (!property_exists($this, 'ordering'))
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_CLASS_DOES_NOT_SUPPORT_ORDERING', get_class($this)));
$this->setError($e);
return false;
}

// Get the largest ordering value for a given where clause.
$query = $this->_db->getQuery(true);
$query->select('MAX(ordering)');
$query->from($this->_tbl);

if ($where)
{
$query->where($where);
}

$this->_db->setQuery($query);
$max = (int) $this->_db->loadResult();

// Check for a database error.
if ($this->_db->getErrorNum())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_GET_NEXT_ORDER_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);

return false;
}

// Return the largest ordering value + 1.
return ($max + 1);
}

/**
* Method to compact the ordering values of rows in a group of rows
* defined by an SQL WHERE clause.
*
* @param string $where WHERE clause to use for limiting the selection of rows to compact the ordering values.
*
* @return mixed Boolean true on success.
*
* @link http://docs.joomla.org/JTable/reorder
* @since 11.1
*/
public function reorder($where = '')
{
// If there is no ordering field set an error and return false.
if (!property_exists($this, 'ordering'))
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_CLASS_DOES_NOT_SUPPORT_ORDERING', get_class($this)));
$this->setError($e);
return false;
}

// Initialise variables.
$k = $this->_tbl_key;

// Get the primary keys and ordering values for the selection.
$query = $this->_db->getQuery(true);
$query->select($this->_tbl_key . ', ordering');
$query->from($this->_tbl);
$query->where('ordering >= 0');
$query->order('ordering');

// Setup the extra where and ordering clause data.
if ($where)
{
$query->where($where);
}

$this->_db->setQuery($query);
$rows = $this->_db->loadObjectList();

// Check for a database error.
if ($this->_db->getErrorNum())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_REORDER_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);

return false;
}

// Compact the ordering values.
foreach ($rows as $i => $row)
{
// Make sure the ordering is a positive integer.
if ($row->ordering >= 0)
{
// Only update rows that are necessary.
if ($row->ordering != $i + 1)
{
// Update the row ordering field.
$query = $this->_db->getQuery(true);
$query->update($this->_tbl);
$query->set('ordering = ' . ($i + 1));
$query->where($this->_tbl_key . ' = ' . $this->_db->quote($row->$k));
$this->_db->setQuery($query);

// Check for a database error.
if (!$this->_db->execute())
{
$e = new JException(
JText::sprintf('JLIB_DATABASE_ERROR_REORDER_UPDATE_ROW_FAILED', get_class($this), $i, $this->_db->getErrorMsg())
);
$this->setError($e);

return false;
}
}
}
}

return true;
}

/**
* Method to move a row in the ordering sequence of a group of rows defined by an SQL WHERE clause.
* Negative numbers move the row up in the sequence and positive numbers move it down.
*
* @param integer $delta The direction and magnitude to move the row in the ordering sequence.
* @param string $where WHERE clause to use for limiting the selection of rows to compact the
* ordering values.
*
* @return mixed Boolean true on success.
*
* @link http://docs.joomla.org/JTable/move
* @since 11.1
*/
public function move($delta, $where = '')
{
// If there is no ordering field set an error and return false.
if (!property_exists($this, 'ordering'))
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_CLASS_DOES_NOT_SUPPORT_ORDERING', get_class($this)));
$this->setError($e);
return false;
}

// If the change is none, do nothing.
if (empty($delta))
{
return true;
}

// Initialise variables.
$k = $this->_tbl_key;
$row = null;
$query = $this->_db->getQuery(true);

// Select the primary key and ordering values from the table.
$query->select($this->_tbl_key . ', ordering');
$query->from($this->_tbl);

// If the movement delta is negative move the row up.
if ($delta < 0)
{
$query->where('ordering < ' . (int) $this->ordering);
$query->order('ordering DESC');
}
// If the movement delta is positive move the row down.
elseif ($delta > 0)
{
$query->where('ordering > ' . (int) $this->ordering);
$query->order('ordering ASC');
}

// Add the custom WHERE clause if set.
if ($where)
{
$query->where($where);
}

// Select the first row with the criteria.
$this->_db->setQuery($query, 0, 1);
$row = $this->_db->loadObject();

// If a row is found, move the item.
if (!empty($row))
{
// Update the ordering field for this instance to the row's ordering value.
$query = $this->_db->getQuery(true);
$query->update($this->_tbl);
$query->set('ordering = ' . (int) $row->ordering);
$query->where($this->_tbl_key . ' = ' . $this->_db->quote($this->$k));
$this->_db->setQuery($query);

// Check for a database error.
if (!$this->_db->execute())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_MOVE_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);

return false;
}

// Update the ordering field for the row to this instance's ordering value.
$query = $this->_db->getQuery(true);
$query->update($this->_tbl);
$query->set('ordering = ' . (int) $this->ordering);
$query->where($this->_tbl_key . ' = ' . $this->_db->quote($row->$k));
$this->_db->setQuery($query);

// Check for a database error.
if (!$this->_db->execute())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_MOVE_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);

return false;
}

// Update the instance value.
$this->ordering = $row->ordering;
}
else
{
// Update the ordering field for this instance.
$query = $this->_db->getQuery(true);
$query->update($this->_tbl);
$query->set('ordering = ' . (int) $this->ordering);
$query->where($this->_tbl_key . ' = ' . $this->_db->quote($this->$k));
$this->_db->setQuery($query);

// Check for a database error.
if (!$this->_db->execute())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_MOVE_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);

return false;
}
}

return true;
}

/**
* Method to set the publishing state for a row or list of rows in the database
* table. The method respects checked out rows by other users and will attempt
* to checkin rows that it can after adjustments are made.
*
* @param mixed $pks An optional array of primary key values to update. If not set the instance property value is used.
* @param integer $state The publishing state. eg. [0 = unpublished, 1 = published]
* @param integer $userId The user id of the user performing the operation.
*
* @return boolean True on success.
*
* @link http://docs.joomla.org/JTable/publish
* @since 11.1
*/
public function publish($pks = null, $state = 1, $userId = 0)
{
// Initialise variables.
$k = $this->_tbl_key;

// Sanitize input.
JArrayHelper::toInteger($pks);
$userId = (int) $userId;
$state = (int) $state;

// If there are no primary keys set check to see if the instance key is set.
if (empty($pks))
{
if ($this->$k)
{
$pks = array($this->$k);
}
// Nothing to set publishing state on, return false.
else
{
$e = new JException(JText::_('JLIB_DATABASE_ERROR_NO_ROWS_SELECTED'));
$this->setError($e);

return false;
}
}

// Update the publishing state for rows with the given primary keys.
$query = $this->_db->getQuery(true);
$query->update($this->_tbl);
$query->set('published = ' . (int) $state);

// Determine if there is checkin support for the table.
if (property_exists($this, 'checked_out') || property_exists($this, 'checked_out_time'))
{
$query->where('(checked_out = 0 OR checked_out = ' . (int) $userId . ')');
$checkin = true;
}
else
{
$checkin = false;
}

// Build the WHERE clause for the primary keys.
$query->where($k . ' = ' . implode(' OR ' . $k . ' = ', $pks));

$this->_db->setQuery($query);

// Check for a database error.
if (!$this->_db->execute())
{
$e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_PUBLISH_FAILED', get_class($this), $this->_db->getErrorMsg()));
$this->setError($e);

return false;
}

// If checkin is supported and all rows were adjusted, check them in.
if ($checkin && (count($pks) == $this->_db->getAffectedRows()))
{
// Checkin the rows.
foreach ($pks as $pk)
{
$this->checkin($pk);
}
}

// If the JTable instance value is in the list of primary keys that were set, set the instance.
if (in_array($this->$k, $pks))
{
$this->published = $state;
}

$this->setError('');
return true;
}

/**
* Generic check for whether dependencies exist for this object in the database schema
*
* Can be overloaded/supplemented by the child class
*
* @param mixed $pk An optional primary key value check the row for. If not
* set the instance property value is used.
* @param array $joins An optional array to compiles standard joins formatted like:
* [label => 'Label', name => 'table name' , idfield => 'field', joinfield => 'field']
*
* @return boolean True on success.
*
* @deprecated 12.1
* @link http://docs.joomla.org/JTable/canDelete
* @since 11.1
*/
public function canDelete($pk = null, $joins = null)
{
// Deprecation warning.
JLog::add('JTable::canDelete() is deprecated.', JLog::WARNING, 'deprecated');

// Initialise variables.
$k = $this->_tbl_key;
$pk = (is_null($pk)) ? $this->$k : $pk;

// If no primary key is given, return false.
if ($pk === null)
{
return false;
}

if (is_array($joins))
{
// Get a query object.
$query = $this->_db->getQuery(true);

// Setup the basic query.
$query->select($this->_db->quoteName($this->_tbl_key));
$query->from($this->_db->quoteName($this->_tbl));
$query->where($this->_db->quoteName($this->_tbl_key) . ' = ' . $this->_db->quote($this->$k));
$query->group($this->_db->quoteName($this->_tbl_key));

// For each join add the select and join clauses to the query object.
foreach ($joins as $table)
{
$query->select('COUNT(DISTINCT ' . $table['idfield'] . ') AS ' . $table['idfield']);
$query->join('LEFT', $table['name'] . ' ON ' . $table['joinfield'] . ' = ' . $k);
}

// Get the row object from the query.
$this->_db->setQuery((string) $query, 0, 1);
$row = $this->_db->loadObject();

// Check for a database error.
if ($this->_db->getErrorNum())
{
$this->setError($this->_db->getErrorMsg());

return false;
}

$msg = array();
$i = 0;

foreach ($joins as $table)
{
$k = $table['idfield'] . $i;

if ($row->$k)
{
$msg[] = JText::_($table['label']);
}

$i++;
}

if (count($msg))
{
$this->setError("noDeleteRecord" . ": " . implode(', ', $msg));

return false;
}
else
{
return true;
}
}

return true;
}

/**
* Method to export the JTable instance properties to an XML string.
*
* @param boolean $mapKeysToText True to map foreign keys to text values.
*
* @return string XML string representation of the instance.
*
* @deprecated 12.1
* @link http://docs.joomla.org/JTable/toXML
* @since 11.1
*/
public function toXML($mapKeysToText = false)
{
// Deprecation warning.
JLog::add('JTable::toXML() is deprecated.', JLog::WARNING, 'deprecated');

// Initialise variables.
$xml = array();
$map = $mapKeysToText ? ' mapkeystotext="true"' : '';

// Open root node.
$xml[] = '<record table="' . $this->_tbl . '"' . $map . '>';

// Get the publicly accessible instance properties.
foreach (get_object_vars($this) as $k => $v)
{
// If the value is null or non-scalar, or the field is internal ignore it.
if (!is_scalar($v) || ($v === null) || ($k[0] == '_'))
{
continue;
}

$xml[] = ' <' . $k . '><![CDATA[' . $v . ']]></' . $k . '>';
}

// Close root node.
$xml[] = '</record>';

// Return the XML array imploded over new lines.
return implode("\n", $xml);
}

/**
* Method to lock the database table for writing.
*
* @return boolean True on success.
*
* @since 11.1
* @throws JDatabaseException
*/
protected function _lock()
{
$this->_db->lockTable($this->_tbl);
$this->_locked = true;

return true;
}

/**
* Method to unlock the database table for writing.
*
* @return boolean True on success.
*
* @since 11.1
*/
protected function _unlock()
{
$this->_db->unlockTables();
$this->_locked = false;

return true;
}
}




Can you check this table.php file please?..
I hope you can find the issue.

Please let me know.

Thanks
·
Monday, 21 April 2014 12:53
·
0 Likes
·
0 Votes
·
0 Comments
·
Hello Fabian Mendoza,

Thanks for take your time to contact with your Webhosting provider,
I have tried to access in your FTP, but it seems like it doesn't show any Joomla root folder there, is it possible help us to set to Joomla root folder directory so we can help you check on this file?
Also, may i know do you have configure some redirection URL in your site? Please advise.
·
Monday, 21 April 2014 13:53
·
0 Likes
·
0 Votes
·
0 Comments
·
Hi Arlex,

Im gonna give you another ftp account, because this one i gave you it does not show anything, dont know why...

Ill let you the other access privately.

About the URL redirection the answer is not, at leas that i know but im almost sure.

Thanks in advance
·
Tuesday, 22 April 2014 10:46
·
0 Likes
·
0 Votes
·
0 Comments
·
Hello Fabian Mendoza,

I'm really sorry that late reply to this,
Can you try update to latest version of Komento and see how it goes?
·
Thursday, 24 April 2014 01:01
·
0 Likes
·
0 Votes
·
0 Comments
·
Hi Arlex,

Thanks.. in fact i was late to reply this becuase you did something with this table.php file, or i don´t know what but everythings is working fine right now... im afraid if i do this update.. Did you guys launch a new version this week?.. because i recently installit the component a few days ago.

Another thing:
I need to change 2 messages that appears. The first one is when you submit a comment and shows this green message: "Comment submitted and pending approval from admins"... the second one is, once you aprove the comment in the backend, in the frontend apeears a message saying something like "1 New comment(s), upload page to see comments". I want to translate this. Where can i do that.

Again thanks for the first resoved issue.
·
Thursday, 24 April 2014 06:36
·
0 Likes
·
0 Votes
·
0 Comments
·
Hello Fabian,

I am sorry for the late reply.
You're welcome. Yes, we actually have launch new version of Komento. Now is Komento 1.8.1.
The fix that we have done in your site is not included in the update. Can you backup this file: .../public_html/components/com_komento/classes/configuration.php. This fix is done only in your site.

You can change "Comment submitted and pending approval from admins" from: ...\language\en-GB\en-GB.com_komento.ini Line: 122 COM_KOMENTO_FORM_USER_COMMENTS_WILL_BE_MODERATED.

You can use this file: ...\language\en-GB\en-GB.com_komento.ini Line: 381-384COM_KOMENTO_NOTIFICATION_NEW_COMMENT and COM_KOMENTO_RELOAD_COMMENTS

If you have anymore question, please don't hesitate to ask us.
Hope this will help.
Thanks.
·
Thursday, 24 April 2014 12:59
·
0 Likes
·
0 Votes
·
0 Comments
·
View Full Post