1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
26:
27: 28: 29: 30: 31: 32: 33:
34: class Mage_ImportExport_Model_Import_Entity_Product_Type_Grouped
35: extends Mage_ImportExport_Model_Import_Entity_Product_Type_Abstract
36: {
37: 38: 39: 40: 41:
42: protected $_particularAttributes = array(
43: '_associated_sku', '_associated_default_qty', '_associated_position'
44: );
45:
46: 47: 48: 49: 50:
51: protected $_behavior;
52:
53: 54: 55: 56: 57:
58: public function getBehavior()
59: {
60: if (is_null($this->_behavior)) {
61: $this->_behavior = Mage_ImportExport_Model_Import::getDataSourceModel()->getBehavior();
62: }
63: return $this->_behavior;
64: }
65:
66: 67: 68: 69: 70:
71: public function saveData()
72: {
73: $groupedLinkId = Mage_Catalog_Model_Product_Link::LINK_TYPE_GROUPED;
74: $connection = Mage::getSingleton('core/resource')->getConnection('write');
75: $resource = Mage::getResourceModel('catalog/product_link');
76: $mainTable = $resource->getMainTable();
77: $relationTable = $resource->getTable('catalog/product_relation');
78: $newSku = $this->_entityModel->getNewSku();
79: $oldSku = $this->_entityModel->getOldSku();
80: $attributes = array();
81:
82:
83: $select = $connection->select()
84: ->from($resource->getTable('catalog/product_link_attribute'), array(
85: 'id' => 'product_link_attribute_id',
86: 'code' => 'product_link_attribute_code',
87: 'type' => 'data_type'
88: ))->where('link_type_id = ?', $groupedLinkId);
89: foreach ($connection->fetchAll($select) as $row) {
90: $attributes[$row['code']] = array(
91: 'id' => $row['id'],
92: 'table' => $resource->getAttributeTypeTable($row['type'])
93: );
94: }
95: while ($bunch = $this->_entityModel->getNextBunch()) {
96: $linksData = array(
97: 'product_ids' => array(),
98: 'links' => array(),
99: 'attr_product_ids' => array(),
100: 'position' => array(),
101: 'qty' => array(),
102: 'relation' => array()
103: );
104: foreach ($bunch as $rowNum => $rowData) {
105: if (!$this->_entityModel->isRowAllowedToImport($rowData, $rowNum)
106: || empty($rowData['_associated_sku'])
107: ) {
108: continue;
109: }
110: if (isset($newSku[$rowData['_associated_sku']])) {
111: $linkedProductId = $newSku[$rowData['_associated_sku']]['entity_id'];
112: } elseif (isset($oldSku[$rowData['_associated_sku']])) {
113: $linkedProductId = $oldSku[$rowData['_associated_sku']]['entity_id'];
114: } else {
115: continue;
116: }
117: $scope = $this->_entityModel->getRowScope($rowData);
118: if (Mage_ImportExport_Model_Import_Entity_Product::SCOPE_DEFAULT == $scope) {
119: $productData = $newSku[$rowData[Mage_ImportExport_Model_Import_Entity_Product::COL_SKU]];
120: } else {
121: $colAttrSet = Mage_ImportExport_Model_Import_Entity_Product::COL_ATTR_SET;
122: $rowData[$colAttrSet] = $productData['attr_set_code'];
123: $rowData[Mage_ImportExport_Model_Import_Entity_Product::COL_TYPE] = $productData['type_id'];
124: }
125: $productId = $productData['entity_id'];
126:
127: if ($this->_type != $rowData[Mage_ImportExport_Model_Import_Entity_Product::COL_TYPE]) {
128: continue;
129: }
130: $linksData['product_ids'][$productId] = true;
131: $linksData['links'][$productId][$linkedProductId] = $groupedLinkId;
132: $linksData['relation'][] = array('parent_id' => $productId, 'child_id' => $linkedProductId);
133: $qty = empty($rowData['_associated_default_qty']) ? 0 : $rowData['_associated_default_qty'];
134: $pos = empty($rowData['_associated_position']) ? 0 : $rowData['_associated_position'];
135:
136: if ($qty || $pos) {
137: $linksData['attr_product_ids'][$productId] = true;
138: if ($pos) {
139: $linksData['position']["{$productId} {$linkedProductId}"] = array(
140: 'product_link_attribute_id' => $attributes['position']['id'],
141: 'value' => $pos
142: );
143: }
144: if ($qty) {
145: $linksData['qty']["{$productId} {$linkedProductId}"] = array(
146: 'product_link_attribute_id' => $attributes['qty']['id'],
147: 'value' => $qty
148: );
149: }
150: }
151: }
152:
153: if ($linksData['product_ids'] && $this->getBehavior() != Mage_ImportExport_Model_Import::BEHAVIOR_APPEND) {
154: $connection->delete(
155: $mainTable,
156: $connection->quoteInto(
157: 'product_id IN (?) AND link_type_id = ' . $groupedLinkId,
158: array_keys($linksData['product_ids'])
159: )
160: );
161: }
162: if ($linksData['links']) {
163: $mainData = array();
164:
165: foreach ($linksData['links'] as $productId => $linkedData) {
166: foreach ($linkedData as $linkedId => $linkType) {
167: $mainData[] = array(
168: 'product_id' => $productId,
169: 'linked_product_id' => $linkedId,
170: 'link_type_id' => $linkType
171: );
172: }
173: }
174: $connection->insertOnDuplicate($mainTable, $mainData);
175: $connection->insertOnDuplicate($relationTable, $linksData['relation']);
176: }
177:
178: if ($linksData['attr_product_ids']) {
179: $savedData = $connection->fetchPairs($connection->select()
180: ->from($mainTable, array(
181: new Zend_Db_Expr('CONCAT_WS(" ", product_id, linked_product_id)'), 'link_id'
182: ))
183: ->where(
184: 'product_id IN (?) AND link_type_id = ' . $groupedLinkId,
185: array_keys($linksData['attr_product_ids'])
186: )
187: );
188: foreach ($savedData as $pseudoKey => $linkId) {
189: if (isset($linksData['position'][$pseudoKey])) {
190: $linksData['position'][$pseudoKey]['link_id'] = $linkId;
191: }
192: if (isset($linksData['qty'][$pseudoKey])) {
193: $linksData['qty'][$pseudoKey]['link_id'] = $linkId;
194: }
195: }
196: if ($linksData['position']) {
197: $connection->insertOnDuplicate($attributes['position']['table'], $linksData['position']);
198: }
199: if ($linksData['qty']) {
200: $connection->insertOnDuplicate($attributes['qty']['table'], $linksData['qty']);
201: }
202: }
203: }
204: return $this;
205: }
206: }
207: