Bolt\Legacy\Storage::searchContentType PHP Method

searchContentType() public method

public searchContentType ( $contenttypename, array $parameters = [], &$pager = [] )
$parameters array
    public function searchContentType($contenttypename, array $parameters = [], &$pager = [])
    {
        $where = [];
        $tablename = $this->getContenttypeTablename($contenttypename);
        $contenttype = $this->app['config']->get('contenttypes/' . $contenttypename);
        // If this contenttype has 'searchable: false', we skip it.
        if (isset($contenttype['searchable']) && $contenttype['searchable'] === false) {
            return [];
        }
        // for all the non-reserved parameters that are fields, we assume people want to do a 'where'
        foreach ($parameters as $key => $value) {
            if (in_array($key, ['order', 'where', 'limit', 'offset'])) {
                continue;
                // Skip this one.
            }
            if (!$this->isValidColumn($key, $contenttype)) {
                continue;
                // Also skip if 'key' isn't a field in the contenttype.
            }
            $where[] = $this->parseWhereParameter($key, $value);
        }
        // @todo update with nice search string
        // If we need to filter, add the WHERE for that.
        // Meh, InnoDB doesn't support full text search.
        if (!empty($parameters['filter'])) {
            $filter = $this->app['db']->quote($parameters['filter']);
            $filterWhere = [];
            foreach ($contenttype['fields'] as $key => $value) {
                if (in_array($value['type'], ['text', 'textarea', 'html', 'markdown'])) {
                    $filterWhere[] = sprintf("%s LIKE '%%%s%%'", $key, $filter);
                }
            }
            if (!empty($filterWhere)) {
                $where[] = '(' . implode(' OR ', $filterWhere) . ')';
            }
        }
        $limit = !empty($parameters['limit']) ? $parameters['limit'] : 9999;
        $page = !empty($parameters['page']) ? $parameters['page'] : 1;
        // If we're allowed to use pagination, use the 'page' parameter.
        if (!empty($parameters['paging']) && $this->app['request_stack']->getCurrentRequest() !== null) {
            $page = $this->app['pager']->getPager();
        }
        $queryparams = "";
        // implode 'where'
        if (!empty($where)) {
            $queryparams .= sprintf(' WHERE (%s)', implode(" AND ", $where));
        }
        // Order, with a special case for 'RANDOM'.
        if (!empty($parameters['order'])) {
            if ($parameters['order'] == "RANDOM") {
                $dboptions = $this->app['db']->getParams();
                $queryparams .= sprintf(' ORDER BY %s', $dboptions['randomfunction']);
            } else {
                $order = $this->getEscapedSortorder($parameters['order'], false);
                if (!empty($order)) {
                    $queryparams .= sprintf(' ORDER BY %s', $order);
                }
            }
        }
        // Make the query for the pager.
        $pagerquery = sprintf('SELECT COUNT(*) AS count FROM %s %s', $tablename, $queryparams);
        // Add the limit
        $queryparams = $this->app['db']->getDatabasePlatform()->modifyLimitQuery($queryparams, $limit, ($page - 1) * $limit);
        // Make the query to get the results.
        $query = "SELECT * FROM {$tablename}" . $queryparams;
        $rows = $this->app['db']->fetchAll($query);
        // Make sure content is set, and all content has information about its contenttype
        $content = [];
        foreach ($rows as $row) {
            $content[$row['id']] = $this->getContentObject($contenttype, $row);
        }
        // TODO: Check if we need to hydrate here!
        // Make sure all content has their taxonomies and relations
        $this->getTaxonomy($content);
        $this->getRelation($content);
        $this->getRepeaters($content);
        // Set up the $pager array with relevant values.
        $rowcount = $this->app['db']->executeQuery($pagerquery)->fetch();
        /** @var \Bolt\Pager\PagerManager $manager */
        $manager = $this->app['pager'];
        $manager->createPager('search')->setCount($rowcount['count'])->setTotalpages(ceil($rowcount['count'] / $limit))->setCurrent($page)->setShowingFrom(($page - 1) * $limit + 1)->setShowingTo(($page - 1) * $limit + count($content));
        return $content;
    }