在drupal 8中调用未定义的方法问题

时间:2019-01-21 21:59:28

标签: php drupal twig

我正在将一个名为“ creditCheck”的变量插入一个名为 node--course.html.twig

的树枝模板中

我从一个名为 FormaRegis 的类开始,该类消除了一个名为 FormaEntity

的抽象类

这是功能:

namespace Drupal\docebo_login;

use Drupal\docebo_login\FormaEntity;


class FormaRegis extends FormaEntity {
.
.
.
public function completionCheck() {
        $check = false;

         if (parent::accessCheck()) {
            $sql = "SELECT count(*) as count FROM learning_courseuser
                    WHERE DATE_FORMAT(CURDATE(),'%d/%m/%Y') = DATE_FORMAT(date_complete,'%d/%m/%Y')
                    AND idUser =  " . $_SESSION['public_area_idst'];

            return $sql;
          }
          else {
            return "";
          }
}

在抽象类 FormaEntity 中,我有这个函数,应该从上一个函数 completionCheck()中获取sql字符串,并执行mysql查询并返回和对象。这是函数:

namespace Drupal\docebo_login;

use Drupal\Core\Access\AccessResult;

abstract class FormaEntity {
.
.
.
public function getCCresult() {
       if ($this->completionCheck() == "") {
          \Drupal\Core\Database\Database::setActiveConnection();
          return false;
       }

       $result = $this->connection->query($this->completionCheck())->fetch();
         \Drupal\Core\Database\Database::setActiveConnection();

       if ($result > 5 ) {
         $check = "fail";
       }
       else {
         $check = "pass";
       }

       return $check;
    }

在另一个名为 FormaNotification 的类中,该类还扩展了 FormaEntity 写入函数,该函数将能够从抽象类中调用函数 getCCresult() FormaEntity 这是功能:

namespace Drupal\docebo_login;

use Drupal\docebo_login\FormaEntity;

class FormaNotification extends FormaEntity {
.
.
.
public function getCreditResult() {

         return parent::getCCresult();
    }

最后,在我的.theme文件中,我编写了一个名为 txhs_preprocess_node__course(&$ variables)的函数,该函数调用了先前的函数,并应该从数据库中检索我获取的信息。但事实并非如此。这是我的主题功能:

use Drupal\docebo_login\FormaNotification;
use Drupal\docebo_login\FormaMyCourse;
use Drupal\docebo_login\FormaRegis;
use Drupal\Core\Url;
.
.
.
function txhs_preprocess_node__course(&$variables) {

  $noti = new FormaNotification();
  var_dump($noti->getCreditResult());
  exit;

  if ($noti->completionCheck() == "fail") {
      $check = "fail";
  }
  else {
    $check = "pass";
  }
   // $variables['creditCheck'] = "HI";

}

我尝试了很多操作,例如重命名功能,在主题文件中移动功能...但是我真的不知道自己在做什么错。

我正在运行php 7.2.11,带有drupal 8.5.6的mysql 5.0.12

我希望out是一个带有数字的对象,但是却出现错误:

  

网站遇到意外错误。请稍后再试。   错误:调用Drupal \ docebo_login \ FormaEntity-> getCCresult()中未定义的方法Drupal \ docebo_login \ FormaNotification :: completionCheck()(模块/custom/docebo_login/src/FormaEntity.php的第106行)。

1 个答案:

答案 0 :(得分:0)

好,所以您有一个基类和2个子类:

  • abstract class FormaEntity> FormaRegis
  • abstract class FormaEntity> FormaNotification

getCreditResult()上调用new FormaNotification()时失败,因为FormaEntity::getCCresult()中的第一行正在调用该抽象类中不存在的方法,即completionCheck()。再往下走$noti->completionCheck(),由于相同的原因也会失败。

根据您的代码的AFAICT,completionCheck()仅在FormaRegis中指定,这导致了您的问题。父类和FormaNotification都没有访问权限。