Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a checkbox to product image gallery (like "Disable/Exclude")

Tags:

magento

I'm trying to code a new checkbox to be appended to the columns in the image gallery, beside "Disable". Its behavior would be the same as "Disable/Exclude" = Yes/No with entry in the database.

The idea is to add a "Use as page" checkbox for each image in the image gallery. The goal being to make a JS carousel with all pictures checked as "Use as page".

I have a few things done but I cannot :

  • update data in the database => set 0 or 1 to the "page" field (see below)
  • retrieve data from the database and then check/uncheck the checkbox depending on the "page" field.

--> So my question is : how to update data in the database and retrieve it in the checkbox (0 or 1 depending on the field value) ?

Thanks all for your very precious help.


Here is what I've done (1.4.1.0) :

1- Update table catalog_product_entity_media_gallery_value

Added a new field (which name is "page") :

  • page tinyint(4) UNSIGNED No 0

2- Made the following changes to class Mage_Catalog_Model_Product_Attribute_Backend_Media

Line 49 :

from

$localAttributes = array('label', 'position', 'disabled');

to

$localAttributes = array('label', 'position', 'disabled', 'page');

Line 223 :

from

$data['disabled'] = (int) $image['disabled'];

to

$data['disabled'] = (int) $image['disabled'];
$data['page'] = (int) $image['page'];

Line 301

from

$mediaGalleryData['images'][] = array(
    'file'     => $fileName,
    'position' => $position,
    'label'    => '',
    'disabled' => (int) $exclude
);

to

$mediaGalleryData['images'][] = array(
    'file'     => $fileName,
    'position' => $position,
    'label'    => '',
    'disabled' => (int) $exclude,
    'page' => (int) $exclude,
);

Line 328

from

$fieldsMap = array(
    'label'    => 'label',
    'position' => 'position',
    'disabled' => 'disabled',
    'exclude'  => 'disabled',
);

to

$fieldsMap = array(
    'label'    => 'label',
    'position' => 'position',
    'disabled' => 'disabled',
    'exclude'  => 'disabled',
    'page'  => 'disabled',
);

3- Made the following changes to template adminhtml/default/default/template/catalog/product/helper/gallery.phtml

Line 64

from

    <th><?php echo Mage::helper('catalog')->__('Exclude') ?></th>

to

    <th><?php echo Mage::helper('catalog')->__('Exclude') ?></th>
    <th><?php echo Mage::helper('catalog')->__('Is Page') ?></th>

Line 77

from

<td class="cell-disable a-center"><input type="checkbox" <?php if($_block->getElement()->getReadonly()):?> disabled="disabled"<?php endif;?> onclick="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" /></td>

to

<td class="cell-disable a-center"><input type="checkbox" <?php if($_block->getElement()->getReadonly()):?> disabled="disabled"<?php endif;?> onclick="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" /></td>
<td class="cell-page a-center"><input type="checkbox" <?php if($_block->getElement()->getReadonly()):?> disabled="disabled"<?php endif;?> onclick="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" /></td>

Line 105

from  

to

            <td class="cell-disable"><input type="hidden" />&nbsp;</td>
            <td class="cell-page last"><input type="hidden" />&nbsp;</td>
like image 279
Hervé Guétin Avatar asked Jul 21 '10 08:07

Hervé Guétin


3 Answers

This is how I solved the problem and is working perfectly. Beside your changes make these too.

1. In Mage_Catalog_Model_Product_Attribute_Backend_Media

change

public function addImage(Mage_Catalog_Model_Product $product, $file,
    $mediaAttribute = null, $move = false, $exclude = true)

to

public function addImage(Mage_Catalog_Model_Product $product, $file,
    $mediaAttribute = null, $move = false, $exclude = true, $page = false)

change

public function addImagesWithDifferentMediaAttributes(Mage_Catalog_Model_Product $product,
    $fileAndAttributesArray, $filePath = '', $move = false, $exclude = true)

to

public function addImagesWithDifferentMediaAttributes(Mage_Catalog_Model_Product $product,
    $fileAndAttributesArray, $filePath = '', $move = false, $exclude = true, $page = true)

change

$savedFileName = $this->addImage($product, $filePath . $value['file'], null, $move, $exclude);

to

$savedFileName = $this->addImage($product, $filePath . $value['file'], null, $move, $exclude, $page );

2. Go to Mage_Catalog_Model_Resource_Product_Attribute_Backend_Media

change

array('label','position','disabled')

to

array('label','position','disabled','page')

change

            array(
                'label_default' => 'label',
                'position_default' => 'position',
                'disabled_default' => 'disabled',
            )

to

            array(
                'label_default' => 'label',
                'position_default' => 'position',
                'disabled_default' => 'disabled',
                'page_default' => 'page'
            )

3. In js/mage/adminhtml/product.js

change

    this.getFileElement(file, 'cell-label input').value = image.label;
    this.getFileElement(file, 'cell-position input').value = image.position;
    this.getFileElement(file, 'cell-remove input').checked = (image.removed == 1);
    this.getFileElement(file, 'cell-disable input').checked = (image.disabled == 1);

to

    this.getFileElement(file, 'cell-label input').value = image.label;
    this.getFileElement(file, 'cell-position input').value = image.position;
    this.getFileElement(file, 'cell-remove input').checked = (image.removed == 1);
    this.getFileElement(file, 'cell-disable input').checked = (image.disabled == 1);
    this.getFileElement(file, 'cell-page input').checked = (image.page == 1);

change

    this.images[index].label = this
            .getFileElement(file, 'cell-label input').value;
    this.images[index].position = this.getFileElement(file,
            'cell-position input').value;
    this.images[index].removed = (this.getFileElement(file,
            'cell-remove input').checked ? 1 : 0);             
    this.images[index].disabled = (this.getFileElement(file,
            'cell-disable input').checked ? 1 : 0);

to

    this.images[index].label = this
            .getFileElement(file, 'cell-label input').value;
    this.images[index].position = this.getFileElement(file,
            'cell-position input').value;
    this.images[index].removed = (this.getFileElement(file,
            'cell-remove input').checked ? 1 : 0);
    this.images[index].page = (this.getFileElement(file,
            'cell-page input').checked ? 1 : 0);                
    this.images[index].disabled = (this.getFileElement(file,
            'cell-disable input').checked ? 1 : 0);

Simply use search text to find where to change the code. Hope this helped.

like image 165
Daniel Avatar answered Sep 23 '22 00:09

Daniel


After much toil I discovered that in addition to the original post and the 2nd poster's recommendations, you also need to open up /app/code/core/Mage/Catalog/sql/catalog_setup/mysql4-upgrade-1.5.9.9-1.6.0.0.php, go to around line 2023 where it starts with this:

$installer->getTable('catalog/product_attribute_media_gallery_value') => array(

Change this:

'disabled' => array(
    'type'      => Varien_Db_Ddl_Table::TYPE_SMALLINT,
    'unsigned'  => true,
    'nullable'  => false,
    'default'   => '0',
    'comment'   => 'Is Disabled'
 )

To this:

'disabled' => array(
    'type'      => Varien_Db_Ddl_Table::TYPE_SMALLINT,
    'unsigned'  => true,
    'nullable'  => false,
    'default'   => '0',
    'comment'   => 'Is Disabled'
 ),
'page' => array(
    'type'      => Varien_Db_Ddl_Table::TYPE_SMALLINT,
    'unsigned'  => true,
    'nullable'  => false,
    'default'   => '0',
    'comment'   => 'Page'
 )

When Magento saves it checks this file to make sure the fields getting passed match the values in these arrays.

like image 20
user1945723 Avatar answered Sep 23 '22 00:09

user1945723


I got the error

Notice: Undefined index 'page'

in the class

Mage_Catalog_Model_Product_Attribute_Backend_Media

in the line 224.

I had to change

js/mage/adminhtml/product.js

newImage.position = this.getNextPosition();

to

newImage.position = this.getNextPosition();
newImage.page = 0;

It works great now.

Thanks.

like image 31
Daniel Zander Avatar answered Sep 26 '22 00:09

Daniel Zander