You can rewrite the method Mage_Adminhtml_Catalog_ProductController::validateAction() and check if the product is new and category_ids hasn't been sent through POST then throw an exception.
Something like this: app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php
public function validateAction()
{
$response = new Varien_Object();
$response->setError(false);
try {
$productData = $this->getRequest()->getPost('product');
if ($productData && !isset($productData['stock_data']['use_config_manage_stock'])) {
$productData['stock_data']['use_config_manage_stock'] = 0;
}
/* @var $product Mage_Catalog_Model_Product */
$product = Mage::getModel('catalog/product');
$product->setData('_edit_mode', true);
if ($storeId = $this->getRequest()->getParam('store')) {
$product->setStoreId($storeId);
}
if ($setId = $this->getRequest()->getParam('set')) {
$product->setAttributeSetId($setId);
}
if ($typeId = $this->getRequest()->getParam('type')) {
$product->setTypeId($typeId);
}
if ($productId = $this->getRequest()->getParam('id')) {
$product->load($productId);
}
//==>start my changes 这里添加开始
$postedCategories = $this->getRequest()->getParam('category_ids');
if ($product->getId()) { //if edit mode
//if product does not have categories and no categories were sent...
if (!$product->getCategoryIds() && empty($postedCategories)){
throw new Mage_Catalog_Exception('Fill in categories'); //translate if needed
}
}
else { //if new mode
if (empty($postedCategories)){
throw new Mage_Catalog_Exception('Fill in categories'); //translate if needed
}
}
//<=== end my changes 这里添加结束
$dateFields = array();
$attributes = $product->getAttributes();
foreach ($attributes as $attrKey => $attribute) {
if ($attribute->getBackend()->getType() == 'datetime') {
if (array_key_exists($attrKey, $productData) && $productData[$attrKey] != ''){
$dateFields[] = $attrKey;
}
}
}
$productData = $this->_filterDates($productData, $dateFields);
$product->addData($productData);
$product->validate();
}
catch (Mage_Eav_Model_Entity_Attribute_Exception $e) {
$response->setError(true);
$response->setAttribute($e->getAttributeCode());
$response->setMessage($e->getMessage());
} catch (Mage_Core_Exception $e) {
$response->setError(true);
$response->setMessage($e->getMessage());
} catch (Exception $e) {
$this->_getSession()->addError($e->getMessage());
$this->_initLayoutMessages('adminhtml/session');
$response->setError(true);
$response->setMessage($this->getLayout()->getMessagesBlock()->getGroupedHtml());
}
$this->getResponse()->setBody($response->toJson());
}
I copied the default validateAction method and added some code. See ===>start my changes.
There are also these events catalog_product_validate_before and catalog_product_validate_after but, unfortunately thy don't take into account the category ids. The product arrives in the validation method without the category ids even if you set them.
参考:http://magento.stackexchange.com/a/11199
你可以修改 skin/adminhtml/default/default/boxes.css
after line 31: 添加
.messages li.error-msg ul li { background:#FAEBE7; }
原文/转自:Magento: 设置category类别为必填 How to make product category selection required
本文详细介绍了如何在Magento中修改产品控制器的验证方法,确保产品类别在创建或编辑时必须填写。包括代码实现、CSS样式调整及注意事项。

1734

被折叠的 条评论
为什么被折叠?



