meraproject/module/vcard/card/model.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

552 lines
24 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?
namespace vcard;
use common\Image;
use core\db\structure\Column as C;
use core\db\structure\eColumnType;
use ms\MS;
use themes\Mstome;
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 vcard\card\structure\eBackgroundClass;
use vcard\card\structure\eTemplate;
use vcard\card\structure\eVcardPayType;
use vcard\card\structure\vcardCardLang as Vars;
use vcard\profile as CardProfile;
class Card extends msModuleTable {
static $self;
static $table_name = 'vcardCard';
static $controller = 'vcard.card';
static $ID = 'id';
static $NAME = 'name';
static $TEXT_ID = 'text_id';
static $HELLO = 'hello';
static $TEXT = 'text';
static $PAGE_BACKGROUND = 'page_background';
static $PAGE_CLASS = 'page_class';
static $CARD_BACKGROUND = 'card_background';
static $CARD_CLASS = 'card_class';
static $AVATAR = 'avatar';
static $ICON = 'icon';
static $TEMPLATE = 'template';
static $IS_LOGO_FOOTER = 'is_logo_footer';
static $PROFILE = 'profile';
static $PORTAL = 'portal';
static $FB_PIXEL = 'fb_pixel';
static $VK_PIXEL = 'vk_pixel';
static $YA_METRIC = 'ya_metric';
static $GA_METRIC = 'ga_metric';
static $BAN = 'ban';
static $ADULT = 'adult';
static $MODERATE = 'moderate';
static $ACCEPT = 'accept';
static $PAY_TYPE = 'pay_type';
static $EXPIRE = 'expire';
static $VIEWS = 'views';
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 function _update(\Where $w, array $values) {
$values[self::$UPDATED] = time();
$values[self::$MODERATE] = isset($values[self::$MODERATE]) ? $values[self::$MODERATE] : 0;
return parent::_update($w, $values);
}
static function setNeedModerate($card_id){
self::updateById($card_id,[self::$MODERATE=>0]);
}
static function check_bg_class($x){
return in_array($x,array_keys(eBackgroundClass::getArray())) ? $x : 0;
}
static function setBan($card_id,$is_ban){
self::updateById($card_id,[self::$BAN=>$is_ban?1:0]);
}
static function setAdult($card_id,$is_adult){
self::updateById($card_id,[self::$ADULT=>$is_adult?1:0]);
}
static function getAllByProfile($pid,$isAssoc = true){
$pid = intval($pid);
$res = [];
if($pid) {
$res = self::select([
\Query::WHERE => new \Where(\Where::_and([
\Where::_operator(self::$PROFILE,'=',$pid),
]))
],$isAssoc);
}
return $res;
}
static function getByTextIDAndPortal($text_id,$portal){
$res = null;
$r = self::select([
\Query::COUNT => 1,
\Query::WHERE => new \Where(\Where::_and([
\Where::_operator(self::$TEXT_ID,'=',$text_id),
\Where::_operator(self::$PORTAL,'=',$portal),
]))
],false);
if(\DB::numRows($r)){
$res = \DB::fetch($r);
}
return $res;
}
public static function installUniques() {
\DB::addIndex(self::$table_name,self::$TEXT_ID);
\DB::addIndex(self::$table_name,self::$PORTAL);
\DB::addIndex(self::$table_name,self::$PROFILE);
\DB::addIndex(self::$table_name,self::$ACCOUNT);
}
static function getBlocks($card_id,$options=[]){
$r = Block::getByCard($card_id);
$res = [];
foreach ($r as $k=>$v){
$res[] = Block::format($v,$options);
}
return $res;
}
static function view($id){
$id = intval($id);
$CARD = self::getByID($id);
$newViews = $CARD[self::$VIEWS]+1;
Card::updateById($id,[
self::$VIEWS => $newViews
]);
}
static function getCardLink($v){
return \Site::sectionUrl($v[self::$TEXT_ID],true);
}
static function format($v,$options=[]){
$images_ids = [];
$images = [];
$cloud = $options['cloud'];
$profile = CardProfile::getByID($v[self::$PROFILE]);
$isProfileExpire = CardProfile::isExpire($profile);
if($c = intval($v[self::$AVATAR])) $images_ids[] = $c;
if($c = intval($v[self::$PAGE_BACKGROUND])) $images_ids[] = $c;
if($c = intval($v[self::$CARD_BACKGROUND])) $images_ids[] = $c;
if($c = intval($v[self::$ICON])) $images_ids[] = $c;
if($images_ids){
$images = Image::getByIDS($images_ids);
//*
if($images[$v[self::$PAGE_BACKGROUND]]) {
$images[$v[self::$PAGE_BACKGROUND]] = Image::imageResize($images[$v[self::$PAGE_BACKGROUND]],1920,0,90,['cloud'=>$cloud]);
}
if($images[$v[self::$CARD_BACKGROUND]]) {
//$images[$v[self::$CARD_BACKGROUND]] = Image::imageResize($images[$v[self::$CARD_BACKGROUND]],600,0,100,['crop'=>'center','cloud'=>$cloud]);
$images[$v[self::$CARD_BACKGROUND]] = Image::imageResize($images[$v[self::$CARD_BACKGROUND]],0,0,90,['cloud'=>$cloud]);;
}
if($images[$v[self::$AVATAR]]) {
$images[$v[self::$AVATAR]] = Image::imageResize($images[$v[self::$AVATAR]],82,82,100,['crop'=>'center','cloud'=>$cloud]);
}
if($images[$v[self::$ICON]]) {
$images[$v[self::$ICON]] = Image::imageResize($images[$v[self::$ICON]],34,34,100,['crop'=>'center','cloud'=>$cloud]);
}
/**/
}
$footer = '';
$isAdult = boolval($v[self::$ADULT]);
$isBan = boolval($v[self::$BAN]);
$ad = '';
if($isAdult) {
if($isProfileExpire) {
$ad = '';
}
$footer = '<div id="adult">🔞 <small>На данной странице размещён контент для взрослых или ссылается на таковой. Пожалуйста, покиньте страницу, если по закону вам нельзя наблюдать такой контент.</small> </div>';
}
return [
'id' => intval($v[self::$ID]), // number
'title' => $v[self::$NAME], // string
'account' => intval($v[self::$ACCOUNT]), // number
'text_id' => $v[self::$TEXT_ID], // string
'link' => self::getCardLink($v), // string
'hello' => $v[self::$HELLO], // string
'text' => $v[self::$TEXT], // string
'page_bg' => ($c = $images[$v[self::$PAGE_BACKGROUND]]) ? $c : '', // string
'page_class' => intval($v[self::$PAGE_CLASS]), // number
'card_bg' => ($c = $images[$v[self::$CARD_BACKGROUND]]) ? $c : '', // string
'card_class' => intval($v[self::$CARD_CLASS]), // number
'avatar' => ($c = $images[$v[self::$AVATAR]]) ? $c : '', // string
'icon' => ($c = $images[$v[self::$ICON]]) ? $c : \Site::themeUrl('pics/logo.svg',true), // string
'template' => intval($v[self::$TEMPLATE]), // ETemplate
'is_logo_footer' => boolval($v[self::$IS_LOGO_FOOTER]), // boolean
'fb_pixel' => $v[self::$FB_PIXEL], // string
'vk_pixel' => $v[self::$VK_PIXEL], // string
'ya_metric' => $v[self::$YA_METRIC], // string
'ga_metric' => $v[self::$GA_METRIC], // string
'blocks' => self::getBlocks($v[self::$ID],$options), // string
'pay_type' => intval($v[self::$PAY_TYPE]),
'expire' => $v[self::$EXPIRE]!='0000-00-00' ? date('d.m.Y',strtotime($v[self::$EXPIRE])) : '0000-00-00',
'views' => intval($v[self::$VIEWS]),
'is_adult' => boolval($v[self::$ADULT]),
'is_ban' => boolval($v[self::$BAN]),
'ad' => $ad,
'footer' => $footer,
];
}
static function getForm($values = [], $options = []) :array {
return [
self::getCommonFormInputs(),
[
Form::VIEW=>Form::ROW,
Form::COLS => [
[
Form::VIEW =>Form::INPUT,
Form::COL_CLASSES =>'col-12',
Form::KEY_VALUE =>self::$NAME,
Form::TYPE =>eInputType::TEXT,
Form::INPUT_OPT => [
Input::PLACEHOLDER => $c = V::get(Vars::$NAME),
Input::LABEL => $c,
],
],
],
],
[
Form::VIEW=>Form::ROW,
Form::COLS => [
[
Form::VIEW =>Form::INPUT,
Form::COL_CLASSES =>'c-100 ',
Form::KEY_VALUE =>self::$BAN,
Form::TYPE =>eInputType::SWITCH_IOS,
Form::INPUT_OPT => [
Input::PLACEHOLDER => $c = V::get(Vars::$BAN),
Input::LABEL => '',
Input::VALUE => 1,
Input::CHECKED => boolval($values[self::$BAN]),
],
],
[
Form::VIEW =>Form::INPUT,
Form::COL_CLASSES =>'c-100 ',
Form::KEY_VALUE =>self::$ADULT,
Form::TYPE =>eInputType::SWITCH_IOS,
Form::INPUT_OPT => [
Input::PLACEHOLDER => $c = V::get(Vars::$ADULT),
Input::LABEL => '',
Input::VALUE => 1,
Input::CHECKED => boolval($values[self::$ADULT]),
],
],
[
Form::VIEW =>Form::INPUT,
Form::COL_CLASSES =>'c-100 ',
Form::KEY_VALUE =>self::$MODERATE,
Form::TYPE =>eInputType::SWITCH_IOS,
Form::INPUT_OPT => [
Input::PLACEHOLDER => $c = V::get(Vars::$MODERATE),
Input::LABEL => '',
Input::VALUE => 1,
Input::CHECKED => boolval($values[self::$MODERATE]),
],
],
[
Form::VIEW =>Form::INPUT,
Form::COL_CLASSES =>'c-100 ',
Form::KEY_VALUE =>self::$ACCEPT,
Form::TYPE =>eInputType::SWITCH_IOS,
Form::INPUT_OPT => [
Input::PLACEHOLDER => $c = V::get(Vars::$ACCEPT),
Input::LABEL => '',
Input::VALUE => 1,
Input::CHECKED => boolval($values[self::$ACCEPT]),
],
],
],
],
self::getCommonFormSubmits($values),
];
}
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::DEFAULT => 'Моё имя',
C::TH => V::get(Vars::$NAME),
C::FUNC_VALUE_DATA => function($v){
$profile = \Profile::getByID($v[self::$PROFILE]);
return $v[self::$NAME].
('<br/>'.$profile[\Profile::$LOGIN])
;
}
]),
new C([
C::VAR_NAME => &self::$PAY_TYPE,
C::TYPE => eColumnType::TINYINT,
C::LENGTH => 1,
C::DEFAULT => eVcardPayType::FREE,
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$EXPIRE,
C::TYPE => eColumnType::DATE,
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$VIEWS,
C::TYPE => eColumnType::INT,
C::DEFAULT => 0,
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$TEXT_ID,
C::TYPE => eColumnType::VARCHAR,
C::LENGTH => 127,
C::DEFAULT => 'card'.time(),
C::TH => V::get(Vars::$TEXT_ID),
C::FUNC_VALUE_DATA => function($v){
//$img = Image::getByID($v[self::$AVATAR]);
return '<a class="link" href="/'.h($v[self::$TEXT_ID]).'/" target="_blank">'.h($v[self::$TEXT_ID]).'</a>';// Image::imageResize($img,100,100,90,['crop'=>'center','cloud'=>Mstome::$CLOUD]);
}
]),
new C([
C::VAR_NAME => &self::$HELLO,
C::TYPE => eColumnType::TEXT,
C::DEFAULT => 'Всем привет!😉',
C::TH => V::get(Vars::$HELLO),
C::TD_CLASS => 'text_wrap',
]),
new C([
C::VAR_NAME => &self::$TEXT,
C::TYPE => eColumnType::TEXT,
C::DEFAULT => 'Мы на связи и отвечаем в течение 5 минут',
C::TH => V::get(Vars::$TEXT),
C::TD_CLASS => 'text_wrap',
]),
new C([
C::VAR_NAME => &self::$PAGE_BACKGROUND,
C::TYPE => eColumnType::INT,
C::DEFAULT => 0,
C::TH => V::get(Vars::$PAGE_BACKGROUND),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$PAGE_CLASS,
C::TYPE => eColumnType::INT,
C::DEFAULT => eBackgroundClass::PAPAYA,
C::TH => V::get(Vars::$PAGE_CLASS),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$CARD_BACKGROUND,
C::TYPE => eColumnType::INT,
C::DEFAULT => 0,
C::TH => V::get(Vars::$CARD_BACKGROUND),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$CARD_CLASS,
C::TYPE => eColumnType::INT,
C::DEFAULT => eBackgroundClass::PAPAYA,
C::TH => V::get(Vars::$CARD_CLASS),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$AVATAR,
C::TYPE => eColumnType::INT,
C::DEFAULT => 0,
C::TH => V::get(Vars::$AVATAR),
C::FUNC_VALUE_DATA => function($v){
$img = Image::getByID($v[self::$AVATAR]);
return Image::imageResize($img,100,100,90,['crop'=>'center','cloud'=>Mstome::$CLOUD]);
}
]),
new C([
C::VAR_NAME => &self::$ICON,
C::TYPE => eColumnType::INT,
C::DEFAULT => 0,
C::TH => V::get(Vars::$ICON),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$TEMPLATE,
C::TYPE => eColumnType::TINYINT,
C::DEFAULT => eTemplate::CLASSIC,
C::TH => V::get(Vars::$TEMPLATE),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$IS_LOGO_FOOTER,
C::TYPE => eColumnType::TINYINT,
C::LENGTH => 1,
C::DEFAULT => 0,
C::TH => V::get(Vars::$IS_LOGO_FOOTER),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$PROFILE,
C::TYPE => eColumnType::INT,
C::LENGTH => 11,
C::DEFAULT => intval(PID),
C::TH => V::get(Vars::$PROFILE),
]),
new C([
C::VAR_NAME => &self::$PORTAL,
C::TYPE => eColumnType::INT,
C::LENGTH => 11,
C::DEFAULT => intval(\Site::$portal_id),
C::TH => V::get(Vars::$PORTAL),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$FB_PIXEL,
C::TYPE => eColumnType::VARCHAR,
C::LENGTH => 127,
C::TH => V::get(Vars::$FB_PIXEL),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$VK_PIXEL,
C::TYPE => eColumnType::VARCHAR,
C::LENGTH => 127,
C::TH => V::get(Vars::$VK_PIXEL),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$YA_METRIC,
C::TYPE => eColumnType::VARCHAR,
C::LENGTH => 127,
C::TH => V::get(Vars::$YA_METRIC),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$GA_METRIC,
C::TYPE => eColumnType::VARCHAR,
C::LENGTH => 127,
C::TH => V::get(Vars::$GA_METRIC),
C::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$BAN,
C::TYPE => eColumnType::TINYINT,
C::DEFAULT => 0,
C::LENGTH => 1,
C::TH => V::get(Vars::$BAN),
C::FUNC_VALUE_DATA => function($v){
return MS::getBoolValText($v[self::$BAN]);
}
]),
new C([
C::VAR_NAME => &self::$ADULT,
C::TYPE => eColumnType::TINYINT,
C::DEFAULT => 0,
C::LENGTH => 1,
C::TH => V::get(Vars::$ADULT),
C::FUNC_VALUE_DATA => function($v){
return MS::getBoolValText($v[self::$ADULT]);
}
]),
new C([
C::VAR_NAME => &self::$MODERATE,
C::TYPE => eColumnType::TINYINT,
C::DEFAULT => 0,
C::LENGTH => 1,
C::TH => V::get(Vars::$MODERATE),
C::FUNC_VALUE_DATA => function($v){
return MS::getBoolValText($v[self::$MODERATE]);
}
]),
new C([
C::VAR_NAME => &self::$ACCEPT,
C::TYPE => eColumnType::TINYINT,
C::DEFAULT => 0,
C::LENGTH => 1,
C::TH => V::get(Vars::$ACCEPT),
C::FUNC_VALUE_DATA => function($v){
return MS::getBoolValText($v[self::$ACCEPT]);
}
]),
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 Card();
///