Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 7 Ответов
  • 3357 Просмотров
*

Servelatin

  • Захожу иногда
  • 132
  • 1 / 0
product_type на shop.browse
« : 26.05.2011, 16:06:03 »
Как и большинство личностей, пользующихся VM, столкнулся с задачей требующей вывода определенного типа товара в категории.
Решений не нашел ни в одном ру\инг-нете. Но нашел интересное решение на одном украинском сайте. Собственно заюзал, но одно место в коде у меня не проходит, поэтому возможно с чей то помощью найдется фри решение для риторического вопроса.
---------------------------------------------------------------------------
-------------------- У меня: VM 1.1.8 | JM 1.5.22 --------------------
---------------------------------------------------------------------------
файл shop.browse.php

После
require_once(CLASSPATH . 'ps_product_attribute.php' );
$ps_product_attribute = new ps_product_attribute;

добавить
require_once(CLASSPATH . 'ps_product_type.php' );
$ps_product_type = new ps_product_type;

после
$product_s_desc = $db_browse->f("product_s_desc");
if( empty($product_s_desc) && $product_parent_id!=0 ) {
    $product_s_desc = $dbp->f("product_s_desc"); // Use product_s_desc from Parent Product
}

добавить
$flerd_product_id = $db_browse->f("product_id");
$product_type = $ps_product_type->list_product_type_shopbrowse($flerd_product_id);

после
$products[$i]['product_s_desc'] = $product_s_desc;

добавить
$products[$i]['product_type'] = $product_type;

файл browser_2.php (или другой файл который используется для отображения списка товаров)
<?php echo $product_type ?>

файл ps_product_type
class vm_ps_product_type {
/*  */
function list_product_type_shopbrowse($product_id) {
        global $VM_LANG;
        $tpl = vmTemplate::getInstance();
        if (!$this->product_in_product_type($product_id)) {
            return "";
        }
        // $dbag = product_types;
        $dbag = new ps_DB;
        // $dba = Attributes of product_type param, holds product_id and values assign to each param;
        $dba = new ps_DB;
        // $dbp = Parameters of product_type, holds definitions of each parameter, but not value ;
        $dbp = new ps_DB;
        $html ="";
        $q  = "SELECT * FROM #__{vm}_product_product_type_xref ";
        $q .= "LEFT JOIN #__{vm}_product_type USING (product_type_id) ";
        $q .= "WHERE product_id='$product_id' AND product_type_publish='Y' ";
        $q .= "ORDER BY product_type_list_order";
        $dbag->query( $q );
        $q  = "SELECT * FROM #__{vm}_product_type_parameter ";
        $q .= "WHERE product_type_id=";
        $pt = 0; //product_type counter;
        //print_r($dbag->loadObjectList());
        while ($dbag->next_record()) {
            $product_type_id = $dbag->f("product_type_id");
            $q2  = "SELECT * FROM #__{vm}_product_type_".$dbag->f("product_type_id");
            $q2 .= " WHERE product_id='$product_id'";
            $dbp->query($q2);
            $dba->query($q.$dbag->f("product_type_id")." ORDER BY parameter_list_order");
            $product_type_param = array();
            while ($dba->next_record()) {
                $obj_name = $dba->f("parameter_name");
               // print_r($obj_name."n");
                $product_type_param[$obj_name]["parameter_label"] = $dba->f("parameter_label");
                $product_type_param[$obj_name]["parameter_description"] = $dba->f("parameter_description");
                $product_type_param[$obj_name]["parameter_value"] = $dbp->f($dba->f("parameter_name"));
                $product_type_param[$obj_name]["parameter_unit"] = $dba->f("parameter_unit");
            }
            $product_types[$product_type_id] = $product_type_param;
        }
        $tpl->set( 'product_types', $product_types );
        $html .= $tpl->fetch( 'common/product_type_shopbrowse.tpl.php' );
            return $html;
    }
}

файл shop.browse в начало
    class fmx_parametr{
        var $product_types;
        var $product_type_id;
        var $product_type_parametr;
        function __construct($product_types, $product_type_id, $product_type_parametr){
            $this->product_types = $product_types;
            $this->product_type_id = $product_type_id;
            $this->product_type_parametr = $product_type_parametr;
        }
        function checktype($product_type_id){
            if(array_key_exists($product_type_id, $this->product_types)){
                return true;
            }
            return false;
        }
        function checkparametr(){
            $product_type_id = $this->product_type_id;
            $product_type_parametr = $this->product_type_parametr;
            if($this->checktype($product_type_id)){
                $params = $this->product_types[$product_type_id];
                if(array_key_exists($product_type_parametr, $params)){
                    if($params[$product_type_parametr]['parameter_value'] != ""){
                        return true;
                    }
                }
            }
            return false;
        }
        function val($name){
            $product_type_id = $this->product_type_id;
            $product_type_parametr = $this->product_type_parametr;
            return $this->product_types[$product_type_id][$product_type_parametr]["parameter_".$name];
        }
    }

файл common/product_type_shopbrowse.tpl.php
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
<?php if( empty($product_types)) return;
    $p1 = new fmx_parametr($product_types, 1, "otdelka");
    $p2 = new fmx_parametr($product_types, 1, "razmer");
?>
    <?php if($p2->checkparametr()):?>
        <div> <?php echo $p2->val("label")?>: <?php echo $p2->val("value"); ?></div>
    <?php endif; ?>
    <?php if($p1->checkparametr()):?>
        <div> <?php echo $p1->val("label")?>: <?php echo $p1->val("value"); ?></div>               
    <?php endif; ?>

-------------------------------------------------------------------------------------------------------
------------------------------- ТЕПЕРЬ МОЙ ОПЫТ ------------------------------------------------
-------------------------------------------------------------------------------------------------------
1. Для вывода категории использую таблицу однастрочную browse_listtable.tpl.php
2. Пункт где про файл ps_product_type и добавить class vm_ps_product_type...: У меня заработало только при вставке предлагаемого кода в заместо:
class vm_ps_product_type {
   /**
    * Validates the Input Parameters onBeforeProductTypeAdd
    * @author Zdenek Dvorak
    * @param array $d
    * @return boolean
    */
   function validate_add(&$d) {
      global $VM_LANG;
      
      if (empty($d["product_type_name"])) {
         $GLOBALS['vmLogger']->err( $VM_LANG->_('VM_PRODUCT_TYPE_ERR_NAME') );
         return False;
      }
      else {
         return True;
      }
   }

3. Файла common/product_type_shopbrowse.tpl.php у меня не существует, поэтому собственно создал (права поставил..)
4. В browse_listtable.tpl.php добавил:
$data[$row][] = $product['product_type'];
после
if( _SHOW_PRICES && $auth['show_prices'] ) {
         $data[$row][] = $product['product_price'];
      }
5. В итоге у меня отлично отображаются все параметры типа товара.
6. Текст без изменений от первоисточника ( ссыль нужна ?? )
 -------------------------------------------------------------------------------------------------------
------------------------------- СМЫСЛ ------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
В предлагаемом коде понятно, что стандартный $product_type заменяется на $p1, $p2, что конечно очень заманчиво, но вот у меня например это не прокатывает. Поэтому надеюсь что местные золотые руки не из жопы не пройдут мимо поста и подведут к нему итог.
*

Gruz

  • Завсегдатай
  • 1275
  • 167 / 3
  • gruz@jabber.org | gruz.org.ua
Re: product_type на shop.browse
« Ответ #1 : 26.05.2011, 17:35:59 »
У меня здесь www.nasos4you.com.ua/shop/категория/7/насосы-бытовые-для-водоснабжения/наружные-самовсасывающие.html
реализовано таким образом.

В components/com_virtuemart/themes/THEME/theme.php добавлена функция в границах класса class vmTheme extends vmTemplate :

Код
	function get_product_id_by_sku($sku) {
$db = new ps_DBe;
// Get Product Types
$q  = "SELECT product_id FROM #__{vm}_product WHERE ";
$q .= 'product_sku = '.$db->Quote($sku);
$db->query($q);
if( $db->num_rows() ) {
return $db->loadResult();
}
else {
return false;
}
}

Далее в /components/com_virtuemart/themes/THEME/templates/browse/browse_1.php добавлено:

Код
require_once(CLASSPATH . 'ps_product_type.php' );
$ps_product_type = new ps_product_type;
$product_id = vmTheme::get_product_id_by_sku($product_sku);
echo $product_type = $ps_product_type->list_product_type($product_id);


По поводу правки самого шаблона вывода типов:
http://virtuemart.net/documentation/Developer_Manual/Finding_Files.html

По поводу невлезания в ядро ВМа:
http://www.vm-expert.com/virtuemart-expert-blog/80-extending-virtuemart-114
Життя має дві форми - горіння і гниття!
-
Со мной на "ты" - Вам лень развёрнуто формулировать вопрос? Нам лень отвечать. Правильный вопрос: - Версии J! и проблемного расширения? - Что хотел? - Что пробовал? - Что получилось и что не получилось? - Какие были ошибки?
*

Servelatin

  • Захожу иногда
  • 132
  • 1 / 0
Re: product_type на shop.browse
« Ответ #2 : 26.05.2011, 18:50:15 »
Ну ты же выводишь в категории product_type целиком. А задача в выводе отдельного параметра.
*

Gruz

  • Завсегдатай
  • 1275
  • 167 / 3
  • gruz@jabber.org | gruz.org.ua
Re: product_type на shop.browse
« Ответ #3 : 26.05.2011, 19:02:50 »
Ну я вывоже не целиком, а кое-что прячу. И делаю это в файле-шаблоне вывода типов. Там легко отфильтровать.

У меня есть внутренние типы, которые начинаются со звёздочки, их шаблон не выводит.
Ты можешь проверить на какой странице выводится шаблон, на page или browse - и обработать по-разному.

components/com_virtuemart/themes/THEME/templates/common/product_type.tpl.php

Правки обозначены ##my
Код
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
<?php if( empty($product_types)) return;
/**
* Available indexes:
*
* $product_type_params["parameter_label"] => The label for each product type parameter
* $product_type_params["parameter_description"] => The description of each product type parameter
* $product_type_params["tooltip"] => Same as above but wrapped in a tooltip
* $product_type_params["parameter_value"] => The actual value of the parameter for this product
* $product_type_params["parameter_unit"] => The unit of the parameter
* $product_type["product_type_name"] => The name of the product type
*
*/
?>
<!-- Tables of product_types -->

<?php
$kk = 0;

foreach( $product_types as $product_type ) { // Loop through all recent products
$kk++;
if ($kk>$product_type['product_type_count_params']) {
continue;
}
if (JString::substr($product_type['product_type_name'],0,1) == '*' ) {
continue;
}
foreach( $product_type as $attr => $val ) {
//echo $attr." - ".$val."<br />";
$this->set( $attr, $val );
}
$header_table = '
<table class="product_types" width="100%" cellspacing="0" summary="'.$this->get_cfg('flypage_parameters_name').'">
<caption>'.$this->get_cfg('flypage_parameters_name').'</caption>
<tr>
<th scope="col" abbr="'.$this->get_cfg('flypage_parameter_col_title').'" class="nobg">'.$this->get_cfg('flypage_parameter_col_title').'</th>
<th scope="col" abbr="'.$this->get_cfg('flypage_parameter_value_col_title').'">'.$this->get_cfg('flypage_parameter_value_col_title').'</th>
</tr>
';

$i = 0;
$print_header = true;
$print_footer = false;
if ( !empty( $product_type["parameters"] ) ) {
foreach( $product_type["parameters"] as $product_type_params ) {
/*##my14032011002911 {Added */
if(empty($product_type_params["parameter_value"]) || JString::substr($product_type_params["parameter_label"],0,1)== '*'){
continue;
}
if($print_header) {
$print_header = false;
$print_footer  = true;
echo $header_table;
}
/* ##my14032011002911 } */
foreach( $product_type_params as $attr => $val ) {
$this->set( $attr, $val );
}
if ( $i++ % 2 ) {
    $class = 'row1';
}
else {
    $class = 'row0';
}
if ( $i > $product_type["product_type_count_params"] ) {
break;
}

?><tr>
<th class="<?php echo $class;?>"><?php echo $product_type_params["parameter_label"];

if ( !empty($product_type_params["tooltip"] ) ) { ?>
&nbsp;<?php echo $product_type_params["tooltip"];
}
?>
</th>

<td class="<?php echo $class;?>"><?php /*##my12032011111649 {
It was:
echo $product_type_params["parameter_value"];
It became:*/
$product_params = explode(';',$product_type_params["parameter_value"]);
$product_params = implode(' &times; ',$product_params);
echo $product_params;
##my12032011111649 } */
if ( !empty($product_type_params["parameter_unit"] ) ) {
echo " ".$product_type_params["parameter_unit"];
} ?>
</td>
</tr>
<?php
}
}
if ($print_footer) {
echo '</table>';
$print_footer = false;
}

?>
    <?php
}
?>


Минус - больше запросов, чем нужно. Но можешь например в шаблон в theme.php вставить функцию, которая будет выбирать именно тот параметр, который нужен,  а не всё скопом. В любом случае будет проще и нагляднее, чем лезть в ядро колупаться.
Життя має дві форми - горіння і гниття!
-
Со мной на "ты" - Вам лень развёрнуто формулировать вопрос? Нам лень отвечать. Правильный вопрос: - Версии J! и проблемного расширения? - Что хотел? - Что пробовал? - Что получилось и что не получилось? - Какие были ошибки?
*

Servelatin

  • Захожу иногда
  • 132
  • 1 / 0
Re: product_type на shop.browse
« Ответ #5 : 26.05.2011, 21:02:33 »
Спасибо flyingspook, видел. Вывод параметра путем обрезания списка как-то не айс. Хочется то чтобы в нужном месте нужное значение...
*

Gruz

  • Завсегдатай
  • 1275
  • 167 / 3
  • gruz@jabber.org | gruz.org.ua
Re: product_type на shop.browse
« Ответ #6 : 26.05.2011, 21:07:18 »
Спасибо flyingspook, видел. Вывод параметра путем обрезания списка как-то не айс. Хочется то чтобы в нужном месте нужное значение...

По-моему, с тем, что я сюда кинул, по образу и подобию функции в этом посте http://joomlaforum.ru/index.php/topic,166048.msg896876.html#msg896876
не сложно сделать выборку. Один запрос.
« Последнее редактирование: 27.05.2011, 00:32:14 от Gruz »
Життя має дві форми - горіння і гниття!
-
Со мной на "ты" - Вам лень развёрнуто формулировать вопрос? Нам лень отвечать. Правильный вопрос: - Версии J! и проблемного расширения? - Что хотел? - Что пробовал? - Что получилось и что не получилось? - Какие были ошибки?
*

eLig

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Re: product_type на shop.browse
« Ответ #7 : 11.01.2012, 21:54:47 »
Добавлю чутка от себя.
Так как мне нужно параметры было разбросать по разным ячейкам таблицы я сделал следующие.
===========
Код
[b]файл common/product_type_shopbrowse.tpl.php[/b]
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
<?php if( empty($product_types)) return;
    $p1 = new fmx_parametr($product_types, 1, "otdelka");
    $p2 = new fmx_parametr($product_types, 1, "razmer");
?>
    <?php if($p2->checkparametr()):?>
       <?php echo $p2->val("value"); ?>
    <?php endif; ?>
    <?php if($p1->checkparametr()):?>
       /<?php echo $p1->val("value"); ?>              
    <?php endif; ?>
Убрал название параметра и поменял отображение на следующиий вид - Значение_1/Значение2

В browse_listtable.tpl.php вставил следующий код
Код
$perem = trim(str_replace(" ","",$product['product_type']));	
list($Per1, $Per2) = explode("/", $perem);
Первая строчка удаляет лишние пробелы между словами, а потом удаляет пробелы у начали и конца строки.
Далее в $Per1 помещается значение $p1, а  в $Per2 помещается значение $p2, значения разделаются /.
Выводится все это дело в нужном месте через echo.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод зависимых товаров в категории (browse)

Автор Seeker

Ответов: 15
Просмотров: 9848
Последний ответ 23.02.2013, 02:38:12
от rezon
Функции из flypage в browse.

Автор fprefix

Ответов: 6
Просмотров: 2922
Последний ответ 23.01.2012, 18:55:26
от vtx
Различные browse для разных категорий

Автор Chikir87

Ответов: 7
Просмотров: 1709
Последний ответ 20.04.2011, 22:07:21
от Chikir87
Как добавить ссылки "добавить в корзину" в шаблон browse?

Автор Dolphin

Ответов: 0
Просмотров: 1284
Последний ответ 09.12.2010, 06:36:54
от Dolphin
Manufacturer в shop.browse

Автор inc!

Ответов: 5
Просмотров: 5900
Последний ответ 10.11.2010, 01:05:16
от yevrowl