Changeset 1156:92f840a91f98
- Timestamp:
- 04/26/13 16:23:16 (12 years ago)
- Branch:
- twig
- Location:
- inc/admin
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
inc/admin/class.dc.admincontext.php
r1153 r1156 208 208 'debug_info' => new Twig_Function_Method($this, 'getDebugInfo', array('is_safe' => array('html'))), 209 209 'memorize' => new Twig_Function_Method($this, 'setMemory', array('is_safe' => array('html'))), 210 'memorized' => new Twig_Function_Method($this, 'getMemory', array('is_safe' => array('html'))) 211 ); 212 } 213 210 'memorized' => new Twig_Function_Method($this, 'getMemory', array('is_safe' => array('html'))), 211 'build_url' => new Twig_Function_Method($this,'buildUrl', array('is_safe' => array('html'))) 212 ); 213 } 214 215 216 /** 217 * Builds an url given a base, and parameters 218 * 219 * @param mixed $url the base url as string 220 * @param mixed $params the parameters. 221 * 222 * @access public 223 * 224 * @return string the resulting url. 225 */ 226 public function buildUrl($url,$params=array()) { 227 if (is_array($url) && isset($url[0])) { 228 $base = $url[0]; 229 if (isset($url[1]) && is_array($url[1])) { 230 $p = array_merge($params,$url[1]); 231 } 232 } else { 233 $base = $url; 234 $p=$params; 235 } 236 if (empty($p)) { 237 return $base; 238 } else { 239 return $base.'?'.http_build_query($p); 240 } 241 } 242 214 243 /** 215 244 Returns a list of global variables to add to the existing list. -
inc/admin/class.dc.filter.php
r1154 r1156 14 14 15 15 16 /** 17 * dcFilterSet -- filter handling object 18 * 19 * @uses dcForm 20 * 21 */ 16 22 class dcFilterSet extends dcForm { 17 protected $filters; /// <b>array</b> lists of currently applied filters 23 /** @var array list of variable filters */ 24 protected $filters; 25 /** @var array list of static filters */ 18 26 protected $static_filters; 27 /** @var array list of all filters (union of the 2 previous props) */ 19 28 protected $all_filters; 20 protected $form_prefix; /// <b>string</b> displayed form prefix 21 protected $action; /// <b>string</b> form action page 22 protected $hide_filterset; /// <b>boolean</b> start form display hidden by default or not 23 protected $name; /// <b>string</b> filterset name 29 /** @var string prefix to be used for all fields */ 30 protected $form_prefix; 31 /** @var string action to perform upon form submission */ 32 protected $action; 33 /** @var boolean start form display hidden by default or not */ 34 protected $hide_filterset; 35 /** @var string filterset name */ 36 protected $name; 37 /** @var dcCore dotclear core object */ 24 38 protected $core; 25 39 40 /** 41 * __init__ - class static initialiser (called at the very bottom of this 42 * page) 43 * 44 * @param mixed $env the twig environment. 45 * 46 * @access public 47 * @static 48 * 49 */ 26 50 public static function __init__($env) { 27 $env->getExtension('dc_form')->addTemplate('@forms/formfilter_layout.html.twig'); 51 // filterset widgets are defined in a separate file 52 $env->getExtension('dc_form')->addTemplate( 53 '@forms/formfilter_layout.html.twig' 54 ); 55 28 56 $env->addFunction( 29 57 new Twig_SimpleFunction( … … 36 64 ))); 37 65 } 38 39 public static function renderFilterSet($env,$context,$name,$attributes=array()) 40 { 41 $context['filtersetname']=$name; 42 echo $env->getExtension('dc_form')->renderWidget( 43 'filterset', 44 $context 45 ); 46 } 47 /** 48 Inits dcFilterSet object 49 50 @param core <b>dcCore</b> Dotclear core reference 51 @param form_prefix <b>string</b> form prefix to use for parameters 52 */ 53 public function __construct($core,$name,$action,$form_prefix="f_") { 66 67 /** 68 * __construct -- constructor 69 * 70 * @param dcCore $core dotclear core instance. 71 * @param string $name filterset name. 72 * @param string $action form action. 73 * @param string $form_prefix form prefix. 74 * 75 * @access public 76 * 77 * @return mixed Value. 78 */ 79 public function __construct($core,$name,$action,$form_prefix="f_"){ 54 80 $this->form_prefix=$form_prefix; 55 81 $this->filters = new ArrayObject(); … … 62 88 } 63 89 90 91 /** 92 * renderFilterSet -- binding to twig function "filterset" 93 * renders a filterset given its name & context 94 * @param mixed $env Twig environment (passed by Twig template). 95 * @param mixed $context Context (passed by Twig template). 96 * @param mixed $name filterset name. 97 * @param array $attributes filterset attributes. 98 * 99 * @access public 100 * @static 101 * 102 * @return mixed Value. 103 */ 104 public static function renderFilterSet($env,$context,$name, 105 $attributes=array()) { 106 $context['filtersetname']=$name; 107 echo $env->getExtension('dc_form')->renderWidget( 108 'filterset', 109 $context 110 ); 111 } 112 113 114 /** 115 * setup - sets up the form filter from http context 116 * 117 * @access public 118 * 119 * @return mixed Value. 120 */ 64 121 public function setup() { 65 122 $form_combo = array(); … … 74 131 $this 75 132 ->addField ( 76 new dcFieldCombo ($p.'add_filter','',$form_combo, array(77 )))133 new dcFieldCombo ($p.'add_filter','',$form_combo, 134 array())) 78 135 ->addField ( 79 new dcFieldSubmit($p.'add',__('Add this filter'), array(80 )))136 new dcFieldSubmit($p.'add',__('Add this filter'), 137 array())) 81 138 ->addField ( 82 new dcFieldSubmit($p.'clear_filters',__('Delete all filters'), array(83 )))139 new dcFieldSubmit($p.'clear_filters',__('Delete all filters'), 140 array())) 84 141 ->addField ( 85 new dcFieldSubmit($p.'apply',__('Apply filters and display options'),array( 86 ))) 142 new dcFieldSubmit($p.'apply', 143 __('Apply filters and display options'), 144 array())) 87 145 ->addField ( 88 new dcFieldSubmit($p.'reset',__('Reset'), array(89 )))146 new dcFieldSubmit($p.'reset',__('Reset'), 147 array())) 90 148 ; 91 149 $this->setupFields(); 92 /* Use cases : 150 /* Since we have specific handling for actions 151 (for instance "del_*" fields), we do not take advantage of 152 submitfields features, actions are performed manually here. 153 154 Use cases : 93 155 (1) $_POST not empty for formfilter fields : 94 * efilters are set from $_POST95 * lfilters are set from $_GET156 * filters are set from $_POST 157 * applied filters values are set from $_GET 96 158 * keep filters div shown 97 159 (2) $_POST empty : 98 * both efilters and lfilters are set from $_GET160 * both filters fields & applied values are set from $_GET 99 161 * hide filter div 100 162 */ … … 102 164 //$allowed_actions = array('clear_filters','add','del_.*','apply','reset'); 103 165 $allowed_actions = '#^(clear_filters|add|del_.*|apply|reset)$#'; 166 104 167 // Fetch each $_POST parameter to see whether filters are concerned. 105 168 // Only 1 action at a time is allowed. 106 107 169 foreach ($_POST as $k => $v) { 108 170 if (strpos($k,$this->form_prefix)===0) { … … 119 181 // Use case (1) 120 182 if ($action != 'clear_filters' && $action != 'reset') { 183 // initialize fields from $_POST 121 184 $this->setupEditFilters($this->all_filters,$_POST); 122 185 if ($action == 'add'){ 186 // Add a new filter 123 187 $fname = $p.'add_filter'; 124 188 if (isset($_POST[$fname]) 125 189 && isset($this->filters[$_POST[$fname]])) { 126 $this->filters[$_POST[$fname]]->add();190 $this->filters[$_POST[$fname]]->add(); 127 191 } 128 192 $this->hide_filterset = false; 129 193 } elseif (strpos($action,'del_') === 0) { 194 // Remove a filter 130 195 $count = preg_match('#del_(.+)_([0-9]+)#',$action,$match); 131 196 if (($count == 1) && isset($this->filters[$match[1]])) { … … 134 199 $this->hide_filterset = false; 135 200 } elseif ($action=="apply") { 201 // Apply all filters 202 // ==> store filter to preferences and redirect to 203 // page with filter as $_GET attributes 136 204 $data = $this->saveFilters(); 137 205 $query = http_build_query($data,'','&'); … … 143 211 } 144 212 } 213 // Form as been submitted with POST method, retrieve 214 // applied filter values from "query" field 145 215 if (isset($_POST[$p."query"])) { 146 216 parse_str($_POST[$p."query"],$out); 147 $this->setupApplied Filters($this->all_filters,$out);217 $this->setupAppliedValues($this->all_filters,$out); 148 218 if ($action == 'reset') { 219 // RESET action => set fields from query field 149 220 $this->setupEditFilters($this->all_filters,$out); 150 221 } elseif ($action == 'clear_filters') { … … 155 226 } 156 227 } 157 158 228 } else { 159 // Use case (2) 229 // Use case (2) : GET method; set both filters and applied values 230 // from GET args or from settings if no GET args. 160 231 $load_from_settings = true; 161 232 foreach($_GET as $k=>$v) { … … 167 238 $get = $_GET; 168 239 if ($load_from_settings) { 169 $get = new ArrayObject(array_merge($this->loadFilters(),$get));240 $get = array_merge($this->loadFilters(),$get); 170 241 } 171 242 $this->setupEditFilters($this->all_filters,$get); 172 243 173 $this->setupApplied Filters($this->all_filters,$get);244 $this->setupAppliedValues($this->all_filters,$get); 174 245 } 175 246 foreach ($this->static_filters as $f) { … … 178 249 } 179 250 } 180 $queryParams = $this->getAppliedFilter s();251 $queryParams = $this->getAppliedFilterValues(); 181 252 $this->addField( 182 253 new dcFieldHidden($this->form_prefix.'query', 183 254 http_build_query($queryParams))); 184 $this->core->tpl->addGlobal('filterset_'.$this->name,$this->getContext()); 255 // form context is set through a global twig variable 256 $this->core->tpl->addGlobal( 257 'filterset_'.$this->name, 258 $this->getContext()); 185 259 } 186 260 187 261 public function getURLParams() { 188 return $this->getAppliedFilters(); 189 } 190 191 /** 192 Saves user filters to preferences 193 */ 262 return $this->getAppliedFilterValues()->getArrayCopy(); 263 } 264 265 /** 266 * saveFilters - save user defined filters into preferences 267 * 268 * @access protected 269 */ 194 270 protected function saveFilters() { 195 271 $ser = array(); 196 272 $ws = $GLOBALS['core']->auth->user_prefs->addWorkspace('filters'); 197 $data = new ArrayObject();198 273 $data= $this->serialize(); 199 274 $ws->put($this->name,serialize($data->getArrayCopy()),'string'); … … 201 276 } 202 277 203 /** 204 Loads user filters from preferences 205 */ 278 /** 279 * loadFilters - load user filters from preferences 280 * 281 * @access protected 282 * 283 * @return mixed Value. 284 */ 206 285 protected function loadFilters() { 207 286 $ws = $GLOBALS['core']->auth->user_prefs->addWorkspace('filters'); 208 $data = (!is_null($ws->{$this->name})) ? unserialize($ws->{$this->name}) : array(); 287 $data = (!is_null($ws->{$this->name})) 288 ? unserialize($ws->{$this->name}) 289 : array(); 209 290 if (is_array($data)) 210 291 return $data; … … 213 294 } 214 295 215 /** 216 Updates filters values according to form_data 217 To be called before any call to display() or getForm() 218 219 @param form_data <b>array</b> form values (usually $_GET or $_POST) 220 */ 296 /** 297 * setupEditFilters - Updates filters fields according to form_data 298 * To be called before any call to display() or getForm() 299 * 300 * @param array $filters list of filters to update 301 * @param array $form_data form values (usually $_GET or $_POST) 302 * 303 * @access protected 304 * 305 * @return mixed Value. 306 */ 221 307 protected function setupEditFilters ($filters,$form_data) { 222 308 foreach ($filters as $filter) { … … 224 310 } 225 311 } 226 protected function setupAppliedFilters ($filters,$form_data) { 312 313 /** 314 * setupAppliedValues - Updates filters applied values according to 315 * form_data 316 * 317 * @param array $filters list of filters to update 318 * @param array $form_data form values (usually $_GET or $_POST) 319 * 320 * @access protected 321 * 322 * @return mixed Value. 323 */ 324 protected function setupAppliedValues ($filters,$form_data) { 227 325 foreach ($filters as $filter) { 228 $filter->setupAppliedFilter ($form_data); 229 } 230 } 231 /** 232 Retrieves the filters values as parameters 233 234 @param filters <b>array</b> list of concerned filters 235 236 @return <b>array</b> the array of parameters 237 238 */ 239 326 $filter->setupAppliedValue ($form_data); 327 } 328 } 329 330 /** 331 * serialize - retrieves filter applied values in a serialized form 332 * 333 * @access protected 334 * 335 * @return ArrayObject serialized data. 336 */ 240 337 protected function serialize() { 241 338 $arr = new ArrayObject(); … … 250 347 return $arr; 251 348 } 252 /** 253 Adds a new filter to list 254 255 @param filter <b>dcFilter</b> the filter to add 256 */ 349 350 /** 351 * addFilter - registers a new filter in filterset 352 * 353 * @param mixed \dcFilter the filter. 354 * 355 * @access public 356 * 357 * @return dcFilterSet the filterset (enabling to chain addFilter). 358 */ 257 359 public function addFilter (dcFilter $filter) { 258 360 $filter->setFormPrefix($this->form_prefix); … … 267 369 } 268 370 371 /** 372 * getContext - retrieves current filterset context 373 * (to be given to twig template) 374 * 375 * @access public 376 * 377 * @return array the context 378 */ 269 379 public function getContext() { 270 380 $fcontext = new ArrayObject(); … … 272 382 foreach ($this->filters as $f) { 273 383 if($f->isEnabled()) { 274 $f->append EditLines($fcontext);384 $f->appendFilterContext($fcontext); 275 385 } 276 386 } 277 387 foreach ($this->static_filters as $f) { 278 $f->append EditLines($sfcontext);388 $f->appendFilterContext($sfcontext); 279 389 } 280 390 return array( 281 'active_filters' => $fcontext, 391 'active_filters' => $fcontext, 282 392 'static_filters' => $sfcontext, 283 393 'hide_filters' => $this->hide_filterset, … … 285 395 } 286 396 287 protected function getAppliedFilters() { 397 /** 398 * getAppliedFilterValues - retrieves the list of applied filter values 399 * 400 * @access protected 401 * 402 * @return ArrayObject the list of applied values 403 */ 404 protected function getAppliedFilterValues() { 288 405 $arr = new ArrayObject(); 289 406 foreach ($this->all_filters as $f) { … … 293 410 return $arr; 294 411 } 295 /** 296 Applies fieldset and return resulting parameters for request 297 298 @param method <b>string</b> form method to use (default: "get") 299 @param method <b>string</b> form method to use (default: "get") 300 301 */ 412 413 /** 414 * applyFilters -- applies filterset 415 * 416 * @param mixed $params the parameters to update. 417 * 418 * @access public 419 * 420 * @return mixed true if at least 1 filter has been applied, false otherwise 421 */ 302 422 public function applyFilters($params) { 303 423 foreach ($this->all_filters as $filter) { … … 310 430 } 311 431 312 public function getDelName($field_id,$pos) { 313 return $this->form_prefix.'del_'.$field_id.'_'.$pos; 432 /** 433 * buildFieldName -- builds a field name given a verb, an id and a position 434 * takes the form prefix into consideration 435 * @param mixed $verb the verb to use (ex : "del") 436 * @param mixed $field_id the field id 437 * @param mixed $pos the field position 438 * 439 * @access public 440 * 441 * @return mixed the field name 442 */ 443 public function buildFieldName($verb,$field_id,$pos) { 444 return $this->form_prefix.$verb.'_'.$field_id.'_'.$pos; 314 445 } 315 446 … … 317 448 318 449 319 320 450 /** 321 * dcFilter - describes an abstract filter 451 * dcFilter -- base filter class 452 * 453 * A filter can be edited while being applied with other values 454 * that enables to keep the list of applied filters (to display a list of items) 455 * while modifing the filter itself. 456 * Therefore it contains : 457 * * a Field that tracks the currently edited filter 458 * * an applied values that tracks the currently applied filter 322 459 * 323 460 */ 324 461 abstract class dcFilter { 325 public $filterset; ///<b>string</b> filterset parent 326 public $id; ///<b>string</b> field id (local to fieldset) 327 public $name; ///<b>string</b> filter name 328 public $desc; ///<b>string</b> field description 329 public $filter_id; ///<b>string</b> field id (global to the page) 330 protected $request_param; ///<b>string</b> resulting parameter array key 331 protected $field; ///<b>array</b> currently edited values 332 protected $avalues; ///<b>array</b> currently applied values 462 /** @var dcFilterSet filterset parent */ 463 public $filterset; 464 /** @var string filter id */ 465 public $id; 466 /** @var string filter name */ 467 public $name; 468 /** @var string filter description */ 469 public $desc; 470 /** @var string filter id (including form prefix) */ 471 public $filter_id; 472 /** @var string resulting parameter array key */ 473 protected $request_param; 474 /** @var dcField edited field */ 475 protected $field; 476 /** @var array currently applied values */ 477 protected $avalues; 478 /** @var boolean true if field is static */ 333 479 protected $static; 480 /** @var array generic field options */ 334 481 protected $options; 482 /** @var boolean true if field can have multiple values */ 335 483 protected $multiple; 336 484 485 /** 486 * __construct -- filter constructor 487 * 488 * @param mixed $id filter id. 489 * @param mixed $name filter name. 490 * @param mixed $desc filter description. 491 * @param mixed $request_param request parameter (see dcBlog::getPosts for 492 * instance). 493 * @param array $options filter options. 494 * 495 * @access public 496 * 497 * @return mixed Value. 498 */ 337 499 public function __construct ($id,$name,$desc,$request_param,$options=array()) { 338 500 $this->id = $id; … … 353 515 } 354 516 355 /** 356 Extract values from data (data being an array, such as $_GET or $_POST) 357 358 @param $data <b>array</b> data to parse 359 @return <b>array</b> field values 360 361 */ 517 518 /** 519 * parseData - Extract values from data (data being an array, such as $_GET 520 * or $_POST) ; does not update any field, only return parsed 521 * data 522 * 523 * @param mixed $data input data. 524 * 525 * @access protected 526 * 527 * @return array an array containing parsed data. 528 */ 362 529 protected function parseData($data) { 363 530 $arr = $this->field->parseValues($data); … … 365 532 } 366 533 534 /** 535 * isStatic -- returns whether the filter is static or not 536 * 537 * @access public 538 * 539 * @return boolean true if the filter is static. 540 */ 367 541 public function isStatic() { 368 542 return $this->static; 369 543 } 370 544 545 /** 546 * setupFields -- sets up filter fielt from $_GET or $_POST 547 * 548 * @param mixed $data input data (either $_GET or $_POST). 549 * 550 * @access public 551 * 552 * @return mixed Value. 553 */ 371 554 public function setupFields($data) { 372 555 $this->field->setup($data); … … 374 557 375 558 559 /** 560 * init -- initializes filter (called after setup) 561 * 562 * @access public 563 * 564 * @return mixed Value. 565 */ 376 566 public function init() { 377 567 } 378 568 569 /** 570 * cleanup - resets filter field to its default value 571 * 572 * @access public 573 * 574 * @return mixed Value. 575 */ 379 576 public function cleanup() { 380 577 $this->field->setValues(array()); 381 578 } 382 579 383 public function setupAppliedFilter($data) { 580 /** 581 * setupAppliedValue -- defines field applied values from data 582 * 583 * @param mixed $data data to retrieve values from ($_GET or $_POST). 584 * 585 * @access public 586 * 587 * @return mixed Value. 588 */ 589 public function setupAppliedValue($data) { 384 590 $this->avalues = $this->parseData($data); 385 591 } … … 389 595 } 390 596 391 /** 392 Defines the filterset containing this filter 393 394 @param prefix <b>dcFilterset</b> the filterset 395 */ 396 public function setFilterSet($fs) { 597 /** 598 * setFilterSet -- sets filterSet for filter 599 * 600 * @param mixed \dcFilterset Description. 601 * 602 * @access public 603 * 604 */ 605 public function setFilterSet(dcFilterset $fs) { 397 606 $this->filterset = $fs; 398 607 } 399 400 /** 401 402 Defines form prefix for filter 403 404 @param prefix <b>string</b> the form prefix 405 */ 608 609 /** 610 * setFormPrefix -- sets filter form prefix 611 * 612 * @param string $prefix the form prefix. 613 * 614 * @access public 615 * 616 * @return mixed Value. 617 */ 406 618 public function setFormPrefix($prefix) { 407 619 $this->filter_id = $prefix.$this->id; 408 620 } 409 621 410 /** 411 Tells whether the filter is enabled or not 412 413 @return <b>boolean</b> true if enabled, false otherwise 414 */ 622 /** 623 * isEnabled -- Tells whether the filter is enabled or not (ie field has 624 * at least 1 value defined) 625 * 626 * @access public 627 * 628 * @return mixed true if the filter is enabled. 629 */ 415 630 public function isEnabled() { 416 631 return count($this->field) != 0; 417 632 } 418 633 419 634 protected abstract function addValue($value=NULL); 420 635 421 /** 422 Adds the current filter to the list 423 */ 636 /** 637 * add -- adds a value for the filter 638 * 639 * @access public 640 * 641 * @return mixed Value. 642 */ 424 643 public function add() { 425 644 if (count($this->field) > 1 && !$this->multiple) … … 427 646 $this->addValue(); 428 647 } 429 430 /** 431 Removes a value from filter 432 */ 648 649 /** 650 * remove -- Removes a value from filter 651 * 652 * @param mixed $pos value position. 653 * 654 * @access public 655 * 656 * @return mixed Value. 657 */ 433 658 public function remove($pos) { 434 659 $values = $this->field->getValues(); … … 439 664 } 440 665 441 abstract protected function appendSingleLine($ctx,$pos); 442 443 public function appendEditLines($ctx) { 666 abstract protected function appendContextLine($ctx,$pos); 667 668 /** 669 * appendFilterContext -- appends current filter context to the given 670 * context. 671 * A filter context consists in a list of array elements, one for 672 * each field line displayed. 673 * If a field has multiple values, there will be as many lines as values 674 * 675 * The twig template then iterates through the array to display 676 * each and every line 677 * @param mixed $ctx the context to enrich 678 * 679 * @access public 680 * 681 * @return mixed Value. 682 */ 683 public function appendFilterContext($ctx) { 444 684 foreach ($this->field->getValues() as $cur => $f) { 685 /* 686 * each line of context has the following properties : 687 * * lineclass : <tr> class to use 688 * * 'del_id' : delete input field name to delete current value 689 * * other field-type specific values that are set from 690 * appendContextLine method 691 */ 445 692 $line = new ArrayObject(); 446 693 $line['lineclass'] = $this->id; 447 $line['del_id'] = $this->filterset->getDelName($this->id,$cur); 694 $line['del_id'] = $this->filterset->buildFieldName('del',$this->id,$cur); 695 // Create the delete field for this line 448 696 $del = new dcFieldSubmit( 449 $this->filterset-> getDelName($this->id,$cur),697 $this->filterset->buildFieldName('del',$this->id,$cur), 450 698 '-', 451 699 array( … … 454 702 ); 455 703 $this->filterset->addField($del); 456 $this->append SingleLine($line,$cur);704 $this->appendContextLine($line,$cur); 457 705 $ctx[]=$line; 458 706 } 459 707 } 460 708 709 /** 710 * serialize - serializes field value into given array 711 * 712 * @param mixed $arr the context to update. 713 * 714 * @access public 715 * 716 * @return mixed Value. 717 */ 461 718 public function serialize($arr) { 462 719 if (count($this->fields) == 1) { … … 466 723 } 467 724 } 468 725 726 /** 727 * isApplied -- returns true when the filter is applied 728 * (ie. has at least 1 applied value) 729 * @access public 730 * 731 * @return mixed Value. 732 */ 469 733 public function isApplied(){ 470 734 return (count($this->avalues['values']) != 0); 471 735 } 472 736 473 /** 474 Convert filter values into a $param filter, used for the upcoming SQL request 475 476 @param <b>ArrayObject</b> the parameters array to enrich 477 478 @return boolean true if a filter has been applied, false otherwise 479 */ 737 /** 738 * applyFilter -- Converts filter values into a $param filter, used for the 739 * upcoming SQL request 740 * 741 * @param mixed $params Description. 742 * 743 * @access public 744 * 745 * @return mixed Value. 746 */ 480 747 public function applyFilter($params) { 481 748 return false; 482 749 } 483 750 751 /** 752 * header -- tbd 753 * 754 * @access public 755 * 756 * @return mixed Value. 757 */ 484 758 public function header() { 485 759 return ''; 486 760 } 487 761 762 /** 763 * getFields -- returns filter field(s) 764 * 765 * @access public 766 * 767 * @return dcField the filter field. 768 */ 488 769 public function getFields() { 489 770 return $this->field; … … 492 773 } 493 774 494 495 775 /** 776 * dcFilterText - basic single field text filter 777 * 778 * @uses dcFilter 779 * 780 */ 496 781 class dcFilterText extends dcFilter { 497 782 783 /** 784 * @see dcFilter::init() 785 */ 498 786 public function init() { 499 787 $this->field = new dcFieldText( … … 505 793 506 794 507 public function appendSingleLine($line,$pos) { 795 /** 796 * @see dcFilter::appendContextLine() 797 */ 798 public function appendContextLine($line,$pos) { 799 /* 800 Extra data provided by this filter : 801 * ffield : field name 802 * display_inline : true if the field is static 803 * fwidget : name of the widget (filter_text) 804 * desc : filter description 805 */ 508 806 $line['ffield'] = $this->field->getName(); 509 807 if ($this->static) { … … 517 815 } 518 816 519 protected function addValue($value=NULL) { 817 /** 818 * @see dcFilter::addValue() 819 */ 820 protected function addValue($value=NULL) { 520 821 if ($value === NULL) { 521 822 $value = ''; … … 524 825 } 525 826 827 /** 828 * @see dcFilter::applyFilter() 829 */ 526 830 public function applyFilter($params) { 527 831 $params[$this->request_param]=$this->avalues['values'][0]; 528 832 } 529 530 833 } 834 531 835 /** 532 @ingroup DC_CORE 533 @nosubgrouping 534 @brief abstract filter class. 535 536 Handle combo filter on admin side. Can be single or multi-valued 836 * dcFilterCombo -- combo filter 837 * 838 * Enables to filter through a list of values, can be used to check 839 * if a value is in a list of items 840 * 841 * @uses dcFilter 842 * 537 843 */ 538 844 class dcFilterCombo extends dcFilter { 845 /** @var combo the list of possible values in combo */ 539 846 protected $combo; 540 847 541 public function __construct($id,$name,$desc,$request_param,$combo,$options=array()) { 848 /** 849 * @see dcFilter::__construct() 850 */ 851 public function __construct($id,$name,$desc,$request_param,$combo, 852 $options=array()) { 542 853 parent::__construct($id,$name,$desc,$request_param,$options); 543 854 $this->combo = $combo; 544 855 } 856 857 /** 858 * @see dcFilter::init() 859 */ 545 860 public function init() { 546 861 $this->field = new dcFieldCombo( … … 551 866 } 552 867 868 /** 869 * @see dcFilter::addValue() 870 */ 553 871 protected function addValue($value=NULL) { 554 872 if ($value === NULL) { … … 558 876 } 559 877 560 public function appendSingleLine($line,$pos) { 878 /** 879 * @see dcFilter::init() 880 */ 881 public function appendContextLine($line,$pos) { 882 /* 883 Extra data provided by this filter : 884 * ffield : field name 885 * display_inline : true if the field is static 886 * fwidget : name of the widget (filter_combo or filter_combo_cont) 887 * foffset : field value offset 888 * desc : filter description 889 Only the 1st item contains description. 890 */ 561 891 if ($this->static) { 562 892 $line['display_inline'] = true; … … 571 901 }; 572 902 } 573 903 904 /** 905 * @see dcFilter::applyFilter() 906 */ 574 907 public function applyFilter($params) { 575 908 $attr = $this->request_param; … … 583 916 584 917 /** 585 @ingroup DC_CORE 586 @nosubgrouping 587 @brief abstract filter class. 588 589 Handle combo filter on admin side. Can be single or multi-valued 918 * dcFilterRichCombo -- rich combo filter 919 * 920 * Same as dcFilterCombo, with the possibility to exclude a list of values 921 * 922 * @uses dcFilter 923 * 590 924 */ 591 925 class dcFilterRichCombo extends dcFilterCombo { 926 /** @var verb verb field ('is' or 'is not') */ 592 927 protected $verb; 593 928 929 /** 930 * @see dcFilter::init() 931 */ 594 932 public function init() { 595 933 parent::init(); … … 604 942 } 605 943 944 /** 945 * @see dcFilter::parseData() 946 */ 606 947 protected function parseData($data) { 607 948 $val = parent::parseData($data); … … 614 955 } 615 956 957 /** 958 * @see dcFilter::setupFields() 959 */ 616 960 public function setupFields($data) { 617 961 parent::setupFields($data); … … 619 963 } 620 964 965 /** 966 * @see dcFilter::updateAppliedValues() 967 */ 621 968 public function updateAppliedValues($arr) { 622 969 parent::updateAppliedValues($arr); 623 $arr['verb'] = $this->verb->getValue(); 624 } 625 626 public function appendSingleLine($line,$pos) { 627 parent::appendSingleLine($line,$pos); 970 $arr[$this->verb->getName()] = $this->verb->getValue(); 971 } 972 973 /** 974 * @see dcFilter::appendContextLine() 975 */ 976 public function appendContextLine($line,$pos) { 977 parent::appendContextLine($line,$pos); 628 978 if ($pos == 0) { 629 979 $line['fverb'] = $this->verb->getName(); 630 980 $line['fwidget']='filter_richcombo'; 631 } 632 } 633 981 } 982 } 983 984 /** 985 * @see dcFilter::serialize() 986 */ 634 987 public function serialize($arr) { 635 988 parent::serialize($arr); 636 989 $arr[$this->filter_id.'_v']=$this->verb->getValue(); 637 990 } 638 991 992 /** 993 * @see dcFilter::applyFilter() 994 */ 639 995 public function applyFilter($params) { 640 996 parent::applyFilter($params); … … 647 1003 } 648 1004 649 650 1005 // Static initializer 651 1006 dcFilterSet::__init__($GLOBALS['core']->tpl); 652 1007 ?> -
inc/admin/class.dc.form.php
r1154 r1156 13 13 14 14 /** 15 * dcFormNode 15 * dcFormNode Twig Node for Form handling 16 16 * 17 17 * @uses Twig_Node … … 57 57 class dcFormTokenParser extends Twig_TokenParser 58 58 { 59 /** 60 * parse - parses form tag 61 * General syntax is : 62 * {% form 'formname' %} 63 * ... {{ form_field (...)}} 64 * {% endform %} 65 * Specific attributes can be passed to the form, enabling to set 66 * attributes to the form template : 67 * {% form 'formname' with {'id':'myform'} %} 68 * @param mixed \Twig_Token Description. 69 * 70 * @access public 71 * 72 * @return mixed Value. 73 */ 59 74 public function parse(Twig_Token $token) 60 75 { … … 63 78 $name = $this->parser->getExpressionParser()->parseExpression(); 64 79 $attr = null; 80 /* parse optional context */ 65 81 if ($stream->test(Twig_Token::NAME_TYPE, 'with')) { 66 82 $stream->next(); … … 70 86 $body = $this->parser->subparse(array($this,'decideBlockEnd'),true); 71 87 $stream->expect(Twig_Token::BLOCK_END_TYPE); 72 88 73 89 return new dcFormNode($name,$body,$attr,$token->getLine(),$this->getTag()); 74 90 } 75 91 76 92 public function decideBlockEnd(Twig_Token $token) 77 93 { 78 94 return $token->test('endform'); 79 95 } 80 96 81 97 public function getTag() 82 98 { … … 97 113 protected $currentForm; 98 114 protected $blocks; 99 115 100 116 public function __construct($core) 101 117 { … … 106 122 $this->currentForm = null; 107 123 } 108 124 109 125 public function initRuntime(Twig_Environment $environment) 110 126 { … … 116 132 } 117 133 } 118 134 119 135 public function addTemplate($tpl) { 120 136 $this->tpl[]=$tpl; … … 129 145 return array('dc_form' => $this); 130 146 } 131 147 132 148 public function getFunctions() 133 149 { … … 160 176 ); 161 177 } 162 178 179 /** 180 * isChoiceGroup - binding for twig function "_form_is_choice_group" 181 * returns whether a choice is a group or not 182 * @param mixed $choice the choice. 183 * 184 * @access public 185 * 186 * @return boolean true is choice is a group (optgroup). 187 */ 163 188 public function isChoiceGroup($choice) 164 189 { 165 190 return is_array($choice); 166 191 } 167 192 193 /** 194 * isChoiceSelected - binding for twig function "_form_is_choice_selected" 195 * returns whether current choice matches a value or not 196 * @param mixed $choice the choixe. 197 * @param mixed $value the value to check matching. 198 * 199 * @access public 200 * 201 * @return boolean if choice is matching the value. 202 */ 168 203 public function isChoiceSelected($choice,$value) 169 204 { 170 205 return $choice == $value; 171 206 } 172 207 208 /** 209 * getTokenParsers returns token parsers 210 * 211 * @access public 212 * 213 * @return mixed Value. 214 */ 173 215 public function getTokenParsers() 174 216 { 175 217 return array(new dcFormTokenParser()); 176 218 } 177 219 220 /** 221 * hasWidget - binding for twig "haswidget" function 222 * returns whether a widget is defined or not 223 * 224 * @param mixed $name the widget name. 225 * 226 * @access public 227 * 228 * @return boolean true if the widget exists. 229 */ 178 230 public function hasWidget($name) { 179 231 return isset($this->blocks[$name]); 180 232 } 233 234 /** 235 * renderWidget - binding for 'widget' twig function 236 * behaves exactly like "block" function, except that a context 237 * can be passed to the function 238 * 239 * @param mixed $name the widget (block) name to render. 240 * @param mixed $attr Description the context for this block. 241 * 242 * 243 * @return mixed Value. 244 */ 181 245 public function renderWidget($name,$attr) { 182 246 if (!isset($this->blocks[$name])) … … 189 253 } 190 254 255 /** 256 * getCurrentForm - returns current form if called within a {% form %} tag 257 * 258 * @access public 259 * 260 * @return string the current form. 261 */ 191 262 public function getCurrentForm() { 192 263 return $this->currentForm; 193 264 } 194 265 266 /** 267 * renderField - binding for 'form_field' twig function; renders a field 268 * 269 * @param mixed $name field name as defined on php side. 270 * @param array $attributes html attributes for field (ex : class, ...). 271 * @param array $extra extra attributes that may be template specific. 272 * 273 * @access public 274 * 275 * @return mixed Value. 276 */ 195 277 public function renderField($name,$attributes=array(),$extra=array()) 196 278 { … … 213 295 } 214 296 297 /** 298 * renderHiddenWidgets -- renders all form hidden fields 299 * 300 * @access public 301 * 302 * @return mixed Value. 303 */ 215 304 public function renderHiddenWidgets() 216 305 { … … 225 314 } 226 315 316 /** 317 * addForm -- registers a new form 318 * 319 * @param mixed \dcForm Description. 320 * 321 * @access public 322 * 323 * @return mixed Value. 324 */ 227 325 public function addForm(dcForm $form) 228 326 { … … 230 328 } 231 329 330 /** 331 * beginForm -- displays form beginning 332 * 333 * @param mixed $name form name. 334 * @param array $attr extra attributes. 335 * 336 * @access public 337 * 338 * @return mixed Value. 339 */ 232 340 public function beginForm($name,$attr=array()) 233 341 { … … 243 351 } 244 352 } 245 353 354 /** 355 * endForm -- displays form ending 356 * 357 * @access public 358 * 359 * @return mixed Value. 360 */ 246 361 public function endForm() 247 362 { … … 263 378 class dcForm 264 379 { 380 /** @var string form id */ 265 381 protected $id; 382 /** @var string form name */ 266 383 protected $name; 384 /** @var dcCore dcCore instance */ 267 385 protected $core; 386 /** @var string form action */ 268 387 protected $action; 388 /** @var array(dcField) list of form fields */ 269 389 protected $fields; 390 /** @var string form method (GET/POST) */ 270 391 protected $method; 392 /** @var array(dcField) list of submit fields */ 271 393 protected $submitfields; 394 /** @var array(dcField) list of hidden fields */ 272 395 protected $hiddenfields; 396 /** @var array(dcField) list of form errors */ 273 397 protected $errors; 274 275 public function addTemplate($t) {276 $this->core->tpl->getExtension('dc_form')->addTemplate($t);277 }278 279 /**280 * addNonce -- adds dc nonce to form fields281 *282 * @access protected283 *284 * @return nothing285 */286 protected function addNonce()287 {288 $this->addField(289 new dcFieldHidden(array('xd_check'),290 $this->core->getNonce())291 );292 }293 294 295 /**296 * Defines Name & ID from field297 *298 * @param mixed $nid either an array (name, id) or a string (name only, id will be set to null).299 *300 * @access protected301 *302 * @return nothing.303 */304 protected function setNID($nid)305 {306 if (is_array($nid)) {307 $this->name = $nid[0];308 $this->id = !empty($nid[1]) ? $nid[1] : null;309 }310 else {311 $this->id = null;312 $this->name = $nid;313 }314 }315 316 public function getContext() {317 return array();318 }319 398 320 399 /** … … 322 401 * 323 402 * @param mixed $core dotclear core 324 * @param mixed $name form name 403 * @param mixed $name form name - can be an array (name,id) 325 404 * @param mixed $action form action 326 405 * @param string $method form method ('GET' or 'POST') … … 345 424 } 346 425 } 347 426 427 /** 428 * addTemplate - Adds a template file to enrich form fields 429 * 430 * @param string $t the template file. 431 * 432 * @access public 433 */ 434 public function addTemplate($t) { 435 $this->core->tpl->getExtension('dc_form')->addTemplate($t); 436 } 437 438 /** 439 * addNonce -- adds dc nonce to form fields 440 * 441 * @access protected 442 * 443 * @return nothing 444 */ 445 protected function addNonce() 446 { 447 $this->addField( 448 new dcFieldHidden(array('xd_check'), 449 $this->core->getNonce()) 450 ); 451 } 452 453 /** 454 * Defines Name & ID from field 455 * 456 * @param mixed $nid either an array (name, id) or a string 457 * (name only, id will be set to null). 458 * 459 * @access protected 460 * 461 * @return nothing. 462 */ 463 protected function setNID($nid) 464 { 465 if (is_array($nid)) { 466 $this->name = $nid[0]; 467 $this->id = !empty($nid[1]) ? $nid[1] : null; 468 } 469 else { 470 $this->id = null; 471 $this->name = $nid; 472 } 473 } 474 475 /** 476 * getContext - returns form context (to fill-in twig context for instance), 477 * if any 478 * 479 * @access public 480 * 481 * @return array the form context. 482 */ 483 public function getContext() { 484 return array(); 485 } 486 348 487 349 488 /** 350 489 * Returns form name 351 * 490 * 352 491 * @access public 353 492 * … … 358 497 return $this->name; 359 498 } 360 499 500 /** 501 * getErrors - returns form errors 502 * 503 * @access public 504 * 505 * @return array the list of errors. 506 */ 361 507 public function getErrors() 362 508 { 363 509 return $this->errors; 364 510 } 365 511 512 /** 513 * addField - adds a new field to form 514 * 515 * @param mixed \dcField the field to add. 516 * 517 * @access public 518 * 519 * @return dcForm the form instance (therefore addField can be chained) 520 */ 366 521 public function addField(dcField $f) 367 522 { … … 373 528 } 374 529 $this->fields[$f->getName()] = $f; 375 530 376 531 return $this; 377 532 } 378 533 534 /** 535 * removeField - removes a field 536 * 537 * @param mixed \dcField the field to remove. 538 * 539 * @access public 540 * 541 * @return dcForm the form instance (therefore addField can be chained) 542 */ 379 543 public function removeField(dcField $f) { 380 544 $n = $f->getName(); … … 382 546 unset($this->fields[$n]); 383 547 } 384 385 } 548 return $this; 549 } 550 551 552 /** 553 * renameField - renames a field 554 * 555 * @param mixed $field the field to rename. 556 * @param mixed $newname new field name 557 * 558 * @access public 559 * 560 * 561 * @return dcForm the form instance (therefore addField can be chained) 562 */ 386 563 public function renameField($field,$newname) { 387 564 $oldname = $field->getName(); … … 391 568 $this->fields[$newname] = $field; 392 569 } 393 } 570 return $this; 571 } 572 573 /** 574 * begin - begins a form. Should be not be called directly, it is handled 575 * by the Twig Form extension. 576 * 577 * @param array $attr form extra attributes, if any. 578 * 579 * @access public 580 * 581 * @return mixed Value. 582 */ 394 583 public function begin($attr=array()) 395 584 { … … 403 592 $attr); 404 593 } 405 594 595 /** 596 * end - ends a form. Should be not be called directly, it is handled 597 * by the Twig Form extension. 598 * 599 * @access public 600 * 601 * @return mixed Value. 602 */ 406 603 public function end() 407 604 { 408 echo '</form>'; 409 } 410 605 $this->core->tpl->getExtension('dc_form')->renderWidget( 606 'endform'); 607 } 608 609 /** 610 * __isset - magic method isset, checks whether a field exists 611 * example : if (isset($form->field1)) 612 * 613 * @param mixed $name field name to check. 614 * 615 * @access public 616 * 617 * @return boolean true if the field exists. 618 */ 411 619 public function __isset($name) 412 620 { 413 621 return isset($this->fields[$name]); 414 622 } 415 623 624 /** 625 * __get -- magic method, retrieves a field from a form 626 * example : $f = $form->field1 627 * 628 * @param mixed $name Description. 629 * 630 * @access public 631 * 632 * @return mixed Value. 633 */ 416 634 public function __get($name) 417 635 { … … 420 638 } 421 639 640 /** 641 * __set -- magic method, sets a value for a given form field 642 * example : $form->field1 = 'my value'; 643 * 644 * @param mixed $name the field name. 645 * @param mixed $value the field value. 646 * 647 * @access public 648 */ 422 649 public function __set($name,$value) 423 650 { … … 427 654 } 428 655 429 public function isSubmitted()656 /* public function isSubmitted() 430 657 { 431 658 $from = $this->method == 'POST' ? $_POST : $_GET; 432 659 } 433 660 */ 661 662 /** 663 * setupFields - initializes form & fields from $_GET or $_POST 664 * 665 * @access protected 666 */ 434 667 protected function setupFields() { 435 668 $from = $this->method == 'POST' ? $_POST : $_GET; … … 439 672 } 440 673 674 /** 675 * handleActions - handle appropriate actions, according to submitted fields 676 * 677 * @param mixed $submitted the fields that have been submitted. 678 * 679 * @access protected 680 */ 441 681 protected function handleActions($submitted) { 442 682 foreach ($submitted as $f) { … … 448 688 } 449 689 690 /** 691 * getSubmittedFields - retrieves fields that have been submitted, if any 692 * 693 * @access protected 694 * 695 * @return array the list of submitted fields. 696 */ 450 697 protected function getSubmittedFields() { 451 698 $s = array(); … … 458 705 } 459 706 707 /** 708 * setup - sets up the form, given the parameters given to the page 709 * should be called after fields have been defined. 710 * 711 * @access public 712 * 713 * @return mixed Value. 714 */ 460 715 public function setup() 461 716 { … … 465 720 } 466 721 722 /** 723 * check - checks if the form is valid, errors are filled in, in case of 724 * incorrect fields 725 * 726 * @access public 727 */ 467 728 public function check() 468 729 { … … 476 737 } 477 738 } 478 739 740 /** 741 * getHiddenFields - returns the list of hidden fields 742 * 743 * @access public 744 * 745 * @return array the list of hidden fields. 746 */ 479 747 public function getHiddenFields() 480 748 { … … 488 756 abstract class dcField implements Countable 489 757 { 758 /** @var string field options */ 490 759 protected $options; 760 /** @var string field name */ 491 761 protected $name; 762 /** @var string field values */ 492 763 protected $values; 764 /** @var string field id */ 493 765 protected $id; 766 /** @var boolean true if field can contain multiple values */ 494 767 protected $multiple; 768 /** @var boolean true if the field has been defined */ 495 769 protected $defined; 496 497 protected function setNID($nid) 498 { 499 if (is_array($nid)) { 500 $this->name = $nid[0]; 501 $this->id = !empty($nid[1]) ? $nid[1] : null; 502 } 503 else { 504 $this->id = $this->name = $nid; 505 } 506 } 507 770 771 /** 772 * __construct - constructor 773 * 774 * @param string $name Name or array(name,id) for field. 775 * @param array $values field values. 776 * @param array $options options 777 * 778 * Currently globally available options are : 779 * * multiple : true/false. Enable multiple values for field 780 * @access public 781 * 782 * @return mixed Value. 783 */ 508 784 public function __construct($name,$values,$options=array()) 509 785 { … … 518 794 519 795 } 520 796 797 /** 798 * setNID - defines fiels name & id 799 * 800 * @param mixed $nid field name (string) or an array containing name (1st) 801 * and id (2nd field). 802 * 803 * @access protected 804 */ 805 protected function setNID($nid) 806 { 807 if (is_array($nid)) { 808 $this->name = $nid[0]; 809 $this->id = !empty($nid[1]) ? $nid[1] : null; 810 } 811 else { 812 $this->id = $this->name = $nid; 813 } 814 } 815 816 /** 817 * setValue - sets field value 818 * 819 * @param mixed $value field value. 820 * @param int $offset value offset to define (default 0). 821 * 822 * @access public 823 */ 521 824 public function setValue($value,$offset=0) { 522 825 $this->values[$offset] = $value; 523 826 } 524 827 828 /** 829 * setValues - set field values 830 * 831 * @param mixed $values the array of values. If not an array, the parameter 832 * will be converted to an array containing the value 833 * 834 * @access public 835 */ 525 836 public function setValues($values) { 526 837 if (is_array($values)) { … … 532 843 } 533 844 845 /** 846 * getValues - return field values 847 * 848 * @access public 849 * 850 * @return mixed the array of values. 851 */ 534 852 public function getValues() { 535 853 return $this->values; 536 854 } 537 855 856 /** 857 * getValue - retrieves a field value 858 * 859 * @param int $offset value offset (by default 1st value is returned). 860 * 861 * @access public 862 * 863 * @return mixed the field value. 864 */ 538 865 public function getValue($offset=0) { 539 866 if (isset($this->values[$offset])) { … … 542 869 } 543 870 871 /** 872 * addValue -- Adds a value to the field values. 873 * 874 * @param mixed $value Description. 875 * 876 * @access public 877 * 878 * @return mixed Value. 879 */ 544 880 public function addValue($value) { 545 881 $this->values[] = $value; … … 551 887 } 552 888 889 /** 890 * count -- returns the number of field values 891 * 892 * @access public 893 * 894 * @return integer the number of values. 895 */ 553 896 public function count() { 554 897 return count($this->values); … … 562 905 abstract public function getWidgetBlock(); 563 906 907 908 /** 909 * getAttributes - retrieve field attributes that will be given to the 910 * twig widget 911 * 912 * @param array $options extra options given to the widget 913 * 914 * @access public 915 * 916 * @return array the attributes. 917 */ 564 918 public function getAttributes($options) 565 919 { … … 581 935 return $attr; 582 936 } 583 937 938 /** 939 * getDefaultValue - returns field default value 940 * 941 * @access public 942 * 943 * @return mixed the field default value. 944 */ 584 945 public function getDefaultValue() { 585 946 return ''; 586 947 } 587 948 949 /** 950 * getName - returns field name 951 * 952 * @access public 953 * 954 * @return string the field name. 955 */ 588 956 public function getName() 589 957 { … … 591 959 } 592 960 961 /** 962 * setName - defines field name and/or field id 963 * 964 * @param mixed $name the field name or an array containing name and id. 965 * 966 * @access public 967 */ 593 968 public function setName($name) { 594 969 $this->setNID($name); 595 970 } 596 971 972 /** 973 * check - checks whether the field is valid or not - raises an exception 974 * if not valid 975 * @access public 976 */ 597 977 public function check() 598 978 { … … 604 984 } 605 985 } 606 986 987 /** 988 * parseValues - parses field value from context (GET or POST) 989 * and returns parsed value(s) 990 * NOTE : the field is not updated with this method 991 * use setup() to also update the field. 992 * @param mixed $from the context (usually $_GET or $_POST). 993 * 994 * @access public 995 * 996 * @return array the list of values (empty array if no value). 997 */ 607 998 public function parseValues($from) { 608 999 if (isset($from[$this->name])) { … … 616 1007 } 617 1008 1009 /** 1010 * setup - sets up the field from conetxt (GET or $POST) 1011 * 1012 * @param mixed $from the context (usually $_GET or $_POST). 1013 * 1014 * @access public 1015 * 1016 * @return mixed Value. 1017 */ 618 1018 public function setup($from) 619 1019 { … … 624 1024 } 625 1025 } 626 1026 1027 /** 1028 * isDefined - returns whether the field is defined or not 1029 * (a field is defined if some values are set after setup()) 1030 * @access public 1031 * 1032 * @return mixed Value. 1033 */ 627 1034 public function isDefined() 628 1035 { … … 732 1139 { 733 1140 protected $combo; 734 1141 735 1142 public function __construct($name,$value,$combo,$options=array()) 736 1143 { … … 738 1145 parent::__construct($name,$value,$options); 739 1146 } 740 1147 741 1148 public function getWidgetBlock() 742 1149 { -
inc/admin/class.dc.list.php
r1154 r1156 21 21 protected $nb_items; 22 22 protected $nb_items_per_page; 23 protected $nb_pages; 24 protected $page; 23 25 24 26 … … 62 64 public function setup() { 63 65 $this 64 ->addField(new dcFieldCombo('action', $this->actions_combo, '', array(66 ->addField(new dcFieldCombo('action','',array(), array( 65 67 'label' => __('Selected entries action:')))) 66 ->addField(new dcFieldSubmit('ok',__('ok'), array())) 67 ->addField(new dcFieldHidden('page','1')); 68 ->addField(new dcFieldSubmit('ok',__('ok'), array())); 68 69 $columns_combo = array(); 69 70 foreach ($this->columns as $c) { … … 86 87 parent::setup(); 87 88 $this->nb_items_per_page = $limit->getFields()->getValue(); 89 if ($this->nb_items_per_page == 0) 90 $this->nb_items_per_page = 10; 88 91 $this->fetchEntries(); 89 92 … … 92 95 protected function fetchEntries() { 93 96 $params = new ArrayObject(); 94 $offset = $this->nb_items_per_page*($this->page->getValue()-1);95 97 $this->filterset->applyFilters($params); 96 98 $this->nb_items = $this->fetcher->getEntriesCount($params); 99 $this->nb_pages = round($this->nb_items / $this->nb_items_per_page) + 1; 100 if (isset($_GET['page'])) { 101 $this->page = (int)$_GET['page']; 102 } else { 103 $this->page = 1; 104 } 105 if ($this->page > $this->nb_pages) { 106 $this->page = $this->nb_pages; 107 } 108 $offset = $this->nb_items_per_page*($this->page-1); 97 109 $entries = $this->fetcher->getEntries($params,$offset,$this->nb_items_per_page); 98 110 $this->setEntries($entries); 99 /*echo "LIMIT:".$this->nb_items_per_page; 100 echo 'count :'.print_r($this->nb_items,true); 101 echo 'page'.$this->page;*/ 111 102 112 } 103 113 … … 115 125 $c->appendEditLines($ccontext); 116 126 } 127 $page = $this->page; 128 $nb_pages = $this->nb_pages; 129 $nb_pages_around = 2; 130 $pages = array(1); 131 if ($page>$nb_pages_around+2) { 132 $pages[]='...'; 133 } 134 for ($p=max(2,$page-$nb_pages_around); 135 $p<=min($page+$nb_pages_around,$nb_pages-1); $p++) { 136 $pages[]=$p; 137 } 138 if ($page<$nb_pages-$nb_pages_around-1) { 139 $pages[]='...'; 140 } 141 $pages[] = $nb_pages; 142 143 117 144 return array( 145 'url' => array('',$this->filterset->getURLParams()), 118 146 'cols' => $ccontext, 119 'entries' => $this->entries); 147 'entries' => $this->entries, 148 'nb_entries' => $this->nb_items, 149 'page' => $page, 150 'pages_links' => $pages); 120 151 } 121 152 -
inc/admin/default-templates/forms/lists_layout.html.twig
r1154 r1156 2 2 {% set lenv = _context['list_' ~ listname] %} 3 3 {% if lenv.entries %} 4 <p>Pages:</p> 4 {% block list_pagination %} 5 <p>Page : {% for p in lenv.pages_links %} 6 {% if p == lenv.page or p == '...' %} 7 <b>{{p}}</b> 8 {% else %} 9 <a href="{{build_url(lenv.url,{'page':p})}}">{{p}}</a> 10 {% endif %} 11 {% endfor %}</p> 12 {% endblock %} 5 13 {% form listname -%} 6 14 {% spaceless %} 7 15 <table class="maximal clear"> 8 <caption> {{ caption }} - {{__(' Page %s')|format(page)}}</caption>16 <caption> {{ caption }} - {{__('%s entries')|format(lenv.nb_entries)}}</caption> 9 17 <tr> 10 18 {% for h in lenv.cols -%} … … 29 37 <p>{{ __('No entries') }}</p> 30 38 {% endif %} 39 {{ block('list_pagination')}} 31 40 {%- endblock %} 32 41 -
inc/admin/default-templates/js_helpers.html.twig
r1100 r1156 14 14 {{ _self.load('js/jquery/jquery.biscuit.js') }} 15 15 {{ _self.load('js/jquery/jquery.bgFade.js') }} 16 {{ _self.load('js/jquery/jquery.constantfooter.js') }}17 16 {{ _self.load('js/common.js') }} 18 17 {{ _self.load('js/prelude.js') }} -
inc/admin/default-templates/posts_cols.html.twig
r1152 r1156 6 6 {% block col_title %} 7 7 {{block('col_ref')}} 8 {{e.post_title}}8 <a href="post.php?id={{e.post_id}}">{{e.post_title}}</a> 9 9 {% endblock %} 10 10
Note: See TracChangeset
for help on using the changeset viewer.