meraproject/module/vcard/block/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

520 lines
19 KiB
PHP

<?
namespace vcard;
use core\db\structure\Column as C;
use core\db\structure\eColumnType;
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\block\structure\eVcardBlockType;
use vcard\block\structure\vcardBlockLang as Vars;
class Block extends msModuleTable {
static $self;
static $table_name = 'vcardBlock';
static $controller = 'vcard.block';
static $ID = 'id';
static $NAME = 'name';
static $TYPE = 'type';
static $SETTINGS = 'settings';
static $POS = 'pos';
static $PROFILE = 'profile';
static $CARD = 'card';
static $VIS = 'vis';
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();
return parent::_update($w, $values);
}
public static function installUniques() {
\DB::addIndex(self::$table_name,self::$CARD);
\DB::addIndex(self::$table_name,self::$VIS);
\DB::addIndex(self::$table_name,self::$POS);
\DB::addIndex(self::$table_name,self::$PROFILE);
}
static function getHash($key,$v){
return md5($key.SALT.$key.$v[self::$CREATED].$v[self::$ID]);
}
static function generateHash($v){
$key = time().'_'.rand(0,100000);
return [
'hash'=>self::getHash($key,$v),
'key'=>$key,
];
}
static function getItems($block_id,$isAssoc = true){
$block_id = intval($block_id);
$res = null;
if($block_id) {
$res = Item::select([
\Query::WHERE => new \Where(\Where::_operator(Item::$BLOCK,'=',$block_id)),
\Query::SORT => [Item::$POS=>'ASC'],
],$isAssoc);
}
return $res;
}
public static function getName($v, array $options = []): string {
$block_name = trim($v[self::$NAME]);
$type = intval($v[self::$TYPE]);
if(!$block_name){
$block_name = eVcardBlockType::getArray()[$type]['def'];
}
return (string)$block_name;
//return parent::getName($v, $options); // TODO: Change the autogenerated stub
}
static function format($v,$options=[]){
$items= [];
$form = [];
$block_id = intval($v[self::$ID]);
switch ($v[self::$TYPE]) {
case eVcardBlockType::SHOP:
$items = [];
$a = Block::getItems($block_id);
foreach ($a as $item){
$items[] = Item::format($item,$options);
}
break;
}
switch ($v[self::$TYPE]) {
case eVcardBlockType::SHOP:
case eVcardBlockType::FORM:
$hash = self::generateHash($v);
$form = [
'key' =>$hash['key'],
'hash' =>$hash['hash'],
];
break;
}
$type = intval($v[self::$TYPE]);
/*
$block_name = trim($v[self::$NAME]);
if(!$block_name){
$block_name = eVcardBlockType::getArray()[$type]['def'];
}
/**/
return [
'id' => $block_id,
'name' => self::getName($v),
'pos' => intval($v[self::$POS]),
'type' => $type,
'vis' => boolval($v[self::$VIS]),
'link' => self::formatLink($v),
'settings' => json_decode($v[self::$SETTINGS],true),
'form' => $form,
'items' => $items,
'paid' => false,
'access' => false,
];
}
static function getByCard($card_id,$isAssoc = true){
$res = null;
$card_id = intval($card_id);
if($card_id) {
$res = self::select([
\Query::WHERE => new \Where(\Where::_operator(self::$CARD,'=',$card_id)),
\Query::SORT => self::$POS
],$isAssoc);
}
return $res;
}
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,
],
],
]
],
self::getCommonFormSubmits($values),
];
}
static function clearLink($x){
$s = substr($x,0,7);
if($s!='http://' and $s!='https:/') $x = "http://".$x;
return h(strip_tags($x));
}
static function parseYoutubeUrl($url){
$res = '';
if ($url){
$result = parse_url($url);
if (in_array($result['host'],array('www.youtube.com','youtube.com'))) {
if ($result['query']){
$res = preg_replace("/^\w\=/", "", $result['query']);
$res = preg_replace("/\&.*/", "", $res);
} else {
$res = preg_replace("/^\/.*\//", "", $result['path']);
}
} else if ($result['host'] == 'youtu.be'){
$res = preg_replace("/^\//", "", $result['path']);
}
}
return $res;
}
static function formatLink($v){
$settings = json_decode($v[self::$SETTINGS],true);
$link = $settings['link'];
$link = h(str_replace([" ",'javascript:'],"",trim(strip_tags($link))));
switch ($v[self::$TYPE]){
case eVcardBlockType::WHATSAPP:
$phone = preg_replace('/[^\d]/','',$link);
$text = $settings['text'];
return 'https://api.whatsapp.com/send?phone='.$phone.'&text='.h($text);
break;
case eVcardBlockType::VIBER:
//return 'viber://chat?number='.preg_replace('/[^\d]/','',$l[ST_LINK_LINK]).'';
return 'viber://add?number='.preg_replace('/[^\d]/','',$link).'';
break;
case eVcardBlockType::VIBER_BOT:
//return 'viber://chat?number='.preg_replace('/[^\d]/','',$l[ST_LINK_LINK]).'';
return 'viber://pa/info?uri='.$link.'';
break;
case eVcardBlockType::VIBER_BOT2:
//return 'viber://chat?number='.preg_replace('/[^\d]/','',$l[ST_LINK_LINK]).'';
return 'viber://pa/chatURI='.$link.'';
break;
case eVcardBlockType::GOOGLE_PLAY:
//return 'viber://chat?number='.preg_replace('/[^\d]/','',$l[ST_LINK_LINK]).'';
return 'https://play.google.com/store/apps/details?id='.$link.'';
break;
case eVcardBlockType::APP_STORE:
$a = array(
"https://apps.apple.com/"=>"",
"http://apps.apple.com/"=>"",
"http://www.apps.apple.com/"=>"",
"https://www.apps.apple.com/"=>"",
" "=>"",
);
return "https://apps.apple.com/".str_replace(array_keys($a),array_values($a),$link);
case eVcardBlockType::TELEGRAM:
$a = array(
"https://t.me/"=>"",
"http://t.me/"=>"",
"http://www.t.me/"=>"",
"https://www.t.me/"=>"",
"@"=>"",
);
//return "https://web.telegram.org/#/im?p=".str_replace(array_keys($a),array_values($a),$l[ST_LINK_LINK]);
//return "https://t.me/".str_replace(array_keys($a),array_values($a),$l[ST_LINK_LINK]);
//return "https://t-go.me/".str_replace(array_keys($a),array_values($a),$link);
return "https://t.me/".str_replace(array_keys($a),array_values($a),$link);
break;
case eVcardBlockType::TIK_TOK:
$a = array(
"https://tiktok.com/"=>"",
"http://tiktok.com/"=>"",
"http://www.tiktok.com/"=>"",
"https://www.tiktok.com/"=>"",
"@"=>"",
" "=>"",
);
return "https://tiktok.com/".str_replace(array_keys($a),array_values($a),$link);
break;
case eVcardBlockType::FL_RU:
$a = array(
"https://fl.ru/"=>"",
"http://fl.ru/"=>"",
"http://www.fl.ru/"=>"",
"https://www.fl.ru/"=>"",
"@"=>"",
"/"=>"",
" "=>"",
);
return "https://www.fl.ru/users/".str_replace(array_keys($a),array_values($a),$link).'/';
break;
case eVcardBlockType::FACEBOOK_MESSENGER:
$a = array(
"https://m.me/"=>"",
"http://m.me/"=>"",
"http://www.m.me/"=>"",
"https://www.m.me/"=>"",
"@"=>"",
);
return "https://m.me/".str_replace(array_keys($a),array_values($a),$link);
break;
case eVcardBlockType::VKONTAKTE_CHAT:
$a = array(
"https://vk.me/"=>"",
"http://vk.me/"=>"",
"http://www.vk.me/"=>"",
"https://www.vk.me/"=>"",
"@"=>"",
);
return "https://vk.me/".str_replace(array_keys($a),array_values($a),$link);
break;
case eVcardBlockType::VKONTAKTE_PAGE:
$a = array(
"https://vk.com/"=>"",
"http://vk.com/"=>"",
"http://www.vk.com/"=>"",
"https://www.vk.com/"=>"",
"https://m.vk.com/"=>"",
"http://m.vk.com/"=>"",
"http://www.m.vk.com/"=>"",
"https://www.m.vk.com/"=>"",
"@"=>"",
);
return "https://vk.com/".str_replace(array_keys($a),array_values($a),$link);
break;
case eVcardBlockType::EMAIL:
return 'mailto:'.preg_replace('/[^-_a-z0-9.@]/','',$link);
break;
case eVcardBlockType::PHONE:
return 'tel:+'.preg_replace('/[^\d]/','',$link);
break;
case eVcardBlockType::TWITCH:
$link = self::clearLink($link);
$x = parse_url($link);
//if( !in_array($x['host'],array('twitch.tv','www.twitch.tv'))) $link = '';
return 'https://www.twitch.tv'.$x['path'];
break;
case eVcardBlockType::INSTAGRAM:
$a = array(
'instagramm'=>'instagram',
);
$link = str_replace(array_keys($a),array_values($a),$link);
$a = array(
"https://www.instagram.com/"=>"",
"http://www.instagram.com/"=>"",
"https://instagram.com/"=>"",
"http://instagram.com/"=>"",
"instagram.com/"=>"",
"www.instagram.com/"=>"",
"https://www.m.instagram.com/"=>"",
"http://www.m.instagram.com/"=>"",
"https://m.instagram.com/"=>"",
"http://m.instagram.com/"=>"",
"m.instagram.com/"=>"",
"www.m.instagram.com/"=>"",
"@"=>"",
);
return "https://instagram.com/".str_replace(array_keys($a),array_values($a),$link);
break;
case eVcardBlockType::FACEBOOK:
$a = array(
"https://fb.com/"=>"",
"http://fb.com/"=>"",
"https://facebook.com/"=>"",
"http://facebook.com/"=>"",
"https://www.fb.com/"=>"",
"http://www.fb.com/"=>"",
"https://www.facebook.com/"=>"",
"http://www.facebook.com/"=>"",
"https://m.fb.com/"=>"",
"http://m.fb.com/"=>"",
"https://m.facebook.com/"=>"",
"http://m.facebook.com/"=>"",
"https://www.m.fb.com/"=>"",
"http://www.m.fb.com/"=>"",
"https://www.m.facebook.com/"=>"",
"http://www.m.facebook.com/"=>"",
"@"=>"",
);
return "https://fb.com/".str_replace(array_keys($a),array_values($a),$link);
break;
case eVcardBlockType::SKYPE:
//return "skype:".$l[ST_LINK_LINK].'?chat';
return "skype:".$link;//.'?chat';
break;
case eVcardBlockType::TWITTER:
$link = self::clearLink($link);
$x = parse_url($link);
if( !in_array($x['host'],array('twitter.com'))) $link = '';
return $link;
case eVcardBlockType::PINTEREST:
$link = self::clearLink($link);
$x = parse_url($link);
$x = explode(".",$x['host']);
if( !in_array($x[ count($x)-2 ],array('pinterest'))) $link = '';
return $link;
case eVcardBlockType::YOUTUBE:
$link = self::clearLink($link);
$x = parse_url($link);
if( !in_array($x['host'],array('youtube.com','www.youtube.com','youtu.be',))) $link = '';
return $link;
break;
case eVcardBlockType::ITUNES:
$link = self::clearLink($link);
$x = parse_url($link);
if( !in_array($x['host'],array('apple.com','www.apple.com','www.itunes.com','itunes.com'))) $link = '';
return $link;
break;
case eVcardBlockType::ODNOKLASSINKI:
$link = self::clearLink($link);
$x = parse_url($link);
if( !in_array($x['host'],array('ok.ru','www.ok.ru'))) $link = '';
return $link;
break;
case eVcardBlockType::YOUTUBE_EMBED:
return 'https://www.youtube.com/embed/'.self::parseYoutubeUrl($link);
break;
case eVcardBlockType::YANDEX_MAPS:
$link = self::clearLink($link);
$x = parse_url($link);
if( !in_array($x['host'],array('yandex.ru','www.yandex.ru'))) $link = '';
return $link;
break;
case eVcardBlockType::GOOGLE_MAPS:
$link = self::clearLink($link);
$x = parse_url($link);
if( !in_array($x['host'],array('google.ru','www.google.ru','google.com','www.google.com'))) $link = '';
return $link;
break;
case eVcardBlockType::SITE:
case eVcardBlockType::SITE_CUSTOM:
return \Site::sectionUrl('away/'.$v[self::$ID].'/',true);
default:
return self::clearLink($link);
}
}
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::TEXT,
C::DEFAULT => 0,
C::TH => V::get(Vars::$NAME),
]),
new C([
C::VAR_NAME => &self::$TYPE,
C::TYPE => eColumnType::INT,
C::DEFAULT => 0,
C::TH => V::get(Vars::$TYPE),
]),
new C([
C::VAR_NAME => &self::$SETTINGS,
C::TYPE => eColumnType::TEXT,
C::DEFAULT => '',
C::TH => V::get(Vars::$SETTINGS),
]),
new C([
C::VAR_NAME => &self::$POS,
C::TYPE => eColumnType::INT,
C::DEFAULT => time(),
C::TH => V::get(Vars::$POS),
]),
new C([
C::VAR_NAME => &self::$PROFILE,
C::TYPE => eColumnType::INT,
C::DEFAULT => intval(PID),
C::TH => V::get(Vars::$PROFILE),
]),
new C([
C::VAR_NAME => &self::$CARD,
C::TYPE => eColumnType::INT,
C::DEFAULT => 0,
C::TH => V::get(Vars::$CARD),
]),
new C([
C::VAR_NAME => &self::$VIS,
C::TYPE => eColumnType::TINYINT,
C::LENGTH => 1,
C::DEFAULT => 1,
C::TH => V::get(Vars::$VIS),
]),
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 Block();
///