public function loadClassMetadata(LoadClassMetadataEventArgs $args) { $em = $args->getEntityManager(); $meta = $args->getClassMetadata(); $class = $meta->name; $rootClass = $meta->rootEntityName; $info = Chalk::info($class); $parentClasses = array_merge([$class], $meta->parentClasses); $repositoryClasses = []; foreach ($parentClasses as $parentClass) { $parentInfo = Chalk::info($parentClass); $repositoryClasses[] = $parentInfo->module->class . '\\Repository\\' . $parentInfo->local->class; } $repositoryClasses[] = 'Chalk\\Repository'; foreach ($repositoryClasses as $repositoryClass) { if (class_exists($repositoryClass)) { $meta->setCustomRepositoryClass($repositoryClass); break; } } if ($meta->discriminatorMap) { $meta->discriminatorMap = [Chalk::info($rootClass)->name => $rootClass]; $allClasses = $em->getConfiguration()->getMetadataDriverImpl()->getAllClassNames(); foreach ($allClasses as $allClass) { if (is_subclass_of($allClass, $rootClass)) { $meta->discriminatorMap[Chalk::info($allClass)->name] = $allClass; } if (is_subclass_of($allClass, $class) && !in_array($allClass, $meta->subClasses)) { $meta->subClasses[] = $allClass; } } } }
public function parse(DOMDocument $doc, DOMXPath $xpath) { $nodes = $xpath->query('//*[@data-chalk]'); foreach ($nodes as $node) { $data = json_decode($node->getAttribute('data-chalk'), true); if (!$data) { continue; } if (isset($data['widget'])) { while ($node->hasChildNodes()) { $node->removeChild($node->firstChild); } $info = Chalk::info($data['widget']['name']); $class = $info->class; $widget = $this->em->wrap(new $class())->graphFromArray($data['widget']['params']); $html = $this->view->render('widget/card', ['widget' => $widget->getObject()], 'core'); $temp = $this->parser->htmlToDoc($html); $temps = $temp->getElementsByTagName('body')->item(0)->childNodes; for ($i = 0; $i < $temps->length; $i++) { $temp = $doc->importNode($temps->item($i), true); $node->appendChild($temp); } $this->_addClass($node, 'mceNonEditable'); } } }
public function joinColumnName($property, $class = null) { $column = $this->propertyToColumnName($property) . ucfirst($this->referenceColumnName()); if (is_subclass_of($class, 'Chalk\\Core\\Content')) { $column = Chalk::info($class)->name . '_' . $column; } return $column; }
public function build(array $params = array()) { $query = parent::build($params); $params = $params + ['entity' => null]; if (isset($params['entity'])) { $query->andWhere("l.entity = :entity AND l.entityId = :entityId")->setParameter('entity', Chalk::info($entity)->name)->setParameter('entityId', $entity->id); } return $query; }
public function searchable_modify(QueryBuilder $query, array $params = array()) { $alias = isset($alias) ? $alias : $this->alias(); $params = $params + ['search' => null]; if (isset($params['search'])) { $info = Chalk::info($this->_class->name); $classes = array_merge([$info->class], $this->_em->getClassMetadata($info->class)->subClasses); $results = $this->_em->getRepository('Chalk\\Core\\Index')->search($params['search'], $classes); $ids = \Coast\array_column($results, 'entityId'); $query->andWhere("{$alias}.id IN (:ids)")->orderBy("FIELD({$alias}.id, :ids)")->setParameter('ids', $ids); } }
public function search($query, $classes = array()) { $conn = $this->_em->getConnection(); $query = $conn->quote($query); $classes = (array) $classes; foreach ($classes as $i => $class) { $classes[$i] = $conn->quote(Chalk::info($class)->name); } $where = count($classes) ? "AND i.entityType IN(" . implode(', ', $classes) . ")" : null; $table = Chalk::info('Chalk\\Core\\Index')->name; return $conn->query("\n SELECT i.entityType, i.entityId,\n MATCH(i.content) AGAINST ({$query}) AS score\n FROM {$table} AS i\n WHERE MATCH(i.content) AGAINST ({$query} IN BOOLEAN MODE)\n {$where}\n ORDER BY score DESC, i.entityId DESC\n ")->fetchAll(); }
public function item($name, $info = null, $append = false) { if (func_num_args() > 1) { if (isset($info)) { $items = [$name => (object) ((array) Chalk::info($name) + $info + ['subtypes' => []])]; $this->_items = $append ? $items + $this->_items : $this->_items + $items; } else { unset($this->_items[$name]); } return $this; } return $this->_items[$name]; }
public function delete(Request $req, Response $res) { $node = $this->em('Chalk\\Core\\Structure\\Node')->id($req->node); $parent = $node->parent; $parent->id; foreach ($node->children as $child) { $node->children->removeElement($child); $child->parent = $parent; $child->sort = \Chalk\Core\Structure\Node::VALUE_MAX; } $this->em->remove($node); $this->em->flush(); $this->notify(Chalk::info($node->content)->singular . " <strong>{$node->content->name}</strong> was removed successfully", 'positive'); return $res->redirect($this->url(array('action' => 'index', 'structure' => $node->structure->id), 'core_structure', true)); }
public function onFlush(OnFlushEventArgs $args) { $em = $args->getEntityManager(); $uow = $em->getUnitOfWork(); $entities = array_merge($uow->getScheduledEntityInsertions(), $uow->getScheduledEntityUpdates()); foreach ($entities as $entity) { if (!$entity instanceof Node) { continue; } $changeSet = $uow->getEntityChangeSet($entity); if (isset($changeSet['slug']) && !isset($changeSet['slug'][0]) && isset($changeSet['slug'][1])) { continue; } $entity = $entity->structure; if (in_array($entity, $entities, true)) { continue; } $entities[] = $entity; } foreach ($entities as $i => $entity) { if (!$entity instanceof Loggable) { continue; } $changeSet = $uow->getEntityChangeSet($entity); $log = new Log(); $log->entity = Chalk::info($entity)->name; $log->entityObject = $entity; if (!isset($entity->id)) { $log->type = Log::TYPE_CREATE; } else { if ($entity instanceof Publishable && isset($changeSet['status']) && $changeSet['status'][0] != $changeSet['status'][1]) { $log->type = constant('Chalk\\Core\\Log::TYPE_STATUS_' . strtoupper($entity->status)); } else { $log->type = Log::TYPE_MODIFY; } } $this->_updates[] = $log; } $entities = array_merge($uow->getScheduledEntityDeletions()); foreach ($entities as $i => $entity) { if (!$entity instanceof Loggable) { continue; } $logs = $em->getRepository('Chalk\\Core\\Log')->all(['entity' => $entity]); $this->_deletions = array_merge($this->_deletions, $logs); } }
public function build(array $params = array()) { $query = parent::build($params); $params = $params + ['structure' => null, 'children' => null, 'parents' => null, 'siblings' => null, 'depth' => null, 'isIncluded' => false, 'isVisible' => Chalk::isFrontend()]; $query->addSelect("c")->leftJoin("n.content", "c"); $depth = null; if (isset($params['structure'])) { $query->andWhere('n.structure = :structure')->setParameter('structure', $params['structure']); } else { if (isset($params['children'])) { $query->andWhere('n.structure = :structure AND n.left >= :left AND n.right <= :right')->setParameter('structure', $params['children']['structureId'])->setParameter('left', $params['children']['left'])->setParameter('right', $params['children']['right']); if (isset($params['depth'])) { $query->andWhere('n.depth <= :depth')->setParameter('depth', $params['children']['depth'] + $params['depth']); } if (!$params['isIncluded']) { $query->andWhere('n != :exclude')->setParameter('exclude', $params['children']['id']); } } else { if (isset($params['parents'])) { $query->from($this->_entityName, 'nt')->andWhere('n.structure = :structure AND nt.left >= n.left AND nt.left <= n.right')->andWhere('nt = :node')->setParameter('structure', $params['parents']['structureId'])->setParameter('node', $params['parents']['id']); if (isset($params['depth'])) { $query->andWhere('n.depth >= :depth')->setParameter('depth', $params['parents']['depth'] - $params['depth']); } if (!$params['isIncluded']) { $query->andWhere('n != :exclude')->setParameter('exclude', $params['parents']['id']); } } else { if (isset($params['siblings'])) { $query->andWhere('n.parent = :parent')->setParameter('parent', $params['siblings']['parentId']); if (!$params['isIncluded']) { $query->andWhere('n != :exclude')->setParameter('exclude', $params['siblings']['id']); } } } } } if ($params['isVisible']) { $query->andWhere("n.isHidden = false"); } $this->publishable_modify($query, $params, 'c'); return $query; }
public function publishable_modify(QueryBuilder $query, array $criteria = array(), $alias = null) { $alias = isset($alias) ? $alias : $this->alias(); $criteria = $criteria + ['isPublished' => Chalk::isFrontend(), 'isPublishable' => false, 'publishDateMin' => null, 'publishDateMax' => null]; if ($criteria['isPublished']) { $query->andWhere("{$alias}.status IN (:statuses) AND UTC_TIMESTAMP() >= {$alias}.publishDate"); $query->setParameter('statuses', [Chalk::STATUS_PUBLISHED]); } if ($criteria['isPublishable']) { $query->andWhere("{$alias}.status IN (:statuses)"); $query->setParameter('statuses', [Chalk::STATUS_DRAFT, Chalk::STATUS_PENDING]); } if (isset($criteria['publishDateMin'])) { $publishDateMin = $criteria['publishDateMin'] instanceof DateTime ? $criteria['publishDateMin'] : new DateTime($criteria['publishDateMin']); $query->andWhere("{$alias}.publishDate >= :publishDateMin")->setParameter('publishDateMin', $publishDateMin); } if (isset($criteria['publishDateMax'])) { $publishDateMax = $criteria['publishDateMax'] instanceof DateTime ? $criteria['publishDateMax'] : new DateTime($criteria['publishDateMax']); $query->andWhere("{$alias}.publishDate <= :publishDateMax")->setParameter('publishDateMax', $publishDateMax); } }
public function parse(DOMDocument $doc, DOMXPath $xpath) { $nodes = $xpath->query('//*[@data-chalk]'); while ($nodes->length) { foreach ($nodes as $node) { $data = json_decode($node->getAttribute('data-chalk'), true); $node->removeAttribute('data-chalk'); if (!$data) { continue; } if (isset($data['content'])) { $content = $this->em('core_content')->id($data['content']['id']); $node->setAttribute('href', $this->url($content)); } else { if (isset($data['widget'])) { $info = Chalk::info($data['widget']['name']); $class = $info->class; $widget = (new $class())->fromArray($data['widget']['params']); $config = $this->chalk->config->viewScripts; $path = "{$config[0]}/{$info->module->name}/{$info->local->path}"; $html = $this->view->render($path, $widget->toArray(), $config[1]); $temp = $this->parser->htmlToDoc($html); $query = $temp->getElementsByTagName('body'); if ($query->length > 0) { $temps = $query->item(0)->childNodes; for ($i = 0; $i < $temps->length; $i++) { $temp = $doc->importNode($temps->item($i), true); $node->parentNode->insertBefore($temp, $node); } } $node->parentNode->removeChild($node); } } } $nodes = $xpath->query('//*[@data-chalk]'); } }
public function select(Request $req, Response $res) { $filters = $this->chalk->module('core')->contentList($req->filters); $info = isset($req->type) ? Chalk::info($req->type) : $filters->first(); $req->queryParam('type', $info->name); $class = "\\{$info->module->class}\\Model\\{$info->local->class}\\Index"; if (!class_exists($class)) { $class = "\\Chalk\\Core\\Model\\Content\\Index"; } $index = new $class(); $wrap = $this->em->wrap($index); $wrap->graphFromArray($req->queryParams()); $req->view->index = $wrap; $req->view->filters = $filters; if (!$req->isPost() && !$index->contentNew) { return; } $wrap->graphFromArray($req->bodyParams()); $contents = []; foreach ($index->contents as $content) { $contents[] = ['id' => $content->id, 'name' => $content->name, 'card' => $this->view->render('content/card', ['content' => $content], 'core')->toString()]; } $req->data->contents = $contents; }
public function frontendInitNodes() { $conn = $this->em->getConnection(); $nodes = $conn->query("\n SELECT n.id,\n n.sort, n.left, n.right, n.depth,\n n.name, n.slug, n.path,\n n.structureId,\n n.parentId,\n c.id AS content_id,\n c.type AS content_type,\n c.data AS content_data\n FROM core_structure_node AS n\n INNER JOIN core_structure AS s ON s.id = n.structureId\n INNER JOIN core_domain__core_structure AS d ON d.core_structureId = s.id\n LEFT JOIN core_content AS c ON c.id = n.contentId\n WHERE d.core_domainId = {$this->frontend->domain['id']}\n ")->fetchAll(); $nodeMap = []; foreach ($nodes as $node) { $nodeMap[$node['id']] = $node; $content = ['id' => $node['content_id'], 'type' => $node['content_type'], 'data' => json_decode($node['content_data'], true)]; if (!isset($content['id'])) { continue; } if (isset($content['data']['delegate'])) { $delegate = $content['data']['delegate'] + ['name' => null, 'params' => []]; $info = Chalk::info($delegate['name']); $name = 'content'; $params = $delegate['params']; } else { $info = Chalk::info($node['content_type']); $name = $info->local->name; $params = []; } $module = $this->app->module($info->module->name); if (!method_exists($module, 'core_frontendInitNode')) { throw new \Chalk\Exception("Module '{$info->module->name}' does not implment 'core_frontendInitNode'"); } $params = ['group' => $module->name(), 'node' => $node, 'content' => $content, $name => $content['id']] + $params; $primary = $module->core_frontendInitNode($info->local->name, $node, $content, $params); if (!$primary) { throw new \Chalk\Exception("No primary route provided for '{$info->name}' on node '{$node['id']}'"); } $this->frontendRouteAlias($this->name("content_{$content['id']}"), $primary)->frontendRouteAlias($this->name("structure_node_{$node['id']}"), $primary); } $this->frontend->nodeMap = $nodeMap; }
use Chalk\App as Chalk; ?> <?php $this->outer('/layout/page_structure', ['title' => isset($node) ? $node->content->name : null]); $this->block('main'); ?> <?php if (isset($node->content)) { ?> <?php $structure = $this->em('Chalk\\Core\\Structure')->id($req->structure); $content = $node->content; $info = Chalk::info($content->getObject()); ?> <?php if ($info->class != 'Chalk\\Core\\Content') { ?> <form action="<?php echo $this->url->route(); echo $this->url->query(); ?> " method="post"> <?php echo $this->inner("/{$info->local->path}/form", ['structure' => $structure, 'content' => $content, 'info' => $info], $info->module->name); ?> </form> <?php }
public function preDispatch(Request $req, Response $res) { $req->view->info = $req->info = Chalk::info($req->entity); }
<?php /* * Copyright 2015 Jack Sleight <http://jacksleight.com/> * This source file is subject to the MIT license that is bundled with this package in the file LICENCE.md. */ use Chalk\App as Chalk; if (php_sapi_name() != 'cli') { exit("Must be run from the command line\n"); } $init = getcwd() . '/chalk-cli.php'; if (!is_file($init)) { exit("No 'chalk-cli.php' initialization file found in '" . getcwd() . "'\n"); } $app = (require_once $init); Chalk::isFrontend(false); $cmds = []; foreach ($app->dir('cli/cmds') as $file) { $cmds[$file->fileName()] = $file; } if (!isset($_SERVER['argv'][1]) || !isset($cmds[$_SERVER['argv'][1]])) { cli\err("Invalid command, valid commands are:\n " . implode("\n ", array_keys($cmds))); exit; } require_once $cmds[$_SERVER['argv'][1]]->name();
public function resolver($name, Closure $resolver) { $info = Chalk::info($name); $this->_resolvers = array_merge([[$info->class, $resolver]], $this->_resolvers); return $this; }
public function __construct(\Toast\Entity $entityObject) { $this->entityObject = $entityObject; $this->entityType = Chalk::info($this->entityObject)->name; $this->entityId = $this->entityObject->id; }
public function build(array $params = array()) { $query = parent::build($params); $params = $params + ['types' => null, 'subtypes' => null, 'tags' => null, 'createDateMin' => null, 'createDateMax' => null, 'modifyDateMin' => null, 'modifyDateMax' => null, 'createUsers' => null, 'statuses' => null]; if (isset($params['types']) && count($params['types'])) { if ($params['types'] instanceof InfoList) { $types = []; foreach ($params['types'] as $filter) { $types[$filter->class] = $filter->subtypes; } } else { $types = $params['types']; } $all = []; foreach ($types as $class => $subtypes) { $info = Chalk::info($class); $classes = array_merge([$info->class], $this->_em->getClassMetadata($info->class)->subClasses); foreach ($classes as $class) { $all[$class] = $subtypes; } } $lines = []; $i = 0; foreach ($all as $class => $subtypes) { $line = "{$this->alias()} INSTANCE OF {$class}"; if (isset($subtypes) && count($subtypes)) { $line .= " AND {$this->alias()}.subtype IN (:types_{$i}_subtypes)"; $query->setParameter("types_{$i}_subtypes", $subtypes); } $lines[] = "({$line})"; $i++; } $query->andWhere(implode(' OR ', $lines)); } if (isset($params['subtypes']) && count($params['subtypes'])) { $query->andWhere("{$this->alias()}.subtype IN (:subtypes)")->setParameter('subtypes', $params['subtypes']); } if (isset($params['tags']) && count($params['tags'])) { $query->andWhere(":tags MEMBER OF {$this->alias()}.tags")->setParameter('tags', $params['tags']); } if (isset($params['createDateMin'])) { $createDateMin = $params['createDateMin'] instanceof DateTime ? $params['createDateMin'] : new DateTime($params['createDateMin']); $query->andWhere("{$this->alias()}.createDate >= :createDateMin")->setParameter('createDateMin', $createDateMin); } if (isset($params['createDateMax'])) { $createDateMax = $params['createDateMax'] instanceof DateTime ? $params['createDateMax'] : new DateTime($params['createDateMax']); $query->andWhere("{$this->alias()}.createDate <= :createDateMax")->setParameter('createDateMax', $createDateMax); } if (isset($params['modifyDateMin'])) { $modifyDateMin = $params['modifyDateMin'] instanceof DateTime ? $params['modifyDateMin'] : new DateTime($params['modifyDateMin']); $query->andWhere("{$this->alias()}.modifyDate >= :modifyDateMin")->setParameter('modifyDateMin', $modifyDateMin); } if (isset($params['modifyDateMax'])) { $modifyDateMax = $params['modifyDateMax'] instanceof DateTime ? $params['modifyDateMax'] : new DateTime($params['modifyDateMax']); $query->andWhere("{$this->alias()}.modifyDate <= :modifyDateMax")->setParameter('modifyDateMax', $modifyDateMax); } if (isset($params['createUsers'])) { $query->andWhere("{$this->alias()}.createUser IN (:createUsers)")->setParameter('createUsers', $params['createUsers']); } if (isset($params['statuses']) && count($params['statuses'])) { $query->andWhere("{$this->alias()}.status IN (:statuses)")->setParameter('statuses', $params['statuses']); } $query->addSelect("{$this->alias()}_tags")->leftJoin("{$this->alias()}.tags", "{$this->alias()}_tags"); $this->publishable_modify($query, $params); $this->searchable_modify($query, $params); return $query; }
<?php use Chalk\App as Chalk; use Chalk\Repository; $info = Chalk::info($index->type); ?> <div class="flex flex-row"> <?php if (count($filters) > 1) { ?> <div class="sidebar"> <div class="body"> <nav class="nav" role="navigation"> <ul> <?php foreach ($filters as $filter) { ?> <li><a href="<?php echo $this->url([]) . $this->url->query(['filters' => $index->filters, 'type' => $filter->name], true); ?> " class="item <?php echo $filter->name == $info->name ? 'active' : null; ?> "> <span class="icon-sidebar icon-<?php echo $filter->icon; ?> "></span> <?php echo $filter->plural;
public function postExecute(Request $req = null, Response $res = null) { Chalk::isFrontend(true); }
public static function staticTypeLabel($type) { return Chalk::info($type)->singular; }
public function preDispatch(Request $req, Response $res) { $req->view->info = $req->info = Chalk::info($req->entity ? $req->entity : 'Chalk\\Core\\Content'); }
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="<?php echo $this->frontend->url->file("vendor/jacksleight/chalk/public/assets/styles/styles{$mode}.css"); ?> "> </head> <body class="<?php echo isset($class) ? $class : ''; ?> "> <?php echo $this->content('body'); ?> <script> var Chalk = <?php echo json_encode(['baseUrl' => (string) $this->url->baseUrl(), 'rootBaseUrl' => (string) $this->frontend->url->baseUrl(), 'pingUrl' => (string) $this->url(['controller' => 'index', 'action' => 'ping'], 'core_index', true), 'prefsUrl' => (string) $this->url(['controller' => 'index', 'action' => 'prefs'], 'core_index', true), 'selectUrl' => (string) $this->url(['controller' => 'index', 'action' => 'select'], 'core_index', true), 'widgetUrl' => (string) $this->url(['action' => 'edit', 'entity' => '{entity}'], 'core_widget', true), 'sourceUrl' => (string) $this->url(['controller' => 'index', 'action' => 'source'], 'core_index', true), 'contentName' => Chalk::info('Chalk\\Core\\Content')->name, 'prefs' => isset($req->user) ? $req->user->prefs() : [], 'styles' => $this->chalk->config->styles, 'notifications' => $this->notify->notifications(), 'widgets' => $this->widgetList->items(), 'editorContent' => ['src' => (string) $this->frontend->url->file("vendor/jacksleight/chalk/public/assets/scripts/editor-content{$mode}.js"), 'loaded' => false, 'loading' => false, 'queue' => []], 'editorCode' => ['src' => (string) $this->frontend->url->file("vendor/jacksleight/chalk/public/assets/scripts/editor-code{$mode}.js"), 'loaded' => false, 'loading' => false, 'queue' => []]]); ?> ; Chalk.execute = []; Chalk.domReady = function(a,b,c){b=document,c='addEventListener';b[c]?b[c]('DOMContentLoaded',a):window.attachEvent('onload',a)} Chalk.domReady(function() { var script = document.createElement('script'); script.src = '<?php echo $this->frontend->url->file("vendor/jacksleight/chalk/public/assets/scripts/scripts{$mode}.js"); ?> '; document.head.appendChild(script); }); </script> <script type="x-tmpl-mustache" class="modal-template"> <div class="modal hideable hideable-hidden">
public function __invoke($class) { return $this->getRepository(Chalk::info($class)->class); }
<?php use Chalk\App as Chalk; if (!isset($content)) { return; } $info = isset($info) ? $info : Chalk::info($content); ?> <div class="card"> <div class="preview"> <?php if ($content instanceof \Chalk\Core\File && $content->file->exists() && $content->isImage()) { ?> <?php if ($content->isImageBitmap()) { ?> <div class="image" style="background-image: url('<?php echo $this->image($content->file, ['size' => '96']); ?> ');"></div> <?php } else { if ($content->isImageVector()) { ?> <div class="image" style="background-image: url('<?php echo $this->frontend->url->file($content->file); ?> ');"></div> <?php } }
public function preDispatch(Request $req, Response $res) { $req->view->info = $req->info = Chalk::info($this->_entityClass); }
<?php use Chalk\App as Chalk; $info = Chalk::info($widget); $file = $widget->previewFile; ?> <div class="card"> <div class="preview"> <?php if (isset($file) && $file->exists() && \Chalk\is_image($file)) { ?> <div class="image" style="background-image: url('<?php echo $this->image($file, ['size' => '96']); ?> ');"><i class="remove"> </i></div> <?php } else { ?> <div class="text"><span class="icon-<?php echo $info->icon; ?> "><i class="remove"> </i></span></div> <?php } ?> </div> <div class="card-inner"> <strong><?php echo $info->singular; ?> </strong>
/* * Copyright 2015 Jack Sleight <http://jacksleight.com/> * This source file is subject to the MIT license that is bundled with this package in the file LICENCE.md. */ use Chalk\App as Chalk; use Chalk\Repository; if (cli\choose("Are you sure", 'yn', 'n') == 'n') { exit; } cli\line('Clearing cache..'); $app->cache->deleteAll(); try { cli\line('Clearing index..'); $conn = $app->em->getConnection(); $table = Chalk::info('Chalk\\Core\\Index')->name; $conn->exec("TRUNCATE TABLE {$table}"); $metas = $app->em->getMetadataFactory()->getAllMetadata(); foreach ($metas as $meta) { if (!is_a($meta->name, 'Chalk\\Core\\Behaviour\\Searchable', true) || $meta->name != $meta->rootEntityName) { continue; } $limit = 100; $page = 0; do { $page++; $entities = $app->em($meta->name)->all(['limit' => $limit, 'page' => $page], [], Repository::FETCH_ALL_PAGED); if ($page == 1) { $total = $entities->count(); $pages = ceil($total / $limit); $bar = new cli\progress\Bar("Indexing {$meta->name}..", $total, 1);