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" /> </td>
<td class="cell-page last"><input type="hidden" />&开发者_StackOverflow社区nbsp;</td>
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.
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.
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.
I was working on something similar recently, and found that this piece of code was part of the solution:
$fieldset->addField('entire_range', 'checkbox', array(
'checked' => $this->getEntireRange()==1 ? 'true' : 'false',
'onclick' => 'this.value = this.checked ? 1 : 0;'
));
I couldn't get it to save the value to the database either. It's something to with the Varien_Data_Form_Element_Checkbox class.
Hope this helps, please post your solution if you find it!
Cheers, JD
精彩评论