getExtension('dc_form')->addTemplate('@forms/lists_layout.html.twig'); $env->addFunction( new Twig_SimpleFunction( 'listitems', 'dcItemList::renderList', array( 'is_safe' => array('html'), 'needs_context' => true, 'needs_environment' => true ))); } public static function renderList($env,$context,$name,$attributes=array()) { $context['listname']=$name; echo $env->getExtension('dc_form')->renderWidget( 'entrieslist', $context ); } /** Inits dcItemList object @param core dcCore Dotclear core reference @param form_prefix string form prefix to use for parameters */ public function __construct($core,$name,$filterset,$fetcher,$action,$form_prefix="f_") { parent::__construct($core,$name,$action,'POST'); $this->entries = array(); $this->columns = array(); $this->selection = new dcFieldCheckbox('entries',NULL,array('multiple' => true)); $this->addField($this->selection); $this->filterset = $filterset; $this->fetcher = $fetcher; } public function setup() { $this ->addField(new dcFieldCombo('action','',array(), array( 'label' => __('Selected entries action:')))) ->addField(new dcFieldSubmit('ok',__('ok'), array())); $columns_combo = array(); foreach ($this->columns as $c) { $columns_combo[$c->getID()] = $c->getName(); } $this->sortby = new dcFilterCombo( 'sortby', __('Sort By'), __('Sort by'), 'sortby', $columns_combo,array('singleval'=> true,'static' => true)); $this->filterset->addFilter($this->sortby); $order_combo = array('asc' => __('Ascending'),'desc' => __('Descending')); $this->order = new dcFilterCombo( 'order', __('Order'), __('Order'), 'orderby', $order_combo,array('singleval'=> true, 'static' => true)); $limit = new dcFilterText( 'limit', __('Limit'), __('Limit'), 'limit',array('singleval'=> true,'static' =>true)); $this->filterset->addFilter($this->order); $this->filterset->addFilter($limit); $this->filterset->setup(); parent::setup(); $this->nb_items_per_page = $limit->getFields()->getValue(); if ($this->nb_items_per_page == 0) $this->nb_items_per_page = 10; $this->fetchEntries(); } protected function fetchEntries() { $params = new ArrayObject(); $this->filterset->applyFilters($params); $this->nb_items = $this->fetcher->getEntriesCount($params); $this->nb_pages = round($this->nb_items / $this->nb_items_per_page) + 1; if (isset($_GET['page'])) { $this->page = (int)$_GET['page']; } else { $this->page = 1; } if ($this->page > $this->nb_pages) { $this->page = $this->nb_pages; } $offset = $this->nb_items_per_page*($this->page-1); $params['order'] = $this->getOrder(); $entries = $this->fetcher->getEntries($params,$offset,$this->nb_items_per_page); $this->setEntries($entries); } public function setEntries($entries) { $this->entries = $entries; $this->core->tpl->addGlobal('list_'.$this->name,$this->getContext()); foreach ($this->entries as $e) { $this->selection->addValue($e->post_id); } } public function getContext() { $ccontext = new ArrayObject(); foreach ($this->columns as $c) { $c->appendEditLines($ccontext); } $page = $this->page; $nb_pages = $this->nb_pages; $nb_pages_around = 2; $pages = array(1); if ($page>$nb_pages_around+2) { $pages[]='...'; } for ($p=max(2,$page-$nb_pages_around); $p<=min($page+$nb_pages_around,$nb_pages-1); $p++) { $pages[]=$p; } if ($page<$nb_pages-$nb_pages_around-1) { $pages[]='...'; } $pages[] = $nb_pages; return array( 'url' => array('',$this->filterset->getURLParams()), 'cols' => $ccontext, 'entries' => $this->entries, 'nb_entries' => $this->nb_items, 'page' => $page, 'pages_links' => $pages); } public function addColumn($c) { $this->columns[$c->getID()] = $c; $c->setForm($this); return $this; } public function getOrder() { $id = $this->sortby->getFields()->getValue(); return $this->columns[$id]->getColID().' '.$this->order->getFields()->getValue(); } public function setFilterSet($fs) { $this->filterset = $fs; } } class dcColumn { protected $form; protected $id; protected $name; protected $sortable; protected $col_id; public function __construct($id, $name, $col_id,$attributes=array()) { $this->id = $id; $this->name = $name; $this->col_id = $col_id; } public function getName() { return $this->name; } public function getID() { return $this->id; } public function getColID(){ return $this->col_id; } public function setForm($f){ $this->form = $f; } public function appendEditLines($line) { $line[] = array ( 'name' => $this->name, 'col_id' => $this->col_id, 'widget' => 'col_'.$this->id); } } abstract class dcListFetcher { protected $core; public function __construct($core) { $this->core = $core; } abstract function getEntries($params,$offset,$limit); abstract function getEntriesCount($params); } dcItemList::__init__($GLOBALS['core']->tpl); ?>