skip to Main Content

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">&times;</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


  1. 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!

    Login or Signup to reply.
  2. 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

    Old style constructors are DEPRECATED in PHP 7.0, and will be removed in a future version. You should always use __construct() in new code.

    You can modify your $this->alertBlock(args) with parent::__construct(args)

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search