Перейти к содержанию
Официальный форум поддержки Simpla

get31

Пользователь
  • Публикаций

    119
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные get31

  1. В 13.03.2024 в 08:32, 6cnitymi сказал:

    Добрый день!
    Есть у кого-нибудь возможность залить повторно?
    Или выложить содержимое файла Files.php?
    Спасибо!

     

    <?php
    
    require_once('Simpla.php');
    
    class Files extends Simpla
    {
      private  $allowed_extentions = array('pdf', 'txt', 'doc', 'docx', 'xls', 'xlsx', 'mp4', 'mp3', 'psd', 'ai', 'zip', 'rar');
    
      public function __construct()
      {    
        parent::__construct();
      }
    
      function get_files($filter = array())
      {  
        $object_id_filter = '';
        $type_filter = '';
    
        if(!empty($filter['object_id']))
          $object_id_filter = $this->db->placehold('AND f.object_id in(?@)', (array)$filter['object_id']);
    
        if(!empty($filter['type']))
          $type_filter = $this->db->placehold('AND f.type=?', $filter['type']);
    
        // files
        $query = $this->db->placehold("SELECT f.id, f.name, f.object_id, f.filename, f.type, f.position
                      FROM __files AS f WHERE 1 $object_id_filter $type_filter ORDER BY f.object_id, f.position");
        $this->db->query($query);
        return $this->db->results();
      }
      
      public function add_file($object_id, $type, $filename, $name = '')
      {
        $query = $this->db->placehold("SELECT id FROM __files WHERE object_id=? AND type=? AND filename=?", $object_id, $type, $filename);
        $this->db->query($query);
        $id = $this->db->result('id');
        if(empty($id))
        {
          $query = $this->db->placehold("INSERT INTO __files SET object_id=?, type=?, filename=?", $object_id, $type, $filename);
          $this->db->query($query);
          $id = $this->db->insert_id();
          $query = $this->db->placehold("UPDATE __files SET position=id WHERE id=?", $id);
          $this->db->query($query);
        }
        return($id);
      }
      
      public function update_file($id, $file)
      {
      
        $query = $this->db->placehold("UPDATE __files SET ?% WHERE id=?", $file, $id);
        $this->db->query($query);
        
        return($id);
      }
      
      public function delete_file($id)
      {
        $query = $this->db->placehold("SELECT filename FROM __files WHERE id=?", $id);
        $this->db->query($query);
        $filename = $this->db->result('filename');
        $query = $this->db->placehold("DELETE FROM __files WHERE id=? LIMIT 1", $id);
        $this->db->query($query);
        $query = $this->db->placehold("SELECT count(*) as count FROM __files WHERE filename=? LIMIT 1", $filename);
        $this->db->query($query);
        $count = $this->db->result('count');
        if($count == 0)
        {      
          $file = pathinfo($filename, PATHINFO_FILENAME);
          $ext = pathinfo($filename, PATHINFO_EXTENSION);
    
          @unlink($this->config->root_dir.$this->config->cms_files_dir.$filename);    
        }
      }
    
      public function upload_file($filename, $name)
      {
        // Имя оригинального файла
        $name = $this->correct_filename($name);
        $uploaded_file = $new_name = pathinfo($name, PATHINFO_BASENAME);
        $base = pathinfo($uploaded_file, PATHINFO_FILENAME);
        $ext = pathinfo($uploaded_file, PATHINFO_EXTENSION);
        
        if(in_array(strtolower($ext), $this->allowed_extentions))
        {      
          while(file_exists($this->config->root_dir.$this->config->cms_files_dir.$new_name))
          {  
            $new_base = pathinfo($new_name, PATHINFO_FILENAME);
            if(preg_match('/_([0-9]+)$/', $new_base, $parts))
              $new_name = $base.'_'.($parts[1]+1).'.'.$ext;
            else
              $new_name = $base.'_1.'.$ext;
          }
          if(move_uploaded_file($filename, $this->config->root_dir.$this->config->cms_files_dir.$new_name))      
            return $new_name;
        }
    
        return false;
      }  
    
      public function correct_filename($filename)
      {
        $ru = explode('-', "А-а-Б-б-В-в-Ґ-ґ-Г-г-Д-д-Е-е-Ё-ё-Є-є-Ж-ж-З-з-И-и-І-і-Ї-ї-Й-й-К-к-Л-л-М-м-Н-н-О-о-П-п-Р-р-С-с-Т-т-У-у-Ф-ф-Х-х-Ц-ц-Ч-ч-Ш-ш-Щ-щ-Ъ-ъ-Ы-ы-Ь-ь-Э-э-Ю-ю-Я-я");
        $en = explode('-', "A-a-B-b-V-v-G-g-G-g-D-d-E-e-E-e-E-e-ZH-zh-Z-z-I-i-I-i-I-i-J-j-K-k-L-l-M-m-N-n-O-o-P-p-R-r-S-s-T-t-U-u-F-f-H-h-TS-ts-CH-ch-SH-sh-SCH-sch---Y-y---E-e-YU-yu-YA-ya");
    
         $res = str_replace($ru, $en, $filename);
        $res = preg_replace("/[\s]+/ui", '-', $res);
        $res = preg_replace("/[^a-zA-Z0-9\.\-\_]+/ui", '', $res);
         $res = strtolower($res);
          return $res;  
      }
    }

     

  2. 1 час назад, Kosjak76 сказал:
    
    $product->related_products = array();

    Как бы вот это хрень полная))

    В OrderView $order ОДИН , а в ProductsView $product - его НЕТ, он существует только внутри $products

    Если не имеете понятия, что делаете и зачем - лучше не лезть

    Почему в шаблоне связанный товар отображается на всех товарах? а не для каждого свой (если есть связанные товары)?

    		$related_ids = array();
    		$related_products = array();
    		foreach($this->products->get_related_products($products_ids) as $p)
    		{
    			$related_ids[] = $p->related_id;
    			$related_products[$p->related_id] = null;
    		}
    
    		if(!empty($related_ids))
    		{
    			foreach($this->products->get_products(array('id'=>$related_ids, 'visible'=>1)) as $p)
    				$related_products[$p->id] = $p;
    			
    			$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
    			foreach($related_products_images as $related_product_image)
    				if(isset($related_products[$related_product_image->product_id]))
    					$related_products[$related_product_image->product_id]->images[] = $related_product_image;
    			$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'in_stock'=>1));
    			foreach($related_products_variants as $related_product_variant)
    			{
    				if(isset($related_products[$related_product_variant->product_id]))
    				{
    					$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
    				}
    			}
    			foreach($related_products as $id=>$r)
    			{
    				if(is_object($r))
    				{
    					$r->image = &$r->images[0];
    					$r->variant = &$r->variants[0];
    				}
    				else
    				{
    					unset($related_products[$id]);
    				}
    			}
    			$this->design->assign('related_products', $related_products);
    		}

     

  3. 5 минут назад, phukortsin сказал:

    Оно и не должно работать. Если считаете, что должно, то пишите ТОЧНЫЕ объяснения, с какой стати это должно работать. Причина все та же - нужные данные в шаблон НЕ передаются.

    Интересная логика получается, по коду для OrderView данные передаются, а для ProductsView не передаются, а код идентичный)))

    		$product->related_products = array();
    
    		$related_ids = array();
    		$related_products = array();
    		foreach($this->products->get_related_products($products_ids) as $p)
    		{
    			$related_ids[] = $p->related_id;
    			$related_products[$p->related_id] = null;
    		}
    		if(!empty($related_ids))
    		{
    			foreach($this->products->get_products(array('id'=>$related_ids, 'in_stock'=>1, 'visible'=>1)) as $p)
    				$related_products[$p->id] = $p;
    			
    			$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
    			foreach($related_products_images as $related_product_image)
    				if(isset($related_products[$related_product_image->product_id]))
    					$related_products[$related_product_image->product_id]->images[] = $related_product_image;
    			$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'in_stock'=>1));
    			foreach($related_products_variants as $related_product_variant)
    			{
    				if(isset($related_products[$related_product_variant->product_id]))
    				{
    					$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
    				}
    			}
    			foreach($related_products as $id=>$r)
    			{
    				if(is_object($r))
    				{
    					$r->image = &$r->images[0];
    					$r->variant = &$r->variants[0];
    
    					$product->related_products[] = $r;
    				}
    				else
    				{
    					unset($related_products[$id]);
    				}
    			}
    		}

     

  4. 5 минут назад, phukortsin сказал:

    Видно четко, что во втором коде данные в шаблон передаются. А в первом НЕ передаются.

    Я ранее уже писал что:

    В 07.01.2024 в 16:03, get31 сказал:

    через $product->related_products и тоже не работает

     

  5. 12 минут назад, phukortsin сказал:

    Может, сможете описать полностью свое рабочее решение хоть в одном из перечисленных случаев?

    Пруфы нужны? Та не вопрос. В OrderView после foreach($purchases as &$purchase){ }

    добавляем:

    
    		$order->related_products = array();
    
    		$related_ids = array();
    		$related_products = array();
    		foreach($this->products->get_related_products($products_ids) as $p)
    		{
    			$related_ids[] = $p->related_id;
    			$related_products[$p->related_id] = null;
    		}
    		if(!empty($related_ids))
    		{
    			foreach($this->products->get_products(array('id'=>$related_ids, 'in_stock'=>1, 'visible'=>1)) as $p)
    				$related_products[$p->id] = $p;
    			
    			$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
    			foreach($related_products_images as $related_product_image)
    				if(isset($related_products[$related_product_image->product_id]))
    					$related_products[$related_product_image->product_id]->images[] = $related_product_image;
    			$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'in_stock'=>1));
    			foreach($related_products_variants as $related_product_variant)
    			{
    				if(isset($related_products[$related_product_variant->product_id]))
    				{
    					$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
    				}
    			}
    			foreach($related_products as $id=>$r)
    			{
    				if(is_object($r))
    				{
    					$r->image = &$r->images[0];
    					$r->variant = &$r->variants[0];
    
    					$order->related_products[] = $r;
    				}
    				else
    				{
    					unset($related_products[$id]);
    				}
    			}
    		}

    В шаблоне выводим: {if $order->related_products} тут связанные товары {/if}

     

    17 минут назад, phukortsin сказал:

    Очень сомневаюсь

    Еще есть сомнения?

     

    В 07.01.2024 в 15:41, phukortsin сказал:

    Возможно

    ....одни сомнения в ответах

  6. 20 минут назад, phukortsin сказал:

    Пробовать лишь бы как методом тыка - не лучшая стратегия...

    вывести где угодно "методом тыка" получается, а вот в каталоге нет....аналогичный метод а ТЫК не работает...

     

     

     

  7. 20 минут назад, phukortsin сказал:

    Возможно, потому, что данные не переданы в шаблон... 

    пробовал методом

    $product->related_products = array();

    чтобы вывести через $product->related_products и тоже не работает(

  8. Добрый день форумчани, и со всеми праздниками!

    Хочу вывести связанные товары в каталоге к каждому товару (где есть связанные товары у товара).

    В ProductsView.php вставляю:

    
    $related_ids = array();
    $related_products = array();
    foreach($this->products->get_related_products($products_ids) as $p)
    {
    	$related_ids[] = $p->related_id;
    	$related_products[$p->related_id] = null;
    }
    if(!empty($related_ids))
    {
    	foreach($this->products->get_products(array('id'=>$related_ids, 'in_stock'=>1, 'visible'=>1)) as $p)
    		$related_products[$p->id] = $p;
    	
    	$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
    	foreach($related_products_images as $related_product_image)
    		if(isset($related_products[$related_product_image->product_id]))
    			$related_products[$related_product_image->product_id]->images[] = $related_product_image;
    	$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'in_stock'=>1));
    	foreach($related_products_variants as $related_product_variant)
    	{
    		if(isset($related_products[$related_product_variant->product_id]))
    		{
    			$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
    		}
    	}
    	foreach($related_products as $id=>$r)
    	{
    		if(is_object($r))
    		{
    			$r->image = &$r->images[0];
    			$r->variant = &$r->variants[0];
    		}
    		else
    		{
    			unset($related_products[$id]);
    		}
    	}
    }

    ну и в шаблоне products.tpl вывожу

    {if $related_products}
         тут отображение связанных товаров
    {/if}

    Но почему не отображаются?(

  9. 2 часа назад, shooroop сказал:

    а что вы хотите выводить если пусто

    делайте условие if else

    так мне не нужно чтобы было пусто , мне нужно вывести то что в условии.

    В данном случаи условия получается:

                {if isset($product->images[$i])}
                  	{if $product->images[$i]->image_main == 1}<img src="{$product->images[$i]->filename|resize:600:600}" style="width:100%;" />{/if}
                {/if}
      			
  10. 2 минуты назад, phukortsin сказал:

    Сначала надо определить ТОЧНО, что такое "нормальный порядок".

    И код надо бы выкладывать полностью, а не кусками.

    И значения  $product->images[$i]->image_main  в Simpla стандартно нет. Если свои доработки делались, то надо все нужные детали выкладывать...

    Если надо выкладывать не все изображения, а некую их часть, то лучше всего в шаблон передавать эту часть. Непосредственно в шаблоне конструировать такое хлопотно...

     

    Про значение $product->images[$i]->image_main я ранее написал, что в админке добавил в изображение select выборку где отображать (код в админке карточки товара)

    				{foreach $product_images as $image}
    				<li style="position:relative;" id='img_{$image->id}'>
    					<img src="{$image->filename|resize:600:600}" />
    					<input type=hidden name='images[]' value='{$image->id}'>
    					<select name="var_to_img[{$image->id}]" style="position:absolute;bottom:0;left:0;width:100%;height:18px;{if $image->image_main == 1}background:lime;{else}{/if}">
    						<option value="0">---</option>
    						<option value="1" {if $image->image_main == 1}selected{/if}>Преимущества</option>
    					</select>
    					
    				</li>
    				{/foreach}

    в шаблоне если

    {foreach $product->images as $image}
    	{if $image->image_main == 0}
    		<img src="{$image->filename|resize:600:600}">
    	{/if}
    {/foreach} 

    показываем изображения которые имею значения {if $image->image_main == 0}, а в другом месте если {if $image->image_main == 1} покажем другие изображения.

    Так вот, по вашему коду, который работает, за это спасибо!

    <div class="items-wrap">
    	{foreach $properties as $i => $property}
    		{if $i % 2}
    			<div>{$property->name}</div>
    			<div>
                {if isset($product->images[$i])}
                  	{if $product->images[$i]->image_main == 1}<img src="{$product->images[$i]->filename|resize:600:600}" style="width:100%;" />{/if}
                {/if}
      			</div>
    		{else}
    			<div>
                {if isset($product->images[$i])}
                	{if $product->images[$i]->image_main == 1}<img src="{$product->images[$i]->filename|resize:600:600}" style="width:100%;" />{/if}
                {/if}
      			</div>
    			<div>{$property->name}</div>
    		{/if}
    	{/foreach}
    </div>

    в админке отображается вот так:

    https://ibb.co/6nD0fTM

    на скрине видно, что первые 2 картинки имеют image_main == 0, следующие картинки имеют image_main == 1, вот и отображение в шаблоне идет не правильное, первые 2 блока где должны быть картинки пусто, остальные имеют картинки, вот скрин как на сайте: https://ibb.co/ns6xr0Z

    П.С. сайт на локалке

     

     

     

  11. 13 часов назад, phukortsin сказал:
    
    <div class="items-wrap">
      {foreach $properties as $i => $property}
    	{if $i % 2}
        <div>{$property->name}</div>
        <div>{if isset($product->images[$i])}<img src="{$product->images[$i]->filename|resize:600:600}" style="width:100%;" />{/if}</div>
    	{else}
        <div>{if isset($product->images[$i])}<img src="{$product->images[$i]->filename|resize:600:600}" style="width:100%;" />{/if}</div>
        <div>{$property->name}</div>
    	{/if}
      {/foreach}
    </div>

     

    Супер! спасибо!

    Только сейчас столкнулся с проблемой порядка изображений. Я добавил в изображение select выборку отображения. Через foreach работает как нужно:

    {foreach $product->images as $image}
    	{if $image->image_main == 1}
    		<img src="{$image->filename|resize:600:600}">
    	{/if}
    {/foreach}

    а вот если сделать вывод изображений в данном коде:

    <div>{if isset($product->images[$i])}{if $product->images[$i]->image_main == 1}<img src="{$product->images[$i]->filename|resize:600:600}" style="width:100%;" />{/if}{/if}</div>

    то из-за {if $product->images[$i]->image_main == 1} отображение идет:

    пусто, пусто, фото, фото фото.....где "пусто" там фото которое без {if $image->image_main == 1}

    Как сделать нормальный порядок без пустого?

     

     

     

     

     

     

  12. 1 час назад, Chudo сказал:

    Попробуй так

     

    
    <div class="items-wrap">
      {foreach $properties as $i => $property}
        <div>{$property->name}</div>
        {if isset($product->images[$i])}
        <div><img src="{$product->images[$i]->filename|resize:600:600}" style="width:100%;" /></div>
        {/if}
      {/foreach}
    </div>

     

    Не подходит, создает:

    текст фото

    текст фото

    текст фото

    ...

  13. Доброго времени суток! пожалуйста, кто может подсказать по шахматному порядку:

    есть CSS и HTML для шахматного порядка:

    .items-wrap {
      width: 250px;
    }
    .items-wrap>div {
      width: 100px;
      height: 100px;
      display:inline-block;
      background: blue;
    }

    .items-wrap>div:nth-child(4n-3),
    .items-wrap>div:nth-child(4n) {
      background: red;
    }

    <div class="items-wrap">
      <div>текст</div>
      <div>фото</div>

      <div>фото</div>
      <div>текст</div>

      <div>текст</div>
      <div>фото</div>
    </div>

    Теперь хочу в карточке товара вывести

    {foreach $properties as $property}
    <div>{$property->name}</div>
    {/foreach}

    и изображение:

    {foreach $product->images as $i=>$image}
    <div><img src="{$image->filename|resize:600:600}" style="width:100%;" /></div>
    {/foreach}

    как правильно написать, чтобы создавался шахматный порядок?

  14. Уважаемые спецы, подскажите пожалуйста. Сделал запись А - через *, чтобы можно было создавать автоматически поддомены.

    Как теперь правильно закрыть в htaccess стандартные папки чтобы не было simpla.site.com а тех которые не существуют ведут на 404 страницу?

  15. 3 минуты назад, phukortsin сказал:

    Чуть изменить способ yr4ik:

    {$h1 = ' ':$page->name|explode:3}

    {$h1[0]} {$h1[1]}<br>{$h1[2]}

    такой способ и сайт летит:

    Fatal error: Uncaught --> Smarty Compiler: Syntax error in template "W:\home\localhost\www\site\design\wo\html\index.tpl" on line 262 "{$h1 = ' ':$p->name|explode:3}" - Unexpected ":", expected one of: "}" <-- thrown in W:\home\localhost\www\site\Smarty\libs\sysplugins\smarty_internal_templatecompilerbase.php on line 262

    ругается на {$h1 = ' ':$p->name|explode:3}

  16. 29 минут назад, phukortsin сказал:

    Десятками способов можно сделать. Для начала самому понимать, что хотите. Затем формулировать адекватно свои хотелки.

    "соответственно 3-го нужно выводить бренды" - очень по-разному можно понимать. Например, как бренды 3-го уровня, которых стандартно в Simpla нет...

    да, выводить бренды третьего уровня категории.

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

  17. 18 часов назад, phukortsin сказал:

    Вроде бы нормально.

    Если у Вас выводятся лишние бренды, т.е. то есть содержащие товары с нулевым к-вом, то это соответствует тому, как запрограммировано, то есть без фильтров на активность и наличие товаров. 

    А еще в цикле по категориям делаются однотипные запросы, весьма нерационально. Надо бы делать одним запросом. Может, даже  с кешированием...

    Попробовал на стандартной simpla через cat3->brands, понял что изначально ТЗ не правильно сформулировал))) надо выводить бренды относящиеся не ко второму уровню, а к третьему. Тобишь сейчас вывод идет 3-го уровня категорий, соответственно 3-го нужно выводить бренды. Как можно это сделать?

  18. 39 минут назад, phukortsin сказал:

    В Simpla стандартно НЕТ  {$cat3->brands}, и как оно у Вас формируется и что там находится, не известно... Что такое "бренды родителя", тоже надо гадать...

    теперь понял)) api/Categories.php

    <?php
    
    /**
     * Simpla CMS
     */
    
    require_once('Simpla.php');
    
    class Categories extends Simpla
    {
    	// Список указателей на категории в дереве категорий (ключ = id категории)
    	private $all_categories;
    	// Дерево категорий
    	private $categories_tree;
    
    	// Функция возвращает массив категорий
    	public function get_categories($filter = array())
    	{
    		if(!isset($this->categories_tree))
    			$this->init_categories();
     
    		if(!empty($filter['product_id']))
    		{
    			$query = $this->db->placehold("SELECT category_id FROM __products_categories WHERE product_id in(?@) ORDER BY position", (array)$filter['product_id']);
    			$this->db->query($query);
    			$categories_ids = $this->db->results('category_id');
    			$result = array();
    			foreach($categories_ids as $id)
    				if(isset($this->all_categories[$id]))
    					$result[$id] = $this->all_categories[$id];
    			return $result;
    		}
    		
    		return $this->all_categories;
    	}	
    
    	// Функция возвращает id категорий для заданного товара
    	public function get_product_categories($product_id)
    	{
    		$query = $this->db->placehold("SELECT product_id, category_id, position FROM __products_categories WHERE product_id in(?@) ORDER BY position", (array)$product_id);
    		$this->db->query($query);
    		return $this->db->results();
    	}	
    
    	// Функция возвращает id категорий для всех товаров
    	public function get_products_categories()
    	{
    		$query = $this->db->placehold("SELECT product_id, category_id, position FROM __products_categories ORDER BY position");
    		$this->db->query($query);
    		return $this->db->results();
    	}	
    
    	// Функция возвращает дерево категорий
    	public function get_categories_tree()
    	{
    		if(!isset($this->categories_tree))
    			$this->init_categories();
    			
    		return $this->categories_tree;
    	}
    
    	// Функция возвращает заданную категорию
    	public function get_category($id)
    	{
    		if(!isset($this->all_categories))
    			$this->init_categories();
    		if(is_int($id) && array_key_exists(intval($id), $this->all_categories))
    			return $category = $this->all_categories[intval($id)];
    		elseif(is_string($id))
    			foreach ($this->all_categories as $category)
    				if ($category->url == $id)
    					return $this->get_category((int)$category->id);	
    		
    		return false;
    	}
    	
    	// Добавление категории
    	public function add_category($category)
    	//public function add_category($category, $copy_features = false)
    	{
    		$category = (array)$category;
    		if(empty($category['url']))
    		{
    			$category['url'] = preg_replace("/[\s]+/ui", '_', $category['name']);
    			$category['url'] = strtolower(preg_replace("/[^0-9a-zа-я_]+/ui", '', $category['url']));
    		}	
    
    		// Если есть категория с таким URL, добавляем к нему число
    		while($this->get_category((string)$category['url']))
    		{
    			if(preg_match('/(.+)_([0-9]+)$/', $category['url'], $parts))
    				$category['url'] = $parts[1].'_'.($parts[2]+1);
    			else
    				$category['url'] = $category['url'].'_2';
    		}
    
            $category = (object)$category;
    
     	    $result = $this->languages->get_description($category, 'category');
            if(!empty($result->data))$category = $result->data;
    
    		$this->db->query("INSERT INTO __categories SET ?%", $category);
    		$id = $this->db->insert_id();
    		$this->db->query("UPDATE __categories SET position=id WHERE id=?", $id);
    		
    		if ($copy_features && $category['parent_id'] > 0) {
    			$query = $this->db->placehold("INSERT INTO __categories_features SELECT ?, f.feature_id FROM __categories_features f WHERE f.category_id = ?", $id, $category['parent_id']);
    			$this->db->query($query);      
    		}
    
            if(!empty($result->description)){
                $this->languages->action_description($id, $result->description, 'category');
            }
    
    		unset($this->categories_tree);	
    		unset($this->all_categories);	
    		return $id;
    	}
    	
    	// Изменение категории
    	public function update_category($id, $category)
    	{
    	    $category = (object)$category;
    	    $result = $this->languages->get_description($category, 'category');
            if(!empty($result->data))$category = $result->data;
    
    		$query = $this->db->placehold("UPDATE __categories SET ?% WHERE id=? LIMIT 1", $category, intval($id));
    		$this->db->query($query);
    
            if(!empty($result->description)){
                $this->languages->action_description($id, $result->description, 'category', $this->languages->lang_id());
            }
    
    		unset($this->categories_tree);
    		unset($this->all_categories);
    		return intval($id);
    	}
    	
    	// Удаление категории
    	public function delete_category($ids)
    	{
    		$ids = (array) $ids;
    		foreach($ids as $id)
    		{
    			if($category = $this->get_category(intval($id)))
    			$this->delete_image($category->children);
    			if(!empty($category->children))
    			{
    				$query = $this->db->placehold("DELETE FROM __categories WHERE id in(?@)", $category->children);
    				$this->db->query($query);
    				$query = $this->db->placehold("DELETE FROM __products_categories WHERE category_id in(?@)", $category->children);
    				$this->db->query($query);
                    $this->db->query("DELETE FROM __lang_categories WHERE category_id in(?@)", $category->children);
    			}
    		}
    		unset($this->categories_tree);			
    		unset($this->all_categories);	
    		return $id;
    	}
    	
    	// Добавить категорию к заданному товару
    	public function add_product_category($product_id, $category_id, $position=0)
    	{
    		$query = $this->db->placehold("INSERT IGNORE INTO __products_categories SET product_id=?, category_id=?, position=?", $product_id, $category_id, $position);
    		$this->db->query($query);
    	}
    
    	// Удалить категорию заданного товара
    	public function delete_product_category($product_id, $category_id)
    	{
    		$query = $this->db->placehold("DELETE FROM __products_categories WHERE product_id=? AND category_id=? LIMIT 1", intval($product_id), intval($category_id));
    		$this->db->query($query);
    	}
    	
    	// Удалить изображение категории
    	public function delete_image($categories_ids)
    	{
    		$categories_ids = (array) $categories_ids;
    		$query = $this->db->placehold("SELECT image FROM __categories WHERE id in(?@)", $categories_ids);
    		$this->db->query($query);
    		$filenames = $this->db->results('image');
    		if(!empty($filenames))
    		{
    			$query = $this->db->placehold("UPDATE __categories SET image=NULL WHERE id in(?@)", $categories_ids);
    			$this->db->query($query);
    			foreach($filenames as $filename)
    			{
    				$query = $this->db->placehold("SELECT count(*) as count FROM __categories WHERE image=?", $filename);
    				$this->db->query($query);
    				$count = $this->db->result('count');
    				if($count == 0)
    				{			
    					@unlink($this->config->root_dir.$this->config->categories_images_dir.$filename);		
    				}
    			}
    			unset($this->categories_tree);
    			unset($this->all_categories);	
    		}
    	}
    
    	// Инициализация категорий, после которой категории будем выбирать из локальной переменной
    	private function init_categories()
    	{
    		// Дерево категорий
    		$tree = new stdClass();
    		$tree->subcategories = array();
    		
    		// Указатели на узлы дерева
    		$pointers = array();
    		$pointers[0] = &$tree;
    		$pointers[0]->path = array();
    		$pointers[0]->level = 0;
    
    		// Выбираем все категории
    		$query = $this->db->placehold("SELECT c.id, c.parent_id, c.name, c.url, c.image, c.visible, c.position
    										FROM __categories c ORDER BY c.parent_id, c.position");
    		
    		$this->db->query($query);
    		$categories = $this->db->results();
    				
    		$finish = false;
    		// Не кончаем, пока не кончатся категории, или пока ниодну из оставшихся некуда приткнуть
    		while(!empty($categories)  && !$finish)
    		{
    			$flag = false;
    			// Проходим все выбранные категории
    			foreach($categories as $k=>$category)
    			{
    				if(isset($pointers[$category->parent_id]))
    				{
    					$category->brands = $this->brands->get_brands( array('category_id'=>$category->id) );
    
    					// В дерево категорий (через указатель) добавляем текущую категорию
    					$pointers[$category->id] = $pointers[$category->parent_id]->subcategories[] = $category;
    					
    					// Путь к текущей категории
    					$curr = $pointers[$category->id];
    					$pointers[$category->id]->path = array_merge((array)$pointers[$category->parent_id]->path, array($curr));
    					
    					// Уровень вложенности категории
    					$pointers[$category->id]->level = 1+$pointers[$category->parent_id]->level;
    
    					// Убираем использованную категорию из массива категорий
    					unset($categories[$k]);
    					$flag = true;
    				}
    			}
    			if(!$flag) $finish = true;
    		}
    		
    		// Для каждой категории id всех ее деток узнаем
    		$ids = array_reverse(array_keys($pointers));
    		foreach($ids as $id)
    		{
    			if($id>0)
    			{
    				$pointers[$id]->children[] = $id;
    
    				if(isset($pointers[$pointers[$id]->parent_id]->children))
    					$pointers[$pointers[$id]->parent_id]->children = array_merge($pointers[$id]->children, $pointers[$pointers[$id]->parent_id]->children);
    				else
    					$pointers[$pointers[$id]->parent_id]->children = $pointers[$id]->children;
    
    			}
    		}
    		unset($pointers[0]);
    		unset($ids);
    
    		$this->categories_tree = $tree->subcategories;
    		$this->all_categories = $pointers;	
    	}
    
    }

     

  19. 2 часа назад, phukortsin сказал:

    Если надо не весь, то меняйте код, чтоб был не весь. А то одни загадки...

    Та какие загадки? Я весь код для вывода категорий показал, сказал, что {$category->brands} выводит бренды подкатегории, а через {$cat3->brands} отображает все бренды родителя.

  20. 5 часов назад, phukortsin сказал:

    А с какой стати они будут меняться, если в коде в цикле  используется {$category->brands}, не зависящее от итерации цикла? Пробуйте использовать  {$cat3->brands}...

    {$category->brands} потому что нужно выводит бренды подкатегории, а если через {$cat3->brands}, то выдаст список всех брендов родителя, даже те где нет товара.

    Но даже через {$cat3->brands} не меняет список при наведении на подкатегории.

  21. Элементарно можно создать такое.

    Нужно создать UsersView.php, добавить в шаблон users.tpl если нужно выводить всех пользователей, добавить строку в .htaccess

    RewriteRule ^users/?$  index.php?module=UsersView  [L,QSA]

    и немного подправить UserView и все

×
×
  • Создать...