{"id":19114857,"url":"https://github.com/namelesscoder/typo3-cms-progressor","last_synced_at":"2026-06-18T08:31:25.700Z","repository":{"id":57023606,"uuid":"179709155","full_name":"NamelessCoder/typo3-cms-progressor","owner":"NamelessCoder","description":"Renders progress bars in the TYPO3 backend header for long-running tasks","archived":false,"fork":false,"pushed_at":"2019-04-05T17:38:26.000Z","size":15,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-22T12:13:25.066Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NamelessCoder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-04-05T15:35:19.000Z","updated_at":"2019-04-10T09:15:32.000Z","dependencies_parsed_at":"2022-08-23T13:50:23.179Z","dependency_job_id":null,"html_url":"https://github.com/NamelessCoder/typo3-cms-progressor","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/NamelessCoder/typo3-cms-progressor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NamelessCoder%2Ftypo3-cms-progressor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NamelessCoder%2Ftypo3-cms-progressor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NamelessCoder%2Ftypo3-cms-progressor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NamelessCoder%2Ftypo3-cms-progressor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NamelessCoder","download_url":"https://codeload.github.com/NamelessCoder/typo3-cms-progressor/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NamelessCoder%2Ftypo3-cms-progressor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34483275,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T04:44:44.181Z","updated_at":"2026-06-18T08:31:25.681Z","avatar_url":"https://github.com/NamelessCoder.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Progressor for TYPO3 CMS\n========================\n\nRenders progress bars in the TYPO3 backend header for long-running tasks.\n\nInstalling\n----------\n\nAvailable only through Composer/Packagist:\n\n```bash\ncomposer require namelesscoder/typo3-cms-progressor\n```\n\nFeatures\n--------\n\n* Uses an absolute minimum of configuration to start a monitoring process.\n* Fire-and-forget progress monitoring integration for your own tasks via one-liner method calls.\n* Integration for DataHandler tasks which makes one progress bar per backend user.\n* Integration with database tables via prepared QueryBuilder instances that select \"pending\" records.\n\n*The DataHandler integration can be enabled via extension configuration*. The other features require writing code either\ninside your own long-running tasks, or in `ext_localconf.php` files to register QueryBuilder instances that will then\nbe monitored automatically whenever there are pending records.\n\nHow to use: QueryBuilder integration\n------------------------------------\n\nUsing the QueryBuilder integration to monitor pending records in any table requires creating and preparing the\nQueryBuilder instance and then handing it off to Progressor - the rest is handled automatically.\n\nYour QueryBuilder instance can be registered anywhere (as long as that place is executed during any request) - for\nexample in your `ext_localconf.php` file:\n\n```php\n// Example: consider all hidden records in table \"pages\" to be a \"pending\" queue item. This shows a progress bar if\n// there are any hidden pages in the site and adds progress as each page gets enabled.\n// Note that in order to select hidden records you do need to remove the restriction for such records.\n$queryBuilder = \\TYPO3\\CMS\\Core\\Utility\\GeneralUtility::makeInstance(\\TYPO3\\CMS\\Core\\Database\\ConnectionPool::class)\n    -\u003egetQueryBuilderForTable('pages');\n$queryBuilder-\u003egetRestrictions()-\u003eremoveByType(\\TYPO3\\CMS\\Core\\Database\\Query\\Restriction\\HiddenRestriction::class);\n$queryBuilder-\u003eselect('uid')-\u003efrom('pages')-\u003ewhere('hidden = 1');\n\\NamelessCoder\\Progressor\\Progressor::trackProgressWithQuery($queryBuilder, 60, 'Hidden Pages');\n``` \n\nThis registers that QueryBuilder instance as the way Progressor reads progress information. The query is fired and all\nrows are counted, then this initial row count is stored in a transient storage which auto-expires and each time the\nprogress information is read from the TYPO3 backend the progress is calculated based on current number of pending rows\nvs initial number of pending rows. Once no more pending records remain the progress bar expires after 60 seconds.\n\nThe query should be as light as possible - one way to do that is to make sure it selects a minimum of columns and\ndefinitely not select `*`. A good column to select which is usually there, is the `uid` column. The query must return\nthe rows that are \"pending\" and must not use dynamic values that change throughout a request because this causes skew\nin the expected number of updates. Aside from that, it has no other side effects such as inability to execute the query.\n\n* The first parameter is the QueryBuilder instance.\n* The second parameter is the expected maximum time between each \"tick\" (you should multiply by 1.5 for safety).\n* The third parameters is a label for your progress bar.\n\nHow to use: Fire and forget API\n-------------------------------\n\nAnother way to use Progressor is from inside your own code, for example in loops which handle large amounts of records\nor files and does one iteration for each resource. By calling a single method from such places you can initialize and\ncontinually update a progress bar with the same method:\n\n```php\n$expectedUpdates = 123; // This can be continually updated if loop skips/appends entries along the way\n\\NamelessCoder\\Progressor\\Progressor::recordProgress('myprogress', $expectedUpdates, 'My progress');\n```\n\nThe first time this method is called, or if the `$expectedUpdates` changes, the internal counter is (re-)initialized\nwith that new value. If the counter already exists, `1` unit of progress is added. When your loop finishes it should\nthen have reached a state where the internal counter has counted exactly the number of items you specified as expected.\n\nLike the other integrations, after 60 seconds such an ad-hoc progress bar is automatically removed.\n\n* The first parameter for the `recordProgress` method is unique name for your instance of the progress bar.\n* The second parameter is optional and can contain the expected number of updates.\n* The third parameter is a label for your progress bar (which should remain the same throughout the loop)\n\nLimitations\n-----------\n\n* Progressor's monitoring is relatively naive with minimal safeguards, but one of the safeguards is that any values that\n  are out of range (for example causing a completeness above 100%) will be truncated to the maximum logical value.\n* The memory of Progressor is currently based on the caching framework and requires a cache backend which supports tags.\n  This unfortunately means that the default implementation is a database table and causes additional database queries.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnamelesscoder%2Ftypo3-cms-progressor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnamelesscoder%2Ftypo3-cms-progressor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnamelesscoder%2Ftypo3-cms-progressor/lists"}