Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal estou com o seguinte erro:
Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'Prova' does not have a method 'questoes' in /home/xxxx/public_html/xx/core/classes/MainController.class.php on line 218
Como posso resolve-los? Abaixo há os meu códigos:
ProvaData.class.php:
<?php
//header('Content-Type: text/plain');
class Questionario {
public $codprova;
public $titulo;
public $perguntas = array();
static public function getByCodigo($codprova){
$pdo = new PDO('mysql:host=localhost;dbname=prova','prova','**********');
$prova = null;
$sql = 'SELECT pr.codprova,
pr.titulo,
pe.codpergunta,
pe.texto as pergunta,
pe.ordem as ordem_pergunta,
op.codopcao,
op.texto as opcao,
op.ordem as ordem_opcao,
op.correta
FROM prova pr
LEFT JOIN pergunta pe ON pe.codprova = pr.codprova
LEFT JOIN opcao op ON op.codpergunta = pe.codpergunta
WHERE pr.codprova = :codprova
ORDER BY pe.ordem, op.ordem';
$rs = $pdo->prepare($sql);
$rs->bindValue( ':codprova', $codprova );
$rs->execute();
while($row = $rs->fetch(PDO::FETCH_ASSOC)){
if(empty($prova)){
$prova = new Prova();
$prova->codprova = $row['codprova'];
$prova->titulo = $row['titulo'];
}
if(!empty($row['codpergunta'])){
if(!isset($prova->perguntas[$row['codpergunta']])){
$pergunta = new Pergunta();
$pergunta->codpergunta = $row['codpergunta'];
$pergunta->codprova = $row['codprova'];
$pergunta->texto = $row['pergunta'];
$pergunta->ordem = $row['ordem_pergunta'];
$prova->perguntas[$row['codpergunta']] = $pergunta;
} else {
$pergunta = $prova->perguntas[$row['codpergunta']];
}
}
if(!empty($row['codopcao'])){
if(!isset($pergunta->opcoes[$row['codopcao']])){
$opcao = new Opcao();
$opcao->codopcao = $row['codopcao'];
$opcao->codpergunta = $row['codpergunta'];
$opcao->texto = $row['opcao'];
$opcao->ordem = $row['ordem_opcao'];
$opcao->correta = !empty($row['correta']);
$pergunta->opcoes[$row['codopcao']] = $opcao;
}
}
}
if(!empty($prova)){
$prova->perguntas = array_values($prova->perguntas);
foreach($prova->perguntas as $pergunta){
$pergunta->opcoes = array_values($pergunta->opcoes);
}
}
return $prova;
}
}<?php
// classe que representa prova
class Prova extends CodonModule {
public $codprova;
public $titulo;
public $perguntas = array();
public function index()
{
$this->render('Prova/index.tpl');
}
}
// Classe que representa pergunta
class Pergunta extends CodonModule {
public $codpergunta;
public $codprova;
public $texto;
public $ordem;
public $opcoes = array();
}
// Classe que representa opcao
class Opcao extends CodonModule {
public $codopcao;
public $codpergunta;
public $texto;
public $ordem;
public $correta;
}
Layout.tpl:
<?php
//// aqui você pode pegar por GET/POST/SESSION.
//// O que melhor servir no teu caso
$codprova = 1;
$prova = Prova::getByCodigo($codprova);
if(!empty($prova)){
echo '<h1>Exibindo as perguntas da prova: ',$prova->titulo,'</h1>';
echo '<ol>';
foreach($prova->perguntas as $pergunta){
echo '<li>',$pergunta->texto;
echo '<ul style="margin-bottom: 30px">';
foreach($pergunta->opcoes as $opcao){
printf('<li><label><input type="radio" name="pergunta[%d]" value="%d" /> %s</label></li>',
$opcao->codpergunta,
$opcao->codopcao,
$opcao->texto
);
}
echo '</ul>';
}
echo '</ol>';
}
?>>
Desculpa a pergunta, mas você leu o erro? Tentou traduzir se tiver sido o caso para compreender e tal?
Eu não sei o que seria essa classe CodonModule da qual a sua classe Prova deriva e ao longo dos códigos apresentados não vi menção à call_user_func_array().
Com isso, a experiência me leva a acreditar que você esteja usando algum framework específico e talvez até pouco conhecido que instancia classes e invoca métodos automaticamente utilizando-se dessa função (o que é bastante comum).
Basicamente, ele espera encontrar um método chamado questoes na declaração da classe Prova, o que, como pode ver, não existe, ocasionando o tal erro.
O fato é que seja qual for a procedência desse CodonModule, você não deveria ver esse erro... "cru", mas por ser desconhecido (pelo menos por mim), não posso dizer se ele tem um manipulamento de erro adequado ou não.
Se fosse pra chutar uma solução, eu diria que bastaria renomear método index para questoes.
Então amigo fiz isso e não funcionão, veja o meu MainController.class.php:
<?php
class MainController
{
public static $ModuleList = array();
public static $activeModule;
private static $stop_execute = false;
private static $listSize;
private static $keys = array();
public static $page_title;
public static function loadEngineTasks()
{
CodonRewrite::ProcessRewrite();
Vars::setParameters();
self::$activeModule = strtoupper(CodonRewrite::$current_module);
Config::loadSettings();
self::loadModules();
}
/**
* Search for any modules in the core/modules directory
* Then call loadModules() after building the list
*
* @param string $path Base folder from where to run modules
*/
protected static function getModulesFromPath($path)
{
$dh = opendir($path);
while (($file = readdir($dh)) !== false)
{
if($file != "." && $file != "..")
{
if(is_dir($path.'/'.$file))
{
$fullpath = $path . DS . $file . DS . $file . '.php';
if(file_exists($fullpath))
{
$file = strtoupper($file);
$modules[$file] = $fullpath;
}
}
}
}
closedir($dh);
return $modules;
}
/**
* Load and initialize any modules from a list
*
* @param array $ModuleList List of modules. $key is name, $value is path
*/
public static function loadModules()
{
global $NAVBAR;
global $HTMLHead;
self::$ModuleList = self::getModulesFromPath(CODON_MODULES_PATH);
if(empty(self::$ModuleList))
{
Debug::showCritical('No modules were found in module path! ('.CODON_MODULES_PATH.')');
return;
}
self::$listSize = sizeof(self::$ModuleList);
self::$keys = array_keys(self::$ModuleList);
for ($i=0; $i<self::$listSize; $i++)
{
$ModuleName = self::$keys[$i];
$ModuleController = self::$ModuleList[$ModuleName];
if(file_exists($ModuleController))
{
include_once $ModuleController;
if(class_exists($ModuleName))
{
$ModuleName = strtoupper($ModuleName);
global $$ModuleName;
$$ModuleName = new $ModuleName();
$$ModuleName->init($ModuleName); // Call the parent constructor
if(self::$activeModule == $ModuleName)
{
# Skip it for now, run it last since it's the active
# one, and may overwrite some other parameters
continue;
}
else
{
ob_start();
self::Run($ModuleName, 'NavBar');
$NAVBAR .= ob_get_clean();
self::Run($ModuleName, 'HTMLHead');
$HTMLHead .= ob_get_clean();
@ob_end_clean();
}
}
}
}
# Run the init tasks
ob_start();
self::Run(self::$activeModule, 'NavBar');
$NAVBAR .= ob_get_clean();
self::Run(self::$activeModule, 'HTMLHead');
$HTMLHead .= ob_get_clean();
@ob_end_clean();
}
/**
* Return an instance of the module/controller specified
*
*/
public static function getInstance($module)
{
$ModuleName = strtoupper($module);
global $$ModuleName;
// Make sure this module is valid
if(!is_object($$ModuleName))
{
return false;
}
return $$ModuleName;
}
/**
* This runs the Controller() function of all the
* modules, and gives priority to the module passed
* in the parameter
*
* @param string $module_priority Module that is called first
*
* Change - Oct 2009
* Makes this more "cake-esque" - check if the "Controller" function
* exists (for backwards compat), if it doesn't then run the function
* defined by the "action" bit in the URL
*/
public static function RunAllActions()
{
//$call_function = 'Controller';
$ModuleName = strtoupper(self::$activeModule);
global $$ModuleName;
// Make sure this module is valid
if(!is_object($$ModuleName))
{
Debug::showCritical("The module \"{$ModuleName}\" doesn't exist!");
return;
}
// Check if we have a function for the page we are calling
$name = CodonRewrite::$current_action;
if($name == '')
{
$call_function = 'index';
}
else
{
$call_function = $name;
}
/* Don't call self::Run() - parameters could change. They have to stay the same
due to the fact that outside modules, etc will still use Run(), so it has
to stay the same */
$ret = call_user_func_array(array($$ModuleName, $call_function), CodonRewrite::$params);
/* Set the title, based on what the module has, if it's blank,
then just set it to the module name */
self::$page_title = $$ModuleName->title;
if(strlen(self::$page_title) === 0)
{
self::$page_title = ucwords(strtolower($ModuleName));
}
return true;
}
/**
* Call a specific function in a module
* Function accepts additional parameters, and then passes
* those parameters to the function which is being called.
*
* @param string $ModuleName Name of the module to call
* @param string $MethodName Method in the module to call
* @return value
*/
public static function Run($ModuleName, $MethodName)
{
$ModuleName = strtoupper($ModuleName);
global $$ModuleName;
// have a reference to the self
if(!is_object($$ModuleName) || ! method_exists($$ModuleName, $MethodName))
{
return false;
}
// if there are parameters added, then call the function
// using those additional params
$args = func_num_args();
if($args>2)
{
$vals=array();
for($i=2;$i<$args;$i++)
{
$param = func_get_arg($i);
array_push($vals, $param);
}
return call_user_func_array(array($$ModuleName, $MethodName), $vals);
}
else
{
//no parameters, straight return
return $$ModuleName->$MethodName();
}
}
/**
* This stops execution of additional modules when
* RunAllActions() is being called. After the current
* module is called, no more of them will be called
* afterwards
*/
public static function stopExecution()
{
self::$stop_execute = true;
}
/**
* Seperate function because it will be expanded with API
* later on when the install routines, etc are included
* just makes sure the module is a valid one in the module's list
*
* @param string $Module See if $Module is a valid, initilized module
*/
protected static function valid_module($Module)
{
if(self::$ModuleList[$Module] != '')
return true;
}
/**
* Return the list of loaded modules
*
* @return array List of active modules
*/
public static function getModuleList()
{
return self::$ModuleList;
}
}Bom, minha posição quanto ao "Codon" cotinua a mesma. Porém nesse código já aparece o uso da função em questão.
E veja que onde ela aparece aparenta haver alguma relação com roteamento de URL.
Se você criar um método questoes na classe Prova, com um echo simples que seja, o que acontece? Teoricamente o erro deve sumir.
Desculpa a pergunta, mas você leu o erro? Tentou traduzir se tiver sido o caso para compreender e tal?
Eu não sei o que seria essa classe CodonModule da qual a sua classe Prova deriva e ao longo dos códigos apresentados não vi menção à call_user_func_array().
Com isso, a experiência me leva a acreditar que você esteja usando algum framework específico e talvez até pouco conhecido que instancia classes e invoca métodos automaticamente utilizando-se dessa função (o que é bastante comum).
Basicamente, ele espera encontrar um método chamado questoes na declaração da classe Prova, o que, como pode ver, não existe, ocasionando o tal erro.
O fato é que seja qual for a procedência desse CodonModule, você não deveria ver esse erro... "cru", mas por ser desconhecido (pelo menos por mim), não posso dizer se ele tem um manipulamento de erro adequado ou não.
Se fosse pra chutar uma solução, eu diria que bastaria renomear método index para questoes.