meraproject/module/common/comment/discuss/model.php

298 lines
9.9 KiB
PHP
Raw Permalink Normal View History

<?
namespace common\comment;
use common\Comment;
use common\comment\Discuss\structure\eDiscussType;
use common\comment\discuss\Vote;
use core\db\structure\Column as C;
use core\db\structure\eColumnType;
use ms\ms\structure\msTo;
use ui\form\structure\eInputType;
use ui\Form;
use ui\input\Input;
use core\lang\structure\LangVariable as V;
use ms\ms\structure\msModuleTable;
use common\comment\discuss\structure\commentDiscussLang as Vars;
class Discuss extends msModuleTable {
static $self;
static $table_name = 'commentDiscuss';
static $controller = 'common.comment.discuss';
static $ID = 'id';
static $NAME = 'name';
static $TO = 'to';
static $OID = 'oid';
static $GROUP = 'group';
static $PROFILE = 'profile';
static $VOTES = 'votes';
static $TYPE = 'type';
static $COMMENTS = 'comments';
static $COMMENT = 'comment'; // Комментарий, который нужен для отображения текст-анонса
static $ACCOUNT = 'account';
static $CREATED = 'created';
static $UPDATED = 'updated';
static function getTitle(){return V::get(Vars::$MODULE_NAME);}
static function getSystemLangValues():array{ return Vars::getArray(); }
public static function installUniques() {
\DB::addIndexManyColumns(self::$table_name,[self::$TO,self::$OID]);
}
static function addComment($id,$text){
$res = ['e'=>0,'m'=>''];
$id = intval($id);
$text = trim((string)$text);
if(!IF_PROFILE) {
$res['e']=1;
$res['m']='Пожалуйста, авторизуйтесь, для оставления сообщения';
}
if($text=='') {
$res['e']=1;
$res['m']='Введите текст сообщения';
}
if($res['e']==0){
$r = Comment::insert([
Comment::$TO=>msTo::DISCUSS,
Comment::$OID=>$id,
Comment::$TEXT=>$text,
Comment::$PROFILE => PID,
]);
self::updateById($id,[
self::$COMMENT => $r->id,
self::$UPDATED => time(),
]);
}
return $res;
}
static function getComments($id){
$res = [];
return Comment::get(msTo::DISCUSS,$id);
}
static function get($to,$oid,$type=eDiscussType::DISCUSS,$options=[]){
$res = [];
$to = intval($to);
$oid = intval($oid);
$type = intval($type);
$search = trim((string)$options['search']);
if($to and $oid){
$res = self::select([
\Query::LEFT_JOINS => [
[\Profile::$table_name,\Profile::$ID,self::$PROFILE],
[Comment::$table_name,Comment::$ID,self::$COMMENT],
],
\Query::WHERE => new \Where(\Where::_and([
\Where::_operator(self::$TO,'=',$to),
\Where::_operator(self::$OID,'=',$oid),
\Where::_operator(self::$TYPE,'=',$type),
$search ? \Where::_operator(self::$NAME,'LIKE','%'.$search.'%') : null,
])),
\Query::SORT => [self::$UPDATED=>'DESC'],
],true);
}
return $res;
}
static function remathVotes($id){
$id = intval($id);
$r = Vote::select($q = [
\Query::SELECT => [
'COUNT('.Vote::$ID.') as cc'
],
\Query::WHERE => new \Where(\Where::_and([
\Where::_operator(Vote::$DISCUSS,'=',$id)
]))
]);
$l = \DB::fetch($r);
$count = intval($l['cc']);
self::updateById($id,[
self::$VOTES => $count,
]);
}
static function getFormatted($to,$oid,$type=eDiscussType::DISCUSS,$options = []){
$res = [];
$a = self::get($to,$oid,$type,$options);
foreach ($a as $v){
$res[] = self::format($v);
}
return $res;
}
static function getVoted($v){
$res = false;
if(!IF_PROFILE) return false;
if($v[self::$TYPE]==eDiscussType::PROPOSALS){
$res = boolval(Vote::get($v[self::$ID]));
}
return $res;
}
static function format($v){
return [
'id' => $v[self::$ID],
'date' => $v[self::$CREATED],
'name' => trim((string)$v[self::$NAME]),
'comment' => Comment::format($v),
'comments' => intval($v[self::$COMMENTS]),
'votes' => intval($v[self::$VOTES]),
'voted' => self::getVoted($v),
'type' => intval($v[self::$TYPE]),
'is_my' => boolval($v[self::$PROFILE]==PID),
];
}
static function add($to,$oid,$name,$text,$type=eDiscussType::DISCUSS){
$res = ['e'=>0,'m'=>'',];
$name = trim((string)$name);
$test = trim((string)$text);
$type = trim((string)$type);
$to = intval($to);
$oid = intval($oid);
if( !$to || !$oid ) {
$res['e'] = 1;
$res['m'] = 'Не удаётся создать обсуждение';
}
if($name==''){
$res['e'] = 1;
$res['m'] = 'Введите, пожалуйста, название обсуждения';
} else if($text==''){
$res['e'] = 1;
$res['m'] = 'Введите, пожалуйста, текст первого сообщения';
} else if(!IF_PROFILE){
$res['e'] = 1;
$res['m'] = 'Для начала обсуждения, пожалуйста, авторизуйтесь';
}
if($res['e']==0){
$r2 = self::insert([
self::$NAME => $name,
self::$PROFILE => PID,
self::$TO => $to,
self::$OID => $oid,
self::$TYPE => $type,
]);
$r = comment::insert([
Comment::$TEXT => $text,
Comment::$PROFILE => PID,
Comment::$TO => msTo::DISCUSS,
Comment::$OID => $r2->id,
]);
$r3 = self::updateById($r2->id,[
self::$COMMENT => $r->id
]);
$res['r'] = $r;
$res['r2'] = $r2;
$res['r3'] = $r3;
$res['id'] = $r2->id;
}
return $res;
}
static function columnInfo() : array {
return [
new C([
C::VAR_NAME =>&self::$ID,
C::TYPE =>eColumnType::INT,
C::AUTO_INCREMENT =>true,
C::PRIMARY =>true,
C::DEFAULT =>0,
C::HIDDEN =>true,
C::TH =>V::get(Vars::$ID),
]),
new C([
C::VAR_NAME => &self::$NAME,
C::TYPE => eColumnType::VARCHAR,
C::LENGTH => 1023,
C::TH => V::get(Vars::$NAME),
]),
new C([
C::VAR_NAME => &self::$TO,
C::TYPE => eColumnType::INT,
]),
new C([
C::VAR_NAME => &self::$OID,
C::TYPE => eColumnType::INT,
]),
new C([
C::VAR_NAME => &self::$GROUP,
C::TYPE => eColumnType::INT,
]),
new C([
C::VAR_NAME => &self::$PROFILE,
C::TYPE => eColumnType::INT,
C::DEFAULT => intval(PID),
]),
new C([
C::VAR_NAME => &self::$TYPE,
C::TYPE => eColumnType::TINYINT,
C::DEFAULT => intval(eDiscussType::DISCUSS),
C::COL_DEFAULT => intval(eDiscussType::DISCUSS),
]),
new C([
C::VAR_NAME => &self::$COMMENT,
C::TYPE => eColumnType::INT,
]),
new C([
C::VAR_NAME => &self::$VOTES,
C::TYPE => eColumnType::INT,
]),
new C([
C::VAR_NAME => &self::$COMMENTS,
C::TYPE => eColumnType::INT,
]),
new C([
C::VAR_NAME => &self::$ACCOUNT,
C::TYPE => eColumnType::INT,
C::LENGTH => 11,
C::TH => V::get(Vars::$ACCOUNT),
C::DEFAULT => intval(\Site::$owner_id),
c::HIDDEN=>true,
c::FUNC_VALUE => function($v){
if($id = $v[self::$ACCOUNT]) {
return \Account::getName( \Account::getByID($id) );
} else return '-';
},
]),
new C([
C::VAR_NAME => &self::$CREATED,
C::TYPE => eColumnType::INT,
C::LENGTH => 11,
C::TH => V::get(Vars::$CREATED),
C::DEFAULT => time(),
c::FUNC_VALUE => function($v){return self::formatDate($v[self::$CREATED]);},
c::HIDDEN=>true,
]),
new C([
C::VAR_NAME => &self::$UPDATED,
C::TYPE => eColumnType::INT,
C::DEFAULT => time(),
C::TH => V::get(Vars::$UPDATED),
c::FUNC_VALUE => function($v){return self::formatDate($v[self::$UPDATED]);},
c::HIDDEN=>true,
]),
];
}
}
new Discuss();
///