VirtueMart Forum

VirtueMart 2 + 3 + 4 => Virtuemart Development and bug reports => Topic started by: lysov on March 25, 2012, 12:35:24 PM

Title: The Feature MultiAuthor
Post by: lysov on March 25, 2012, 12:35:24 PM
In many cases (books, music, etc.) must specify the number of authors for the product. This ability to easily integrate into VM (g.e. VM 203E).
First of all, we need to make some core changes:
- to the product model (administrator/components/com_virtuemart/models/product.php) add two functions

//<-- LYV 2012-03-11
/**
* Load the product manufacturers id
*
* @author LYV
* @return array list of Manufacturers ID
*/
private function getProductManufacturers($virtuemart_product_id=0) {

$manufacturers = array();
if ($virtuemart_product_id > 0) {
$q = 'SELECT `virtuemart_manufacturer_id` FROM `#__virtuemart_product_manufacturers` WHERE `virtuemart_product_id` = "'.(int)$virtuemart_product_id.'"';
$this->_db->setQuery($q);
$manufacturers = $this->_db->loadResultArray();
}

return $manufacturers;
}

/**
* Load the product manufacturers list
*
* @author LYV
* @return array list of Manufacturers for this product
*/
public function getProductManufacturersList($virtuemart_product_id=0) {

if ($virtuemart_product_id > 0) {
$query  = 'SELECT DISTINCT l.`mf_name`,l.`virtuemart_manufacturer_id` FROM `#__virtuemart_manufacturers_'.VMLANG.'` as l';
$query .= ' JOIN `#__virtuemart_manufacturers` AS m using (`virtuemart_manufacturer_id`)';
$query .= ' JOIN `#__virtuemart_product_manufacturers` AS pm using (`virtuemart_manufacturer_id`)';
$query .= ' WHERE m.`published`=1 AND pm.`virtuemart_product_id` ='.(int)$virtuemart_product_id;
$query .= ' ORDER BY l.`mf_name`';
$this->_db->setQuery($query);
return $this->_db->loadObjectList();
}
return array();
}
// LYV -->

After that, you need to make a couple of changes to this file
-- into the function getProductSingle()

// Load the shoppers the product is available to for Custom Shopper Visibility
$product->shoppergroups = $this->getProductShoppergroups($this->_id);

//<-- LYV 2012-03-11: add some manufacturers
$product->manufacturers = $this->getProductManufacturers($this->_id);
// LYV -->
$ppTable = $this->getTable('product_prices');


-- into the function fillVoidProduct()

$product->categories = array();
$product->shoppergroups= array();
//<-- LYV 2012-03-11: add some manufacturers
$product->manufacturers = array();
// LYV -->

if($front){


- to the Manufacturer model (administrator/components/com_virtuemart/models/manufacturer.php) add the function getManufacturerList() (it was commented):

//<-- LYV 2012-03-11: for MultiManufacturer = MultiAuthor
    /**
     * Select the Manufacturers to list on the product list page
     */
public function getManufacturerList() {
$db = JFactory::getDBO();
$q = "SELECT `virtuemart_manufacturer_id`, `mf_name` AS `text` FROM `#__virtuemart_manufacturers_".VMLANG."` ORDER BY `mf_name`";
$db->setQuery($q);
return $db->loadObjectList();
}
// LYV -->

- the next step, we need to make changes in the BE product view (at least) - administrator/components/com_virtuemart/views/product/view.html.php
-- into the function display()

/* Load the manufacturers*/
// $config = VmConfig::loadConfig();
$mf_model = VmModel::getModel('manufacturer');
//<-- LYV replaced for MA (combox -> listbox) -->
// $manufacturers = $mf_model->getManufacturerDropDown($product->virtuemart_manufacturer_id);
$manufacturers = $mf_model->getManufacturerList();
//<-- LYV 2012-03-11 add multiAuthor
if(!isset($product->virtuemart_manufacturer_id)) {
$product->virtuemart_manufacturer_id = 1; // As defined at the database
}
// LYV -->
if(count($manufacturers)>0 ){
//<-- LYV --> $lists['manufacturers'] = JHTML::_('select.genericlist', $manufacturers, 'virtuemart_manufacturer_id', 'class="inputbox"', 'value', 'text', $product->virtuemart_manufacturer_id );
$lists['manufacturers'] = JHTML::_('select.genericlist', $manufacturers, 'virtuemart_manufacturer_id[]', 'multiple="multiple"', 'virtuemart_manufacturer_id', 'text', $product->manufacturers);
}

$lists['product_weight_uom'] = ShopFunctions::renderWeightUnitList('product_weight_uom',$task=='add'? VmConfig::get('weight_unit_default'): $product->product_weight_uom);


- the next step is editing FE view and layout - components/com_virtuemart/views/productdetails/view.html.php and components/com_virtuemart/views/productdetails/tmpl/default_manufacturer.php
-- view.html.php - edit the function display()

/* Load the product */
// $product = $this->get('product'); //Why it is sensefull to use this construction? Imho it makes it just harder
$product_model = VmModel::getModel('product');

$virtuemart_product_idArray = JRequest::getInt('virtuemart_product_id', 0);
if (is_array($virtuemart_product_idArray)) {
    $virtuemart_product_id = $virtuemart_product_idArray[0];
} else {
    $virtuemart_product_id = $virtuemart_product_idArray;
}

$product = $product_model->getProduct($virtuemart_product_id);
//<-- LYV 2012-03-11
$manufacturers = $product_model->getProductManufacturersList($virtuemart_product_id);
// LYV -->
        ...
        ...
$this->assignRef('min_order_level', $min_order_level);

//<-- LYV 2012-03-11
$this->assignRef('manufacturers', $manufacturers);
// LYV -->
        ...


-- the layout default_manufacturer.php

<div class="manufacturer">
<?php
$i 0;
/* Avoid JavaScript on PDF Output */
if (strtolower(JRequest::getWord('output')) == "pdf") {
foreach ($this->manufacturers as $author) {
if ($i++ > 0) echo ', ';
$link JRoute::_('index.php?option=com_virtuemart&view=manufacturer&virtuemart_manufacturer_id=' $author->virtuemart_manufacturer_id '&tmpl=component');
echo JHTML::_('link'$link$author->mf_name);
}
} else {
?>

<span class="bold"><?php echo JText::_('COM_VIRTUEMART_PRODUCT_DETAILS_MANUFACTURER_LBL'); ?></span>
<?php
foreach ($this->manufacturers as $author) {
if ($i++ > 0) echo ', ';
$link JRoute::_('index.php?option=com_virtuemart&view=manufacturer&virtuemart_manufacturer_id=' $author->virtuemart_manufacturer_id '&tmpl=component');
?>

<a class="modal" rel="{handler: 'iframe', size: {x: 700, y: 550}}" href="<?php echo $link?>"><?php echo $author->mf_name?></a>
<?php
}
?>

</div>

Now we can check the performance of this feature!
And for completeness, we need more to make small changes to the BE view for the list of the products (column Manufacturer).
Title: Re: The Feature MultiAuthor
Post by: Paul66 on September 19, 2012, 17:33:19 PM
Hi lysov,
I needed the multi-manufacturer option that you have described in your post for a website, so I went through the process of adding the code to virtuemart files as you instructed. It all seems to have went well untill I click on a product and I get multiples of this error coming up:
....................\libraries\joomla\html\html\select.php on line 85

I also don't see how to choose multiple manufacturers in the virtuemart product control panel.

Can you please help?

Thanks
Title: Re: The Feature MultiAuthor
Post by: lysov on December 19, 2012, 08:14:37 AM
I did not complete this development. For books are very important order of authors. In my case, this is achieved by the output order FIFO. The patch for versions 2.0.15a - 2.0.15e for applying is attached. Lack of my decision is the wrong display of authors in the BE list of products.
To apply the patch please follow next steps:
1. Unpack VM 215e to the /var/www/html/tempo/vm/215a/ (this is important, this path is written in the patch file!!!)
2. Copy the patch for example to your html folder (/var/www/html/<your-site>/)
3. Run next shell commands:
$  cd /var/www/html/<your-site>/
$  patch -p0 -i manufacturers-215.patch
4. Replace FE template to the attached version (components/com_virtuemart/views/productdetails/default_manufacturer.php)

[attachment cleanup by admin]
Title: Re: The Feature MultiAuthor
Post by: bobchain on February 05, 2013, 18:11:05 PM
Hi lysov,
after much research and finding answer to my problem in your post.

my problem is the same that you have show in the first post:
how can I assign an article to more manufacturers?

the problem arises since my shop is selling books and managing manufactures such as writers, poets, authors,  I need to be able to assign certain items (books) that are written by more manufaturers simultaneously.

I tried manipulating the association table article_manufactures manually [myid_virtuemart_product_manufacturers].
the creation of the report allows me to associate more rightly [virtuemart_manufacturer_id] same [virtuemart_product_id].
Search filters keep track of the relationship and I relate in the same book page: items list for manufacturers, and other pages of search or filters.

The problem remains, however, in the management: for each item I can not associate multiple manufacturers.

How can I change the management page of the article to allow the assignment to multiple manufacturers? Maybe the same method that is used to assign an item to multiple categories.

I read your guide but I have a problem when I need to execute the patch.
Is not possible modify every file in the manually mode? could you send me the index of step to do?

Then in the next update of VM2 I could have problem with this management?

my actually environment is: joomla 2.5.8 + VM 2018

thank you very much for every your answer, hopeful for your help!

Roberto
Title: Re: The Feature MultiAuthor
Post by: bobchain on February 06, 2013, 10:25:07 AM
Hi Lysov,
I was able to make the changes that you specified in the patch manually.

Only problem is still reflected in the view: List products, manufaturers column shows only an "author" as I was expecting to see the field as the column categories.
Where can I be wrong?

thank you for your help.

Roberto
Title: Re: The Feature MultiAuthor
Post by: tobisagt on April 06, 2013, 11:57:00 AM
Thx for your instructions! It works like a charm!!! :)

But one i really want to know. How to show the manufacturers description of each author in product details?
I hope you can help me!

EDIT: And a second question. Is it possible to show alle authors on category view?

Thx
-Tobi
Title: Re: The Feature MultiAuthor
Post by: penart on April 30, 2013, 22:45:47 PM
Hi,

Could you please help me with the procedure of the Feature MultiAuthor at vm2.  I cannot understand how to do this.  I have a site for a school, and I have to add many teachers (manufacturers) in on product (course).

Thanks in advance
Penelope
Title: Re: The Feature MultiAuthor
Post by: bobchain on May 31, 2013, 15:14:28 PM
dear,
I wish I could use the same function (multi-combination) on the category view.
who I know how to modify the core files "category" to use the same query to display into override of  the category view?

@VM DEV: whi not include this feature in the next release?
would be very useful to be able to assign a single product more "manufacturer" (make management much more flexible and usable) my case: book (multiple authors for each book), or training courses (more professors / teachers or schools)
or if we have a parent product and No. variants products, check more producers to the father, and son is just one specific

Roberto
Title: Re: The Feature MultiAuthor
Post by: Adam Bazaroff on June 28, 2014, 09:52:38 AM
Any solution for 2.6.6? Don't understand, why Developers don't add multiple manufacturers? It strongly need for bookstores (2-3 authors on once book), music stores (CD compilations) and other.
Title: Re: The Feature MultiAuthor
Post by: Milbo on June 30, 2014, 15:01:45 PM
Because it is added in vm3 and it takes a day to implement and test it. If you pay the day, we can do it.
Title: Re: The Feature MultiAuthor
Post by: balai on June 30, 2014, 16:59:33 PM
Have you tried custom fields?
Title: Re: The Feature MultiAuthor
Post by: Milbo on July 04, 2014, 21:44:19 PM
you may try http://virtuemart.net/news/latest-news/460-updates-about-virtuemart-3-support-membership
Title: Re: The Feature MultiAuthor
Post by: vm_ASL on October 24, 2014, 17:37:31 PM
Hello there,

i was looking forward to the multiple manufacturer option  in vm3 resp. 2.9.9. and i'm happy we're able to select multiple mf to one product.

BUT how can i achieve to really show these manufacturers on the productdetailspage?

what do i have to change here? (components/com_virtuemart/views/productdetails/default.php)


      <?php
      // Manufacturer of the Product
      if (VmConfig::get('show_manufacturers', 1) && !empty($this->product->virtuemart_manufacturer_id)) {
         echo $this->loadTemplate('manufacturer');
      }
      ?>

im using Joomla 3.3.6 and vm 2.9.9.2

Title: Re: The Feature MultiAuthor
Post by: tobisagt on December 02, 2014, 23:31:19 PM
Hi. I dont know if this is useful for you because its in german: http://www.webnut.de/webnut-blog/geschreibsel/52-virtuemart-3-es-wird-nur-ein-hersteller-angezeigt.html  (http://www.webnut.de/webnut-blog/geschreibsel/52-virtuemart-3-es-wird-nur-ein-hersteller-angezeigt.html)
Replace the code in "default_manufacturer.php" in your template overrite with this code:

<div class="manufacturer">   
    <?
        $manufacturers_id = $this->product->virtuemart_manufacturer_id;
         
        // Zähle die Hersteller
        $numManufacturer = count($manufacturers_id);
     
        $i = 1;
         
        // Gebe die Hersteller aus
        foreach($manufacturers_id as $manufacturer_id)
        {
            $db = JFactory::getDbo();
            $query = $db->getQuery(true);
            $query->select('mf_name');
            $query->from($db->quoteName('#__virtuemart_manufacturers_de_de'));
            $query->where($db->quoteName('virtuemart_manufacturer_id')." = ".$manufacturer_id);
             
            $db->setQuery($query);
            $manufacturers_details = $db->loadObject();
             
            // Produktlink des Herstellers
            $link = JRoute::_('index.php?option=com_virtuemart&view=manufacturer&virtuemart_manufacturer_id=' . $manufacturer_id .'&tmpl=component', FALSE);
            $name = $manufacturers_details->mf_name;
             
            /* Avoid JavaScript on PDF Output */
            if (strtolower(vRequest::getCmd('output')) == "pdf") {
                echo JHtml::_('link', $link, $name);
            } else {
            ?>
                <a class="manuModal" rel="{handler: 'iframe', size: {x: 700, y: 550}}" href="/<?php echo $link ?>"><?php echo $name ?></a> 
             
                <?php        
                
// Füge ein Komma hinter jeden Hersteller, außer dem letzten.
                
if ($i != $numManufacturer)
                {
                    echo 
', ';
                }
            }   
            
$i++;
        }
    
?>

</div>


I hope it is useful for you.

Maybe you need to change this line to your language:
$query->from($db->quoteName('#__virtuemart_manufacturers_de_de'));
Title: Re: The Feature MultiAuthor
Post by: Milbo on December 04, 2014, 08:36:05 AM
I strongly recommened to use the vm api for stuff like that


foreach($manufacturers_id as $manufacturer_id)
        {
            $db = JFactory::getDbo();

This is evil, avoid always sql in the templates, better use the cached vm objects

$manModel = VmModel::getModel('manufacturer');
$manufacturers_details = $manModel->getManufacturer($id);

....
then you also do not have to think about the language. In your case language fallback wouldnt work.
Title: Re: The Feature MultiAuthor
Post by: tobisagt on December 04, 2014, 18:46:59 PM
Thank you Milbo. This is indeed the better way! :)

Here's the new Code:

<div class="manufacturer">   
    <?
  $manufacturers_id = $this->product->virtuemart_manufacturer_id;

// Zähle die Hersteller
$numManufacturer = count($manufacturers_id);

    $i = 1;
    // Gebe die Hersteller aus
    foreach($manufacturers_id as $manufacturer_id)
    {

$manModel = VmModel::getModel('manufacturer');
$manufacturers_details = $manModel->getManufacturer($manufacturer_id);

// Produktlink des Herstellers
$link = JRoute::_('index.php?option=com_virtuemart&view=category&virtuemart_manufacturer_id=' . $manufacturer_id, FALSE);
$name = $manufacturers_details->mf_name;

/* Avoid JavaScript on PDF Output */
    if (strtolower(vRequest::getCmd('output')) == "pdf") {
echo JHtml::_('link', $link, $name);
    } else {
?>
<a class="manuModal" rel="{handler: 'iframe', size: {x: 700, y: 550}}" href="<?php echo $link ?>"><?php echo $name ?></a>

<?php
// Füge ein Komma hinter jeden Hersteller, außer dem letzten.
if ($i != $numManufacturer)
{
echo ', ';
}
    }
     $i++;
     }
    ?>

</div>
Title: Re: The Feature MultiAuthor
Post by: vm_ASL on December 08, 2014, 10:09:53 AM
Hello tobisagt,

happy to see a workaraound here, finally! Thank you very much, it works for me, so far...
But what I did was to change my override for components\com_virtuemart\views\productdetails\tmpl\default.php with your code, not in default_manufacturer.php.

Thank you very much, anyway!