Przeglądanie rekordów - Symfony browser helper

Napisany przez Szymon Sawicki dnia 5 kwietnia 2008, godzina 18:33  Rss do tej wiadomości

Tagi: Symfony + programowanie + propel

A oto prosty sposób, aby w Symfony uzyskać browsing dla dowolnych obiektów Propela. Browser ma postać dodatkowego helpera, który wstawia się w dodatkowym szablonie, np.: _browser.php. Jedyne, co musisz wpisać w tym szablonie to:

<?php echo browser($propelObject) ?>

A tutaj kod całego helpera umożliwiającego przeglądanie kolejnych rekordów:

<?php
function browser($object)
{
	// wyświetl browsera tylko dla istniejących obiektów
	if($object->getId())
	{
		$rule = sfRouting::getInstance()->getCurrentRouteName();
		if($rule == 'default')
		{
			// Obsługa jedynie akcji domyslnej dla edycji w adminie czyli edit
			$action_name = sfContext::getInstance()->getActionName();
			if(in_array($action_name, array('edit', 'create', 'save')))
				$rule = sfContext::getInstance()->getModuleName().'/edit';
			else
				return null;
		}
		else
		{
			$rule = '@'.$rule;
		}
		
		$html = '';
		$object_class = get_class($object);
		$primaryKeyColumn = call_user_func_array(array($object_class.'Peer', 'translateFieldName'), array('id', BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME));
		$prev_label = ' poprzedni';
		$next_label = 'następny ';
		
		$c = new Criteria();
		$c->add($primaryKeyColumn, $object->getId(), Criteria::LESS_THAN);
		$c->addDescendingOrderByColumn($primaryKeyColumn);
		$prev = call_user_func_array(array($object_class.'Peer', 'doSelectOne'), array($c));
		
  		$c = new Criteria();
		$c->add($primaryKeyColumn, $object->getId(), Criteria::GREATER_THAN);
		$c->addAscendingOrderByColumn($primaryKeyColumn);
		$next = call_user_func_array(array($object_class.'Peer', 'doSelectOne'), array($c));
		
		if($prev)
			$html .= link_to(image_tag('previous.gif', 'align=absmiddle') . ' poprzedni', $rule.'?id=' . $prev->getId());
		else
			$html .= image_tag('previous.gif', 'align=absmiddle') . $prev_label;
		
		$html .= '   ';
		
		if($next)
			$html .= link_to('następny ' . image_tag('next.gif', 'align=absmiddle'), $rule.'?id=' . $next->getId());
		else
			$html .= $next_label . image_tag('next.gif', 'align=absmiddle');
		return $html;
	}
	else
	{
		return false;
	}
}
?>