[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: конфликт объектов в контроллере
Evgeny87
Есть контроллер C_Article. Его функция в зависимости от гет паратметров выбирать метод которым он будет отображать страницу со статьями. В конструкторе этого контроллера объявляются два свойства

function __construct()
{
$this->mArticle = M_Article::Instance();
$this->mComments = M_Comments::Instance();

}

Класс M_Article является моделью, которая занимается всеми манипуляциями со статьями. Класс M_Comments манипулирует комментариями.
В контроллере есть метод action_article()

<?php
public function
action_article()
{
$this->title .= '::Статьи';
$error = ERR_ARTICLE_NOT_FOUND;
if (!empty($_GET))
{
// Извлечение статьи.
$article = $this->mArticle->Get($_GET['id']);
if($article <> NULL)
{
$article['title'] = nl2br($article[0]['title']);
$article['content'] = nl2br($article[0]['content']);
$error = 0;
}
$comments = $this->mComments->Get($_GET['id']);
}

$this->content = $this->Template('v/v_article.php',array('article' => $article, 'error' => $error, 'comments'=>$comments));

$this->fill_left_block('article');
}
?>

по задумке этот метод выводит страницу со статьей, которую выцепляет из базы, за это отвечает M_Article . А под статьей выводятся комментарии к ней - M_Comments.
Проблема такова, что интерпретатор экземпляр класса M_Comments воспринимает как M_Article. И там где вызывается метод GET() класса
$comments = $this->mComments->Get($_GET['id']); интерпретатор берет этот метод из класса M_Article. Фактически он воспринимает так будто M_Comments это M_Article. Специально проверил это через
print_r(M_Comments::Instance()->Get($GET['id'])). Интерпретатор возвращает ассоциативный массив с полями из базы articles, а не comments. Если прописать в конструкторе сначала объявление свойства равным M_Comments. То как ни странно интепретатор будет видеть везде только M_Comments даже там где на самом деле класс M_Article. Вот такой бред. Что сделать чтобы все работало по задумке ? Где ошибка ?

<?php
class M_Article extends M_Bd

{
//Синглтон
public static function Instance()
{
if(self::$instance === null)
{
self::$instance = new M_Article;
}
return self::$instance;
}
//Конструктор
protected function __construct()
{
parent::__construct('articles', 'id_article');

}
//
// Список всех статей или статей на текущей странице
//

function articles_all($page_id = NULL)
{
if($page_id <> NULL)
{
if((int)$page_id <= 0)
return NULL;

$count = ARTICLES_ON_PAGE;
$shift = ($page_id - 1) * $count;
return $this->articles_some($shift,$count);
}
else
return
$this->articles_some();
}
//
// Получить $count статей после $shift
//

function articles_some($shift = NULL, $count = NULL)
{
$query = "SELECT *
FROM articles
ORDER BY id_article DESC"
; //LIMIT $shift,$count

if($count <> NULL)
$query .= " LIMIT $shift,$count";
$articles = $this->M_MSQL->Select($query);
return $articles;
}
//
// Кол-во страниц статей
//

function get_pages_count()
{
$query = "SELECT COUNT(*)
FROM articles"
;
$count = $this->M_MSQL->Select($query);
return ceil($count[0]['COUNT(*)'] / ARTICLES_ON_PAGE);
}
//
// Краткое описание статьи
//

function articles_intro($article)
{
$symb_limit = ARTICLE_INTRO_LIMIT;

$result_str = $article['content'];

if(strlen($result_str) > $symb_limit)
{
$result_str = substr($result_str,0,$symb_limit);
$temp_str = explode(' ',$result_str);
unset($temp_str[count($temp_str) - 1]);
$result_str = implode(' ',$temp_str) . '...';
}

return $result_str;
}
}


class M_Comments extends M_Bd
{
//Синглтон
public static function Instance()
{
if(self::$instance === null)
{
self::$instance = new M_Comments;
}
return self::$instance;
}
//Конструктор
protected function __construct()
{
parent::__construct('comments', 'id_article');

}

}



class M_Bd
{
public $table;
public $pk;
protected $M_MSQL;
protected static $instance;

//Синглтон
public static function Instance()
{
if(self::$instance === null)
{
$self::$instance = new M_Bd;
}
return self::$instance;
}
protected function __construct($table, $pk)
{
$this->table = $table;
$this->pk = $pk;
$this->M_MSQL = M_MSQL::Instance();
}
//
// Экранирование потенциально опасных символов
//

function protect_str($str)
{
return htmlspecialchars(mysql_real_escape_string($str));
}
//
//Выборка из базы конкретной статьи или комментариев
//

public function Get($id_article)
{
$t = "SELECT *
FROM
$this->table
WHERE
$this->pk = '%d'
ORDER BY
$this->pk DESC";
$query = sprintf($t, $id_article);
$result = $this->M_MSQL->Select($query);
return $result;
}
//
// Добавить статью
//

public function Add($title, $content)
{
// Подготовка.
$title = trim($title);
$content = trim($content);

// Проверка.
if ($title == '')
return false;

// Запрос.
$obj = array();
$obj['title'] = $title;
$obj['content'] = $content;

$this->msql->Insert($this->table, $obj);
return true;
}

//
// Изменить статью
//

public function Edit($id_article, $title, $content)
{
// Подготовка.
$title = trim($title);
$content = trim($content);

// Проверка.
if ($title == '')
return false;

// Запрос.
$obj = array();
$obj['title'] = $title;
$obj['content'] = $content;

$t = "id_article = '%d'";
$where = sprintf($t, $id_article);
$this->M_MSQL->Update($this->table, $obj, $where);
return true;
}

//
// Удалить статью
//

public function Delete($id_article)
{
// Запрос.
$t = "id_article = '%d'";
$where = sprintf($t, $id_article);
$this->M_MSQL->Delete($this->table, $where);
return true;
}
}

?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.