DEV: Дальнейшая работа по добавлению поста через URL

This commit is contained in:
Evg 2021-06-20 20:09:05 +03:00
parent f66b500a53
commit c4665234b7
13 changed files with 242 additions and 123 deletions

View file

@ -76,11 +76,10 @@ class CommentController extends \MainController
return true;
}
// Ограничим частоту добавления
// Добавить условие TL
if($uid['trust_level'] < 2) {
// Участник с нулевым уровнем доверия должен быть ограничен в добавлении комментариев
if($uid['trust_level'] < Config::get(Config::PARAM_TL_ADD_COMM)) {
$num_comm = CommentModel::getCommentSpeed($uid['id']);
if(count($num_comm) > 10) {
if(count($num_comm) > 9) {
Base::addMsg('Вы исчерпали лимит комментариев (15) на сегодня', 'error');
redirect('/');
}

View file

@ -0,0 +1,60 @@
<?php
namespace App\Controllers;
use Hleb\Constructor\Handlers\Request;
use App\Models\ExploreModel;
use App\Models\LinkModel;
use Lori\Config;
use Lori\Base;
class LinkController extends \MainController
{
public function index()
{
$uid = Base::getUid();
$data = [
'h1' => lang('domains-title'),
'canonical' => '/domains',
'sheet' => 'domains',
'meta_title' => lang('domains-title') .' | '. Config::get(Config::PARAM_NAME),
'meta_desc' => lang('domains-desc'),
];
return view(PR_VIEW_DIR . '/link/index', ['data' => $data, 'uid' => $uid]);
}
// Выборка по домену
public function domain()
{
$domain = \Request::get('domain');
$uid = Base::getUid();
$post = LinkModel::getDomain($domain, $uid['id']);
Base::PageError404($post);
$result = Array();
foreach($post as $ind => $row){
$row['post_content_preview'] = Base::cutWords($row['post_content'], 68);
$row['post_date'] = lang_date($row['post_date']);
$row['lang_num_answers'] = word_form($row['post_answers_num'], lang('Answer'), lang('Answers-m'), lang('Answers'));
$result[$ind] = $row;
}
$domains = LinkModel::getDomainsTop($domain);
$meta_title = lang('Domain') . ': ' . $domain .' | '. Config::get(Config::PARAM_NAME);
$meta_desc = lang('domain-desc') . ': ' . $domain .' '. Config::get(Config::PARAM_HOME_TITLE);
$data = [
'h1' => lang('Domain') . ': ' . $domain,
'canonical' => '/' . $domain,
'sheet' => 'domain',
'meta_title' => $meta_title,
'meta_desc' => $meta_desc,
];
return view(PR_VIEW_DIR . '/link/domain', ['data' => $data, 'uid' => $uid, 'posts' => $result, 'domains' => $domains]);
}
}

View file

@ -178,7 +178,7 @@ class MessagesController extends \MainController
redirect('/u/' . $uid['login'] . '/messages');
}
// Для пользователя с TL < N
// Участник с нулевым уровнем доверия должен быть ограничен в добавлении ЛС
Base::validTl($uid['trust_level'], Config::get(Config::PARAM_TL_ADD_PM), '/');
MessagesModel::SendMessage($uid['id'], $recipient_uid, $message);
@ -197,7 +197,7 @@ class MessagesController extends \MainController
redirect('/');
}
// Для пользователя с TL < N
// Участник с нулевым уровнем доверия должен быть ограничен в добавлении ЛС
Base::validTl($uid['trust_level'], Config::get(Config::PARAM_TL_ADD_PM), '/');
$data = [

View file

@ -5,6 +5,7 @@ use Hleb\Constructor\Handlers\Request;
use App\Models\PostModel;
use App\Models\UserModel;
use App\Models\SpaceModel;
use App\Models\LinkModel;
use App\Models\AnswerModel;
use App\Models\CommentModel;
use App\Models\VotesPostModel;
@ -325,10 +326,31 @@ class PostController extends \MainController
Base::Limits($post_content, lang('The post'), '6', '25000', $redirect);
if($post_url) {
// Поскольку это для поста, то получим превью
$og_img = self::grabOgImg($post_url);
$parse = parse_url($post_url);
$post_url_domain = $parse['host'];
$link_url = $parse['scheme'] . '://' . $parse['host'];
// Мы должны добавить домен, который появился в системе
// Далее мы можем менять ему статус, запрещать и т.д.
$link = LinkModel::getLinkOne($post_url_domain);
if(!$link) {
// Запишем минимальные данный для дальнешей работы
$data = [
'link_url' => $link_url,
'link_url_domain' => $post_url_domain,
'link_add_uid' => $uid['id'],
'link_type' => 0,
'link_status' => 200,
'link_cat_id' => 1,
];
LinkModel::addLinks($data);
} else {
LinkModel::addLinkCount($post_url_domain);
}
}
// images
$name = $_FILES['images']['name'][0];
if($name) {
@ -357,7 +379,6 @@ class PostController extends \MainController
$post_img = $year . $filename . '.webp';
}
}
// Проверяем url для > TL1
// Ввести проверку дублей и запрещенных, для img повторов
@ -367,8 +388,7 @@ class PostController extends \MainController
$og_img = empty($og_img) ? '' : $og_img;
$tag_id = empty($tag_id) ? 0 : $tag_id;
// Ограничим частоту добавления
// Добавить условие TL
// Участник с нулевым уровнем доверия должен быть ограничен в добавлении ответов
if($uid['trust_level'] < Config::get(Config::PARAM_TL_ADD_POST)) {
$num_post = PostModel::getPostSpeed($uid['id']);
if(count($num_post) > 2) {
@ -483,7 +503,7 @@ class PostController extends \MainController
->toFile($path . $year . $file .'.webp', 'image/webp');
if(file_exists($local)) {
unlink($path_img . $avatar['avatar']);
unlink($local);
return $year . $file .'.webp';
}

View file

@ -70,39 +70,4 @@ class SearchController extends \MainController
return view(PR_VIEW_DIR . '/search/index', ['data' => $data, 'uid' => $uid, 'result' => $result, 'query' => $query]);
}
// Поиск по домену
public function domain()
{
$domain = \Request::get('domain');
$uid = Base::getUid();
$post = SearchModel::getDomain($domain, $uid['id']);
Base::PageError404($post);
$result = Array();
foreach($post as $ind => $row){
$row['post_content_preview'] = Base::cutWords($row['post_content'], 68);
$row['post_date'] = lang_date($row['post_date']);
$row['lang_num_answers'] = word_form($row['post_answers_num'], lang('Answer'), lang('Answers-m'), lang('Answers'));
$result[$ind] = $row;
}
$domains = SearchModel::getDomainsTop($domain);
$meta_title = lang('Domain') . ': ' . $domain .' | '. Config::get(Config::PARAM_NAME);
$meta_desc = lang('domain-desc') . ': ' . $domain .' '. Config::get(Config::PARAM_HOME_TITLE);
$data = [
'h1' => lang('Domain') . ': ' . $domain,
'canonical' => '/' . $domain,
'sheet' => 'domain',
'meta_title' => $meta_title,
'meta_desc' => $meta_desc,
];
return view(PR_VIEW_DIR . '/search/domain', ['data' => $data, 'uid' => $uid, 'posts' => $result, 'domains' => $domains]);
}
}

View file

@ -23,7 +23,6 @@ return [
'forgot-password' => 'Forgot your password',
'repeat-password' => 'Repeat the password',
'ban-space' => 'This space is blocked',
'domain-desc' => 'Grouping posts by domain',
'no-cover' => 'No cover. Download it',
'select-file-up' => 'Select the file to upload',
@ -72,6 +71,10 @@ return [
'add_up_answ' => 'I liked the answer',
'add_up_comm' => 'liked the comment',
'domain-desc' => 'Grouping posts by domain',
'domains-title' => 'Sites in the system',
'domains-desc' => 'Statistics on domains, links that are used to compile publications on the site. Most visited, popular sites',
/* Setting */
'info_setting' => 'Fill in your name to help participants address you by your first name. <br> <br> Tell me something about yourself. You have a great opportunity to open up to please others and seem like an interesting person.',
'info_avatar' => 'Upload an avatar and cover image for your profile. <br><br> When each user has a unique avatar, it becomes much easier to follow the discussions!',

View file

@ -26,7 +26,6 @@ return [
'Action' => 'Действие',
'Domain' => 'Домен',
'Domains' => 'Домены',
'domain-desc' => 'Группировка постов в сообществе по домену',
'Sign in' => 'Войти',
'Sign out' => 'Выйти',
'Sign up' => 'Регистрация',
@ -329,6 +328,9 @@ return [
'info_login' => 'Авторизация дает вам возможность публиковать посты, отвечать, комментировать.<br><br>Вы можете голосовать за другие публикации, заполнять и редактировать профиль.',
'info_recover' => 'После того, как нажмете кнопку «Сбросить», проверьте свой e-mail...',
'domain-desc' => 'Группировка постов в сообществе по домену',
'domains-title' => 'Сайты в системе',
'domains-desc' => 'Статистика по доменам, ссылкам, которые используются для составление публикаций на сайте. Самые посещаемые, популярные сайты',
'Joined in the early days' => 'Присоединился в первые дни запуска сообщества',
'The owner restricted the publication' => 'Владелец пространства ограничил публикацию',

74
app/Models/LinkModel.php Normal file
View file

@ -0,0 +1,74 @@
<?php
namespace App\Models;
use XdORM\XD;
use DB;
use PDO;
class LinkModel extends \MainModel
{
// Получение постов по url
public static function getDomain($url, $uid)
{
$q = XD::select('*')->from(['posts']);
$query = $q->leftJoin(['users'])->on(['id'], '=', ['post_user_id'])
->leftJoin(['space'])->on(['space_id'], '=', ['post_space_id'])
->leftJoin(['votes_post'])->on(['votes_post_item_id'], '=', ['post_id'])
->and(['votes_post_user_id'], '=', $uid)
->where(['post_is_delete'], '=', 0)
->and(['post_url_domain'], '=', $url)
->orderBy(['post_id'])->desc();
return $query->getSelect();
}
// 5 популярных доменов
public static function getDomainsTop($domain)
{
return XD::select('*')->from(['links'])->where(['link_url_domain'], '=', $domain)
->and(['link_is_deleted'], '=', 0)->orderBy(['link_count'])->desc()->limit(10)->getSelect();
}
// Добавим домен
public static function addLinks($data)
{
XD::insertInto(['links'], '(',
['link_url'], ',',
['link_url_domain'], ',',
['link_title'], ',',
['link_content'], ',',
['link_add_uid'], ',',
['link_type'], ',',
['link_status'], ',',
['link_cat_id'], ',',
['link_count'],')')->values( '(',
XD::setList([
$data['link_url'],
$data['link_url_domain'],
'',
'',
$data['link_add_uid'],
$data['link_type'],
$data['link_status'],
$data['link_cat_id'],
1]), ')' )->run();
// id домена
return XD::select()->last_insert_id('()')->getSelectValue();
}
// Количество в системе
public static function addLinkCount($domain)
{
$sql = "UPDATE links SET link_count = (link_count + 1) WHERE link_url_domain = :domain";
DB::run($sql, ['domain' => $domain]);
}
// Проверим наличие домена
public static function getLinkOne($domain)
{
return XD::select('*')->from(['links'])->where(['link_url_domain'], '=', $domain)->getSelectOne();
}
}

View file

@ -20,37 +20,9 @@ class SearchModel extends \MainModel
{
// Без SNIPPET
// $sql = "SELECT * FROM postind WHERE MATCH(:qa)";
$sql = "SELECT id as post_id, space_slug, space_name, space_img, post_slug, post_space_id, post_votes, SNIPPET(post_title, :qa) as _title, SNIPPET(post_content, :qa) AS _content FROM postind WHERE MATCH(:qa)";
$result = DB::run($sql, ['qa' => $query], 'mysql.sphinx-search');
return $result->fetchall(PDO::FETCH_ASSOC);
}
// Получение постов по url
public static function getDomain($url, $uid)
{
$q = XD::select('*')->from(['posts']);
$query = $q->leftJoin(['users'])->on(['id'], '=', ['post_user_id'])
->leftJoin(['space'])->on(['space_id'], '=', ['post_space_id'])
->leftJoin(['votes_post'])->on(['votes_post_item_id'], '=', ['post_id'])
->and(['votes_post_user_id'], '=', $uid)
->where(['post_is_delete'], '=', 0)
->and(['post_url_domain'], '=', $url)
->orderBy(['post_id'])->desc();
return $query->getSelect();
}
// 5 популярных доменов
public static function getDomainsTop($domain)
{
$sql = "SELECT * FROM posts WHERE post_url_domain != '' AND post_url_domain != :domain";
$result = DB::run($sql, ['domain' => $domain]);
return $result->fetchall(PDO::FETCH_ASSOC);
}
}

View file

@ -572,21 +572,21 @@ ALTER TABLE `report`
--
CREATE TABLE `links` (
`link_id` int(11) NOT NULL,
`link_ind_id` int(11) DEFAULT '0' COMMENT 'Индификатор ссылки отличных от id',
`link_url` varchar(255) DEFAULT NULL,
`link_url_domain` varchar(255) DEFAULT NULL,
`link_title` varchar(250) NOT NULL,
`link_content` text NOT NULL,
`link_add_uid` int(11) NOT NULL DEFAULT 0 COMMENT 'Кто добавил',
`link_date` datetime NOT NULL DEFAULT current_timestamp(),
`link_type` int(6) NOT NULL DEFAULT 0 COMMENT 'Тип сайта (0 - общий, 1 - блог, 2 - энциклопедия)',
`link_status` int(6) NOT NULL DEFAULT 200 COMMENT 'Статус сайта (200, 403, 404)',
`link_status_date` datetime NOT NULL DEFAULT current_timestamp() COMMENT 'Когда была проверка статуса',
`link_cat_id` int(11) DEFAULT 0 COMMENT 'Категория сайта',
`link_votes` int(6) NOT NULL DEFAULT 0,
`link_is_deleted` tinyint(1) DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
`link_id` int(11) NOT NULL,
`link_url` varchar(255) DEFAULT NULL,
`link_url_domain` varchar(255) DEFAULT NULL,
`link_title` varchar(250) NOT NULL,
`link_content` text NOT NULL,
`link_add_uid` int(11) NOT NULL DEFAULT 0 COMMENT 'Кто добавил',
`link_date` datetime NOT NULL DEFAULT current_timestamp(),
`link_type` int(6) NOT NULL DEFAULT 0 COMMENT 'Тип сайта (0 - общий, 1 - блог, 2 - энциклопедия)',
`link_status` int(6) NOT NULL DEFAULT 200 COMMENT 'Статус сайта (200, 403, 404)',
`link_status_date` datetime NOT NULL DEFAULT current_timestamp() COMMENT 'Когда была проверка статуса',
`link_cat_id` int(11) DEFAULT 0 COMMENT 'Категория сайта',
`link_votes` int(6) DEFAULT 0,
`link_count` int(6) DEFAULT 0,
`link_is_deleted` tinyint(1) DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER TABLE `links`
ADD PRIMARY KEY (`link_id`);

View file

@ -136,8 +136,9 @@
<?php if (!empty($domains)) { ?>
<div class="bar-title small"><?= lang('Domains'); ?></div>
<?php foreach ($domains as $domain) { ?>
<a class="space-u tag-u" href="/domain/<?= $domain['post_url_domain']; ?>">
<i class="icon link"></i> <?= $domain['post_url_domain']; ?>
<a class="space-u tag-u" href="/domain/<?= $domain['link_url_domain']; ?>">
<i class="icon link"></i> <?= $domain['link_url_domain']; ?>
<sup class="date small"><?= $domain['link_count']; ?></sup>
</a><br>
<?php } ?>
<?php } ?>

View file

@ -0,0 +1,21 @@
<?php include TEMPLATE_DIR . '/header.php'; ?>
<div class="wrap">
<main>
<div class="white-box">
<div class="inner-padding space-tags">
<h1><?= $data['h1']; ?></h1>
<br>
<i>В стадии разработки...</i>
<br><br>
</div>
</div>
</main>
<aside>
<div class="white-box">
<div class="inner-padding space-tags">
<?= lang('domains-desc'); ?>.
</div>
</div>
</aside>
</div>
<?php include TEMPLATE_DIR . '/footer.php'; ?>

View file

@ -177,7 +177,9 @@ Route::type('post')->get('/comments/addform')->controller('CommentController@add
// Поиск
Route::type(['get','post'])->get('/search')->controller('SearchController');
Route::get('/domain/{domain}')->controller('SearchController@domain')->where(['domain' => '[A-Za-z0-9-.]+']);
// Домены
Route::get('/domains')->controller('LinkController');
Route::get('/domain/{domain}')->controller('LinkController@domain')->where(['domain' => '[A-Za-z0-9-.]+']);
Route::type(['get','post'])->get('/search/users')->controller('PostController@userSelect');
Route::type(['get','post'])->get('/search/posts')->controller('PostController@postsSelect');