*/ class Mage_Widget_Model_Widget extends Varien_Object { /** * Load Widgets XML config from widget.xml files and cache it * * @return Varien_Simplexml_Config */ public function getXmlConfig() { $cachedXml = Mage::app()->loadCache('widget_config'); if ($cachedXml) { $xmlConfig = new Varien_Simplexml_Config($cachedXml); } else { $config = new Varien_Simplexml_Config(); $config->loadString(''); Mage::getConfig()->loadModulesConfiguration('widget.xml', $config); $xmlConfig = $config; if (Mage::app()->useCache('config')) { Mage::app()->saveCache($config->getXmlString(), 'widget_config', array(Mage_Core_Model_Config::CACHE_TAG)); } } return $xmlConfig; } /** * Return widget XML config element based on its type * * @param string $type Widget type * @return null|Varien_Simplexml_Element */ public function getXmlElementByType($type) { $elements = $this->getXmlConfig()->getXpath('*[@type="' . $type . '"]'); if (is_array($elements) && isset($elements[0]) && $elements[0] instanceof Varien_Simplexml_Element) { return $elements[0]; } return null; } /** * Wrapper for getXmlElementByType method * * @param string $type Widget type * @return null|Varien_Simplexml_Element */ public function getConfigAsXml($type) { return $this->getXmlElementByType($type); } /** * Return widget XML configuration as Varien_Object and makes some data preparations * * @param string $type Widget type * @return Varien_Object */ public function getConfigAsObject($type) { $xml = $this->getConfigAsXml($type); $object = new Varien_Object(); if ($xml === null) { return $object; } // Save all nodes to object data $object->setType($type); $object->setData($xml->asCanonicalArray()); // Set module for translations etc. $module = $object->getData('@/module'); if ($module) { $object->setModule($module); } // Correct widget parameters and convert its data to objects $params = $object->getData('parameters'); $newParams = array(); if (is_array($params)) { $sortOrder = 0; foreach ($params as $key => $data) { if (is_array($data)) { $data['key'] = $key; $data['sort_order'] = isset($data['sort_order']) ? (int)$data['sort_order'] : $sortOrder; // prepare values (for drop-dawns) specified directly in configuration $values = array(); if (isset($data['values']) && is_array($data['values'])) { foreach ($data['values'] as $value) { if (isset($value['label']) && isset($value['value'])) { $values[] = $value; } } } $data['values'] = $values; // prepare helper block object if (isset($data['helper_block'])) { $helper = new Varien_Object(); if (isset($data['helper_block']['data']) && is_array($data['helper_block']['data'])) { $helper->addData($data['helper_block']['data']); } if (isset($data['helper_block']['type'])) { $helper->setType($data['helper_block']['type']); } $data['helper_block'] = $helper; } $newParams[$key] = new Varien_Object($data); $sortOrder++; } } } uasort($newParams, array($this, '_sortParameters')); $object->setData('parameters', $newParams); return $object; } /** * Return filtered list of widgets as SimpleXml object * * @param array $filters Key-value array of filters for widget node properties * @return Varien_Simplexml_Element */ public function getWidgetsXml($filters = array()) { $widgets = $this->getXmlConfig()->getNode(); $result = clone $widgets; // filter widgets by params if (is_array($filters) && count($filters) > 0) { foreach ($widgets as $code => $widget) { try { $reflection = new ReflectionObject($widget); foreach ($filters as $field => $value) { if (!$reflection->hasProperty($field) || (string)$widget->{$field} != $value) { throw new Exception(); } } } catch (Exception $e) { unset($result->{$code}); continue; } } } return $result; } /** * Return list of widgets as array * * @param array $filters Key-value array of filters for widget node properties * @return array */ public function getWidgetsArray($filters = array()) { if (!$this->_getData('widgets_array')) { $result = array(); foreach ($this->getWidgetsXml($filters) as $widget) { $helper = $widget->getAttribute('module') ? $widget->getAttribute('module') : 'widget'; $helper = Mage::helper($helper); $result[$widget->getName()] = array( 'name' => $helper->__((string)$widget->name), 'code' => $widget->getName(), 'type' => $widget->getAttribute('type'), 'description' => $helper->__((string)$widget->description) ); } usort($result, array($this, "_sortWidgets")); $this->setData('widgets_array', $result); } return $this->_getData('widgets_array'); } /** * Return widget presentation code in WYSIWYG editor * * @param string $type Widget Type * @param array $params Pre-configured Widget Params * @param bool $asIs Return result as widget directive(true) or as placeholder image(false) * @return string Widget directive ready to parse */ public function getWidgetDeclaration($type, $params = array(), $asIs = true) { $directive = '{{widget type="' . $type . '"'; foreach ($params as $name => $value) { // Retrieve default option value if pre-configured if (is_array($value)) { $value = implode(',', $value); } elseif (trim($value) == '') { $widget = $this->getConfigAsObject($type); $parameters = $widget->getParameters(); if (isset($parameters[$name]) && is_object($parameters[$name])) { $value = $parameters[$name]->getValue(); } } if ($value) { $directive .= sprintf(' %s="%s"', $name, $value); } } $directive .= '}}'; if ($asIs) { return $directive; } $config = Mage::getSingleton('widget/widget_config'); $imageName = str_replace('/', '__', $type) . '.gif'; if (is_file($config->getPlaceholderImagesBaseDir() . DS . $imageName)) { $image = $config->getPlaceholderImagesBaseUrl() . $imageName; } else { $image = $config->getPlaceholderImagesBaseUrl() . 'default.gif'; } $html = sprintf('', $this->_idEncode($directive), $image, Mage::helper('core')->urlEscape($directive) ); return $html; } /** * Return list of required JS files to be included on the top of the page before insertion plugin loaded * * @return array */ public function getWidgetsRequiredJsFiles() { $result = array(); foreach ($this->getWidgetsXml() as $widget) { if ($widget->js) { foreach (explode(',', (string)$widget->js) as $js) { $result[] = $js; } } } return $result; } /** * Encode string to valid HTML id element, based on base64 encoding * * @param string $string * @return string */ protected function _idEncode($string) { return strtr(base64_encode($string), '+/=', ':_-'); } /** * User-defined widgets sorting by Name * * @param array $a * @param array $b * @return boolean */ protected function _sortWidgets($a, $b) { return strcmp($a["name"], $b["name"]); } /** * Widget parameters sort callback * * @param Varien_Object $a * @param Varien_Object $b * @return int */ protected function _sortParameters($a, $b) { $aOrder = (int)$a->getData('sort_order'); $bOrder = (int)$b->getData('sort_order'); return $aOrder < $bOrder ? -1 : ($aOrder > $bOrder ? 1 : 0); } }