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

Статья из блога в карточке товара по тегу


sudya12345

Recommended Posts

Народ, нужна помощь, что-то я уперся и мыслю не туда, решение должно ж быть простое...

 

Имеем Opencart 3.0, есть на нем модуль блога со статьями.

Нужно чтобы к карточке товара подтягивалась статья/и по тегу. Поле для тега я добавил в карточке товара и редактируется в админке отдельно.

Есть статья на модуле Блога и в нем тоже есть теги.

 

Каким методом спарсить эти статьи по тегу из карточки товара?

Запрос в базу есть, отрабатывает на чистых запросах в phpmysql, но как передать переменную содержащую текст тега в запрос базы данных, ума не приложу (((((

 

Подскажите хоть в каком направление прорабатывать?

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


Вариан 1

если у статьи один тег, то в бд добавить поле к таблице статей и туда записывать этот тег, далее если для товара тоже тег один то так же сделать или в свободное поле писать

в выборке статьи добавить выбор того поля что добавили и при получении этого значения получать товар.

Вариант 2

если тег в статье и вида примерно #слово  то скорее всего нужно вытаскивать тег с помощью регулярки, далее если тот же тег присвоен к товару то по нему и выдергивать товар

Вариант 3

Писать тег в статью, далее добавить поле в бд к таблице статей и туда же записать этот тег, так же при выборке установить получение этого тега и потом уже дергать товар если к товару отдельно прикреплен тег.

 

Не ясно до конца

У вас один тег к статье и товару или по несколько?

Как прописываете тег в статье? Как его прописываете для товара?

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

3 часа назад, Venter сказал:

если тег в статье и вида примерно #слово  то скорее всего нужно вытаскивать тег с помощью регулярки

Можно в запросе искать типа SELECT * FROM таблица WHERE поле IN (explode(',',массив тэгов)) - как-то так (тэги могут храниться в сериализованном виде, в виде строки через запятые, в формате json), но нужно доработать запрос от контроллера в модель (сделать функцию). Или SELECT * FROM таблица WHERE поле LIKE %тэг% OR LIKE %тэг% и т.д.

Вариант 3 от Вентера наиболее подходит, но опять же - нужно доработать контроллер (админки и сайта)

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

7 часов назад, sudya12345 сказал:

Народ, нужна помощь, что-то я уперся и мыслю не туда, решение должно ж быть простое...

 

Имеем Opencart 3.0, есть на нем модуль блога со статьями.

Нужно чтобы к карточке товара подтягивалась статья/и по тегу. Поле для тега я добавил в карточке товара и редактируется в админке отдельно.

Есть статья на модуле Блога и в нем тоже есть теги.

 

Каким методом спарсить эти статьи по тегу из карточки товара?

Запрос в базу есть, отрабатывает на чистых запросах в phpmysql, но как передать переменную содержащую текст тега в запрос базы данных, ума не приложу (((((

 

Подскажите хоть в каком направление прорабатывать?

зачем к товару добавлять поле для тега, если оно по дефолту там есть?

 

в контроллере product.php примерно такой код добавить

 

$this->load->model('blog/article');

$article_data = array(
	'filter_tag'         => $product_info['tag'],
	'start'              => 0,
	'limit'              => 1
);

$results = $this->model_blog_article->getArticles($article_data);

 

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

3 часа назад, Blast сказал:

в контроллере product.php примерно такой код добавить

 


$this->load->model('blog/article');

$article_data = array(
	'filter_tag'         => $product_info['tag'],
	'start'              => 0,
	'limit'              => 1
);

$results = $this->model_blog_article->getArticles($article_data);

 

вот моя конструкция в контроллере product.php

$data['blogtag'] = array();
				
$filter_data = array(
'filter_tag'         => $product_info['tag'],
'start'              => 0,
'limit'              => 1
);

$blogs = $this->model_blog_blog->getBlogs($filter_data);

foreach ($blogs as $blog) {

$data['blogtag'][] = array(
	'title'  => $blog['title'],
	'description' => html_entity_decode($blog['description']),
	'href' => $this->url->link('blog/blog', 'blog_id=' . $blog['blog_id'])
	);
}

вот модель функции getBlogs в блоге

	public function getBlogs($data, $start = 0, $limit = 30) {
		$sql = "SELECT * FROM " . DB_PREFIX . "blog i LEFT JOIN " . DB_PREFIX . "blog_description id ON (i.blog_id = id.blog_id) LEFT JOIN " . DB_PREFIX . 			"blog_to_store i2s ON (i.blog_id = i2s.blog_id) WHERE id.language_id = '" . (int)$this->config->get('config_language_id') . "' AND i2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND i.status = '1' AND i.sort_order <> '-1'";
		
		if(!empty($data['filter_tag'])){
			$parts = explode (",",$data['filter_tag'] );
			
			if(count($parts) > 1) {
				$tags = array();
                
				foreach($parts as $part) {
					$tags[] = 'id.tags LIKE "%' . $this->db->escape($part) . '%"';
					
				}
                
				$sql .= ' AND  ' . implode(" OR ", $tags ) . ' ';	

			} else {
				$sql .= ' AND id.tags LIKE "%' . $this->db->escape($data['filter_tag']) . '%"';
			}
		}
        
        $sql .= " ORDER BY i.sort_order, i.blog_id DESC LIMIT " . (int)$start . "," . (int)$limit;
		
        $query = $this->db->query($sql);
		
		return $query->rows;
	}

но данных нет(((

колонка tag в продукте TEXT

колонка tags в блоге VARCHAR

 

 

 

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


58 минут назад, sudya12345 сказал:

 

вот моя конструкция в контроллере product.php


$data['blogtag'] = array();
				
$filter_data = array(
'filter_tag'         => $product_info['tag'],
'start'              => 0,
'limit'              => 1
);

$blogs = $this->model_blog_blog->getBlogs($filter_data);

foreach ($blogs as $blog) {

$data['blogtag'][] = array(
	'title'  => $blog['title'],
	'description' => html_entity_decode($blog['description']),
	'href' => $this->url->link('blog/blog', 'blog_id=' . $blog['blog_id'])
	);
}

вот модель функции getBlogs в блоге


	public function getBlogs($data, $start = 0, $limit = 30) {
		$sql = "SELECT * FROM " . DB_PREFIX . "blog i LEFT JOIN " . DB_PREFIX . "blog_description id ON (i.blog_id = id.blog_id) LEFT JOIN " . DB_PREFIX . 			"blog_to_store i2s ON (i.blog_id = i2s.blog_id) WHERE id.language_id = '" . (int)$this->config->get('config_language_id') . "' AND i2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND i.status = '1' AND i.sort_order <> '-1'";
		
		if(!empty($data['filter_tag'])){
			$parts = explode (",",$data['filter_tag'] );
			
			if(count($parts) > 1) {
				$tags = array();
                
				foreach($parts as $part) {
					$tags[] = 'id.tags LIKE "%' . $this->db->escape($part) . '%"';
					
				}
                
				$sql .= ' AND  ' . implode(" OR ", $tags ) . ' ';	

			} else {
				$sql .= ' AND id.tags LIKE "%' . $this->db->escape($data['filter_tag']) . '%"';
			}
		}
        
        $sql .= " ORDER BY i.sort_order, i.blog_id DESC LIMIT " . (int)$start . "," . (int)$limit;
		
        $query = $this->db->query($sql);
		
		return $query->rows;
	}

но данных нет(((

колонка tag в продукте TEXT

колонка tags в блоге VARCHAR

 

 

 

ну логически вроде все верно. Проверяйте заданы ли записи блога для текущего языка и магазина. Сделайте дамп получившегося запроса и выполните его в PhpMyAdmin. Просмотрите ошибки в лог-файле.

не забывайте обновлять модификаторы и кэш шаблона

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

вот так работает

    public function getBlogs($data, $start = 0, $limit = 30) {
		$sql = "SELECT DISTINCT * FROM " . DB_PREFIX . "article i 
		      LEFT JOIN " . DB_PREFIX . "article_description id ON (i.article_id = id.article_id) 
			  LEFT JOIN " . DB_PREFIX . "article_to_store i2s ON (i.article_id = i2s.article_id) 
			  WHERE id.language_id = '" . (int)$this->config->get('config_language_id') . "' 
			  AND i2s.store_id = '" . (int)$this->config->get('config_store_id') . "' 
			  AND i.status = '1' AND i.sort_order <> '-1'";
		
			
		if(!empty($data['filter_tag'])){
			$parts = explode (",",$data['filter_tag'] );
			
			if(count($parts) > 1) {
				$tags = array();
                
				foreach($parts as $part) {
					$tags[] = 'id.tag LIKE "%' . $this->db->escape($part) . '%"';
					
				}
                
				$sql .= ' AND  ' . implode(" OR ", $tags ) . ' ';	

			} else {
				$sql .= ' AND pd.tag LIKE "%' . $this->db->escape($data['filter_tag']) . '%"';
			}
		}
        
        $sql .= " ORDER BY i.sort_order DESC LIMIT " . (int)$start . "," . (int)$limit;
		
        $query = $this->db->query($sql);
		
        //смотрим что в массиве
		echo '<pre>'; print_r($query); echo '</pre>';
		
		return $query->rows;
	}
	    $filter = array(
			'filter_tag' => 'бублик, булка',
			);
			
		$this->getBlogs($filter, 0, 7);

только у нас названия таблиц разные и поле тега называется tag

Змінено користувачем Venter
  • +1 1
Надіслати
Поділитися на інших сайтах

33 минуты назад, Venter сказал:

$sql .= ' AND id.tags LIKE "%' . $this->db->escape($data['filter_tag']) . '%"';

в бд внимательно гляньте у вас поле tag или tags у меня поле tag

минус в том что если у продукта к примеру два тега и у одного поста такие же есть два тега, то один и тот же пост будет выводиться повторно

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

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

 

Вы вообще что хотите получить от этого запроса? Вывод постов где есть тег?

вывод статьи(ей) в карточке товара, у которого такой же тег как и у статьи

нужен список заголовков с картинками этих статьей 

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


3 минуты назад, sudya12345 сказал:

вывод статьи(ей) в карточке товара, у которого такой же тег как и у статьи

нужен список заголовков с картинками этих статьей 

выше запрос выложил который у меня работает, по сути только это ваш запрос только название таблиц поменял

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

5 минут назад, Venter сказал:

в бд внимательно гляньте у вас поле tag или tags у меня поле tag

в модели блога поле tags, а вот в товаре просто tag

 

но я ведь отдаю в функцию обработки запросов по блогам в переменной filter_tag=$product_info['tag']

 

7 минут назад, Venter сказал:

минус в том что если у продукта к примеру два тега и у одного поста такие же есть два тега, то один и тот же пост будет выводиться повторно

для этого и создавал отдельное поле, чтобы указать один тег или несколько но уникальных, но это сейчас не проблема

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


14 минут назад, sudya12345 сказал:

в модели блога поле tags, а вот в товаре просто tag

 

но я ведь отдаю в функцию обработки запросов по блогам в переменной filter_tag=$product_info['tag']

 

для этого и создавал отдельное поле, чтобы указать один тег или несколько но уникальных, но это сейчас не проблема

выше в запросе спецом поставил

echo '<pre>'; print_r($query); echo '</pre>';

чтоб вы видели что приходит вам в массив

проверьте какой у вас сейчас стоит language_id и store_id

echo $this->config->get('config_language_id');

echo $this->config->get('config_store_id');

потом идите в бд и посмотрите какие данные в полях store_id и language_id

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

18 минут назад, sudya12345 сказал:

но я ведь отдаю в функцию обработки запросов по блогам в переменной filter_tag=$product_info['tag']

да и еще бы посмотреть что у вас вообще прилетает в $product_info['tag']

echo $product_info['tag'];

 

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

10 минут назад, sudya12345 сказал:

эммм, а как это сделать на twig?

зачем это делать в твиге??? в контройлере пропишите и в самом верху увидите. Переходите на страницу продукта и вот в этом контройлере и пропишите

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

1 час назад, Venter сказал:

echo $this->config->get('config_store_id');

вот эта сволочь)))

в модуле блога в самой базе не было привязки статьи к id магазина никакой, выдавало пустоту

были только категории к магазину подтянуты

 

Спасибо за наводку ;)

Змінено користувачем sudya12345
Надіслати
Поділитися на інших сайтах


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

эммм, а как это сделать на twig?

контройлер откройте product/product.php

после 

$product_info = $this->model_catalog_product->getProduct($product_id);

пропишите

echo '<pre>'; print_r($product_info); echo '</pre>';

перейдите на страницу продукта у которого есть тег, или у которого вы вроде как ставили теги

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

1 час назад, sudya12345 сказал:

вот эта сволочь)))

в модуле блога в самой базе не было привязки статьи к id магазина никакой, выдавало пустоту

были только категории к магазину подтянуты

 

Спасибо за наводку ;)

 

 

3 часа назад, Blast сказал:

ну логически вроде все верно. Проверяйте заданы ли записи блога для текущего языка и магазина. Сделайте дамп получившегося запроса и выполните его в PhpMyAdmin. Просмотрите ошибки в лог-файле.

не забывайте обновлять модификаторы и кэш шаблона

эммм, тут разве не то же самое написано?

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

4 часа назад, Blast сказал:

эммм, тут разве не то же самое написано?

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

 

и вам спасибо;)

 

 

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


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

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

×
×
  • Створити...

Important Information

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