Template error: trim() expects parameter 1 to be string

Everything to do with Joomla! 1.5 templates and templating.

Moderator: General Support Moderators

Forum rules
Forum Rules
Absolute Beginner's Guide to Joomla! <-- please read before posting, this means YOU.
Locked
Crumbs
Joomla! Apprentice
Joomla! Apprentice
Posts: 8
Joined: Tue Feb 02, 2010 10:35 pm

Template error: trim() expects parameter 1 to be string

Post by Crumbs » Fri Feb 05, 2010 10:53 pm

I installed a template in Joomla which works fine except when you hover over the Home button an error appears in the drop down menu. Any help would be greatly appriciated. I've copied the error and code from file below. Problem seems to be on line 83 - if (trim( $data )) {$this->loadINI($data);}

Warning: trim() expects parameter 1 to be string, array given in C:\Users\Louise\Documents\Keane Therapy\xampp\htdocs\keanetherapy\libraries\joomla\html\parameter.php on line 83

<?php
/**
* @version $Id: parameter.php 10707 2008-08-21 09:52:47Z eddieajau $
* @package Joomla.Framework
* @subpackage Parameter
* @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/

// Check to ensure this file is within the rest of the framework
defined('JPATH_BASE') or die();

jimport( 'joomla.registry.registry' );

//Register the element class with the loader
JLoader::register('JElement', dirname(__FILE__).DS.'parameter'.DS.'element.php');

/**
* Parameter handler
*
* @package Joomla.Framework
* @subpackage Parameter
* @since 1.5
*/
class JParameter extends JRegistry
{
/**
* The raw params string
*
* @access private
* @var string
* @since 1.5
*/
var $_raw = null;

/**
* The xml params element
*
* @access private
* @var object
* @since 1.5
*/
var $_xml = null;

/**
* loaded elements
*
* @access private
* @var array
* @since 1.5
*/
var $_elements = array();

/**
* directories, where element types can be stored
*
* @access private
* @var array
* @since 1.5
*/
var $_elementPath = array();

/**
* Constructor
*
* @access protected
* @param string The raw parms text
* @param string Path to the xml setup file
* @since 1.5
*/
function __construct($data, $path = '')
{
parent::__construct('_default');

// Set base path
$this->_elementPath[] = dirname( __FILE__ ).DS.'parameter'.DS.'element';

if (trim( $data )) {
$this->loadINI($data);
}

if ($path) {
$this->loadSetupFile($path);
}

$this->_raw = $data;
}

/**
* Set a value
*
* @access public
* @param string The name of the param
* @param string The value of the parameter
* @return string The set value
* @since 1.5
*/
function set($key, $value = '', $group = '_default')
{
return $this->setValue($group.'.'.$key, (string) $value);
}

/**
* Get a value
*
* @access public
* @param string The name of the param
* @param mixed The default value if not found
* @return string
* @since 1.5
*/
function get($key, $default = '', $group = '_default')
{
$value = $this->getValue($group.'.'.$key);
$result = (empty($value) && ($value !== 0) && ($value !== '0')) ? $default : $value;
return $result;
}

/**
* Sets a default value if not alreay assigned
*
* @access public
* @param string The name of the param
* @param string The value of the parameter
* @param string The parameter group to modify
* @return string The set value
* @since 1.5
*/
function def($key, $default = '', $group = '_default') {
$value = $this->get($key, (string) $default, $group);
return $this->set($key, $value);
}

/**
* Sets the XML object from custom xml files
*
* @access public
* @param object An XML object
* @since 1.5
*/
function setXML( &$xml )
{
if (is_object( $xml ))
{
if ($group = $xml->attributes( 'group' )) {
$this->_xml[$group] = $xml;
} else {
$this->_xml['_default'] = $xml;
}
if ($dir = $xml->attributes( 'addpath' )) {
$this->addElementPath( JPATH_ROOT . str_replace('/', DS, $dir) );
}
}
}

/**
* Bind data to the parameter
*
* @param mixed $data Array or Object
* @return boolean True if the data was successfully bound
* @access public
* @since 1.5
*/
function bind($data, $group = '_default')
{
if ( is_array($data) ) {
return $this->loadArray($data, $group);
} elseif ( is_object($data) ) {
return $this->loadObject($data, $group);
} else {
return $this->loadINI($data, $group);
}
}

/**
* Render
*
* @access public
* @param string The name of the control, or the default text area if a setup file is not found
* @return string HTML
* @since 1.5
*/
function render($name = 'params', $group = '_default')
{
if (!isset($this->_xml[$group])) {
return false;
}

$params = $this->getParams($name, $group);
$html = array ();
$html[] = '<table width="100%" class="paramlist admintable" cellspacing="1">';

if ($description = $this->_xml[$group]->attributes('description')) {
// add the params description to the display
$desc = JText::_($description);
$html[] = '<tr><td class="paramlist_description" colspan="2">'.$desc.'</td></tr>';
}

foreach ($params as $param)
{
$html[] = '<tr>';

if ($param[0]) {
$html[] = '<td width="40%" class="paramlist_key"><span class="editlinktip">'.$param[0].'</span></td>';
$html[] = '<td class="paramlist_value">'.$param[1].'</td>';
} else {
$html[] = '<td class="paramlist_value" colspan="2">'.$param[1].'</td>';
}

$html[] = '</tr>';
}

if (count($params) < 1) {
$html[] = "<tr><td colspan=\"2\"><i>".JText::_('There are no Parameters for this item')."</i></td></tr>";
}

$html[] = '</table>';

return implode("\n", $html);
}

/**
* Render all parameters to an array
*
* @access public
* @param string The name of the control, or the default text area if a setup file is not found
* @return array Array of all parameters, each as array Any array of the label, the form element and the tooltip
* @since 1.5
*/
function renderToArray($name = 'params', $group = '_default')
{
if (!isset($this->_xml[$group])) {
return false;
}
$results = array();
foreach ($this->_xml[$group]->children() as $param) {
$result = $this->getParam($param, $name);
$results[$result[5]] = $result;
}
return $results;
}

/**
* Return number of params to render
*
* @access public
* @return mixed Boolean falst if no params exist or integer number of params that exist
* @since 1.5
*/
function getNumParams($group = '_default')
{
if (!isset($this->_xml[$group]) || !count($this->_xml[$group]->children())) {
return false;
} else {
return count($this->_xml[$group]->children());
}
}

/**
* Get the number of params in each group
*
* @access public
* @return array Array of all group names as key and param count as value
* @since 1.5
*/
function getGroups()
{
if (!is_array($this->_xml)) {
return false;
}
$results = array();
foreach ($this->_xml as $name => $group) {
$results[$name] = $this->getNumParams($name);
}
return $results;
}

/**
* Render all parameters
*
* @access public
* @param string The name of the control, or the default text area if a setup file is not found
* @return array Aarray of all parameters, each as array Any array of the label, the form element and the tooltip
* @since 1.5
*/
function getParams($name = 'params', $group = '_default')
{
if (!isset($this->_xml[$group])) {
return false;
}
$results = array();
foreach ($this->_xml[$group]->children() as $param) {
$results[] = $this->getParam($param, $name);
}
return $results;
}

/**
* Render a parameter type
*
* @param object A param tag node
* @param string The control name
* @return array Any array of the label, the form element and the tooltip
* @since 1.5
*/
function getParam(&$node, $control_name = 'params', $group = '_default')
{
//get the type of the parameter
$type = $node->attributes('type');

//remove any occurance of a mos_ prefix
$type = str_replace('mos_', '', $type);

$element =& $this->loadElement($type);

// error happened
if ($element === false)
{
$result = array();
$result[0] = $node->attributes('name');
$result[1] = JText::_('Element not defined for type').' = '.$type;
$result[5] = $result[0];
return $result;
}

//get value
$value = $this->get($node->attributes('name'), $node->attributes('default'), $group);

return $element->render($node, $value, $control_name);
}

/**
* Loads an xml setup file and parses it
*
* @access public
* @param string path to xml setup file
* @return object
* @since 1.5
*/
function loadSetupFile($path)
{
$result = false;

if ($path)
{
$xml = & JFactory::getXMLParser('Simple');

if ($xml->loadFile($path))
{
if ($params = & $xml->document->params) {
foreach ($params as $param)
{
$this->setXML( $param );
$result = true;
}
}
}
}
else
{
$result = true;
}

return $result;
}

/**
* Loads a element type
*
* @access public
* @param string elementType
* @return object
* @since 1.5
*/
function &loadElement( $type, $new = false )
{
$false = false;
$signature = md5( $type );

if( (isset( $this->_elements[$signature] ) && !is_a($this->_elements[$signature], '__PHP_Incomplete_Class')) && $new === false ) {
return $this->_elements[$signature];
}

$elementClass = 'JElement'.$type;
if( !class_exists( $elementClass ) )
{
if( isset( $this->_elementPath ) ) {
$dirs = $this->_elementPath;
} else {
$dirs = array();
}

$file = JFilterInput::clean(str_replace('_', DS, $type).'.php', 'path');

jimport('joomla.filesystem.path');
if ($elementFile = JPath::find($dirs, $file)) {
include_once $elementFile;
} else {
return $false;
}
}

if( !class_exists( $elementClass ) ) {
return $false;
}

$this->_elements[$signature] = new $elementClass($this);

return $this->_elements[$signature];
}

/**
* Add a directory where JParameter should search for element types
*
* You may either pass a string or an array of directories.
*
* JParameter will be searching for a element type in the same
* order you added them. If the parameter type cannot be found in
* the custom folders, it will look in
* JParameter/types.
*
* @access public
* @param string|array directory or directories to search.
* @since 1.5
*/
function addElementPath( $path )
{
// just force path to array
settype( $path, 'array' );

// loop through the path directories
foreach ( $path as $dir )
{
// no surrounding spaces allowed!
$dir = trim( $dir );

// add trailing separators as needed
if ( substr( $dir, -1 ) != DIRECTORY_SEPARATOR ) {
// directory
$dir .= DIRECTORY_SEPARATOR;
}

// add to the top of the search dirs
array_unshift( $this->_elementPath, $dir );
}


}
}

User avatar
toivo
Joomla! Exemplar
Joomla! Exemplar
Posts: 9846
Joined: Thu Feb 15, 2007 5:48 am
Location: Oxford, UK
Contact:

Re: Template error: trim() expects parameter 1 to be string

Post by toivo » Sat Feb 06, 2010 2:45 am

The code in parameter.php is hardly at fault here, the problem is with the calling routine that passes the parameter of incorrect type.

The message is only a warning. You need to fine tune the error reporting parameters in php.ini so errors and warnings are not displayed but written to the PHP error log, and turn off the reporting of warnings and notices.

Apart from the PHP reference manual at http://php.net/manual/en/errorfunc.configuration.php, you will find a lot of information about error reporting in this forum, for example this useful thread: http://forum.joomla.org/viewtopic.php?f=199&t=154552
Toivo Talikka, Global Moderator
my first programs were assembled and run in 16KB :)
troubleshooting smtp and other articles https://talikka.com/joomla

marlon_andrei
Joomla! Fledgling
Joomla! Fledgling
Posts: 1
Joined: Thu Mar 11, 2010 2:12 am
Location: Brazil
Contact:

Re: Template error: trim() expects parameter 1 to be string

Post by marlon_andrei » Thu Mar 11, 2010 2:22 am

Hello friend

CHANGE DE BLOCK IN LINE 83, TODAY THIS IS:

if (trim($data))
{
$this->loadINI($data);
}

CHANGE FOR THIS:

if (gettype($data) == 'array')
{
foreach ($data as $data_string)
{
if (trim($data_string))
{
$this->loadINI($data_string);
}
}
}
else
{
if (trim($data))
{
$this->loadINI($data);
}
}


Good luck from Brazil...

jmanalili
Joomla! Fledgling
Joomla! Fledgling
Posts: 3
Joined: Wed Mar 24, 2010 12:17 am

Re: Template error: trim() expects parameter 1 to be string

Post by jmanalili » Wed Apr 07, 2010 6:11 am

I have the same issue and your solution works great, thanks.

User avatar
beerallica
Joomla! Apprentice
Joomla! Apprentice
Posts: 6
Joined: Thu Dec 31, 2009 2:56 pm
Location: Greece
Contact:

Re: Template error: trim() expects parameter 1 to be string

Post by beerallica » Wed Apr 14, 2010 4:07 pm

It may be working OK but you're not supposed to fiddle with Joomla core code, or your changes will be overwritten with the next update. Having the warnings & notices displayed is OK for debugging purposes (i.e. when moving your site to a new server) but then you can turn them off and you're as good as new.

carlkinsman
Joomla! Apprentice
Joomla! Apprentice
Posts: 6
Joined: Sat May 08, 2010 3:17 pm

Re: Template error: trim() expects parameter 1 to be string

Post by carlkinsman » Sun May 09, 2010 1:48 pm

I have the same problem with error message on the home button. I read how to fix above but not sure which file I open to edit?? Which PHP file is it? Is it in the Parameter folder?

User avatar
web_servant
Joomla! Explorer
Joomla! Explorer
Posts: 298
Joined: Thu Dec 10, 2009 12:00 am

Re: Template error: trim() expects parameter 1 to be string

Post by web_servant » Fri Feb 11, 2011 4:02 am

I used this fix on a local server. I am using it to teach an administrator how to use Joomla. It worked great. Although it's not recommended to tamper with the core, I won't be updating this installation, it's for training purposes only. Thanks a bunch marlon!!!
By the way, the file is libraries/joomla/html/parameter.php line 83

malikarshad
Joomla! Fledgling
Joomla! Fledgling
Posts: 1
Joined: Tue Dec 01, 2009 5:57 am

Re: Template error: trim() expects parameter 1 to be string

Post by malikarshad » Mon Sep 03, 2012 7:18 pm

I had the same error. I replaced the code as was given in the forum from the guy from Brazil. It works like a charm.

Codeless
Joomla! Intern
Joomla! Intern
Posts: 51
Joined: Tue Oct 06, 2009 4:36 am

Re: Template error: trim() expects parameter 1 to be string

Post by Codeless » Fri Nov 09, 2012 10:53 am

I just started having this error on one of my older sites. I recently upgraded my PHP to 5.3. so I could run J3 on other sites. I tried upgrading the Joomla on this site to Version 1.5.26 and applying this fix, in the backend, it works, no more error. But the frontend chucks up a 500 Internal Server Error now. Anyone have any suggestions how to fix?

Cheers!


Locked

Return to “Templates for Joomla! 1.5”