I have been given the task of migrating an OSCommerce website from a server running PHP 5.3.3 to a server running PHP 7.0.33. The current live website uses OSCommerce version 2.3.4 and I know from reading on the OSC forums that this will cause a lot of errors when moving to a more recent PHP server.
Ideally I should upgrade OSC to the latest stable release but there is a lot of custom code that would potentially be an absolute nightmare to integrate and besides I’m under a time constraint to get the site moved and up and running again.
I have cleared a lot of basic errors and warnings but the one error I’m having trouble with is the call to the ‘messageStack’ class which displays a ajax/jquery information box to show items added to the cart or issues with forms etc.
The error is:
Fatal error: Uncaught Error: Call to undefined method
messageStack::alertBlock() in
/home/xxxx/public_html/xxxx/includes/classes/message_stack.php:66
Stack trace: #0
/home/xxxx/public_html/xxxx/includes/modules/product_listing.php(4):
messageStack->output(‘product_action’) #1
/home/xxxx/public_html/xxxx/index.php(227):
include(‘/home/xxxx…’) #2 {main} thrown in
/home/xxxx/public_html/xxxx/includes/classes/message_stack.php
on line 66
The line in question is:
return $this->alertBlock($output);
message_stack.php
class messageStack extends alertBlock {
// class constructor
function __construct() {
$this->messages = array();
if (isset($_SESSION['messageToStack'])) {
for ($i=0, $n=sizeof($_SESSION['messageToStack']); $i<$n; $i++) {
$this->add($_SESSION['messageToStack'][$i]['class'], $_SESSION['messageToStack'][$i]['text'], $_SESSION['messageToStack'][$i]['type']);
}
unset($_SESSION['messageToStack']);
}
}
// class methods
function add($class, $message, $type = 'error') {
if ($type == 'error') {
$this->messages[] = array('params' => 'class="alert alert-danger alert-dismissible"', 'class' => $class, 'text' => $message);
} elseif ($type == 'warning') {
$this->messages[] = array('params' => 'class="alert alert-warning alert-dismissible"', 'class' => $class, 'text' => $message);
} elseif ($type == 'success') {
$this->messages[] = array('params' => 'class="alert alert-success alert-dismissible"', 'class' => $class, 'text' => $message);
} else {
$this->messages[] = array('params' => 'class="alert alert-info alert-dismissible"', 'class' => $class, 'text' => $message);
}
}
function add_session($class, $message, $type = 'error') {
if (!isset($_SESSION['messageToStack'])) {
$_SESSION['messageToStack'] = array();
}
$_SESSION['messageToStack'][] = array('class' => $class, 'text' => $message, 'type' => $type);
}
function reset() {
$this->messages = array();
}
function output($class) {
$output = array();
for ($i=0, $n=sizeof($this->messages); $i<$n; $i++) {
if ($this->messages[$i]['class'] == $class) {
$output[] = $this->messages[$i];
}
}
return $this->alertBlock($output);
}
function size($class) {
$count = 0;
for ($i=0, $n=sizeof($this->messages); $i<$n; $i++) {
if ($this->messages[$i]['class'] == $class) {
$count++;
}
}
return $count;
}
}
and alertbox.php
class alertBlock {
// class constructor
function __construct($contents, $alert_output = false) {
$alertBox_string = '';
for ($i=0, $n=sizeof($contents); $i<$n; $i++) {
$alertBox_string .= ' <div';
if (isset($contents[$i]['params']) && tep_not_null($contents[$i]['params']))
$alertBox_string .= ' ' . $contents[$i]['params'];
$alertBox_string .= '>' . "n";
$alertBox_string .= ' <button type="button" class="close" data-dismiss="alert">×</button>' . "n";
$alertBox_string .= $contents[$i]['text'];
$alertBox_string .= ' </div>' . "n";
}
if ($alert_output == true) echo $alertBox_string;
return $alertBox_string;
}
}
Does anyone have an idea as to why this is happening? I’ve posted this exact question on the OSCommerce forums but as yet no reply so I thought I would ask here in case any of you kind people could possibly help.
2
Answers
You have to create method with different name from the class into the “alertBox” class then after you can easily access the method of this class!
Until PHP 7.0, you could define the constructor of a class by writing a function that has the exact same name as the class, which seems to be the case here :
extends alertBlock
and$this->alertBlock()
.Now, this behaviour is deprecated : PHP constructors
You can modify your
$this->alertBlock(args)
withparent::__construct(args)