520 lines
19 KiB
PHP
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();
|
|
|
|
|
|
///
|