Jump to content

adeiit

Пользователь
  • Content Count

    16
  • Joined

  • Last visited

Posts posted by adeiit

  1. Установка моей версии "Допилинного поиска AJAX"

     

    1. Открываем файл: ajax/search_products.php

    2. Вместо: 

    $keyword = $simpla->request->get('query', 'string'); 

     

    Вставляем 

    $keyword = $simpla->request->get('query', 'string');
    $SearchCategory = $simpla->request->get('category', 'string');    
        
        /**ПОИСК КАТЕГОРИЙ**/
        if($SearchCategory == 1)
        {
            $simpla->db->query('SELECT `parent_id`, `name`, `url`, `image` FROM `s_categories` WHERE (`name` LIKE "%'.mysql_real_escape_string($keyword).'%" OR `meta_keywords` LIKE "%'.mysql_real_escape_string($keyword).'%" OR `meta_keywords` LIKE "%'.mysql_real_escape_string($keyword).'%") AND visible=1 ORDER BY `name` LIMIT 2', $limit);
            $categories = $simpla->db->results();
            
            foreach($categories as $category){
                
                if($category->image == "")$category->image = "noimage_category.jpg";            
                $category->image = "/files/categories/".$category->image;
                
                $products_names[] = $category->name;
                
                getCategoryTreeUrl($category->url,$category->parent_id,Array());
                $category->url = "/catalog/".$category->url;
                
                $category->thiss = "category";
                $products_data[] = $category;
            }
        } 

     

    3. Находим запрос в базу стандартный:

    $simpla->db->query('SELECT p.id, p.name, i.filename as image FROM __products p
                            LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1)
                            WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 ORDER BY p.name LIMIT ?', $limit);
    

    Заменяем на .... ВЫБЕРИТЕ НУЖНЫЙ ИЗ ЧЕТЫРЕХ:

       3.1. Стандартный вывод искомых товаров SIMPLA, НО из результатов поиска убираются товары, кол-во которых равно НУЛЮ. За это отвечает условие "AND (v.stock>0 OR v.stock is NULL)" при необходимости можно удалить, чтобы показывались все товары, даже которых нет в наличии.

    $simpla->db->query('SELECT p.id, p.name, p.url, v.price, i.filename as `image` FROM s_products p
    						JOIN __variants v ON v.product_id=p.id
    						LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1)
                            WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?', $limit); 

     

       3.2. Запрос: Если у товара несколько вариантов, то выводит так же и имя варианта, напр. IPhone Белый, IPhone Черный

    $simpla->db->query('SELECT p.id, CONCAT_WS(" ",p.name,v.name) as `name`, p.url, v.price, i.filename as `image` FROM __products p
    						JOIN __variants v ON v.product_id=p.id
    						LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1)
                            WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?', $limit); 

       3.3. Запрос для дополнения предыдущего, добавляет к ссылке товара ?variant=ID для перехода из поиска сразу к выбранному варианту товара

    $simpla->db->query('SELECT p.id, CONCAT_WS(" ",p.name,v.name) as `name`,  REPLACE(CONCAT_WS("?", p.url, CAST(v.position AS CHAR)),"\'","") as `url`, v.price, i.filename as `image` FROM __products p
    						JOIN __variants v ON v.product_id=p.id
    						LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1)
                            WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?',"?variant=", $limit);
    

       3.4 Запрос, выводит только один товар, первый вариант товара в поиске, даже если их несколько.

    $simpla->db->query('SELECT p.id, p.name, p.url, v.price, i.filename as `image` FROM s_products p
    						JOIN __variants v ON v.product_id=p.id
    						LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1)
                            WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) GROUP BY v.product_id ORDER BY p.name LIMIT ?', $limit);
    

     

    4. Находим:

    foreach($products as $product)
    	{
    		if(!empty($product->image))
    			{
    				$product->image = $simpla->design->resize_modifier($product->image, 35, 35);
    				$products_names[] = $product->name;
    			}
    		else
    			$products_names[] = $product->name;	
    				
    		$products_data[] = $product;
    	}
    

    Заменяем на:

    foreach($products as $product)
    	{
    		if(!empty($product->image))
    			{
    				$product->image = $simpla->design->resize_modifier($product->image, 35, 35);
    				$products_names[] = $product->name;
    			}
    		else{
    			$product->image = "noproductimage.jpg";
    			$products_names[] = $product->name;	
    			}
    		$product->url = "/products/".$product->url;
    		$products_data[] = $product;
    	}
    

     

     

    ЕСЛИ У ВАС СТАНДАРТНЫЙ НЕ ИЗМЕННЫЙ  ФАЙЛ, ТО ВОТ СОДЕРЖИМОЕ ВСЕГО ФАЙЛА:

    <?php
    	chdir('..');
    	require_once('api/Simpla.php');
    	$simpla = new Simpla();
    	$limit = 30;
    	
    	$keyword = $simpla->request->get('query', 'string');
    	$SearchCategory = $simpla->request->get('category', 'string');	
    	
    	/**ПОИСК КАТЕГОРИЙ**/
    	if($SearchCategory == 1)
    	{
    		$simpla->db->query('SELECT `parent_id`, `name`, `url`, `image` FROM `s_categories` WHERE (`name` LIKE "%'.mysql_real_escape_string($keyword).'%" OR `meta_keywords` LIKE "%'.mysql_real_escape_string($keyword).'%" OR `meta_keywords` LIKE "%'.mysql_real_escape_string($keyword).'%") AND visible=1 ORDER BY `name` LIMIT 2', $limit);
    		$categories = $simpla->db->results();
    		
    		foreach($categories as $category){
    			
    			if($category->image == "")$category->image = "noimage_category.jpg";			
    			$category->image = "/files/categories/".$category->image;
    			
    			$products_names[] = $category->name;
    			
    			getCategoryTreeUrl($category->url,$category->parent_id,Array());
    			$category->url = "/catalog/".$category->url;
    			
    			$category->thiss = "category";
    			$products_data[] = $category;
    		}
    	}
    	
    	/**ПОИСК ТОВАРОВ**/
    	
    	$simpla->db->query('SELECT p.id, CONCAT_WS(" ",p.name,v.name) as `name`, p.url, v.price, i.filename as `image` FROM __products p
                            JOIN __variants v ON v.product_id=p.id
                            LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1)
    WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?', $limit);
    	$products = $simpla->db->results();
    
    	foreach($products as $product)
    	{
    		if(!empty($product->image))
    			{
    				$product->image = $simpla->design->resize_modifier($product->image, 35, 35);
    				$products_names[] = $product->name;
    			}
    		else{
    			$product->image = "noproductimage.jpg";
    			$products_names[] = $product->name;	
    			}
    		$product->url = "/products/".$product->url;
    		$products_data[] = $product;
    	}
    	
    	
    	$res->query = $keyword;
    	$res->suggestions = $products_names;
    	$res->data = $products_data;
    	header("Content-type: application/json; charset=UTF-8");
    	header("Cache-Control: must-revalidate");
    	header("Pragma: no-cache");
    	header("Expires: -1");		
    	print json_encode($res);
    
    

    Файлы JS и CSS.

    Удалите существующие в /js/autocomplete/ и замените на файлы из архива.

    attachicon.gifautocomplete.zip

    Подключать, так:

          <link href="/js/autocomplete/autocomplete/auto.complete.css" rel="stylesheet" type="text/css" />
          <script src="/js/autocomplete/autocomplete/jquery.autocomplete-min.js" type="text/javascript"></script>
          <script src="/js/autocomplete/autocomplete/auto.complete.js" type="text/javascript"></script>
    

     

    Чтобы настроить ширину всплывающих подсказок, откройте файл auto.complete.js и измените значение width

     

    Так же создайте для себя изображения, если отсутствует лого товара или категории, названия и месторасположения такие:

    • Для категории: /files/categories/noimage_category.jpg
    • Для товара: /files/products/noproductimage.jpg

    Вроде бы все. И вроде ничего не упустил, пробуйте, менял код кое где на ходу, потому что генерация URL товаров и категорий у меня измененная!

     

    Сообщено обновлено 15.03.2014 - изменены запросы к БД с различными условиями вывода и компановки результатов поиска! Пункт 3

    Пытался поставить, 2.3.3 версия, не работает, поиск выводит теперь один и тот же столбец с одинаковыми товарами, всё сделал по инструкции

  2. в логах это

    [Sun Jan 03 20:19:22 2016] [error] [client 95.31.102.89:34967] AH01276: Cannot serve directory /home/a/adeiit0l/top-sale46.ru/public_html/files/brands/: No matching DirectoryIndex (index.shtml,index.html,index.php,index.htm) found, and server-generated directory index forbidden by Options directive, referer http://top-sale46.ru/products/mtv-4828lta2-
    [Sun Jan 03 20:19:22 2016] [info] [client 95.31.102.89:34853] AH00128: File does not exist: /home/a/adeiit0l/top-sale46.ru/public_html/js/fancybox/jquery.fancybox-1.3.4.css, referer http://top-sale46.ru/products/mtv-4828lta2-
    [Sun Jan 03 20:19:23 2016] [error] [client 95.31.102.89:34853] AH01276: Cannot serve directory /home/a/adeiit0l/top-sale46.ru/public_html/files/brands/: No matching DirectoryIndex (index.shtml,index.html,index.php,index.htm) found, and server-generated directory index forbidden by Options directive, referer http://top-sale46.ru/products/mtv-4828lta2-
    [Sun Jan 03 20:19:23 2016] [info] [client 95.31.102.89:34853] AH00128: File does not exist: /home/a/adeiit0l/top-sale46.ru/public_html/design/QFood/images/v_blue_on_white_ru.png, referer http://top-sale46.ru/products/mtv-4828lta2-
    [Sun Jan 03 20:19:23 2016] [info] [client 95.31.102.89:35301] AH00128: File does not exist: /home/a/adeiit0l/top-sale46.ru/public_html/design/citymarket_1/images/bg/sub-nav-marker.gif, referer http://top-sale46.ru/design/citymarket_1/css/style.css
    [Sun Jan 03 20:19:24 2016] [info] [client 95.31.102.89:34853] AH00128: File does not exist: /home/a/adeiit0l/top-sale46.ru/public_html/js/fancybox/jquery.fancybox-1.3.4.pack.js, referer http://top-sale46.ru/products/mtv-4223lt2-
    [Sun Jan 03 20:19:24 2016] [info] [client 95.31.102.89:35597] AH00128: File does not exist: /home/a/adeiit0l/top-sale46.ru/public_html/js/fancybox/jquery.fancybox-1.3.4.css, referer http://top-sale46.ru/products/mtv-4223lt2-
    [Sun Jan 03 20:19:25 2016] [info] [client 95.31.102.89:35597] AH00128: File does not exist: /home/a/adeiit0l/top-sale46.ru/public_html/js/fancybox/jquery.fancybox-1.3.4.pack.js, referer http://top-sale46.ru/products/mtv-4223lt2-
    [Sun Jan 03 20:19:25 2016] [info] [client 95.31.102.89:35663] AH00128: File does not exist: /home/a/adeiit0l/top-sale46.ru/public_html/design/QFood/images/v_blue_on_white_ru.png, referer http://top-sale46.ru/products/mtv-4223lt2-
    
  3. Всем привет! И с наступившим новым годом!


    Облазил весь форум и не нашел рабочего решения в качестве парсинга картинок и характеристик.


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


    но с помощью него не парсит фотки (не могу сказать почему)


    В качестве характеристик насколько я понимаю есть родной парсер симплы
    но он также не работает, кто сталкивался с данной проблемой? Есть ли
    какие решения?

  4. Вот здесь расписывается, как создать дополнительную страницу - галерею, но в Вашем случае это будут бренды. Т.е. вместо галереи выводите бренды.

    Спасибо, задачу решил, столкнулся с новой проблемой.

     

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

  5. Да верно потому как инструкция не полная, точнее косячная. Итак по пунктам:

    Правим контроллер api/Brands.php:

    Добавляем свою функцию, которая генерирует бренды: (я вставил после функции  public function delete_image($brand_id))

     

    	public function get_rand_brands($count = 2)
    	{
    		$brands = array();
    		$category_id_filter = '';
    		// Выбираем все бренды
    		$query = $this->db->placehold("SELECT id, name, url, meta_title, meta_keywords, meta_description, description, image FROM __brands WHERE 1 ORDER BY RAND() LIMIT $count");
    		$this->db->query($query);
     
    		return $this->db->results();
    	}
    

     

    Далее в файле view/IndexView.php сразу после function fetch() { вставляем:

    $brandni = $this->brands->get_rand_brands(15);
          $this->design->assign('brandni', $brandni);
    

    get_rand_brands(15) - 15 это число брендов выведенных в блоке.

     

    Теперь в шаблоне design/{ваш_шаблон}/index.tpl вместо полного списка брендов, будет выводить случайный набор:

    В любом месте шаблона вставьте:

     

    <h2>Производители</h2>
                     <div class="catalog_menu">
                      
                      <ul>
     
            	   {foreach $brandni as $brandss}
            		<!-- Бренд -->
            		<li>            
                		<!-- Фото бренда -->          
                		 {if $brandss->image}
                			<div><a href="brands/{$brandss->url}"><img src="./files/brands/{$brandss->image}" alt="{$brandss->name|escape}"/></a></div>
                		 {else}
                		  <!-- Фото бренда (The End) -->
                		  <!-- Название бренда -->
                		  <h3><a href="brands/{$brandss->url}">{$brandss->name|escape}</a></h3>
                		  <!-- Название бренда (The End) -->  
                             {/if}
            		<!-- Бренд (The End)-->
                       	
            	  {/foreach}    
        		  </ul>
                      <hr>
                      <b><center><a href="brands/">Все бренды</a><center></b>
                     </div>
    

    Добавим с .htaccess перекидку на новый модуль — сразу после RewriteRule ^products/?$    index.php?module=ProductsView [L,QSA] Вставляем:

    RewriteRule ^brands/?$    index.php?module=BrandsView [L,QSA]
    

    Создаем файл подготовки данных view/BrandsView.php, который формирует данные для страницы брендов.

    <?PHP
    require_once('View.php');
    class BrandsView extends View
    {
        function fetch()
        {   
            // Выбираем товар из базы
            $this->design->assign('meta_title', 'Все производители');
            $this->design->assign('meta_keywords', 'Все производители');
            $this->design->assign('meta_description', 'Все производители');
     
            $brands = $this->brands->get_brands();
            $this->design->assign('brands', $brands);
     
            return $this->design->fetch('brands.tpl');
        }
    }
    

    И теперь делаем вывод всего этого в новый шаблон design/{ваш_шаблон}/brands.tpl (этот файл нужно создать)

    {if $brands}
     
        <!-- Список брендов -->
        <ul>
     
            {foreach $brands as $brand}
            <!-- Бренд -->
            <li>            
                <!-- Фото бренда -->          
                {if $brand->image}
                <div><a href="brands/{$brand->url}"><img src="./files/brands/{$brand->image}" alt="{$brand->name|escape}"/></a></div>
                {/if}
                <!-- Фото бренда (The End) -->
                <!-- Название бренда -->
                <h3><a href="brands/{$brand->url}">{$brand->name|escape}</a></h3>
                <!-- Название бренда (The End) -->  
            </li>
            <!-- Бренд (The End)-->
            {/foreach}    
        </ul>
        <!-- Список брендов (The End)-->
        {else}
        Бренды не найдены<br /><br />
        {/if}
    

    Вот и все работает! Пример http://s.intimdolgopa.ru 

    делал всё как вы говорили, но после изменения файла brands.php симпла выдала ошибку, Parse error: syntax error, unexpected T_PUBLIC in Z:\home\lec\www\api\Brands.php on line 132

  6. Вариантов решения уйма. Можно бренды выводить каруселью, можно выпадающим списком, можно отдельной страницей, можно в попапе, Вам решать, что для Вас красиво, а что нет.

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

  7. Приветствую всех, столкнулся с такой проблемой - большое количество брендов в каталоге, и соответственно на главной страничке, и смотрится дико не красиво. Как можно решить данную задачу?

    Скрин в архиве прилагаю, заранее извиняясь что в архиве, по-другому не умею)

  8. попробуйте заменить в simpla/ajax/import.php функцию private function import_category($category)

    на мою:

     

    private function import_category($category)
    {			
    	// Поле "категория" может состоять из нескольких имен, разделенных subcategory_delimiter-ом
    	// Только неэкранированный subcategory_delimiter может разделять категории
    	$delimiter = $this->subcategory_delimiter;
    	$regex = "/\\DELIMITER((?:[^\\\\\DELIMITER]|\\\\.)*)/";
    	$regex = str_replace('DELIMITER', $delimiter, $regex);
    	$names = preg_split($regex, $category, 0, PREG_SPLIT_DELIM_CAPTURE);
    	$id = null;   
    	$parent = 0; 
    	
    	// получаем последнюю категорию товара в цепочке и ищем ее в каталоге
    	$last_cat = end($names);
    	$this->db->query('SELECT id FROM __categories WHERE name=?', $last_cat);
    	$id = $this->db->result('id');
    
    	// если мы нашли категорию, сразу возвращаем ее айди, если нет, добавляем категорию по иерархии
    	if(empty($id)) {
    		// Для каждой категории
    		foreach($names as $name)
    		{
    			// Заменяем \/ на /
    			$name = trim(str_replace("\\$delimiter", $delimiter, $name));
    			if(!empty($name))
    			{
    				// Найдем категорию по имени
    				$this->db->query('SELECT id FROM __categories WHERE name=? AND parent_id=?', $name, $parent);
    				$id = $this->db->result('id');
    				
    				// Если не найдена - добавим ее
    				if(empty($id))
    					$id = $this->categories->add_category(array('name'=>$name, 'parent_id'=>$parent, 'meta_title'=>$name,  'meta_keywords'=>$name,  'meta_description'=>$name, 'url'=>$this->translit($name)));
    
    				$parent = $id;
    			}	
    		}
    	}
    	return $id;
    }
    

    работает так: выбирает последнюю категорию в цепочке (если указана главная и субкатегории), если такая категория найдена по имени, возвращает сразу айди этой категории и вставляет туда товар. если категория не найдена, она добавляется с учетом указанной иерархии в импорте (так как по умолчанию).

    Показать

    тоесть, если у вас указано у товара1 категория Коляски/Аксессуары, а у товара2 просто Аксессуары оба тавара добавит в категорию Коляски/Аксессуары, учтите, одинаковых имен быть не должно, иначе добавит в первую что найдена.

    огромнейшее спасибо, испытал моральный оргазм после того как увидел что товары сели сразу в дочернюю категорию и не стали создавать новую)

    Пользуясь случаем хотел спросить, возможно есть решение по данной проблеме http://www.screencapture.ru/file/2e89c003

    Брендов много, и не красиво смотрится такое количество на главной странице, а вообще как с вами можно связаться? Есть несколько задач по интернет-магазину на симпле, не могу найти проггера, естественно на платной основе

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

     

    есть несколько выходов из ситуации

    - проставить вручную эти корневые категории в прайсе и все будет импортировать

    - если у вас нет категорий с одинаковыми именами (корневой и подкатегорий) можно переделать импорт чтобы искало только по названию и в эту категорию и вставляло.

    - добавлять еще в прайс айди категории и по ней цеплять товар к категории. что тоже требует изменения импорта

    как можно воплотить в жизнь второй вариант? нет категорий, имена которых, совпадают с подкатегориями

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

     

    + вы не добавили в прайс названия колонок в первой строке

    а что можете подсказать по поводу решения задачи с подкатегориями?

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

     

    + вы не добавили в прайс названия колонок в первой строке

    Это прайс поставщика, в таком виде он его предоставляет, надо было конечно добавить что бы нагляднее было, сейчас перезалью

  12. Всем доброго времени суток стоит задача импортировать прайс лист csv формата в симплу. Что-то я адаптировал под симплу, что-то в ручную просто повставлял. В качестве адреса страницы взял артикул.


    Осталась только одна проблема, в магазине есть категории с дочерними категориями, например крупнобытовая техника/холодильники, а прайс поставщика изначально подразумевает только дочернюю категории "Холодильники". Подскажите, как можно реализовать чтобы товары заносились в категорию крупонобытовая техника/холодильники, а не создавал новую "главную" категорию "холодильники" так как таких подкатегорий очень много и нужно раскидать их по главным категориям.

    Думал над возможностью написания макроса в excel где будет сопоставление по названиям категорий и под категорий, типа если в ячейке "категория" написано холодильники (категория которую может предоставить поставщик) то эта ячейка заменяется на крупнобытовая техника/холодильники.

     

    Возможно у вас есть свои варианты решения данной задачи? Подскажите как можно реализовать. Во вложениях прилагаю формат прайс листа который предоставляет поставщик

×
×
  • Create New...