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:
35: class Mage_Dataflow_Model_Convert_Profile_Collection
36: {
37:
38: protected $_xml;
39:
40: protected $_containers;
41:
42: protected $_profiles = array();
43:
44: protected $_simplexmlDefaultClass = 'Varien_Simplexml_Element';
45:
46: protected $_profileDefaultClass = 'Mage_Dataflow_Model_Convert_Profile';
47:
48: protected $_profileCollectionDefaultClass = 'Mage_Dataflow_Model_Convert_Profile_Collection';
49:
50: protected $_containerDefaultClass = 'Mage_Dataflow_Model_Convert_Container_Generic';
51:
52: protected $_containerCollectionDefaultClass = 'Mage_Dataflow_Model_Convert_Container_Collection';
53:
54: public function getContainers()
55: {
56: if (!$this->_containers) {
57: $this->_containers = new $this->_containerCollectionDefaultClass();
58: $this->_containers->setDefaultClass($this->_containerDefaultClass);
59: }
60: return $this->_containers;
61: }
62:
63: public function getContainer($name)
64: {
65: return $this->getContainers()->getItem($name);
66: }
67:
68:
69: public function addContainer($name, Mage_Dataflow_Model_Convert_Container_Interface $container)
70: {
71: $container = $this->getContainers()->addItem($name, $container);
72: return $container;
73: }
74:
75: public function getProfiles()
76: {
77: return $this->_profiles;
78: }
79:
80: public function getProfile($name)
81: {
82: if (!isset($this->_profiles[$name])) {
83: $this->importProfileXml($name);
84: }
85: return $this->_profiles[$name];
86: }
87:
88: public function addProfile($name, Mage_Dataflow_Model_Convert_Profile_Interface $profile=null)
89: {
90: if (is_null($profile)) {
91: $profile = new $this->_profileDefaultClass();
92: }
93: $this->_profiles[$name] = $profile;
94: return $profile;
95: }
96:
97: public function run($profile)
98: {
99: $this->getProfile($profile)->run();
100: return $this;
101: }
102:
103: public function getClassNameByType($type)
104: {
105: return $type;
106: }
107:
108: public function importXml($xml)
109: {
110: if (is_string($xml)) {
111: $xml = @simplexml_load_string($xml, $this->_simplexmlDefaultClass);
112: }
113: if (!$xml instanceof SimpleXMLElement) {
114: return $this;
115: }
116: $this->_xml = $xml;
117:
118: foreach ($xml->container as $containerNode) {
119: if (!$containerNode['name'] || !$containerNode['type']) {
120: continue;
121: }
122: $class = $this->getClassNameByType((string)$containerNode['type']);
123: $container = $this->addContainer((string)$containerNode['name'], new $class());
124: foreach ($containerNode->var as $varNode) {
125: $container->setVar((string)$varNode['name'], (string)$varNode);
126: }
127: }
128: return $this;
129: }
130:
131: public function importProfileXml($name)
132: {
133: if (!$this->_xml) {
134: return $this;
135: }
136: $nodes = $this->_xml->xpath("//profile[@name='".$name."']");
137: if (!$nodes) {
138: return $this;
139: }
140: $profileNode = $nodes[0];
141:
142: $profile = $this->addProfile($name);
143: $profile->setContainers($this->getContainers());
144: foreach ($profileNode->action as $actionNode) {
145: $action = $profile->addAction();
146: foreach ($actionNode->attributes() as $key=>$value) {
147: $action->setParam($key, (string)$value);
148: }
149:
150: if ($actionNode['use']) {
151: $container = $profile->getContainer((string)$actionNode['use']);
152: } else {
153: $action->setParam('class', $this->getClassNameByType((string)$actionNode['type']));
154: $container = $action->getContainer();
155: }
156: $action->setContainer($container);
157: if ($action->getParam('name')) {
158: $this->addContainer($action->getParam('name'), $container);
159: }
160:
161: $country = '';
162:
163:
164: foreach ($actionNode->var as $key => $varNode) {
165: if ($varNode['name'] == 'map') {
166: $mapData = array();
167: foreach ($varNode->map as $mapNode) {
168: $mapData[(string)$mapNode['name']] = (string)$mapNode;
169: }
170: $container->setVar((string)$varNode['name'], $mapData);
171: } else {
172: $value = (string)$varNode;
173:
174: 175: 176: 177:
178: if ($value && 'filter/country' == (string)$varNode['name']) {
179: 180: 181:
182: $country = $value;
183: } elseif ($value && 'filter/region' == (string)$varNode['name'] && 'US' == $country) {
184: 185: 186:
187:
188: $region = Mage::getModel('directory/region');
189:
190: $state = $region->loadByCode($value, $country)->getDefaultName();
191: if ($state) {
192: $value = $state;
193: }
194: }
195:
196: $container->setVar((string)$varNode['name'], $value);
197: }
198: }
199: }
200:
201: return $this;
202: }
203:
204: }
205: