├── Classes ├── Contract │ ├── PaginationInterface.php │ └── PaginatorInterface.php └── NumberedPagination.php ├── LICENSE.txt ├── Readme.md ├── Resources ├── Private │ └── Partials │ │ └── Pagination.html └── Public │ └── Icons │ └── Extension.svg ├── composer.json ├── ext_emconf.php └── ext_localconf.php /Classes/Contract/PaginationInterface.php: -------------------------------------------------------------------------------- 1 | paginator = $paginator; 26 | if ($maximumNumberOfLinks > 0) { 27 | $this->maximumNumberOfLinks = $maximumNumberOfLinks; 28 | } 29 | $this->calculateDisplayRange(); 30 | } 31 | 32 | public function getPreviousPageNumber(): ?int 33 | { 34 | $previousPage = $this->paginator->getCurrentPageNumber() - 1; 35 | 36 | if ($previousPage > $this->paginator->getNumberOfPages()) { 37 | return null; 38 | } 39 | 40 | return $previousPage >= $this->getFirstPageNumber() 41 | ? $previousPage 42 | : null; 43 | } 44 | 45 | public function getNextPageNumber(): ?int 46 | { 47 | $nextPage = $this->paginator->getCurrentPageNumber() + 1; 48 | 49 | return $nextPage <= $this->paginator->getNumberOfPages() 50 | ? $nextPage 51 | : null; 52 | } 53 | 54 | public function getFirstPageNumber(): int 55 | { 56 | return 1; 57 | } 58 | 59 | public function getLastPageNumber(): int 60 | { 61 | return $this->paginator->getNumberOfPages(); 62 | } 63 | 64 | public function getStartRecordNumber(): int 65 | { 66 | if ($this->paginator->getCurrentPageNumber() > $this->paginator->getNumberOfPages()) { 67 | return 0; 68 | } 69 | 70 | return $this->paginator->getKeyOfFirstPaginatedItem() + 1; 71 | } 72 | 73 | public function getEndRecordNumber(): int 74 | { 75 | if ($this->paginator->getCurrentPageNumber() > $this->paginator->getNumberOfPages()) { 76 | return 0; 77 | } 78 | 79 | return $this->paginator->getKeyOfLastPaginatedItem() + 1; 80 | } 81 | 82 | /** 83 | * @return int[] 84 | */ 85 | public function getAllPageNumbers(): array 86 | { 87 | return range($this->displayRangeStart, $this->displayRangeEnd); 88 | } 89 | 90 | public function getHasLessPages(): bool 91 | { 92 | return $this->hasLessPages; 93 | } 94 | 95 | public function getHasMorePages(): bool 96 | { 97 | return $this->hasMorePages; 98 | } 99 | 100 | /** 101 | * @return int 102 | */ 103 | public function getMaximumNumberOfLinks(): int 104 | { 105 | return $this->maximumNumberOfLinks; 106 | } 107 | 108 | /** 109 | * @return int 110 | */ 111 | public function getDisplayRangeStart(): int 112 | { 113 | return $this->displayRangeStart; 114 | } 115 | 116 | /** 117 | * @return int 118 | */ 119 | public function getDisplayRangeEnd(): int 120 | { 121 | return $this->displayRangeEnd; 122 | } 123 | 124 | protected function calculateDisplayRange(): void 125 | { 126 | $numberOfPages = $this->paginator->getNumberOfPages(); 127 | $currentPage = $this->paginator->getCurrentPageNumber(); 128 | 129 | $maximumNumberOfLinks = $this->maximumNumberOfLinks; 130 | if ($maximumNumberOfLinks > $numberOfPages) { 131 | $maximumNumberOfLinks = $numberOfPages; 132 | } 133 | $delta = (int)($maximumNumberOfLinks / 2); 134 | $this->displayRangeStart = $currentPage - $delta; 135 | $this->displayRangeEnd = $currentPage + $delta - ($maximumNumberOfLinks % 2 === 0 ? 1 : 0); 136 | if ($this->displayRangeStart < 1) { 137 | $this->displayRangeEnd -= $this->displayRangeStart - 1; 138 | } 139 | if ($this->displayRangeEnd > $numberOfPages) { 140 | $this->displayRangeStart -= $this->displayRangeEnd - $numberOfPages; 141 | } 142 | $this->displayRangeStart = (integer)max($this->displayRangeStart, 1); 143 | $this->displayRangeEnd = (integer)min($this->displayRangeEnd, $numberOfPages); 144 | $this->hasLessPages = $this->displayRangeStart > 1; 145 | $this->hasMorePages = $this->displayRangeEnd < $this->paginator->getNumberOfPages(); 146 | } 147 | 148 | public function getPaginator(): PaginatorInterface 149 | { 150 | return $this->paginator; 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Some icons used in the TYPO3 project are retrieved from the "Silk" icon set of 2 | Mark James, which can be found at http://famfamfam.com/lab/icons/silk/. This 3 | set is distributed under a Creative Commons Attribution 2.5 License. The 4 | license can be found at http://creativecommons.org/licenses/by/2.5/. 5 | --------------------------------- 6 | 7 | GNU GENERAL PUBLIC LICENSE 8 | Version 2, June 1991 9 | 10 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 11 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 12 | Everyone is permitted to copy and distribute verbatim copies 13 | of this license document, but changing it is not allowed. 14 | 15 | Preamble 16 | 17 | The licenses for most software are designed to take away your 18 | freedom to share and change it. By contrast, the GNU General Public 19 | License is intended to guarantee your freedom to share and change free 20 | software--to make sure the software is free for all its users. This 21 | General Public License applies to most of the Free Software 22 | Foundation's software and to any other program whose authors commit to 23 | using it. (Some other Free Software Foundation software is covered by 24 | the GNU Lesser General Public License instead.) You can apply it to 25 | your programs, too. 26 | 27 | When we speak of free software, we are referring to freedom, not 28 | price. Our General Public Licenses are designed to make sure that you 29 | have the freedom to distribute copies of free software (and charge for 30 | this service if you wish), that you receive source code or can get it 31 | if you want it, that you can change the software or use pieces of it 32 | in new free programs; and that you know you can do these things. 33 | 34 | To protect your rights, we need to make restrictions that forbid 35 | anyone to deny you these rights or to ask you to surrender the rights. 36 | These restrictions translate to certain responsibilities for you if you 37 | distribute copies of the software, or if you modify it. 38 | 39 | For example, if you distribute copies of such a program, whether 40 | gratis or for a fee, you must give the recipients all the rights that 41 | you have. You must make sure that they, too, receive or can get the 42 | source code. And you must show them these terms so they know their 43 | rights. 44 | 45 | We protect your rights with two steps: (1) copyright the software, and 46 | (2) offer you this license which gives you legal permission to copy, 47 | distribute and/or modify the software. 48 | 49 | Also, for each author's protection and ours, we want to make certain 50 | that everyone understands that there is no warranty for this free 51 | software. If the software is modified by someone else and passed on, we 52 | want its recipients to know that what they have is not the original, so 53 | that any problems introduced by others will not reflect on the original 54 | authors' reputations. 55 | 56 | Finally, any free program is threatened constantly by software 57 | patents. We wish to avoid the danger that redistributors of a free 58 | program will individually obtain patent licenses, in effect making the 59 | program proprietary. To prevent this, we have made it clear that any 60 | patent must be licensed for everyone's free use or not licensed at all. 61 | 62 | The precise terms and conditions for copying, distribution and 63 | modification follow. 64 | 65 | GNU GENERAL PUBLIC LICENSE 66 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 67 | 68 | 0. This License applies to any program or other work which contains 69 | a notice placed by the copyright holder saying it may be distributed 70 | under the terms of this General Public License. The "Program", below, 71 | refers to any such program or work, and a "work based on the Program" 72 | means either the Program or any derivative work under copyright law: 73 | that is to say, a work containing the Program or a portion of it, 74 | either verbatim or with modifications and/or translated into another 75 | language. (Hereinafter, translation is included without limitation in 76 | the term "modification".) Each licensee is addressed as "you". 77 | 78 | Activities other than copying, distribution and modification are not 79 | covered by this License; they are outside its scope. The act of 80 | running the Program is not restricted, and the output from the Program 81 | is covered only if its contents constitute a work based on the 82 | Program (independent of having been made by running the Program). 83 | Whether that is true depends on what the Program does. 84 | 85 | 1. You may copy and distribute verbatim copies of the Program's 86 | source code as you receive it, in any medium, provided that you 87 | conspicuously and appropriately publish on each copy an appropriate 88 | copyright notice and disclaimer of warranty; keep intact all the 89 | notices that refer to this License and to the absence of any warranty; 90 | and give any other recipients of the Program a copy of this License 91 | along with the Program. 92 | 93 | You may charge a fee for the physical act of transferring a copy, and 94 | you may at your option offer warranty protection in exchange for a fee. 95 | 96 | 2. You may modify your copy or copies of the Program or any portion 97 | of it, thus forming a work based on the Program, and copy and 98 | distribute such modifications or work under the terms of Section 1 99 | above, provided that you also meet all of these conditions: 100 | 101 | a) You must cause the modified files to carry prominent notices 102 | stating that you changed the files and the date of any change. 103 | 104 | b) You must cause any work that you distribute or publish, that in 105 | whole or in part contains or is derived from the Program or any 106 | part thereof, to be licensed as a whole at no charge to all third 107 | parties under the terms of this License. 108 | 109 | c) If the modified program normally reads commands interactively 110 | when run, you must cause it, when started running for such 111 | interactive use in the most ordinary way, to print or display an 112 | announcement including an appropriate copyright notice and a 113 | notice that there is no warranty (or else, saying that you provide 114 | a warranty) and that users may redistribute the program under 115 | these conditions, and telling the user how to view a copy of this 116 | License. (Exception: if the Program itself is interactive but 117 | does not normally print such an announcement, your work based on 118 | the Program is not required to print an announcement.) 119 | 120 | These requirements apply to the modified work as a whole. If 121 | identifiable sections of that work are not derived from the Program, 122 | and can be reasonably considered independent and separate works in 123 | themselves, then this License, and its terms, do not apply to those 124 | sections when you distribute them as separate works. But when you 125 | distribute the same sections as part of a whole which is a work based 126 | on the Program, the distribution of the whole must be on the terms of 127 | this License, whose permissions for other licensees extend to the 128 | entire whole, and thus to each and every part regardless of who wrote it. 129 | 130 | Thus, it is not the intent of this section to claim rights or contest 131 | your rights to work written entirely by you; rather, the intent is to 132 | exercise the right to control the distribution of derivative or 133 | collective works based on the Program. 134 | 135 | In addition, mere aggregation of another work not based on the Program 136 | with the Program (or with a work based on the Program) on a volume of 137 | a storage or distribution medium does not bring the other work under 138 | the scope of this License. 139 | 140 | 3. You may copy and distribute the Program (or a work based on it, 141 | under Section 2) in object code or executable form under the terms of 142 | Sections 1 and 2 above provided that you also do one of the following: 143 | 144 | a) Accompany it with the complete corresponding machine-readable 145 | source code, which must be distributed under the terms of Sections 146 | 1 and 2 above on a medium customarily used for software interchange; or, 147 | 148 | b) Accompany it with a written offer, valid for at least three 149 | years, to give any third party, for a charge no more than your 150 | cost of physically performing source distribution, a complete 151 | machine-readable copy of the corresponding source code, to be 152 | distributed under the terms of Sections 1 and 2 above on a medium 153 | customarily used for software interchange; or, 154 | 155 | c) Accompany it with the information you received as to the offer 156 | to distribute corresponding source code. (This alternative is 157 | allowed only for noncommercial distribution and only if you 158 | received the program in object code or executable form with such 159 | an offer, in accord with Subsection b above.) 160 | 161 | The source code for a work means the preferred form of the work for 162 | making modifications to it. For an executable work, complete source 163 | code means all the source code for all modules it contains, plus any 164 | associated interface definition files, plus the scripts used to 165 | control compilation and installation of the executable. However, as a 166 | special exception, the source code distributed need not include 167 | anything that is normally distributed (in either source or binary 168 | form) with the major components (compiler, kernel, and so on) of the 169 | operating system on which the executable runs, unless that component 170 | itself accompanies the executable. 171 | 172 | If distribution of executable or object code is made by offering 173 | access to copy from a designated place, then offering equivalent 174 | access to copy the source code from the same place counts as 175 | distribution of the source code, even though third parties are not 176 | compelled to copy the source along with the object code. 177 | 178 | 4. You may not copy, modify, sublicense, or distribute the Program 179 | except as expressly provided under this License. Any attempt 180 | otherwise to copy, modify, sublicense or distribute the Program is 181 | void, and will automatically terminate your rights under this License. 182 | However, parties who have received copies, or rights, from you under 183 | this License will not have their licenses terminated so long as such 184 | parties remain in full compliance. 185 | 186 | 5. You are not required to accept this License, since you have not 187 | signed it. However, nothing else grants you permission to modify or 188 | distribute the Program or its derivative works. These actions are 189 | prohibited by law if you do not accept this License. Therefore, by 190 | modifying or distributing the Program (or any work based on the 191 | Program), you indicate your acceptance of this License to do so, and 192 | all its terms and conditions for copying, distributing or modifying 193 | the Program or works based on it. 194 | 195 | 6. Each time you redistribute the Program (or any work based on the 196 | Program), the recipient automatically receives a license from the 197 | original licensor to copy, distribute or modify the Program subject to 198 | these terms and conditions. You may not impose any further 199 | restrictions on the recipients' exercise of the rights granted herein. 200 | You are not responsible for enforcing compliance by third parties to 201 | this License. 202 | 203 | 7. If, as a consequence of a court judgment or allegation of patent 204 | infringement or for any other reason (not limited to patent issues), 205 | conditions are imposed on you (whether by court order, agreement or 206 | otherwise) that contradict the conditions of this License, they do not 207 | excuse you from the conditions of this License. If you cannot 208 | distribute so as to satisfy simultaneously your obligations under this 209 | License and any other pertinent obligations, then as a consequence you 210 | may not distribute the Program at all. For example, if a patent 211 | license would not permit royalty-free redistribution of the Program by 212 | all those who receive copies directly or indirectly through you, then 213 | the only way you could satisfy both it and this License would be to 214 | refrain entirely from distribution of the Program. 215 | 216 | If any portion of this section is held invalid or unenforceable under 217 | any particular circumstance, the balance of the section is intended to 218 | apply and the section as a whole is intended to apply in other 219 | circumstances. 220 | 221 | It is not the purpose of this section to induce you to infringe any 222 | patents or other property right claims or to contest validity of any 223 | such claims; this section has the sole purpose of protecting the 224 | integrity of the free software distribution system, which is 225 | implemented by public license practices. Many people have made 226 | generous contributions to the wide range of software distributed 227 | through that system in reliance on consistent application of that 228 | system; it is up to the author/donor to decide if he or she is willing 229 | to distribute software through any other system and a licensee cannot 230 | impose that choice. 231 | 232 | This section is intended to make thoroughly clear what is believed to 233 | be a consequence of the rest of this License. 234 | 235 | 8. If the distribution and/or use of the Program is restricted in 236 | certain countries either by patents or by copyrighted interfaces, the 237 | original copyright holder who places the Program under this License 238 | may add an explicit geographical distribution limitation excluding 239 | those countries, so that distribution is permitted only in or among 240 | countries not thus excluded. In such case, this License incorporates 241 | the limitation as if written in the body of this License. 242 | 243 | 9. The Free Software Foundation may publish revised and/or new versions 244 | of the General Public License from time to time. Such new versions will 245 | be similar in spirit to the present version, but may differ in detail to 246 | address new problems or concerns. 247 | 248 | Each version is given a distinguishing version number. If the Program 249 | specifies a version number of this License which applies to it and "any 250 | later version", you have the option of following the terms and conditions 251 | either of that version or of any later version published by the Free 252 | Software Foundation. If the Program does not specify a version number of 253 | this License, you may choose any version ever published by the Free Software 254 | Foundation. 255 | 256 | 10. If you wish to incorporate parts of the Program into other free 257 | programs whose distribution conditions are different, write to the author 258 | to ask for permission. For software which is copyrighted by the Free 259 | Software Foundation, write to the Free Software Foundation; we sometimes 260 | make exceptions for this. Our decision will be guided by the two goals 261 | of preserving the free status of all derivatives of our free software and 262 | of promoting the sharing and reuse of software generally. 263 | 264 | NO WARRANTY 265 | 266 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 267 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 268 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 269 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 270 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 271 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 272 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 273 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 274 | REPAIR OR CORRECTION. 275 | 276 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 277 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 278 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 279 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 280 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 281 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 282 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 283 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 284 | POSSIBILITY OF SUCH DAMAGES. 285 | 286 | END OF TERMS AND CONDITIONS 287 | 288 | How to Apply These Terms to Your New Programs 289 | 290 | If you develop a new program, and you want it to be of the greatest 291 | possible use to the public, the best way to achieve this is to make it 292 | free software which everyone can redistribute and change under these terms. 293 | 294 | To do so, attach the following notices to the program. It is safest 295 | to attach them to the start of each source file to most effectively 296 | convey the exclusion of warranty; and each file should have at least 297 | the "copyright" line and a pointer to where the full notice is found. 298 | 299 | 300 | Copyright (C) 301 | 302 | This program is free software; you can redistribute it and/or modify 303 | it under the terms of the GNU General Public License as published by 304 | the Free Software Foundation; either version 2 of the License, or 305 | (at your option) any later version. 306 | 307 | This program is distributed in the hope that it will be useful, 308 | but WITHOUT ANY WARRANTY; without even the implied warranty of 309 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 310 | GNU General Public License for more details. 311 | 312 | You should have received a copy of the GNU General Public License along 313 | with this program; if not, write to the Free Software Foundation, Inc., 314 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 315 | 316 | Also add information on how to contact you by electronic and paper mail. 317 | 318 | If the program is interactive, make it output a short notice like this 319 | when it starts in an interactive mode: 320 | 321 | Gnomovision version 69, Copyright (C) year name of author 322 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 323 | This is free software, and you are welcome to redistribute it 324 | under certain conditions; type `show c' for details. 325 | 326 | The hypothetical commands `show w' and `show c' should show the appropriate 327 | parts of the General Public License. Of course, the commands you use may 328 | be called something other than `show w' and `show c'; they could even be 329 | mouse-clicks or menu items--whatever suits your program. 330 | 331 | You should also get your employer (if you work as a programmer) or your 332 | school, if any, to sign a "copyright disclaimer" for the program, if 333 | necessary. Here is a sample; alter the names: 334 | 335 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 336 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 337 | 338 | , 1 April 1989 339 | Ty Coon, President of Vice 340 | 341 | This General Public License does not permit incorporating your program into 342 | proprietary programs. If your program is a subroutine library, you may 343 | consider it more useful to permit linking proprietary applications with the 344 | library. If this is what you want to do, use the GNU Lesser General 345 | Public License instead of this License. 346 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # TYPO3 Extension `numbered_pagination` 2 | 3 | Since TYPO3 10 a new pagination API is shipped which supersedes the pagination widget controller which is removed in version 11.0. 4 | [Official documentation](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Pagination/Index.html) 5 | 6 | This extension provides an improved pagination which can be used to paginate array items or query results from Extbase. 7 | The main advantage is that it reduces the amount of pages shown. 8 | 9 | **Example**: Imagine 1000 records and 20 items per page which would lead to 50 links. 10 | Using the `NumberedPagination`, you will get something like `< 1 2 ... 21 22 23 24 ... 100 >` 11 | 12 | ## Installation 13 | 14 | Install the extension with `composer require georgringer/numbered-pagination` or by downloading it 15 | from [extensions.typo3.org](https://extensions.typo3.org/extension/numbered_pagination/) or the Extension Manager. 16 | 17 | ## Usage 18 | 19 | Just replace the usage of `SimplePagination` with `\GeorgRinger\NumberedPagination\NumberedPagination` and you are done. 20 | Set the 2nd argument to the maximum number of links which should be rendered. 21 | 22 | ```php 23 | $itemsPerPage = 10; 24 | $maximumLinks = 15; 25 | $currentPage = $this->request->hasArgument('currentPage') ? (int)$this->request->getArgument('currentPage') : 1; 26 | $paginator = new \TYPO3\CMS\Extbase\Pagination\QueryResultPaginator($allItems, $currentPage, $itemsPerPage); 27 | $pagination = new \GeorgRinger\NumberedPagination\NumberedPagination($paginator, $maximumLinks); 28 | $this->view->assign('pagination', [ 29 | 'paginator' => $paginator, 30 | 'pagination' => $pagination, 31 | ]); 32 | ``` 33 | 34 | ### Templating 35 | 36 | ```html 37 | 38 | 39 | 40 | 41 | ``` 42 | 43 | Copy the pagination partial `EXT:numbered_pagination/Resources/Private/Partials/Pagination.html` to your extension or use it directly by providing the path mapping: 44 | 45 | ```typo3_typoscript 46 | # Example for extension "fo" 47 | plugin.tx_fo.view.partialRootPaths.4483 = EXT:numbered_pagination/Resources/Private/Partials/ 48 | ``` 49 | 50 | The default paginator looks like this: 51 | 52 | * [1] 2 3 … next 53 | * 1 [2] 3 … next 54 | * prev … 2 [3] 4 … next 55 | * prev … 3 [4] 5 56 | * prev … 3 4 [5] 57 | 58 | Here's three how-to's on how to achieve different, still common paginators: 59 | 60 | #### Scenario 1 61 | 62 | By uncommenting `li.first` and `li.last` and commenting out `li.prev` and `li.next` it looks like this: 63 | 64 | * [1] 2 3 … last 65 | * 1 [2] 3 … last 66 | * first 2 [3] 4 last 67 | * first … 3 [4] 5 68 | * first … 3 4 [5] 69 | 70 | #### Scenario 1 (alternative) 71 | 72 | By **additionally** changing their text to `1` and `{pagination.lastPageNumber}` it looks like this: 73 | 74 | * [1] 2 3 … 5 75 | * 1 [2] 3 … 5 76 | * 1 2 [3] 4 5 77 | * 1 … 3 [4] 5 78 | * 1 … 3 4 [5] 79 | 80 | #### Scenario 3 81 | 82 | By uncommenting `li.first` and `li.last` (and renaming them to `|<` and `>|`) and flipping their position with `li.prev` and `li.next` (and renaming them to `<` and `>`) it looks like this: 83 | 84 | * [1] 2 3 … > >| 85 | * 1 [2] 3 … > >| 86 | * |< < … 2 [3] 4 … > >| 87 | * |< < … 3 [4] 5 88 | * |< < … 3 4 [5] 89 | 90 | #### Remark on 'dots' 91 | 92 | In case the two properties `{pagination.hasLessPages}` and `{pagination.hasMorePages}` don't exactly suit the scenario you're trying to set up, think about doing your own calculations. Here's an example: 93 | 94 | ```xml 95 | 96 | 97 |
  • 98 |
    99 | 100 | 101 | 102 |
  • 103 |
    104 | ``` 105 | -------------------------------------------------------------------------------- /Resources/Private/Partials/Pagination.html: -------------------------------------------------------------------------------- 1 | 58 | -------------------------------------------------------------------------------- /Resources/Public/Icons/Extension.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "georgringer/numbered-pagination", 3 | "type": "typo3-cms-extension", 4 | "description": "Improved pagination for TYPO3", 5 | "keywords": [ 6 | "TYPO3", 7 | "pagination" 8 | ], 9 | "homepage": "https://github.com/georgringer/numbered_pagination", 10 | "authors": [ 11 | { 12 | "name": "Georg Ringer", 13 | "role": "Developer" 14 | } 15 | ], 16 | "license": "GPL-2.0-or-later", 17 | "require": { 18 | "typo3/cms-core": "^9 || ^10 || ^11 || ^12 || ^13", 19 | "php": ">=7.3" 20 | }, 21 | "extra": { 22 | "typo3/cms": { 23 | "extension-key": "numbered_pagination" 24 | } 25 | }, 26 | "autoload": { 27 | "psr-4": { 28 | "GeorgRinger\\NumberedPagination\\": "Classes" 29 | } 30 | }, 31 | "replace": { 32 | "typo3-ter/numbered-pagination": "self.version" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ext_emconf.php: -------------------------------------------------------------------------------- 1 | 'Numbered Pagination', 5 | 'description' => 'Improved pagination for TYPO3 10+', 6 | 'category' => 'fe', 7 | 'author' => 'Georg Ringer', 8 | 'author_email' => 'mail@ringer.it', 9 | 'state' => 'stable', 10 | 'clearCacheOnLoad' => true, 11 | 'version' => '2.1.0', 12 | 'constraints' => [ 13 | 'depends' => [ 14 | 'typo3' => '9.5.0-13.4.99', 15 | ], 16 | 'conflicts' => [], 17 | 'suggests' => [], 18 | ], 19 | 'autoload' => [ 20 | 'classmap' => ['Classes'], 21 | ], 22 | ]; 23 | -------------------------------------------------------------------------------- /ext_localconf.php: -------------------------------------------------------------------------------- 1 |