VM 2.x Настраиваемые поля на странице категории.

Нормальные герои-всегда идут в обход! :)
Не силен в сайтостроении, но..=> Joomla! 2.5.8, VM 2.0.16.
Решил переименовать габариты и вес товара, под необходимые характеристики товаров ( в моем случае проекты домов) рис. adm и вывести не в описание продукта , а в информации о товаре( рис. sait.)
Суть вопроса:
1. Где-то накосячил в коде default.php , или в другом месте, и не могу корректно убрать поле Материал стен( бывшее Кол-во в упаковке) из описания( рис. sait. по стрелочке).
2. Какие изменения нужно внести в базу данных, что бы в поле Материал стен( Кол-во в упаковке) была возможность вписать наименование материала , допустим "Бревно оцилиндрованное" целиком, а то обрезает.
Изобажения и код default.php. ниже
Код:
<?php
/**
*
* Show the product details page
*
* @package    VirtueMart
* @subpackage
* @author Max Milbers, Eugen Stranz
* @author RolandD,
* @todo handle child products
* @link http://www.virtuemart.net
* @copyright Copyright (c) 2004 - 2010 VirtueMart Team. All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
* VirtueMart is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* @version $Id: default.php 6530 2012-10-12 09:40:36Z alatak $
*/
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die('Restricted access');
 
// addon for joomla modal Box
JHTML::_('behavior.modal');
// JHTML::_('behavior.tooltip');
$document = JFactory::getDocument();
$document->addScriptDeclaration("
    jQuery(document).ready(function($) {
        $('a.ask-a-question').click( function(){
            $.facebox({
                iframe: '" . $this->askquestion_url . "',
                rev: 'iframe|550|550'
            });
            return false ;
        });
    /*    $('.additional-images a').mouseover(function() {
            var himg = this.href ;
            var extension=himg.substring(himg.lastIndexOf('.')+1);
            if (extension =='png' || extension =='jpg' || extension =='gif') {
                $('.main-image img').attr('src',himg );
            }
            console.log(extension)
        });*/
    });
");
/* Let's see if we found the product */
if (empty($this->product)) {
    echo JText::_('COM_VIRTUEMART_PRODUCT_NOT_FOUND');
    echo '<br /><br />  ' . $this->continue_link_html;
    return;
}
?>
 
<div class="productdetails-view productdetails">
 
    <?php
    // Product Navigation
    if (VmConfig::get('product_navigation', 1)) {
    ?>
        <div class="product-neighbours">
        <?php
        if (!empty($this->product->neighbours ['previous'][0])) {
        $prev_link = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $this->product->neighbours ['previous'][0] ['virtuemart_product_id'] . '&virtuemart_category_id=' . $this->product->virtuemart_category_id);
        echo JHTML::_('link', $prev_link, $this->product->neighbours ['previous'][0]
            ['product_name'], array('class' => 'previous-page'));
        }
        if (!empty($this->product->neighbours ['next'][0])) {
        $next_link = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $this->product->neighbours ['next'][0] ['virtuemart_product_id'] . '&virtuemart_category_id=' . $this->product->virtuemart_category_id);
        echo JHTML::_('link', $next_link, $this->product->neighbours ['next'][0] ['product_name'], array('class' => 'next-page'));
        }
        ?>
        <div class="clear"></div>
        </div>
    <?php } // Product Navigation END
    ?>
 
    <?php // Back To Category Button
    if ($this->product->virtuemart_category_id) {
        $catURL =  JRoute::_('index.php?option=com_virtuemart&view=category&virtuemart_category_id='.$this->product->virtuemart_category_id);
        $categoryName = $this->product->category_name ;
    } else {
        $catURL =  JRoute::_('index.php?option=com_virtuemart');
        $categoryName = jText::_('COM_VIRTUEMART_SHOP_HOME') ;
    }
    ?>
    <div class="back-to-category">
        <a href="<?php echo $catURL ?>" class="product-details" title="<?php echo $categoryName ?>"><?php echo JText::sprintf('COM_VIRTUEMART_CATEGORY_BACK_TO',$categoryName) ?></a>
    </div>
 
    <?php // Product Title  ?>
    <h1><?php echo $this->product->product_name ?></h1>
    <?php // Product Title END  ?>
 
    <?php // afterDisplayTitle Event
    echo $this->product->event->afterDisplayTitle ?>
 
    <?php
    // Product Edit Link
    echo $this->edit_link;
    // Product Edit Link END
    ?>
 
    <?php
    // PDF - Print - Email Icon
    if (VmConfig::get('show_emailfriend') || VmConfig::get('show_printicon') || VmConfig::get('pdf_button_enable')) {
    ?>
        <div class="icons">
        <?php
        //$link = (JVM_VERSION===1) ? 'index2.php' : 'index.php';
        $link = 'index.php?tmpl=component&option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $this->product->virtuemart_product_id;
        $MailLink = 'index.php?option=com_virtuemart&view=productdetails&task=recommend&virtuemart_product_id=' . $this->product->virtuemart_product_id . '&virtuemart_category_id=' . $this->product->virtuemart_category_id . '&tmpl=component';
 
        if (VmConfig::get('pdf_icon', 1) == '1') {
        echo $this->linkIcon($link . '&format=pdf', 'COM_VIRTUEMART_PDF', 'pdf_button', 'pdf_button_enable', false);
        }
        echo $this->linkIcon($link . '&print=1', 'COM_VIRTUEMART_PRINT', 'printButton', 'show_printicon');
        echo $this->linkIcon($MailLink, 'COM_VIRTUEMART_EMAIL', 'emailButton', 'show_emailfriend');
        ?>
        <div class="clear"></div>
        </div>
    <?php } // PDF - Print - Email Icon END
    ?>
 
    <?php
    // Product Short Description
    if (!empty($this->product->product_s_desc)) {
    ?>
        <div class="product-short-description">
        <?php
        /** @todo Test if content plugins modify the product description */
        echo nl2br($this->product->product_s_desc);
        ?>
        </div>
    <?php
    } // Product Short Description END
 
 
    if (!empty($this->product->customfieldsSorted['ontop'])) {
    $this->position = 'ontop';
    echo $this->loadTemplate('customfields');
    } // Product Custom ontop end
    ?>
 
    <div>
    <div class="width60 floatleft">
<?php
echo $this->loadTemplate('images');
?>
    </div>
 
    <div class="width40 floatright">
        <div class="spacer-buy-area">
 
        <?php
        // TODO in Multi-Vendor not needed at the moment and just would lead to confusion
        /* $link = JRoute::_('index2.php?option=com_virtuemart&view=virtuemart&task=vendorinfo&virtuemart_vendor_id='.$this->product->virtuemart_vendor_id);
          $text = JText::_('COM_VIRTUEMART_VENDOR_FORM_INFO_LBL');
          echo '<span class="bold">'. JText::_('COM_VIRTUEMART_PRODUCT_DETAILS_VENDOR_LBL'). '</span>'; ?><a class="modal" href="<?php echo $link ?>"><?php echo $text ?></a><br />
        */
        ?>
 
        <?php
        if ($this->showRating) {
            $maxrating = VmConfig::get('vm_maximum_rating_scale', 5);
 
            if (empty($this->rating)) {
            ?>
            <span class="vote"><?php echo JText::_('COM_VIRTUEMART_RATING') . ' ' . JText::_('COM_VIRTUEMART_UNRATED') ?></span>
                <?php
            } else {
                $ratingwidth = $this->rating->rating * 24; //I don't use round as percetntage with works perfect, as for me
                ?>
            <span class="vote">
    <?php echo JText::_('COM_VIRTUEMART_RATING') . ' ' . round($this->rating->rating) . '/' . $maxrating; ?><br/>
                <span title=" <?php echo (JText::_("COM_VIRTUEMART_RATING_TITLE") . round($this->rating->rating) . '/' . $maxrating) ?>" class="ratingbox" style="display:inline-block;">
                <span class="stars-orange" style="width:<?php echo $ratingwidth.'px'; ?>">
                </span>
                </span>
            </span>
            <?php
            }
        }
        if (is_array($this->productDisplayShipments)) {
            foreach ($this->productDisplayShipments as $productDisplayShipment) {
            echo $productDisplayShipment . '<br />';
            }
        }
        if (is_array($this->productDisplayPayments)) {
            foreach ($this->productDisplayPayments as $productDisplayPayment) {
            echo $productDisplayPayment . '<br />';
            }
        }
        // Product Price
            // the test is done in show_prices
        //if ($this->show_prices and (empty($this->product->images[0]) or $this->product->images[0]->file_is_downloadable == 0)) {
            echo $this->loadTemplate('showprices');
        //}
        ?>
 
        <?php
        // Add To Cart Button
//            if (!empty($this->product->prices) and !empty($this->product->images[0]) and $this->product->images[0]->file_is_downloadable==0 ) {
//        if (!VmConfig::get('use_as_catalog', 0) and !empty($this->product->prices['salesPrice'])) {
            echo $this->loadTemplate('addtocart');
//        }  // Add To Cart Button END
        ?>
 
        <?php
        // Availability Image
        $stockhandle = VmConfig::get('stockhandle', 'none');
        if (($this->product->product_in_stock - $this->product->product_ordered) < 1) {
            if ($stockhandle == 'risetime' and VmConfig::get('rised_availability') and empty($this->product->product_availability)) {
            ?>    <div class="availability">
                <?php echo (file_exists(JPATH_BASE . DS . VmConfig::get('assets_general_path') . 'images/availability/' . VmConfig::get('rised_availability'))) ? JHTML::image(JURI::root() . VmConfig::get('assets_general_path') . 'images/availability/' . VmConfig::get('rised_availability', '7d.gif'), VmConfig::get('rised_availability', '7d.gif'), array('class' => 'availability')) : VmConfig::get('rised_availability'); ?>
            </div>
            <?php
            } else if (!empty($this->product->product_availability)) {
            ?>
            <div class="availability">
            <?php echo (file_exists(JPATH_BASE . DS . VmConfig::get('assets_general_path') . 'images/availability/' . $this->product->product_availability)) ? JHTML::image(JURI::root() . VmConfig::get('assets_general_path') . 'images/availability/' . $this->product->product_availability, $this->product->product_availability, array('class' => 'availability')) : $this->product->product_availability; ?>
            </div>
            <?php
            }
        }
        ?>
 
<?php
// Ask a question about this product
if (VmConfig::get('ask_question', 1) == 1) {
    ?>
            <div class="ask-a-question">
                <a class="ask-a-question" href="<?php echo $this->askquestion_url ?>" ><?php echo JText::_('COM_VIRTUEMART_PRODUCT_ENQUIRY_LBL') ?></a>
                <!--<a class="ask-a-question modal" rel="{handler: 'iframe', size: {x: 700, y: 550}}" href="<?php echo $this->askquestion_url ?>"><?php echo JText::_('COM_VIRTUEMART_PRODUCT_ENQUIRY_LBL') ?></a>-->
            </div>
        <?php }
        ?>
 
        <?php
        // Manufacturer of the Product
        if (VmConfig::get('show_manufacturers', 1) && !empty($this->product->virtuemart_manufacturer_id)) {
            echo $this->loadTemplate('manufacturer');
        }
        ?>
 
        </div>
    </div>
    <div class="clear"></div>
    </div>
 
    <?php // event onContentBeforeDisplay
    echo $this->product->event->beforeDisplayContent; ?>
 
    <?php
    // Product Description
    if (!empty($this->product->product_desc)) {
        ?>
        <div class="product-description">
    <?php /** @todo Test if content plugins modify the product description */ ?>
        <span class="title"><?php echo JText::_('COM_VIRTUEMART_PRODUCT_DESC_TITLE') ?></span>
    <?php echo $this->product->product_desc; ?>
        </div>
    <?php
    } // Product Description END
 
    if (!empty($this->product->customfieldsSorted['normal'])) {
    $this->position = 'normal';
    echo $this->loadTemplate('customfields');
    } // Product custom_fields END
    // Product Packaging
    $product_packaging = '';
    if ($this->product->product_box) {
    ?>
        <div class="product-box">
        <?php
            echo JText::_('COM_VIRTUEMART_PRODUCT_UNITS_IN_BOX') .$this->product->product_box;
        ?>
        </div>
    <?php } // Product Packaging END
    ?>
 
    <?php
    // Product Files
    // foreach ($this->product->images as $fkey => $file) {
    // Todo add downloadable files again
    // if( $file->filesize > 0.5) $filesize_display = ' ('. number_format($file->filesize, 2,',','.')." MB)";
    // else $filesize_display = ' ('. number_format($file->filesize*1024, 2,',','.')." KB)";
 
    /* Show pdf in a new Window, other file types will be offered as download */
    // $target = stristr($file->file_mimetype, "pdf") ? "_blank" : "_self";
    // $link = JRoute::_('index.php?view=productdetails&task=getfile&virtuemart_media_id='.$file->virtuemart_media_id.'&virtuemart_product_id='.$this->product->virtuemart_product_id);
    // echo JHTMl::_('link', $link, $file->file_title.$filesize_display, array('target' => $target));
    // }
    if (!empty($this->product->customfieldsRelatedProducts)) {
    echo $this->loadTemplate('relatedproducts');
    } // Product customfieldsRelatedProducts END
 
    if (!empty($this->product->customfieldsRelatedCategories)) {
    echo $this->loadTemplate('relatedcategories');
    } // Product customfieldsRelatedCategories END
    // Show child categories
    if (VmConfig::get('showCategory', 1)) {
    echo $this->loadTemplate('showcategory');
    }
    if (!empty($this->product->customfieldsSorted['onbot'])) {
        $this->position='onbot';
        echo $this->loadTemplate('customfields');
    } // Product Custom ontop end
    ?>
 
<?php // onContentAfterDisplay event
echo $this->product->event->afterDisplayContent; ?>
 
<?php
echo $this->loadTemplate('reviews');
?>
</div>
 

Вложения

  • adm.jpg
    adm.jpg
    57,3 KB · Просмотры: 101
  • sait.jpg
    sait.jpg
    93,4 KB · Просмотры: 114
Нормальные герои-всегда идут в обход!
Зачем все усложнять и придумывать колесо - достаточно добавить настраиваемое поле типа строка и вывести его там, где необходимо.
Как это сделать - смотри Для просмотра ссылки Войди или Зарегистрируйся
Это идеальный вариант.

Что касается вопросов, то:
1) за вывод этой переменной в шаблоне отвечает кусок кода:
PHP:
 <?php
      // Product Packaging
    $product_packaging = '';
    if ($this->product->product_box) {
    ?>
        <div class="product-box">
        <?php
            echo JText::_('COM_VIRTUEMART_PRODUCT_UNITS_IN_BOX') .$this->product->product_box;
        ?>
        </div>
    <?php } // Product Packaging END
    ?>

2) Поле можно расширить - файл product_edit_dimensions.php в папке \administrator\components\com_virtuemart\views\product\tmpl
строка
PHP:
<input type="text" class="inputbox"  name="product_box" value="<?php echo $this->product->product_box; ?>" size="15" maxlength="15"/>&nbsp;
Изменить значение maxlength
Но это все слетит при первом обновлении версии VM.

Поэтому смотри настраиваемые поля.
P.S. Если будешь менять что-то в шаблоне default.php - не забудь его скопировать в папку шаблона \templates\ШАБЛОН\html\com_virtuemart\productdetails

 
Зачем все усложнять и придумывать колесо - достаточно добавить настраиваемое поле типа строка и вывести его там, где необходимо.
Как это сделать - смотри Для просмотра ссылки Войди или Зарегистрируйся
Это идеальный вариант.
Действительно лучший вариант. При создании настраиваемого поля в строке Позиция макета вводим необходимое нам название. К примеру Позиция макета: variant. Тогда код будет выглядеть следующим образом:
Код:
<?php
if (!empty($this->product->customfieldsSorted['variant'])) {
$this->position='variant';
echo $this->loadTemplate('customfields');
} ?>
Вставляете этот код куда вам удобно и вуаля.Все работает)
 
Вышеприведённый способ имеет недостатки:

Ниже у меня идёт код отвечающий за кнопку "добавить в корзину", которая тоже добавлена на странице категорий.
можете привести этот код? :)
не могу поставить корзину, чтобы работала с связке с полями...
 
Как увеличить число вводимых символов в поле "По умолчанию" в настраиваемых полях VirtueMart 2... ?
в базе менял тип в virtuemart_customs значения custom_value но не чего не получилось, не хватает знаний...
 
Как увеличить число вводимых символов в поле "По умолчанию" в настраиваемых полях VirtueMart 2... ?
в базе менял тип в virtuemart_customs значения custom_value но не чего не получилось, не хватает знаний...
в файле administrator\components\com_virtuemart\helpers\html.php
в строчке public static function input($name,$value,$class='class="inputbox"',$readonly='',$size='37',$maxlength='255',$more=''){
изменить значение 255 на нужное Вам! (255 - ограничение символов)

подскажите, как вывести в корзине у товара определенное настраиваемое поле?
все способы описанные тут, не помогают :(
 
подскажите, как вывести в корзине у товара определенное настраиваемое поле?
все способы описанные тут, не помогают :(
В корзине можно вывести только поле типа "Атрибут корзины" или другое поле, например "строка", но с атрибутом корзины.
"Атрибут корзины " позволяет добавить товару некоторые опции, которые могут изменять его цену, например размер, цвет и т.д.
Отличие друг от друга - Тип поля "Атрибут корзины" выводится возле кнопки "купить" в виде выпадающего списка select, а поле с атрибутом корзины в виде radio-переключателя.
 
В корзине можно вывести только поле типа "Атрибут корзины" или другое поле, например "строка", но с атрибутом корзины.
"Атрибут корзины " позволяет добавить товару некоторые опции, которые могут изменять его цену, например размер, цвет и т.д.
Отличие друг от друга - Тип поля "Атрибут корзины" выводится возле кнопки "купить" в виде выпадающего списка select, а поле с атрибутом корзины в виде radio-переключателя.
мне вот нужно отображение только в корзине (выбор не обязателен, пусть просто будет текст)
чтобы выбирать ничего нельзя было :) и не отображалось в карточке продукта
 
Тогда можно в карточке товара скрыть при помощи CSS тот блок, который выводит настраиваемое поле. Вычислить его FireBug-ом и дописать ему в таблицу стилей {display: none;}
 
Вышеприведённый способ имеет недостатки:
- если у одного товара есть доп. поля а у другого их нет - на странице появляются ошибки кода.
- у меня почему-то вообще не заработало, хотя я не подвергаю сомнению чужие слова - мои руки не самые прямые.
- чужой файл зачем загружать, когда должны быть решения стандартными средствами.

Я сделал так:
1) В папку component/com_virtuemart/category/ добавил файл default_addtocart.php, который взял из соседней папки "productdetails"
2) в файл com_virtuemart/category/default.php после строки
PHP:
<form method="post" class="product" action="index.php" id="addtocartproduct<?php echo $product->virtuemart_product_id ?>">
добавил код

PHP:
<!-- Пытаемся вставить ручные поля  -->
  <?php // Product custom_fields
  if (!empty($product->customfieldsCart)) {  ?>
  <div class="product-fields">
      <?php foreach ($product->customfieldsCart as $field)
      { ?><div style="display:inline-block;" class="product-field product-field-type-<?php echo $field->field_type ?>">
        <span class="product-fields-title" ><b><?php echo  JText::_($field->custom_title)?></b></span>
        <?php //echo JHTML::tooltip($field->custom_tip,  JText::_($field->custom_title), 'tooltip.png'); ?>
        <span class="product-field-display"><?php echo $field->display ?></span>
 
        <span class="product-field-desc"><?php echo $field->custom_field_desc ?></span>
        </div><br/ >
        <?php
      }
      ?>
  </div>
  <?php }
    /* Product custom Childs
    * to display a simple link use $field->virtuemart_product_id as link to child product_id
    * custom_value is relation value to child
    */
 
  if (!empty($product->customsChilds)) {  ?>
      <div class="product-fields">
        <?php foreach ($product->customsChilds as $field) {  ?>
            <div style="display:inline-block;" class="product-field product-field-type-<?php echo $field->field->field_type ?>">
            <span class="product-fields-title" ><b><?php echo JText::_($field->field->custom_title)?></b></span>
            <span class="product-field-desc"><?php echo JText::_($field->field->custom_value)?></span>
            <span class="product-field-display"><?php echo $field->display ?></span>
 
            </div><br/ >
            <?php
        } ?>
      </div>
  <?php } ?>

Ниже у меня идёт код отвечающий за кнопку "добавить в корзину", которая тоже добавлена на странице категорий.
Решил проблемку с выводом ошибки если поля не заполнены,просто добавил if,в первую функцию,на проверку поля
public static function getCustomFieldValue($oProduct, $iFieldId, $bAll = false)
{
$sValue = "";
if($oProduct->customfields){
foreach (isset($oProduct->customfields) ? $oProduct->customfields : $oProduct->customfieldsSorted["normal"] as $field)
if($field->virtuemart_custom_id == $iFieldId)
{
$sValue = $bAll ? $field : $field->custom_value;
break;
}
}
return $sValue;
}
 
Назад
Сверху