123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- <?php
- /**
- * @file Styles.inc
- * Base class for Styles.
- */
- class StylesDefault {
- // The variables passed from our theme.
- public $variables = array();
- // The object passed from our theme.
- public $object = array();
- // Any effects to apply when displaying content matching this style.
- public $effects = array();
- // The final rendered output for this item.
- public $output;
- public $prefix;
- public $suffix;
- public $wrapperType = 'div';
- public $classes = array('styles');
- public $id;
- private $_id = 0;
- public function __construct($object = NULL, $effects = NULL, $variables = NULL) {
- // @TODO: This is not great IMO, the ->object and ->variables props already have everything
- // we shouldn't be duplicating it in different methods / properties.
- if (isset($variables)) {
- $properties = (array) $variables;
- $this->magicSet($properties);
- $this->setVariables($variables);
- }
- // If we are passed an array, then set the object properties from its keys.
- if (isset($object)) {
- $properties = (array) $object;
- $this->magicSet($properties);
- $this->setObject($object);
- }
- if (isset($effects)) {
- $this->setEffects($effects);
- }
- }
- /**
- * Converts a string in the form with_underscores to withUnderscores
- * @param string $str
- * @return string
- */
- protected function _toCamelCase($str) {
- $parts = explode("_", $str);
- $out = array_shift($parts);
- foreach ($parts as $part) {
- $out .= ucfirst($part);
- }
- return $out;
- }
- /**
- * Given an array of k/v pairs calls set$key
- * @param array $properties
- */
- protected function magicSet($properties) {
- $methods = get_class_methods($this);
- foreach ($properties as $key => $value) {
- $propName = "set_{$key}";
- $function = $this->_toCamelCase($propName);
- if (in_array($function, $methods)) {
- $this->$function($value);
- }
- }
- }
- /**
- * Display the rendered output.
- *
- * @param boolean $reset
- * Optional; if TRUE, the rebuild the output.
- * @return
- * A fully themed snippet of HTML for output.
- */
- public function display($reset = FALSE) {
- return $this->render($reset);
- }
- /**
- * Build the output for display.
- *
- * @param boolean $reset
- * Optional; if TRUE, the rebuild the output.
- * @return
- * A fully themed snippet of HTML for output.
- */
- public function render($reset = FALSE) {
- // If we need to reset, then set the output to NULL.
- if ($reset) {
- $this->setOutput(NULL);
- }
- // Have we already rendered the output?
- $output = $this->getOutput();
- // We need to render the output the first time around, or if reset.
- if (!isset($output)) {
- // First, we get the array of callable class methods for this object.
- // These may each be called by effects called for by the style.
- // @TODO: Should we have a proper array of allowable effects, rather
- // than our current lazy method of allowing all class functions?
- $methods = get_class_methods($this);
- // Loop through and apply each effect.
- foreach ($this->getEffects() as $effect) {
- // What is the effect?
- $effectName = $effect['name'];
- if ($effectName && in_array($effectName, $methods)) {
- // Apply the effect with its settings.
- $this->$effectName($effect['settings']);
- }
- else {
- // Ouch. We have an invalid effect. Flag for bug reporting.
- $variables = $this->getVariables();
- $styleName = $variables['style']['name'];
- watchdog('styles', 'Effect %effect_name not found for %style_name display formatter style of the %class_name class.', array('%effect_name' => $effectName, '%style_name' => $styleName, '%class_name' => $this->getClassName()), WATCHDOG_WARNING);
- }
- }
- // Now the output will have been fully built.
- $output = $this->getOutput();
- }
- return $output;
- }
- public function getClassName() {
- return get_called_class();
- }
- public function _get($variable) {
- if (function_exists('get_' . $variable)) {
- return $this->{'get_' . $variable}();
- }
- else {
- return $this->get($variable);
- }
- }
- public function _set($variable, $value) {
- if (function_exists('set_' . $variable)) {
- return $this->{'set_' . $variable}($value);
- }
- else {
- return $this->set($variable, $value);
- }
- }
- public function arrayPush($variable, $element) {
- $array = (array) $this->_get($variable);
- array_push($array, $element);
- return $this->_set($variable, $array);
- }
- public function arrayPop($variable) {
- $array = (array) $this->_get($variable);
- array_pop($array);
- return $this->_set($variable, $array);
- }
- public function arrayUnshift($variable, $element) {
- $array = (array) $this->_get($variable);
- array_unshift($array, $element);
- return $this->_set($variable, $array);
- }
- public function arrayShift($variable) {
- $array = (array) $this->_get($variable);
- array_shift($array);
- return $this->_set($variable, $array);
- }
- /**
- * Add an effect to the end of the array.
- *
- * An effect is an array with at least a 'name' key, which corresponds to the
- * class function to be called during the rendering process. It will usually
- * also contain an array of 'effects' to apply.
- */
- public function addEffect($effect) {
- return $this->pushEffect($effect);
- }
- public function pushEffect($effect) {
- $effectName = $effect['name'];
- if (method_exists($this, $effectName)) {
- $effects = $this->getEffects();
- array_push($effects, $effect);
- return $this->setEffects($effects);
- }
- else {
- $variables = $this->getVariables();
- $styleName = $variables['style']['label'];
- watchdog('styles', 'Effect %effect_name not found for %style_name display formatter style of the %class_name class.', array('%effect_name' => $effectName, '%style_name' => $styleName, '%class_name' => $this->getClassName()), WATCHDOG_WARNING);
- }
- }
- public function popEffect() {
- $effects = $this->getEffects();
- $effect = array_pop($effects);
- $this->setEffects($effects);
- return $effect;
- }
- public function unshiftEffect($effect) {
- $effectName = $effect['name'];
- if (method_exists($this, $effectName)) {
- $effects = $this->getEffects();
- array_unshift($effects, $effect);
- return $this->setEffects($effects);
- }
- else {
- $variables = $this->getVariables();
- $styleName = $variables['style']['label'];
- watchdog('styles', 'Effect %effect_name not found for %style_name display formatter style of the %class_name class.', array('%effect_name' => $effectName, '%style_name' => $this->getName(), '%class_name' => $this->getClassName()), WATCHDOG_WARNING);
- }
- }
- public function shiftEffect() {
- $effects = $this->getEffects();
- $effect = array_shift($effects);
- $this->setEffects($effects);
- return $effect;
- }
- public function getObject() {
- return $this->get('object');
- }
- public function setObject($value) {
- return $this->set('object', $value);
- }
- public function getVariables() {
- return $this->get('variables');
- }
- public function setVariables($value) {
- return $this->set('variables', $value);
- }
- public function getEffects() {
- return $this->get('effects');
- }
- public function setEffects($value) {
- return $this->set('effects', $value);
- }
- public function getWrapperType() {
- return $this->get('wrapperType');
- }
- public function setWrapperType($value) {
- return $this->set('wrapperType', $value);
- }
- public function getClasses() {
- $classes = $this->get('classes');
- return is_array($classes) ? implode(' ', $classes) : $classes;
- }
- public function setClasses($value) {
- return $this->set('classes', $value);
- }
- public function getId() {
- return $this->get('id');
- }
- public function setId($value) {
- return $this->set('id', $value);
- }
- public function getOutput() {
- return $this->get('output');
- }
- public function setOutput($value) {
- return $this->set('output', $value);
- }
- public function getPrefix() {
- $prefix = $this->get('prefix');
- if (!isset($prefix)) {
- $wrapperType = $this->getWrapperType();
- $id = $this->getId();
- $_id = $this->_id++;
- $classes = $this->getClasses();
- $prefix = "<$wrapperType id=\"styles-$id-$_id\" class=\"$classes\">";
- }
- return $prefix;
- }
- public function setPrefix($value) {
- return $this->set('prefix', $value);
- }
- public function getSuffix() {
- $suffix = $this->get('suffix');
- if (!isset($suffix)) {
- $wrapperType = $this->getWrapperType();
- $suffix = "</$wrapperType>";
- }
- return $suffix;
- }
- public function setSuffix($value) {
- return $this->set('suffix', $value);
- }
- public function get($variable) {
- return isset($this->{$variable}) ? $this->{$variable} : NULL;
- }
- public function set($variable, $value) {
- return $this->{$variable} = $value;
- }
- }
|