public function execute() { $view = $this->getView(); $fac = new ModelFactory('PageModel'); $fac->where('baseurl LIKE /blog/view/%'); $fac->where('published_status = published'); $fac->where('published <= ' . \Core\Date\DateTime::NowGMT()); $fac->limit($this->getSetting('count')); switch ($this->getSetting('sort')) { case 'newest': $fac->order('published DESC'); break; case 'popular': $fac->order('popularity DESC'); break; case 'random': $fac->order('RAND()'); break; } if (!$fac->count()) { // If there are no results found, then do not display the widget. return ''; } $view->assign('sort', $this->getSetting('sort')); $view->assign('title', $this->getSetting('title')); $view->assign('links', $fac->get()); }
/** * Page to display and manage all gallery widgets. */ public function admin() { $view = $this->getView(); $request = $this->getPageRequest(); if (!\Core\user()->checkAccess('p:/gallery/manage_all')) { return View::ERROR_ACCESSDENIED; } $factory = new ModelFactory('WidgetModel'); $factory->where('baseurl LIKE /gallery/view/%'); $factory->order('title'); $widgets = $factory->get(); $view->title = 'Gallery Widgets'; $view->assign('can_manage_theme', \Core\user()->checkAccess('g:admin')); $view->assign('widgets', $widgets); $view->addControl('Create Gallery Widget', '/gallerywidget/update', 'add'); }
public function index(){ $view = $this->getView(); $permissionmanager = \Core\user()->checkAccess('p:/user/permissions/manage'); $factory = new ModelFactory('UserGroupModel'); if(Core::IsComponentAvailable('multisite') && MultiSiteHelper::IsEnabled()){ if(MultiSiteHelper::GetCurrentSiteID()){ // Child site, only display global and site-specific sites. $w = new \Core\Datamodel\DatasetWhereClause(); $w->setSeparator('or'); $w->addWhere('site = ' . MultiSiteHelper::GetCurrentSiteID()); $w->addWhere('site = -1'); $factory->where($w); $displayglobal = true; $multisite = false; } else { // Root site, display all groups across all sites. $factory->where('site != -2'); $displayglobal = false; $multisite = true; } $site = MultiSiteHelper::GetCurrentSiteID(); } else{ $displayglobal = false; $multisite = false; $site = null; } $factory->order('name'); $groups = $factory->get(); $view->title = 'User Group Administration'; $view->assign('groups', $groups); $view->assign('permissionmanager', $permissionmanager); $view->assign('display_global', $displayglobal); $view->assign('site', $site); $view->assign('multisite', $multisite); $view->addControl('Add Group', '/usergroupadmin/create', 'add'); }
public function view() { $view = $this->getView(); $factory = new ModelFactory('GalleryImageModel'); if ($this->getSetting('order') == 'random') { $factory->order('RAND()'); } else { $factory->order($this->getSetting('order')); } if ($this->getSetting('album')) { $factory->where('albumid = ' . $this->getSetting('album')); $album = GalleryAlbumModel::Construct($this->getSetting('album')); $link = $album->get('baseurl'); } else { $link = null; } $factory->limit($this->getSetting('count')); $images = $factory->get(); $view->assign('images', $images); $view->assign('dimensions', $this->getSetting('dimensions')); $view->assign('link', $link); $view->assign('uselightbox', $this->getSetting('uselightbox') && Core::IsComponentAvailable('jquery-lightbox')); }
/** * The view for the admin dashboard. Gets the last executed crons and displays that to the admin. */ public function dashboard() { // This dashboard has no effect if the user can't view crons. if (!\Core\user()->checkAccess('p:/cron/viewlog')) { return ''; } $view = $this->getView(); // Get the latest cron and its execution information and display that to the dashboard. $checks = [['cron' => 'hourly', 'modify' => '-1 hour', 'label' => 'hour'], ['cron' => 'daily', 'modify' => '-1 day', 'label' => 'day'], ['cron' => 'weekly', 'modify' => '-1 week', 'label' => 'week'], ['cron' => 'monthly', 'modify' => '-1 month', 'label' => 'month']]; $crons = array(); foreach ($checks as $k => $check) { $time = new CoreDateTime(); $cronfac = new ModelFactory('CronLogModel'); $cronfac->limit(1); $cronfac->where('cron = ' . $check['cron']); $cronfac->order('created desc'); $c = $cronfac->get(); if ($c) { $crons[] = $c; } } $view->title = 't:STRING_LATEST_CRON_RESULTS'; $view->assign('crons', $crons); }
<?php /** * Upgrade script to update the published timestamp of all pages. * This is necessary because <= 3.0.0, pages did not have the published flag. * * @package Core */ // Get every page that currently exists $factory = new ModelFactory('PageModel'); $pages = $factory->get(); foreach($pages as $page){ /** @var $page PageModel */ $page->set('published', $page->get('created')); $page->save(); }
/** * Perform a model search on the records of this Model. * * @param string $query The base query to search * @param array $where Any additional where parameters to add onto the factory * * @return array An array of ModelResult objects. */ public static function Search($query, $where = []){ $ret = []; // If this object does not support searching, simply return an empty array. $ref = new ReflectionClass(get_called_class()); if(!$ref->getProperty('HasSearch')->getValue()){ return $ret; } $fac = new ModelFactory(get_called_class()); if(sizeof($where)){ $fac->where($where); } if($ref->getProperty('HasDeleted')->getValue()){ $fac->where('deleted = 0'); } $fac->where(\Core\Search\Helper::GetWhereClause($query)); foreach($fac->get() as $m){ /** @var Model $m */ $sr = new \Core\Search\ModelResult($query, $m); // This may happen since the where clause can be a little open-ended. if($sr->relevancy < 1) continue; $sr->title = $m->getLabel(); $sr->link = $m->get('baseurl'); $ret[] = $sr; } // Sort the results before returning them. // Because otherwise, what's the point of a search algorithm?!? usort($ret, function($a, $b) { /** @var $a Core\Search\ModelResult */ /** @var $b Core\Search\ModelResult */ return $a->relevancy < $b->relevancy; }); return $ret; }
/** * Method to cleanup expired IP addresses from the database. * * @return bool */ public static function CleanupHook() { $factory = new \ModelFactory('IpBlacklistModel'); $factory->where('expires > 0'); // If they're set not to be deleted, don't purge them... $factory->where('expires <= ' . \CoreDateTime::Now('U', \Time::TIMEZONE_GMT)); // DELETE! $count = $factory->count(); if (!$count) { echo 'No records purged.'; return true; } foreach ($factory->get() as $record) { /** @var $record \IpBlacklistModel */ $record->delete(); } echo "Purged " . $count . ' record' . ($count > 1 ? 's' : '') . ' successfully.'; return true; }
<?php /** * Upgrade file to migrate the existing navigation widgets to the new schema, (edit and delete URLs) * * @author Charlie Powell <*****@*****.**> * @date 20140228.1049 * @package Blog */ $fac = new ModelFactory('WidgetModel'); $fac->where('baseurl LIKE /navigation/view/%'); foreach ($fac->get() as $model) { /** @var WidgetModel $model */ $id = substr($model->get('baseurl'), 17); $model->set('baseurl', '/navigation/view/' . $id); $model->set('editurl', '/navigation/edit/' . $id); $model->set('deleteurl', '/navigation/delete/' . $id); $model->save(); }
/** * @todo Finish documentation of smarty_function_widgetarea * @param array $params Associative (and/or indexed) array of smarty parameters passed in from the template * @param Smarty_Internal_Template $smarty Parent Smarty template object * * @return string|void */ function smarty_function_widgetarea($params, $smarty) { // Get all widgets set to load in this area. $body = ''; $baseurl = PageRequest::GetSystemRequest()->getBaseURL(); $template = $smarty->template_resource; $tmpl = $smarty->getTemplateVars('__core_template'); $topview = ($tmpl instanceof \Core\Templates\TemplateInterface) ? $tmpl->getView() : \Core\view(); $parameters = []; $name = null; $installable = null; $assign = null; foreach($params as $k => $v){ switch($k){ case 'name': $name = $v; break; case 'installable': $installable = $v; break; case 'assign': $assign = $v; break; default: $parameters[$k] = $v; break; } } // I need to resolve the page template down to the base version in order for the lookup to work. foreach(Core\Templates\Template::GetPaths() as $base){ if(strpos($template, $base) === 0){ $template = substr($template, strlen($base)); break; } } // Given support for page-level widgets, this logic gets slightly more difficult... $factory = new ModelFactory('WidgetInstanceModel'); $factory->order('weight'); if(Core::IsComponentAvailable('multisite') && MultiSiteHelper::IsEnabled()){ $factory->whereGroup('or', ['site = -1', 'site = ' . MultiSiteHelper::GetCurrentSiteID()]); } $subwhere = new Core\Datamodel\DatasetWhereClause(); $subwhere->setSeparator('OR'); // First, the skin-level where clause. $skinwhere = new Core\Datamodel\DatasetWhereClause(); $skinwhere->setSeparator('AND'); $skinwhere->addWhere('template = ' . $template); $skinwhere->addWhere('widgetarea = ' . $name); $subwhere->addWhere($skinwhere); // And second, the page-level where clause. if($baseurl){ $pagewhere = new Core\Datamodel\DatasetWhereClause(); $pagewhere->setSeparator('AND'); $pagewhere->addWhere('page_baseurl = ' . $baseurl); $pagewhere->addWhere('widgetarea = ' . $name); $subwhere->addWhere($pagewhere); } $factory->where($subwhere); $widgetcount = 0; try{ $widgets = $factory->get(); } catch(Exception $e){ if(DEVELOPMENT_MODE){ $body .= '<p class="message-error">Exception while trying to load widget area ' . $name . '!</p>'; $body .= '<pre class="xdebug-var-dump">' . $e->getMessage() . '</pre>'; } else{ \Core\ErrorManagement\exception_handler($e, false); } $widgets = []; ++$widgetcount; } foreach ($widgets as $wi) { /** @var $wi WidgetInstanceModel */ // User cannot access this widget? Don't display it... if(!\Core\user()){ continue; } if (!\Core\user()->checkAccess($wi->get('access'))){ continue; } if($installable){ $wi->set('installable', $installable); } $view = $wi->execute($parameters); // Some widgets may return simply a blank string. Those should just be ignored. if ($view == ''){ continue; } // If it's just a string, return that. if (is_string($view)) { $contents = $view; } elseif($view->error == View::ERROR_NOERROR){ // Ensure that the widget's View knows it's linked to a parent! $view->parent = $topview; $contents = $view->fetch(); } else{ $contents = 'Error displaying widget [' . $wi->get('baseurl') . '], returned error [' . $view->error . ']'; } ++$widgetcount; // Does this widget have controls attached to it? $widget = $wi->getWidget(); if($widget->controls instanceof ViewControls && $widget->controls->hasLinks()){ $contents = '<div class="widget-controls-wrapper">' . '<menu id="widget-controls-' . $wi->get('id') . '">' . $widget->controls->fetch() . '</menu>' . '</div>' . $contents; } $body .= '<div class="widget">' . $contents . '</div>'; } // Do some sanitizing for the css data $class = 'widgetarea-' . strtolower(str_replace(' ', '', $name)); $html = '<div class="widgetarea ' . $class . '" widgetarea="' . $name . '">' . $body . '</div>'; // No widgets, no inner content! if($widgetcount == 0){ $html = ''; } if($assign){ $smarty->assign($assign, $html); } else{ return $html; } }
/** * Get the page model for the current page. * * @return PageModel */ public function getPageModel() { if ($this->_pagemodel === null) { $uri = $this->uriresolved; $pagefac = new ModelFactory('PageModel'); $pagefac->where('rewriteurl = ' . $uri); //$pagefac->where('fuzzy = 0'); $pagefac->limit(1); if(Core::IsComponentAvailable('multisite') && MultiSiteHelper::IsEnabled()){ $pagefac->whereGroup('OR', array('site = -1', 'site = ' . MultiSiteHelper::GetCurrentSiteID())); } $p = $pagefac->get(); // Split this URL, it'll be used somewhere. $pagedat = $this->splitParts(); if ($p) { // :) Found it $this->_pagemodel = $p; } elseif ($pagedat && isset($pagedat['baseurl'])) { // Is this even a valid controller? // This will allow a page to be called with it being in the pages database. $p = new PageModel($pagedat['baseurl']); if(!$p->exists()){ $p->set('rewriteurl', $pagedat['rewriteurl']); } $this->_pagemodel = $p; } else { // No page in the database and no valid controller... sigh $this->_pagemodel = new PageModel(); } //var_dump($p); die(); // Make sure all the parameters from both standard GET and core parameters are tacked on. if ($pagedat && $pagedat['parameters']) { foreach ($pagedat['parameters'] as $k => $v) { $this->_pagemodel->setParameter($k, $v); } } if (is_array($_GET)) { foreach ($_GET as $k => $v) { if (is_numeric($k)) continue; $this->_pagemodel->setParameter($k, $v); } } } return $this->_pagemodel; }
/** * Display a listing of all widgets registered in the system. */ public function admin(){ $view = $this->getView(); $request = $this->getPageRequest(); $viewer = \Core\user()->checkAccess('p:/core/widgets/manage'); $manager = \Core\user()->checkAccess('p:/core/widgets/manage'); if(!($viewer || $manager)){ return View::ERROR_ACCESSDENIED; } // Build a list of create pages for all registered components. $components = Core::GetComponents(); $pages = []; $skins = []; $selected = null; $selectedtype = null; $baseurl = null; $selectoptions = []; $links = []; $theme = ThemeHandler::GetTheme(); $formtheme = null; $formskin = null; $formtemplate = null; foreach($components as $c){ /** @var Component_2_1 $c */ $viewdir = $c->getViewSearchDir(); if($viewdir){ $dirlen = strlen($viewdir); $component = $c->getName(); $dh = \Core\Filestore\Factory::Directory($viewdir); //$pagetplfiles = $dh->ls('tpl', true); $pagetplfiles = $dh->ls(null, true); // not sure why getFilename(path) isn't working as expected, but this works too. foreach($pagetplfiles as $obj){ // I don't want directories. if($obj instanceof \Core\Filestore\Directory) continue; /** @var $obj \Core\Filestore\File */ $file = substr($obj->getFilename(), $dirlen); // Since this is a template, it may actually be in a different location than where the package maintainer put it. // ie: user template user/templates/pages/user/view.tpl may be installed to themes/myawesometheme/pages/user/view.tpl instead. $tpl = Core\Templates\Template::Factory($file); if($tpl->hasWidgetAreas()){ $pagetitle = $file; if(strpos($pagetitle, 'pages/') === 0){ $pagetitle = substr($pagetitle, 6); } // Replace directory slashes with a space $pagetitle = str_replace(['/', '-'], ' ', $pagetitle); // Capitalize them $pagetitle = ucwords($pagetitle); // And trim off the ".tpl" suffix. $pagetitle = substr($pagetitle, 0, -4); $pages[$file] = $pagetitle; } } } foreach($c->getXML()->getElements('/widgets/widgetcreate') as $node){ /** @var DOMElement $node */ if($node->getAttribute('baseurl')){ $nodebaseurl = $node->getAttribute('baseurl'); $image = ''; } elseif($node->getAttribute('class')){ /** @var Widget_2_1 $obj */ $obj = Widget_2_1::Factory($node->getAttribute('class')); $nodebaseurl = '/widget/create?class=' . $node->getAttribute('class'); if($obj){ $image = $obj->getPreviewImage(); } else{ \Core\set_message('Invalid "widgetcreate" found in ' .$node->getAttribute('class') . ', ' . $node->getAttribute('title'), 'error'); $image = ''; } } else{ \Core\set_message('Invalid "widgetcreate" found in ' . $c->getName() . ', ' . $node->getAttribute('title'), 'error'); continue; } $links[] = [ 'baseurl' => $nodebaseurl, 'title' => $node->getAttribute('title'), 'preview' => $image, ]; } } // Build the array of skins for the current theme $themeskins = $theme->getSkins(); $defaultskin = null; foreach($themeskins as $dat){ $skins[ 'skins/' . $dat['file'] ] = $dat['title']; if($dat['default']){ $defaultskin = 'skins/' . $dat['file']; } } // Now that the various templates have been loaded into a flat array, I need to sort them. asort($pages); asort($skins); foreach($skins as $k => $v){ $selectoptions[ $k ] = 'Skin: ' . $v; } foreach($pages as $k => $v){ $selectoptions[ $k ] = 'Page: ' . $v; } if($request->getParameter('baseurl')){ // It's a URL-specific request, lookup which template that page used last. $baseurl = $request->getParameter('baseurl'); $page = PageModel::Construct($baseurl); if(!isset($pages[ $page->get('last_template') ])){ \Core\set_message('Requested page template does not seem to contain any widget areas.', 'error'); \Core\go_back(); } $selected = $page->get('last_template'); $selectedtype = 'url'; $formtemplate = $selected; } elseif($request->getParameter('template')){ $selected = $request->getParameter('template'); if(isset($pages[ $selected ])){ $selectedtype = 'page'; $formtemplate = $selected; } else{ $selectedtype = 'skin'; $formtheme = $theme->getKeyName(); $formskin = $selected; } } else{ // Just use the default theme skin. $selected = $defaultskin; $selectedtype = 'skin';$formtheme = $theme->getKeyName(); $formskin = $selected; } $template = \Core\Templates\Template::Factory($selected); $areas = $template->getWidgetAreas(); $installables = [0 => '']; foreach($areas as $k => $dat){ // Ensure that each area has a widgets array, (even if it's empty) $areas[$k]['widgets'] = []; $installables[] = $dat['installable']; } $installables = array_unique($installables); $factory = new ModelFactory('WidgetInstanceModel'); $factory->order('weight'); if(Core::IsComponentAvailable('multisite') && MultiSiteHelper::IsEnabled()){ $factory->whereGroup('or', ['site = -1', 'site = ' . MultiSiteHelper::GetCurrentSiteID()]); } if($selectedtype == 'skin'){ // First, the skin-level where clause. $skinwhere = new Core\Datamodel\DatasetWhereClause(); $skinwhere->setSeparator('AND'); //$skinwhere->addWhere('theme = ' . $theme->getKeyName()); $skinwhere->addWhere('template = ' . $selected); $factory->where($skinwhere); } elseif($selectedtype == 'page'){ $factory->where('template = ' . $selected); } elseif($selectedtype == 'url'){ $factory->where('page_baseurl = ' . $baseurl); } else{ \Core\set_message('Invalid/unknown template type', 'error'); \Core\go_back(); } foreach($factory->get() as $wi){ /** @var $wi WidgetInstanceModel */ $a = $wi->get('widgetarea'); $areas[$a]['widgets'][] = $wi; } $available = WidgetModel::Find(['installable IN ' . implode(', ', $installables)]); /* $table = new Core\ListingTable\Table(); $table->setName('/admin/widgets'); $table->setModelName('WidgetModel'); // Add in all the columns for this listing table. $table->addColumn('Title', 'title'); if(Core::IsComponentAvailable('enterprise') && MultiSiteHelper::IsEnabled() && \Core\user()->checkAccess('g:admin')){ $table->addColumn('Site', 'site', false); $ms = true; } else{ $ms = false; } $table->getModelFactory()->where('installable IN ' . implode(', ', $installables)); $table->addColumn('Base URL', 'baseurl'); $table->addColumn('Installable', 'installable'); $table->addColumn('Created', 'created'); $table->loadFiltersFromRequest(); */ $view->mastertemplate = 'admin'; $view->title = 'All Widgets'; //$view->assign('table', $table); $view->assign('available_widgets', $available); $view->assign('links', $links); $view->assign('manager', $manager); $view->assign('theme', $formtheme); $view->assign('skin', $formskin); $view->assign('template', $selected); $view->assign('page_template', $formtemplate); $view->assign('page_baseurl', $baseurl); $view->assign('options', $selectoptions); $view->assign('selected', $selected); $view->assign('areas', $areas); //$view->assign('multisite', $ms); }
} if(strpos($class, '\\') !== false){ // If this "Model" class is namespaced, it's not a valid model! // All Models MUST reside in the global namespace in order to be valid. continue; } $ref = new ReflectionClass($class); if(!$ref->getProperty('HasSearch')->getValue()){ // This model doesn't have the searchable flag, skip it. continue; } CLI::PrintActionStart("Syncing searchable model $class"); $fac = new ModelFactory($class); foreach($fac->get() as $m){ /** @var Model $m */ $m->set('search_index_pri', '!'); $m->save(); } CLI::PrintActionStatus('ok'); $changes[] = "Synced searchable model " . $class; } } // Flush the system cache, just in case \Core\Cache::Flush(); \Core\Templates\Backends\Smarty::FlushCache(); CLI::PrintHeader('DONE!');
public function execute() { $view = $this->getView(); $fac = new ModelFactory('PageModel'); if ($this->getSetting('blog')) { $fac->where('parenturl = /blog/view/' . $this->getSetting('blog')); } $fac->where('parenturl LIKE /blog/view/%'); $fac->where('published_status = published'); $fac->where('published <= ' . \Core\Date\DateTime::NowGMT()); $fac->limit($this->getSetting('count')); switch ($this->getSetting('sort')) { case 'newest': $fac->order('published DESC'); break; case 'popular': $fac->order('popularity DESC'); break; case 'random': $fac->order('RAND()'); break; } if (!$fac->count()) { // If there are no results found, then do not display the widget. return ''; } $view->assign('count', $this->getSetting('count')); $view->assign('sort', $this->getSetting('sort')); $view->assign('title', $this->getSetting('title')); // The template is expecting an array, if count is 1, only a single Model is returned from the factory. $view->assign('links', $this->getSetting('count') == 1 ? [$fac->get()] : $fac->get()); }
/** * View to edit the user account, both administratively and from within the user's profile. */ public function edit(){ $view = $this->getView(); $req = $this->getPageRequest(); $userid = $req->getParameter(0); $manager = \Core\user()->checkAccess('p:/user/users/manage'); // Current user an admin? $groupmanager = \Core\user()->checkAccess('p:/user/groups/manage'); $contextnames = []; $contexts = []; $usecontexts = false; if($userid === null) $userid = \Core\user()->get('id'); // Default to current user. // Only allow this if the user is either the same user or has the user manage permission. if(!($userid == \Core\user()->get('id') || $manager)){ \Core\set_message('Insufficient Permissions', 'error'); \core\redirect('/'); } /** @var UserModel $user */ $user = UserModel::Construct($userid); if($user) { $form = \Core\User\Helper::GetEditForm($user); } else { \Core\set_message('A user with this ID does not exist'); \Core\go_back(); } if($groupmanager){ $contextgroups = UserGroupModel::Find(['context != '], null, 'name'); foreach($contextgroups as $group){ /** @var UserGroupModel $group */ $ckey = $group->get('context'); $gkey = $group->get('id'); $contextnames[ $group->get('name') ] = $gkey; // I need to load *all* those models into the system so they're available to the UI. $fac = new ModelFactory($ckey . 'Model'); $all = []; foreach($fac->get() as $m){ /** @var Model $m */ $all[$m->getPrimaryKeyString()] = $m->getLabel(); } $contexts[$gkey] = $all; $usecontexts = true; } } $view->controls = ViewControls::DispatchModel($user); $view->mastertemplate = ConfigHandler::Get('/theme/siteskin/user'); $view->title = 'Editing ' . $user->getDisplayName(); $view->assign('form', $form); $view->assign('contextnames_json', json_encode($contextnames)); $view->assign('contextnames', $contextnames); $view->assign('contexts_json', json_encode($contexts)); $view->assign('use_contexts', $usecontexts); $view->assign('user', $user); // Breadcrumbs! (based on access permissions) if($manager){ //$view->addBreadcrumb('User Administration', '/user/admin'); } }