1.9 - Неустранимая ошибка: Вызов функции-члена в логическом


Я создал пользовательский модуль для единого входа с помощью Discourse.

Точная ошибка:

Неустранимая ошибка: Вызов функции-члена setsecret() на логическом в /главная/веб-сайт/public_html/приложение/дизайн/интерфейс/тема/путь/шаблон/пользовательские страницы/sso.phtml в строке 9

Я использую следующий шаблон sso.phtml:

<?php

$sso = Mage::app()->getLayout()->createBlock('namespace/ssohelper');




$secret = "secret_phrase";
$sso->setSecret($secret);

// load payload
$payload = $_GET['sso'];
$signature = $_GET['sig'];

// validate payload
if(!($sso->validatePayload($payload,$signature))) {
  // invalid, Deny
  header("HTTPS/1.1 403 Forbidden");
  echo("Bad SSO request");
  die();
}

$nonce = $sso->getNonce($payload);

$loggedIn = Mage::getSingleton('customer/session')->isLoggedIn();
 if($loggedIn) {
  $sess = Mage::getSingleton('customer/session');
  $username = $sess->getCustomer()->getUsername();
  $email = $sess->getCustomer()->getEmail();
  $external_id = $sess->getCustomer()->getId();

  $extraParameters = array(
     'username' => $username,
     'name' => $username,
    'avatar_url' => $avatar
   );
}


// build query string and redirect back to forum
$query = $sso->getSignInString($nonce, $external_id, $email, $extraParameters);
header('Location: https://forum.website.come/session/sso_login?' . $query);
exit(0);

Мой config.xml:

<?xml version="1.0"?>

<config>
    <modules>
        <Namespace_SsoHelper>
            <version>0.1.1</version>
        </Namespace_SsoHelper>
    </modules>    
    <global>
      <blocks>
        <ssohelper>
            <class>Namespace_SsoHelper_Block</class>
        </ssohelper>
      </blocks>
    </global>

  </config>

Мой SsoHelper.php с Block:

<?php

use Namespace\SsoHelper\Exception\PayloadException;


class Namespace_SsoHelper_Block_SsoHelper extends Mage_Core_Block_Template
{
  public function __construct(){
    parent::__construct();
    # getting default settings
  }

private $secret;


public function setSecret($secret)
{
    $this->secret = $secret;

    return $this;
}

/**
 * @param $payload
 * @param $signature
 * @return mixed
 */
public function validatePayload($payload, $signature)
{
    $payload = urldecode($payload);

    return $this->signPayload($payload) === $signature;
}

/**
 * @param $payload
 * @return mixed
 * @throws PayloadException
 */
public function getNonce($payload)
{
    $payload = urldecode($payload);
    $query = array();
    parse_str(base64_decode($payload), $query);
    if (!array_key_exists('nonce', $query)) {
        throw new PayloadException('Nonce not found in payload');
    }

    return $query['nonce'];
}

/**
 * @param $payload
 * @return mixed
 * @throws PayloadException
 */
public function getReturnSSOURL($payload)
{
    $payload = urldecode($payload);
    $query = array();
    parse_str(base64_decode($payload), $query);
    if (!array_key_exists('return_sso_url', $query)) {
        throw new PayloadException('Return SSO URL not found in payload');
    }

    return $query['return_sso_url'];
}

/**
 * @param $nonce
 * @param $external_id
 * @param $email
 * @param array $extraParameters
 * @return string
 */
public function getSignInString($nonce, $external_id, $email, $extraParameters = [])
{

    $parameters = array(
            'nonce'       => $nonce,
            'external_id' => $external_id,
            'email'       => $email,
        ) + $extraParameters;

    $payload = base64_encode(http_build_query($parameters));

    $data = array(
        'sso' => $payload,
        'sig' => $this->signPayload($payload),
    );

    return http_build_query($data);
}

/**
 * @param $payload
 * @return string
 */
    protected function signPayload($payload)
    {
        return hash_hmac('sha256', $payload, $this->secret);
    }
}

Я впервые создаю пользовательский модуль с использованием Block класс.

Author: Manashvi Birla, 2018-07-17

2 answers

Очень похоже на ответ Вивекса, но попробуйте заменить

$sso = Mage::app()->getLayout()->createBlock('namespace/ssohelper');

С

$sso = Mage::app()->getLayout()->createBlock('ssohelper/ssoHelper'); 

Я считаю, что пространство имен и корпус имени блока неверны. В конечном счете вызов createBlock ничего не возвращает, поэтому то, что вы передаете, не сопоставляется с созданным вами блоком.

 1
Author: Andrew Kett, 2018-07-18 03:00:03

Заменить

$sso = Mage::app()->getLayout()->createBlock('namespace/ssohelper');

С

$sso = Mage::app()->getLayout()->createBlock('ssohelper/ssohelper');

Это должно решить вашу проблему.

 0
Author: Vivek Kumar, 2018-07-17 23:19:24