Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Помогите наконец разобраться с 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". Что не так делаю?...

Надіслати
Поділитися на інших сайтах


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
Надіслати
Поділитися на інших сайтах


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

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 в ОС "зарезервирована"  для шаблона " - нигде раньше я об этом не читал.

 

Надіслати
Поділитися на інших сайтах


  • 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

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

Змінено користувачем 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

Надіслати
Поділитися на інших сайтах


 

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

Надіслати
Поділитися на інших сайтах


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

$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
Надіслати
Поділитися на інших сайтах


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:

 

Надіслати
Поділитися на інших сайтах


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

$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 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.