Интересно, компиляция действительно оказывается более эффективной для меня (Python 2.5.2 на XP Победы):
import re
import time
rgx = re.compile('(\w+)\s+[0-9_]?\s+\w*')
str = "average 2 never"
a = 0
t = time.time()
for i in xrange(1000000):
if re.match('(\w+)\s+[0-9_]?\s+\w*', str):
#~ if rgx.match(str):
a += 1
print time.time() - t
Выполнение вышеупомянутый код однажды, как, и однажды с два if
строки, прокомментированные наоборот, скомпилированный regex вдвое более быстр
Я еще не видел способа создать собственный рендерер. Вот что я в итоге сделал:
Во-первых, вместо рендеринга вызова menu () по умолчанию, создайте партиал для рендеринга:
// menu.phtml is partial, cms is module
$partial = array('menu.phtml', 'cms');
$this->navigation()->menu()->setPartial($partial);
echo $this->navigation()->menu()->render();
Затем (из документации) вы можете создать "собственный" рендер, например :
// -- inside menu.phtml
foreach ($this->container as $page)
{
// this just prints a "<a>" or "<span>" tag
// depending on whether the page has a uri
echo $this->menu()->htmlify($page), PHP_EOL;
}
В итоге я создал то, что у меня было изначально (меню с одним уровнем подменю), с помощью этого скрипта:
// -- another menu.phtml
<ul class="navigation">
<?php
$html = array();
foreach ($this->container as $page)
{
$html[] = "<li>";
$html[] = $this->menu()->htmlify($page) . PHP_EOL;
if (!empty($page->pages))
{
$html[] = "<ul>";
foreach ($page->pages as $subpage)
{
$html[] = "<li>";
if ($href = $subpage->getHref()) $html[] = "<a href=\"{$href}\">";
else $html[] = "<span>";
$html[] = "<img src=\"/ui/cms/img/icons/edit.png\" alt=\"\"/>";
$html[] = $subpage->getLabel();
if ($href) $html[] = "</a>";
else $html[] = "</span>";
$html[] = "</li>";
}
$html[] = "</ul>";
}
$html[] = "</li>";
}
echo join(PHP_EOL, $html);
?>
</ul>
Вы можете просто изменить разметку в партиале и добавить туда свои изображения / значки.
Извините, за проблему форматирования в предыдущем посте
Чтобы добавить свой собственный помощник, выполните в начальной загрузке:
protected function _initNavigation()
{
$this->bootstrap('view'); // make sure we have a view
$view = $this->getResource('view'); // get the view resource
$config = new Zend_Config_Xml(APPLICATION_ROOT . '/config/navigation.xml','nav');
$container = new Zend_Navigation($config);
$view->navigation($container);
// Tell Zend were it can find your custom helpers and what
// the prefix is going to be.
$view->addHelperPath(
APPLICATION_ROOT . '/library/MyApp/View/Helper/Navigation',
'MyApp_View_Helper_'
);
}
Затем создайте пользовательский помощник представления и поместите его в путь 'addHelperPath'. В зависимости от того, что вы хотите сделать, вам необходимо реализовать как минимум свою собственную функцию htmlify. Взгляните на Zend / View / Help / Navigation / Menu. php в качестве примера.
class MyApp_View_Helper_MyMenu extends Zend_View_Helper_Navigation_Menu
{
public function myMenu(Zend_Navigation_Container $container = null)
{
if (null !== $container) {
$this->setContainer($container);
}
return $this;
}
protected function htmlify(Zend_Navigation_Page $page )
{
...
}
}
Затем в вашем скрипте phtml:
<?php echo $this->navigation()->myMenu()->setMaxDepth(0); ?>
или просто
<?php echo $this->navigation()->myMenu(); ?>
Теперь, если вы хотите добавить свои собственные настраиваемые свойства в сгенерированный HTML, вы можете добавить их в свой ini или xml файл навигации. Например:
<home>
<label>Home</label>
<uri>/</uri>
<img>
<src>/images/MyIcon.gif</src>
<img>
</home>
Пользовательский тег xml
будет сохранен как свойство страницы навигации и может быть получен следующим образом:
foreach ($iterator as $page) {
...
$properties = new Zend_Config($page->GetCustomProperties());
$myPicture = $properties->img->src;
...
}
Надеюсь, это поможет. Питер