Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

Помогите наконец разобраться с MVC


Recommended Posts

Дорогие, уважаемые форумчане, помогите пожалуйста разобраться, как работает схема MVC в opencart! С какого боку к ней не подбирался, ничего не получается ( идея вроде понятна, но ничего из того, что пишу, не работает.

Например. В теме есть блог. Мне надо добавить в навигационную цепочку (breadcrumbs) пункт, обозначающий категорию статьи в блоге/ Собрал по анаогии с существующими функциями.

В файле model пишу:

 

class ModelSimpleBlogArticle extends Model {
		
		public function getCategoryForBreadcrumbs($article_id = 0) {
			$sql = $this->db->query("SELECT * FROM `" . DB_PREFIX . "simple_blog_article_to_category WHERE simple_blog_article_id=" . $article_id);
			
			return $sql->rows;
		}
}

в файле controller пишу:

 

$articleCategories = $this->model_simple_blog_article->getCategoryForBreadcrumbs($this->request->get['simple_blog_article_id']);

в шаблоне пишу (чтобы проверить себя):

<?php print_r($articleCategories); ?>

Выдает мне "undefined variable". Что не так делаю?...

Link to post
Share on other sites

Во вью вы передаете массив $data, в контроллере так $data['articleCategories']

  • +1 2
Link to post
Share on other sites

52 минуты назад, tolkodelo сказал:

$articleCategories

Слабак :)

 

$data['articleCategories']

Вам же данные нужно передать в шаблон

посмотрите

$this->load->view('имя' , $data)

Так случилось, что переменная $data в ОС "зарезервирована"  для шаблона..

  • +1 2
Link to post
Share on other sites

n3bo,  chukcha,

спасибо за ответ! ^_^
 

Да, я видел, что рядом в коде так передается, ставил. Может быть, тогда делал ошибку в другом месте. Пробую...

Ну вот - в контроллере поставил

		$data['articleCategories'] = $this->model_simple_blog_article->getCategoryForBreadcrumbs($this->request->get['simple_blog_article_id']);

В шаблоне я должен поставить $data['articleCategories'] или  $articleCategories? В любом случае мне выдает undefined variable
 

И еще.... А почему я вижу в коде рядом? -

//контроллер

$article_info = $this->model_simple_blog_article->getArticle($simple_blog_article_id);
if($article_info) {

				$this->document->setTitle($article_info['article_title']);
				$this->document->setDescription($article_info['meta_description']);
				$this->document->setKeywords($article_info['meta_keyword']);

				if ($article_info['description']) {
					if (method_exists($this->document, 'add_AddThisMeta')) {
						$this->document->add_AddThisMeta('description', str_replace('"', '\'', strip_tags(html_entity_decode($article_info['description'], ENT_QUOTES, 'UTF-8'))));
					}
				}

				$data['article_info_found'] = $article_info; }

//шаблон

<?php if (isset($article_info_found)) { ?>
				<article class="article-info">
					<div class="article-title">
						<h1><?php echo $article_info['article_title'] ?></h1>
					</div>

					<div class="article-sub-title">
						<span class="article-date material-design-clock100"><?php echo $article_date_modified; ?></span>

						<?php if ($article_info['allow_comment']) { /*...*/ }
/*...*/ } ?>

И оно работает

Edited by tolkodelo
Link to post
Share on other sites

model_simple_blog_article а эта модель подключена?

 

Вообще в шаблое обращаетесь к articleCategories.

 

Вы бы сразу проверили приходят ли данные в контроллер, там сделать var_dump

  • +1 1
Link to post
Share on other sites

17 minutes ago, n3bo said:

Вы бы сразу проверили приходят ли данные в контроллер, там сделать var_dump


Идея!

Link to post
Share on other sites

Слушайте, а я писал переменные внутри вот этого метода:

class ControllerSimpleBlogArticle extends Controller {
	public function index() { /*.........*/ }}

Внутри метода index поместил код "$foo = 'bar'; var_dump($foo);" - не выводит. Внутри метода view выводит. Методы внутри контроллеров вообще идут стандартные?

Вообще, есть для Опенкарта что-то типа Кодекса, как для Вордпресса?

Теперь дальше:

//Внутри метода view прописал переменную 
$data['articleCategories'] = 'bar';

в шаблоне она успешно ВЫВОДИТСЯ:

echo $articleCategories;

//НО! Вот так не выводится - получаю БЕЛЫЙ ЭКРАН
$data['articleCategories'] = $this->model_simple_blog_article->getCategoryForBreadcrumbs($simple_blog_article_id);

//при этом на строку выше стоит, и ведь работает:
$article_info = $this->model_simple_blog_article->getArticle($simple_blog_article_id); 

А в модели рядом стоят:
public function getCategoryForBreadcrumbs($article_id = 0) { /*.......*/}
public function getArticles($data = array()) { /*.......*/}

Ну где же я косячу ((((

Link to post
Share on other sites

37 минут назад, tolkodelo сказал:

//НО! Вот так не выводится - получаю БЕЛЫЙ ЭКРАН $data['articleCategories'] = $this->model_simple_blog_article->getCategoryForBreadcrumbs($simple_blog_article_id);

ошибок в самом методе getCategoryForBreadcrumbs нет? что в логах сервера и ошибок, если получаете белый экран?

  • +1 1
Link to post
Share on other sites

9 minutes ago, thentru said:

ошибок в самом методе getCategoryForBreadcrumbs нет? что в логах сервера и ошибок, если получаете белый экран?


Стал выкладывать сюда код и увидел... Затесался странный апостроф в строку sql запроса! Убрал, заработало. Спасибо, уважаемые!!! )))) Сколько раз я подбирался к MVC опенкарта и бросал ))

:eek:

А есть подробная документация "от разработчиков" по Opencart? Типа как Кодекс ВордПресс? Вот например Chukcha писал " Так случилось, что переменная $data в ОС "зарезервирована"  для шаблона " - нигде раньше я об этом не читал.

 

Link to post
Share on other sites

  • 2 weeks later...

Смотрите, вот что я пишу.

в файле controller/additional/parents.php

<?php
class ControllerAdditionalParents extends Controller{
     public function index()
     {
 
		$data['test'] = "Тестовая переменная";
		$this->template = $this->config->get('config_template') . '/template/common/header.tpl';
		$this->response->setOutput($this->render());
		 
     }
}
 ?>

В common/header.tpl:

 

<?php echo $test;?>

Выдает Notice: Undefined variable: test

Что ему не так?

Edited by tolkodelo
Link to post
Share on other sites

Вывод от древней версии  ОС. Делайте по примеру категории

			if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/category.tpl')) {
				$this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/product/category.tpl', $data));
			} else {
				$this->response->setOutput($this->load->view('default/template/product/category.tpl', $data));
			}

ЗЫ: Только счас обратил внимание, что вы его еще и в хедер так лихо вывести пытаетесь) Не получится. У хедера свой контроллер.

Edited by Shureg
  • +1 1
Link to post
Share on other sites

8 minutes ago, Shureg said:

Вывод от древней версии  ОС. Делайте по примеру категории

 


Сделал, все равно undefined variable:

<?php
class ControllerAdditionalParents extends Controller{
     public function index()
     {
 
		$data['test'] = "Тестовая переменная";
		
		$this->template = $this->config->get('config_template') . '/template/common/header.tpl';
		
		 if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/common/header.tpl')) {
				$this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/common/header.tpl', $data));
			} else {
				$this->response->setOutput($this->load->view('default/template/common/header.tpl', $data));
			} 
		 
     }
}
 ?>

 

Link to post
Share on other sites

16 minutes ago, Shureg said:

Вывод от древней версии  ОС. Делайте по примеру категории


			if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/category.tpl')) {
				$this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/product/category.tpl', $data));
			} else {
				$this->response->setOutput($this->load->view('default/template/product/category.tpl', $data));
			}

 


Я вообще то делаю? Мне нужно переменную из контроллера вывести в шаблоне header

Link to post
Share on other sites

Нет, не то. Что бы вывести в  header, надо изменять catalog/controller/common/header.php

  • +1 1
Link to post
Share on other sites

 

8 minutes ago, Shureg said:

Нет, не то. Что бы вывести в  header, надо изменять catalog/controller/common/header.php

 

А если я хочу написать чисто свой контроллер? (Разбираюсь с MVC). Могу ли я подключить его потом в header через $data['test2'] = $this->load->controller('additional/parents');? Или по-другому, могу ли я прописать в своем новом контроллере что-то типа return $this->load->view('common/header', $data);
 

Link to post
Share on other sites

Подключить "левый" контроллер можете. Но свой вывод в нем делать не требуется. Посмотрите для примера контроллер home.php

  • +1 1
Link to post
Share on other sites

Посмотрите на то как реализован вывод позиций, например в контроллере категории
 

$data['column_left'] = $this->load->controller('common/column_left');

контроллер common/column_left возвращает готовый результат

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/common/column_left.tpl')) {
  return $this->load->view($this->config->get('config_template') . '/template/common/column_left.tpl', $data);
} else {
  return $this->load->view('default/template/common/column_left.tpl', $data);
}

 

  • +1 1
Link to post
Share on other sites

Если нужно передать одну переменную, рендерить не обязательно.

  • +1 1
Link to post
Share on other sites

Верно да, но мы ведь не знаем точной задачи ТС что он хочет в итоге вывести - шаблон или переменную

  • +1 1
Link to post
Share on other sites

38 minutes ago, thentru said:

Верно да, но мы ведь не знаем точной задачи ТС что он хочет в итоге вывести - шаблон или переменную


Я со скрипом разбираюсь в MVC Opencart, вот главная затея... Задача, которую я взял: получить из базы и вывести категории, у которых нет родителей.

Ага, thentru, понял насчет боковой колонки, это случай когда мы берем шаблон и с ним работаем в контроллере.

Вроде бы с вашей ангельской ^_^ помощью разобрался с выводом переменной, теперь вот ломаю голову над чем.

В модели:
 

		//получаем несколько имен категорий из базы
		$sql = 'SELECT name FROM shop_category_description WHERE category_id IN (1,2,3,4,5)';
		$names = $this->db->query($sql);
		
		foreach($names->rows as $value){
			$categories[] = $value;	
		}
	 
		return $categories;

В контроллере хедера:

 

$this->load->model("additional/categories");
$data['test'] = $this->model_additional_categories->get_parentless_categories();

В шаблоне print_r($test);

И он мне выдает массив с неназванными ключами, т.е.

Array(
     => Array(
         => Категория 1
        )
     => Array(
         => Категория 2
        )
  )

Я пытался сделать :

		$i = 0;
		foreach($parentless_categories_names as $name){
			$data['test'][$i] = implode($name);
			$i++;
		}

Результата ноль :wacko:

 

Link to post
Share on other sites

можно так

return $names->rows;

 

  • +1 1
Link to post
Share on other sites

print_r($test); // выдает array(=> array(=> элемент1) => array(=> элемент2))
print_r($test['0']); //выдает array(=> элемент1)
print_r($test['0']['0']); // ошибка Undefined offset

Хмммм.......

Link to post
Share on other sites

4 minutes ago, thentru said:

можно так


return $names->rows;

 

Спасибо за подсказку :lol: похихикал над собой

Link to post
Share on other sites

В общем, я пытался сделать так:

$sql = 'SELECT name FROM category_description WHERE category_id="121")';
$db = $this->db->query($sql);
$categories[] = array('id' => implode($value), 'name' => $db);

а надо было так, не учел что $db это объект:
 

$db = $this->db->query($sql);
$row = $db->rows;
$categories[] = array('id' => implode($value), 'name' =>$db->row['name']);

Что конечно не объясняет массива без ключей вообще (не с пустыми именами ключей, а вообще). Но хоть проблему решил.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.