Перейти к содержанию
tolkodelo

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

Рекомендуемые сообщения

Дорогие, уважаемые форумчане, помогите пожалуйста разобраться, как работает схема 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". Что не так делаю?...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • +1 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
52 минуты назад, tolkodelo сказал:

$articleCategories

Слабак :)

 

$data['articleCategories']

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

посмотрите

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

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

  • +1 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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']) { /*...*/ }
/*...*/ } ?>

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

Изменено пользователем tolkodelo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
17 minutes ago, n3bo said:

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


Идея!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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()) { /*.......*/}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
37 минут назад, tolkodelo сказал:

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

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

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 minutes ago, thentru said:

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


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

:eek:

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

в файле 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

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

Изменено пользователем tolkodelo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

			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));
			}

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

Изменено пользователем Shureg
  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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));
			} 
		 
     }
}
 ?>

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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);
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

$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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно так

return $names->rows;

 

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
print_r($test); // выдает array(=> array(=> элемент1) => array(=> элемент2))
print_r($test['0']); //выдает array(=> элемент1)
print_r($test['0']['0']); // ошибка Undefined offset

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 minutes ago, thentru said:

можно так


return $names->rows;

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

$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']);

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.