first commit
This commit is contained in:
156
apps/frontend/lib/stSmartySlotParser.class.php
Normal file
156
apps/frontend/lib/stSmartySlotParser.class.php
Normal file
@@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
class stSmartySlotParser
|
||||
{
|
||||
|
||||
protected $source = null;
|
||||
|
||||
public function __construct($source = null)
|
||||
{
|
||||
$this->source = $source;
|
||||
}
|
||||
|
||||
public function parse($callback)
|
||||
{
|
||||
if ($this->source && preg_match_all('/\{slot\s*(.+?)\}(.*?)\{\/slot\}/si', $this->source, $slots))
|
||||
{
|
||||
foreach ($slots[0] as $i => $replace)
|
||||
{
|
||||
$slot_attr = $this->parseAttributes($slots[1][$i]);
|
||||
|
||||
if (!isset($slot_attr['name']))
|
||||
{
|
||||
throw new sfException('Smarty slot: parameter "name" is mandatory');
|
||||
}
|
||||
|
||||
$components_attr = $this->parseComponents($slots[2][$i]);
|
||||
|
||||
call_user_func($callback, $slot_attr, $components_attr, $replace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function setSource($source)
|
||||
{
|
||||
$this->source = $source;
|
||||
}
|
||||
|
||||
public function getSource()
|
||||
{
|
||||
return $this->source;
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected function parseComponents($source)
|
||||
{
|
||||
$components_attr = array();
|
||||
|
||||
if (preg_match_all('/\{(partial|component)\s*(.+?)\}/', $source, $content))
|
||||
{
|
||||
|
||||
foreach ($content[1] as $j => $type)
|
||||
{
|
||||
$attr = $this->parseAttributes($content[2][$j]);
|
||||
|
||||
if (!isset($attr['parameters']))
|
||||
{
|
||||
$attr['parameters'] = array();
|
||||
}
|
||||
else
|
||||
{
|
||||
$attr['parameters'] = self::parseParameters($attr['parameters']);
|
||||
}
|
||||
|
||||
// if (isset($attr['name']) && $attr['name'] == 'stBoxFrontend/boxGroup' && isset($attr['parameters']['box_group']))
|
||||
// {
|
||||
|
||||
// $components_attr = array_merge($components_attr, self::compileBoxComponents($attr['parameters']['box_group']));
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
$components_attr[] = self::compileComponent($type, $attr);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match_all('/\{(content_block)\s*(.+?)\}(.*?){\/content_block}/s', $source, $content))
|
||||
{
|
||||
foreach ($content[1] as $j => $type)
|
||||
{
|
||||
$attr = $this->parseAttributes($content[2][$j]);
|
||||
|
||||
if (!isset($attr['name']))
|
||||
{
|
||||
throw new sfException('Smarty slot '.$type.': parameter "name" is mandatory');
|
||||
}
|
||||
|
||||
$attr['content_type'] = $attr['type'];
|
||||
|
||||
$attr['type'] = $type;
|
||||
|
||||
$attr['is_active'] = true;
|
||||
|
||||
if (!isset($attr['decorator']))
|
||||
{
|
||||
$attr['decorator'] = false;
|
||||
}
|
||||
|
||||
$attr['content'] = trim($content[3][$j]);
|
||||
|
||||
$components_attr[] = $attr;
|
||||
}
|
||||
}
|
||||
|
||||
return $components_attr;
|
||||
}
|
||||
|
||||
protected function parseAttributes($content)
|
||||
{
|
||||
$attr = array();
|
||||
|
||||
if (preg_match_all('/\s*([^=]+)="([^"]+)"\s*/', $content, $tmp))
|
||||
{
|
||||
foreach ($tmp[1] as $i => $name)
|
||||
{
|
||||
$attr[trim($name)] = trim($tmp[2][$i]);
|
||||
}
|
||||
}
|
||||
|
||||
return $attr;
|
||||
}
|
||||
|
||||
protected static function parseParameters($content)
|
||||
{
|
||||
$params = array();
|
||||
|
||||
if (preg_match_all('/\s*([^:]+):\s+([^,]+),?\s*/', $content, $tmp))
|
||||
{
|
||||
foreach ($tmp[1] as $i => $name)
|
||||
{
|
||||
$params[trim($name)] = trim($tmp[2][$i]);
|
||||
}
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
public static function compileComponent($type, $attr)
|
||||
{
|
||||
if (!isset($attr['name']))
|
||||
{
|
||||
throw new sfException('Smarty slot '.$type.': parameter "name" is mandatory');
|
||||
}
|
||||
|
||||
$attr['type'] = $type;
|
||||
|
||||
if ($type == 'component')
|
||||
{
|
||||
list($attr['module'], $attr['component']) = explode('/', $attr['name']);
|
||||
}
|
||||
|
||||
$attr['is_active'] = true;
|
||||
|
||||
return $attr;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user