-
Публикаций
119 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные get31
-
-
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); }
-
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]); } } }
-
5 минут назад, phukortsin сказал:
Видно четко, что во втором коде данные в шаблон передаются. А в первом НЕ передаются.
Я ранее уже писал что:
В 07.01.2024 в 16:03, get31 сказал:через $product->related_products и тоже не работает
-
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 сказал:Возможно
....одни сомнения в ответах
-
20 минут назад, phukortsin сказал:
Пробовать лишь бы как методом тыка - не лучшая стратегия...
вывести где угодно "методом тыка" получается, а вот в каталоге нет....аналогичный метод а ТЫК не работает...
-
20 минут назад, phukortsin сказал:
Возможно, потому, что данные не переданы в шаблон...
пробовал методом
$product->related_products = array();
чтобы вывести через $product->related_products и тоже не работает(
-
Добрый день форумчани, и со всеми праздниками!
Хочу вывести связанные товары в каталоге к каждому товару (где есть связанные товары у товара).
В 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}Но почему не отображаются?(
-
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}
-
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>
в админке отображается вот так:
на скрине видно, что первые 2 картинки имеют image_main == 0, следующие картинки имеют image_main == 1, вот и отображение в шаблоне идет не правильное, первые 2 блока где должны быть картинки пусто, остальные имеют картинки, вот скрин как на сайте: https://ibb.co/ns6xr0Z
П.С. сайт на локалке
-
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}
Как сделать нормальный порядок без пустого?
-
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>
Не подходит, создает:
текст фото
текст фото
текст фото
...
-
Доброго времени суток! пожалуйста, кто может подсказать по шахматному порядку:
есть 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}как правильно написать, чтобы создавался шахматный порядок?
-
Уважаемые спецы, подскажите пожалуйста. Сделал запись А - через *, чтобы можно было создавать автоматически поддомены.
Как теперь правильно закрыть в htaccess стандартные папки чтобы не было simpla.site.com а тех которые не существуют ведут на 404 страницу?
-
1 час назад, phukortsin сказал:
{$h1 = explode(' ',$page->name,4)}
{$h1[0]} {$h1[1]} {$h1[2]}<br>{$h1[3]}
Работает, спасибо!
-
1 час назад, phukortsin сказал:
{$h1 = $page->name|explode:4}
{$h1[0]} {$h1[1]} {$h1[2]}<br>{$h1[3]}
вместо названия - Warning: explode() expects at least 2 parameters, 1 given in W:\home\localhost\www\smart\Smarty\libs\sysplugins\smarty_internal_templatebase.php(165) : eval()'d code on line 527
-
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}
-
В 28.09.2017 в 14:42, loxter сказал:
Чуть попроще
{$page->name|regex_replace:'/^([^ ]*) /':'\1<br>'}
а как вывести после 3-го слова?
-
29 минут назад, phukortsin сказал:
Десятками способов можно сделать. Для начала самому понимать, что хотите. Затем формулировать адекватно свои хотелки.
"соответственно 3-го нужно выводить бренды" - очень по-разному можно понимать. Например, как бренды 3-го уровня, которых стандартно в Simpla нет...
да, выводить бренды третьего уровня категории.
То есть я вывел горизонтально категории 2-го уровня, сделал выпадающий список категорий 3-го уроня, и хочу рядом с выводом категорий 3го выводить бренды которые относятся К категориям 3-го со сменой брендов
-
18 часов назад, phukortsin сказал:
Вроде бы нормально.
Если у Вас выводятся лишние бренды, т.е. то есть содержащие товары с нулевым к-вом, то это соответствует тому, как запрограммировано, то есть без фильтров на активность и наличие товаров.
А еще в цикле по категориям делаются однотипные запросы, весьма нерационально. Надо бы делать одним запросом. Может, даже с кешированием...
Попробовал на стандартной simpla через cat3->brands, понял что изначально ТЗ не правильно сформулировал))) надо выводить бренды относящиеся не ко второму уровню, а к третьему. Тобишь сейчас вывод идет 3-го уровня категорий, соответственно 3-го нужно выводить бренды. Как можно это сделать?
-
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; } }
-
2 часа назад, phukortsin сказал:
Если надо не весь, то меняйте код, чтоб был не весь. А то одни загадки...
Та какие загадки? Я весь код для вывода категорий показал, сказал, что {$category->brands} выводит бренды подкатегории, а через {$cat3->brands} отображает все бренды родителя.
-
Точнее {$cat3->brands} меняет как надо но url, но к сожалению выводит весь список брендов родителя
-
5 часов назад, phukortsin сказал:
А с какой стати они будут меняться, если в коде в цикле используется {$category->brands}, не зависящее от итерации цикла? Пробуйте использовать {$cat3->brands}...
{$category->brands} потому что нужно выводит бренды подкатегории, а если через {$cat3->brands}, то выдаст список всех брендов родителя, даже те где нет товара.
Но даже через {$cat3->brands} не меняет список при наведении на подкатегории.
-
Элементарно можно создать такое.
Нужно создать UsersView.php, добавить в шаблон users.tpl если нужно выводить всех пользователей, добавить строку в .htaccess
RewriteRule ^users/?$ index.php?module=UsersView [L,QSA]
и немного подправить UserView и все
[2.*] Прикрепленные файлы
в Готовые решения
Опубликовано