Exemple #1
0
 /**
  * @param $zip_file
  * @return array|string
  */
 static function install($zip_file)
 {
     $already_installed = static::modules();
     # Extract archive
     $zip = new \ZipArchive();
     if ($zip->open($zip_file)) {
         if (!$zip->extractTo(ROOT)) {
             return 'admin.insta.error.101';
         }
     }
     # Migrate database
     $db = NCService::load('Database')->connection();
     $new = array_diff($already_installed, static::modules());
     foreach ($new as $module_name) {
         $migration = ROOT . S . 'engine' . S . 'Module' . S . ucfirst($module_name) . S . 'migration.sql';
         if (!file_exists($migration)) {
             continue;
         }
         $queries = file_get_contents($migration);
         $queries = explode(';', $queries);
         foreach ($queries as $sql) {
             $db->query($sql);
         }
     }
     return $new;
 }
Exemple #2
0
 public function edit_page(Request $request, $matches)
 {
     $title = $this->lang->translate('page.create');
     // Get page for updating
     $id = intval($matches->get('id', $request->get('id')));
     if ($id > 0) {
         $page = \Page::find_by_id($id);
         $title = $this->lang->translate('page.editing', $page->title);
     } else {
         $page = ['title' => $this->lang->translate('page.name'), 'content' => '', 'template' => 'default.twig'];
     }
     // Create or update page
     if ($request->isMethod('post')) {
         if ($page instanceof \Page) {
             $page->title = $request->get('title');
             $page->content = $request->get('content');
             $page->slug = $request->get('slug');
             $page->template = $request->get('template');
         } else {
             $page = new \Page(['title' => $request->get('title'), 'content' => $request->get('content'), 'slug' => $request->get('slug'), 'template' => $request->get('template'), 'author_id' => $this->user->id]);
             // Ping sitemap
             NCService::load('SocialMedia.Ping');
         }
         // Updating instance
         $page->save();
         $page = $page->to_array();
         return static::json_response(['success' => true, 'message' => $this->lang->translate('form.saved')]);
     }
     return $this->view->render('pages/create.twig', ['page' => $page, 'title' => $title, 'templates' => $this->view->list_files('pages', '@current')]);
 }
Exemple #3
0
 /**
  * @param null $redirect_uri
  * @return bool
  */
 public static function go($redirect_uri = null)
 {
     /** @var SocialMedia $smp */
     $smp = NCService::load('SocialMedia');
     /** @var Google $manager */
     $manager = $smp->go();
     return $manager->setup($_GET);
 }
Exemple #4
0
 public function __construct()
 {
     session_start();
     // Init request and response objects
     Env::$request = Request::createFromGlobals();
     Env::$response = Response::create();
     // Loads database
     NCService::load('Database');
     // Starts application kernel
     NCService::load('Application', [Env::$request->server->get('REQUEST_URI')]);
 }
Exemple #5
0
 /**
  * Comments list
  *
  * @param $request
  * @return mixed
  */
 public function comments_list($request)
 {
     // Delete page
     if ($request->get('delete')) {
         $delete = $request->get('delete');
         if ($delete != 'all') {
             $comment = \Comment::find_by_id(intval($delete));
             if ($comment) {
                 // Delete child comments
                 \Comment::table()->delete('parent_id = ' . $comment->id);
                 if ($comment->delete()) {
                     $this->view->assign('message', $this->lang->translate('form.deleted'));
                 }
             }
         } else {
             \Comment::table()->delete('1');
             $this->view->assign('message', $this->lang->translate('form.deleted'));
         }
     }
     // Filter
     $filter = [];
     if ($request->get('author')) {
         $author = \User::find($request->get('author'));
         if ($author) {
             $filter['conditions'] = ['author_id = ?', $author->id];
         }
     }
     $filter['order'] = 'id DESC';
     if ($request->order) {
         $filter['order'] = $request->order;
     }
     /** @var Listing $paginator */
     $paginator = NCService::load('Paginator.Listing', [$request->page, \Comment::count('all')]);
     $filter = array_merge($filter, $paginator->limit());
     // Filter users
     $comments = \Comment::all($filter);
     $comments = \Comment::as_array($comments);
     return $this->view->render('comment/list.twig', ['title' => $this->lang->translate('comment.list'), 'comments_list' => $comments, 'listing' => $paginator->pages(), 'page' => $paginator->cur_page]);
 }
Exemple #6
0
 /**
  * Import videos from youtube
  *
  * @param Request $request
  * @param $match
  * @return string
  */
 public function import(Request $request, $match)
 {
     if ($request->isMethod('post')) {
         $items = [];
         $query = ['part' => 'snippet,id', 'channelId' => $request->get('channel')];
         // Fetch videos
         /** @var Google $sm */
         $sm = NCService::load('SocialMedia.Google');
         while ($response = $sm->request('https://www.googleapis.com/youtube/v3/search', $query)) {
             $response = json_decode($response, true);
             $items = array_merge($items, $response['items']);
             // Move to next page or break
             if (isset($response['nextPageToken']) && $response['nextPageToken']) {
                 $query['pageToken'] = $response['nextPageToken'];
             } else {
                 break;
             }
         }
         // Save videos
         foreach ($items as $video) {
             $id = $video['id']['videoId'];
             $url = 'https://www.youtube.com/watch?v=' . $id;
             $title = $video['snippet']['title'];
             $description = $video['snippet']['description'];
             $iframe = '<iframe class="youtube" width="560" height="315" src="https://www.youtube.com/embed/' . $id . '" frameborder="0" allowfullscreen></iframe>';
             $created_at = strtotime($video['snippet']['publishedAt']);
             // Get image url
             $preview_img = end(array_values($video['snippet']['thumbnails']))['url'];
             // Render import template
             $body = $this->view->render('@assets/templates/youtube.import.twig', ['title' => $title, 'description' => $description, 'player' => $iframe, 'url' => $url, 'short' => '#split#', 'preview' => $preview_img]);
             $entity = new \Post(['author_id' => $this->user->id, 'title' => $title, 'content' => str_replace('#split#', '<!-- split -->', $body), 'moderate' => 1, 'category_id' => $request->get('category'), 'created_at' => $created_at, 'updated_at' => $created_at]);
             $entity->save();
         }
         $this->view->assign('message', $this->lang->translate('post.youtube.done', count($items)));
     }
     return $this->view->render('posts/import.twig', ['title' => $this->lang->translate('post.import'), 'categories' => \PostCategory::as_array(\PostCategory::all())]);
 }
Exemple #7
0
 /**
  * Comments list
  *
  * @param $request
  * @param $matches
  * @return mixed
  */
 public function posts_list($request, $matches)
 {
     $topic = $this->view->get('topic', $matches->get('topic'));
     $topic = $topic instanceof \ForumTheme ? $topic : \ForumTheme::find($topic);
     $filter = ['conditions' => ['theme_id = ?', $topic->id], 'order' => 'created_at DESC'];
     /** @var Listing $paginator */
     $paginator = NCService::load('Paginator.Listing', [$request->page, \ForumPost::count($filter)]);
     $filter = array_merge($filter, $paginator->limit());
     // Comments
     $comments = \ForumPost::find('all', $filter);
     $comments = \ForumPost::as_array($comments);
     // Context
     $context = ['topic' => $topic, 'posts_list' => $comments, 'page' => $paginator->cur_page, 'listing' => $paginator->pages()];
     // Add comment status
     if ($status = $this->view->get('status', false)) {
         $context['status'] = $status;
     }
     // Build response
     if ($request->get('type', 'html') == 'json') {
         unset($context['listing']);
         $context['pages'] = $paginator->pages;
         $context['rows'] = $paginator->num_rows;
         return static::json_response($context);
     }
     return $this->view->render('forum/posts.twig', $context);
 }
Exemple #8
0
 /**
  * Comments list
  *
  * @param $request
  * @param $matches
  * @return mixed
  */
 public function likes_list($request, $matches)
 {
     $post = trim($matches->get('post'), '-+ ');
     $filter = ['conditions' => ['post = ?', $post], 'order' => 'created_at DESC'];
     /** @var Listing $paginator */
     $paginator = NCService::load('Paginator.Listing', [$request->page, \Like::count($filter)]);
     $filter = array_merge($filter, $paginator->limit());
     // Likes
     $likes = \Like::find('all', $filter);
     $likes = \Like::as_array($likes);
     // Context
     $context = ['rating' => \Like::rating($post), 'likes' => $likes, 'page' => $paginator->cur_page, 'listing' => $paginator->pages()];
     // Build response
     if ($request->get('type', 'html') == 'json') {
         unset($context['listing']);
         $context['pages'] = $paginator->pages;
         $context['rows'] = $paginator->num_rows;
         return static::json_response($context);
     }
     return $this->view->render('likes/list.twig', $context);
 }
Exemple #9
0
 /**
  * @param NCModule $module
  * @param Translate $lang
  */
 public function load_globals(NCModule $module, Translate $lang)
 {
     /** @var array $modules */
     $modules = NCService::load('Module')->modules('all');
     foreach ($modules as $mdl_dir) {
         $globalize = '\\Module\\' . $mdl_dir . '\\Module::globalize';
         if (!is_callable($globalize)) {
             continue;
         }
         $globals = call_user_func($globalize, $module, $this, $lang);
         if ($globals) {
             foreach ($globals as $k => $v) {
                 if (is_int($k)) {
                     break;
                 }
                 if ($v instanceof NCBlock) {
                     $this->assign($k, $v->render($this));
                     continue;
                 }
                 $this->assign($k, $v);
             }
         }
     }
 }
Exemple #10
0
 /**
  * @param Request $request
  * @param null $matches
  * @return mixed|string
  */
 public function create(Request $request, $matches = null)
 {
     $this->authenticated_only();
     if (!$this->user->can('publicate')) {
         return $this->error403($request);
     }
     $title = $this->lang->translate('post.create');
     // Get post for updating
     $id = intval($matches->get('id', $request->get('id')));
     if ($id > 0) {
         $post = \Post::find(['conditions' => ['id = ? AND author_id = ?', $id, $this->user->id]]);
         $title = $this->lang->translate('post.editing', $post->title);
     } else {
         $last_category = \PostCategory::last();
         if ($last_category) {
             $last_category = $last_category->to_array();
         } else {
             $last_category = null;
         }
         $post = ['title' => $this->lang->translate('post.name'), 'content' => '', 'category' => $last_category];
     }
     // Create or update page
     if ($request->isMethod('post')) {
         if ($post instanceof \Post) {
             $post->title = $request->get('title');
             $post->content = $request->get('content');
             $post->category_id = $request->get('category');
             $post->keywords = $request->get('keywords');
             $post->slug = $request->get('slug');
             $post->moderate = $this->user->can('premoderate_publ');
         } else {
             $post = new \Post(['title' => $request->get('title'), 'content' => $request->get('content'), 'category_id' => $request->get('category'), 'keywords' => $request->get('keywords'), 'slug' => $request->get('slug'), 'author_id' => $this->user->id, 'moderate' => $this->user->can('premoderate_publ')]);
         }
         // Updating instance
         $post->save();
         if (!$post->moderate) {
             // Exporting to social
             static::export($post, $this->view);
             // Ping sitemap
             NCService::load('SocialMedia.Ping');
         }
         return static::json_response(['success' => true, 'message' => $this->lang->translate('form.saved')]);
     }
     if ($post instanceof \Post) {
         $post = $post->to_array();
     }
     return $this->view->render('posts/create.twig', ['post' => $post, 'title' => $title, 'categories' => \PostCategory::as_array(\PostCategory::all())]);
 }
Exemple #11
0
 /**
  * Comments list
  *
  * @param $request
  * @param $matches
  * @return mixed
  */
 public function comments_list($request, $matches)
 {
     $post = trim($this->view->get('com', $matches->get('post')));
     $filter = ['conditions' => ['post = ?', $post], 'order' => 'created_at DESC'];
     /** @var Listing $paginator */
     $paginator = NCService::load('Paginator.Listing', [$request->page, \Comment::count($filter)]);
     $filter = array_merge($filter, $paginator->limit());
     // Comments
     $comments = \Comment::find('all', $filter);
     $comments = \Comment::as_array($comments);
     // Context
     $context = ['com' => $post, 'comments' => $comments, 'page' => $paginator->cur_page, 'listing' => $paginator->pages()];
     // Add comment status
     if ($status = $this->view->get('status', false)) {
         $context['status'] = $status;
     }
     // Build response
     if ($request->get('type', 'html') == 'json') {
         unset($context['listing']);
         $context['pages'] = $paginator->pages;
         $context['rows'] = $paginator->num_rows;
         return static::json_response($context);
     }
     return $this->view->render('comment/list.twig', $context);
 }
Exemple #12
0
 /**
  * Installed modules list
  *
  * @return array
  */
 static function modules()
 {
     return NCService::load('Module')->modules();
 }
Exemple #13
0
 /**
  * @param $url
  * @param $theme
  * @param $namespace
  */
 public function __construct($url, $theme = 'default', $namespace = '')
 {
     // Authentication
     /** @var Auth auth */
     $this->auth = NCService::load('User.Auth');
     /** @var \User user */
     $this->user = $this->auth->identify(Env::$request->cookies->get('sess'));
     // Settings
     /** @var Settings settings */
     $this->settings = NCService::load('Application.Settings');
     // Analytics module
     if ($this->analytics) {
         $counter = NCService::load('Application.Analytics', [$this->user ? $this->user->id : null]);
         $counter->save();
     }
     // Renderring
     /** @var Theme view */
     $this->view = NCModuleCore::load_view($theme);
     // Translation
     /** @var Translate lang */
     $this->lang = NCModuleCore::load_lang();
     // Module level routing
     /** @var NCRouter map */
     $this->map = new NCRouter($this, $namespace);
     // Adding sitemap to urls
     $this->map->addRoute('sitemap.xml', [$this, 'sitemap'], 'sitemap');
     // Register reverse url filter
     $this->view->twig->addFilter(new \Twig_SimpleFilter('url', [$this->map, 'reverse_filter']));
     // Register translate filters
     $this->view->twig->addFilter(new \Twig_SimpleFilter('lang', [$this->lang, 'translate']));
     $this->view->twig->addFilter(new \Twig_SimpleFilter('dlang', [$this->lang, 'translate_date']));
     // Assign user
     $this->view->assign('user', $this->user ? $this->user->to_array() : []);
     $this->view->assign('group', $this->user ? $this->user->group : []);
     // Assign captcha URL
     $this->view->assign('secure_image', NCModuleCore::$captcha_url);
     // Loading modules globals
     $this->view->load_globals($this, $this->lang);
     // Disable access to banned users
     if ($this->user->ban_time > time() || $this->user->ban_time == -1) {
         Env::$response->setContent($this->errorBanned(Env::$request, $this->user->ban_reason));
         Env::$response->send();
         return;
     }
     // Check access to current module
     if (!$this->access()) {
         Env::$response->setContent($this->error403(Env::$request));
         Env::$response->send();
         return;
     }
     // Build current module map
     $this->route();
     /** @var NCRoute $route */
     $route = $this->map->match($url);
     // Check route
     if (!is_callable($route->callback)) {
         Env::$response->setContent($this->error404(Env::$request));
         Env::$response->send();
         return;
     }
     // Bufferization content
     ob_start();
     $this->configure();
     if (strpos($url, 'sitemap.xml') > -1) {
         Env::$response->headers->set('Content-Type', 'application/xml');
         $response = call_user_func($route->callback, new NCSitemapBuilder(), $this->map);
         $response = strval($response);
     } else {
         $response = call_user_func($route->callback, Env::$request, $route->matches);
     }
     $buffer = ob_get_clean();
     Env::$response->setContent(!is_null($response) ? $response : $buffer);
     // Flush content
     Env::$response->send();
 }
Exemple #14
0
 /**
  * View users list
  *
  * @param Request $request
  * @param $matches
  * @return mixed
  */
 public function users_list(Request $request, $matches)
 {
     $filter = [];
     $title = $this->lang->translate('user.list');
     // Filtering by user
     if ($request->get('group')) {
         $filter['conditions'] = ['group_id = ?', intval($request->get('group'))];
         $group = \Group::find($request->get('group'));
         if ($group) {
             $title = $this->lang->translate('user.profile.group') . ' ' . $group->name;
         }
     }
     // Ordering table
     if ($request->order) {
         $filter['order'] = $request->order;
     }
     /** @var Listing $paginator */
     $paginator = NCService::load('Paginator.Listing', [$request->page, $filter ? \User::count($filter) : \User::count()]);
     $filter = array_merge($filter, $paginator->limit());
     // Filter users
     $users = \User::all($filter);
     $users = array_map(function ($i) {
         return $i->to_array();
     }, $users);
     return $this->view->render('users/list.twig', ['title' => $title, 'users_list' => $users, 'listing' => $paginator->pages(), 'page' => $paginator->cur_page]);
 }
Exemple #15
0
 public function logout(Request $request)
 {
     /** @var Auth $service */
     $service = NCService::load('User.Auth');
     $service->logout();
     Env::$response->sendHeaders();
     header('Location: ' . $this->map->reverse('login'));
     die;
 }
Exemple #16
0
 /**
  * Exporting to social
  */
 public function export($templates)
 {
     /** @var \Service\SocialMedia\SocialMedia $smp */
     $smp = \System\Engine\NCService::load('SocialMedia');
     $post_url = '/post/' . $this->id . '-' . $this->slug . '.html';
     $url = \System\Environment\Env::$request->getSchemeAndHttpHost() . $post_url;
     // Posting vk
     if ($this->category->post_vkontakte && isset($templates['vkontakte']) && !$this->post_twitter) {
         $vk = $smp->vk();
         $this->assign_attribute('post_vkontakte', $vkp = $vk->m_post($this->category->post_vkontakte, $templates['vkontakte'], ['attachments' => $url]));
     }
     // Posting twitter
     if ($this->category->post_twitter && isset($templates['twitter']) && !$this->post_twitter) {
         $tw = $smp->tw();
         $this->assign_attribute('post_twitter', $tw->m_post($templates['twitter'], reset($this->images(ROOT)))->id);
     }
     if ($this->save()) {
         return ['vk' => $this->post_vkontakte, 'tw' => $this->post_twitter];
     }
     return false;
 }
Exemple #17
0
 /**
  * @param $code
  * @return bool
  */
 static function verify_captcha($code)
 {
     /** @var Captcha $captcha */
     $captcha = NCService::load('Application.Captcha');
     return $captcha->is_valid($code);
 }
Exemple #18
0
 /**
  * @return \Service\User\Permissions
  */
 public static function getPermissionsMap()
 {
     if (!static::$permissionsMap) {
         static::$permissionsMap = NCService::load('User.Permissions');
     }
     return static::$permissionsMap;
 }
Exemple #19
0
 public function subjects(Request $request, $matches)
 {
     $title = $this->lang->translate('forum.list');
     // Delete topic
     if ($request->get('delete')) {
         $forum = \Forum::find_by_id(intval($request->get('delete')));
         if ($forum) {
             $forum->delete();
             $this->view->assign('message', $this->lang->translate('form.deleted'));
         }
     }
     // Filter
     $filter = ['conditions' => ['forum_id < 1']];
     if ($request->get('author')) {
         $author = \User::find($request->get('author'));
         if ($author) {
             $filter['conditions'] = ['author_id = ?', $author->id];
         }
     }
     // Parent
     if ($request->get('parent')) {
         $parent = \Forum::find($request->get('parent'));
         if ($parent) {
             $filter['conditions'] = ['forum_id = ?', $parent->id];
         }
     }
     $filter['order'] = 'id DESC';
     if ($request->order) {
         $filter['order'] = $request->order;
     }
     /** @var Listing $paginator */
     $paginator = NCService::load('Paginator.Listing', [$request->page, \Forum::count('all')]);
     $filter = array_merge($filter, $paginator->limit());
     // Filter topics
     $forums = \Forum::as_array(\Forum::all($filter));
     return $this->view->render('forum/list.twig', ['title' => $title, 'forums_list' => $forums, 'listing' => $paginator->pages(), 'page' => $paginator->cur_page]);
 }