diff --git a/common/css/rhymix.less b/common/css/rhymix.less index 240ed9001..d3f565b83 100644 --- a/common/css/rhymix.less +++ b/common/css/rhymix.less @@ -42,6 +42,51 @@ a img { max-width: 100%; height: auto; } + blockquote { + padding: 2px 0; + border-style: solid; + border-color: #ccc; + border-width: 0; + border-left-width: 5px; + padding-left: 20px; + padding-right: 8px; + + &:lang(ar), &:lang(arc), &:lang(dv), &:lang(ha), &:lang(he), &:lang(khw), &:lang(ks), &:lang(ku), &:lang(ps), &:lang(fa), &:lang(ur), &:lang(yi) { + border-left-width: 0px; + border-right-width: 5px; + padding-left: 8px; + padding-right: 20px; + + } + } + + + /* lists */ + ul { + list-style-type: disc; + } + + ol { + list-style-type: decimal; + } + + ul, ol { + display: block; + margin-left: 1em; + margin-right: 0; + padding-left: 25px; + padding-right: 0; + &:lang(ar), &:lang(arc), &:lang(dv), &:lang(ha), &:lang(he), &:lang(khw), &:lang(ks), &:lang(ku), &:lang(ps), &:lang(fa), &:lang(ur), &:lang(yi) { + padding-left: 0px; + padding-right: 25px; + margin-left: 0; + margin-right: 1em; + } + } + + li { + display: list-item; + } } @media screen { img, video { @@ -317,7 +362,7 @@ a img { } } -/* Button (for XE compatibility */ +/* Button (for XE compatibility) */ .btnArea_mixin(@enabled) when (@enabled = true) { clear: both; margin: 10px 0; diff --git a/common/framework/drivers/sms/solapi.php b/common/framework/drivers/sms/solapi.php new file mode 100644 index 000000000..ba73be496 --- /dev/null +++ b/common/framework/drivers/sms/solapi.php @@ -0,0 +1,228 @@ + 1000, + 'sms_max_length' => 90, + 'sms_max_length_in_charset' => 'CP949', + 'lms_supported' => true, + 'lms_supported_country_codes' => array(82), + 'lms_max_length' => 2000, + 'lms_max_length_in_charset' => 'CP949', + 'lms_subject_supported' => true, + 'lms_subject_max_length' => 40, + 'mms_supported' => true, + 'mms_supported_country_codes' => array(82), + 'mms_max_length' => 2000, + 'mms_max_length_in_charset' => 'CP949', + 'mms_subject_supported' => true, + 'mms_subject_max_length' => 40, + 'image_allowed_types' => array('jpg', 'gif', 'png'), + 'image_max_dimensions' => array(2048, 2048), + 'image_max_filesize' => 300000, + 'delay_supported' => true, + ); + + /** + * Config keys used by this driver are stored here. + */ + protected static $_required_config = array('api_key', 'api_secret'); + protected static $_optional_config = array('sender_key'); + + /** + * Check if the current SMS driver is supported on this server. + * + * This method returns true on success and false on failure. + * + * @return bool + */ + public static function isSupported() + { + return true; + } + + /** + * Send a message. + * + * This method returns true on success and false on failure. + * + * @param array $messages + * @param object $original + * @return bool + */ + public function send(array $messages, \Rhymix\Framework\SMS $original) + { + $groupArray = array(); + $groupMessage = false; + if(count($messages) > 1) + { + $groupMessage = true; + } + foreach ($messages as $i => $message) + { + if (count($message->to) > 1 && !$groupMessage) + { + $groupMessage = true; + } + $options = new \stdClass; + if ($this->_config['sender_key']) + { + $options->sender_key = $this->_config['sender_key']; + $options->type = 'CTA'; + } + else + { + $options->type = $message->type; + } + $options->from = $message->from; + $options->to = $message->to; + $options->text = $message->content ?: $message->type; + if ($message->delay && $message->delay > time()) + { + $options->datetime = gmdate('YmdHis', $message->delay + (3600 * 9)); + } + if ($message->country && $message->country != 82) + { + $options->country = $message->country; + } + if ($message->subject) + { + $options->subject = $message->subject; + } + else + { + if($message->type != 'SMS') + { + // 문자 전송 타입이 SMS이 아닐경우 subjext가 필수 + $options->subject = cut_str($message->content, 20); + } + } + if ($message->image) + { + $output = $this->uploadImage($message->image, $message->type); + $options->imageId = $output->fileId; + } + $groupArray[] = $options; + } + + if($groupMessage) + { + $jsonObject = new \stdClass(); + $jsonObject->messages = json_encode($groupArray); + $groupId = $this->createGroup(); + if(!$groupId) + { + return false; + } + + $result = json_decode($this->request("PUT", "messages/v4/groups/{$groupId}/messages", $jsonObject)); + if(!$result || $result->errorCode) + { + return false; + } + + $result = json_decode($this->request("POST", "messages/v4/groups/{$groupId}/send")); + if (!$result || $result->status != 'SENDING') + { + return false; + } + } + else + { + // simpleMessage 를 사용 할 경우 to가 array 타입이면 문자 전송이 되지 않아 string 으로 요청 + $groupArray[0]->to = $groupArray[0]->to[0]; + $simpleObject = new \stdClass(); + $simpleObject->message = $groupArray[0]; + $simpleObject->agent = new \stdClass(); + $simpleObject->agent->appId = self::appId; + + $result = json_decode($this->request("POST", "messages/v4/send", $simpleObject)); + if(!$result || $result->errorCode) + { + return false; + } + } + + return true; + } + + /** + * Create header string for http protocol + * @param $config + * @return string + */ + private function getHeader() + { + date_default_timezone_set('Asia/Seoul'); + $date = date('Y-m-d\TH:i:s.Z\Z', time()); + $salt = uniqid(); + $signature = hash_hmac('sha256', $date . $salt, $this->_config['api_secret']); + return "HMAC-SHA256 apiKey={$this->_config['api_key']}, date={$date}, salt={$salt}, signature={$signature}"; + } + + /** + * Create message group + * @return string : group id + */ + private function createGroup() + { + $args = new \stdClass(); + $args->appId = self::appId; + $result = $this->request("POST", 'messages/v4/groups', $args); + $groupId = json_decode($result)->groupId; + return $groupId; + } + + /** + * Upload to image for MMS message. + * @param $imageDir + * @param $type + * @return mixed + */ + private function uploadImage($imageDir, $type) + { + $path = $imageDir; + $data = file_get_contents($path); + $imageData = base64_encode($data); + $jsonData = new \stdClass(); + $jsonData->file = $imageData; + $jsonData->type = $type; + $url = "storage/v1/files"; + return json_decode($this->request('POST', $url, $jsonData)); + } + + /** + * Request string message. + * @param $method + * @param $url + * @param bool $data + * @return bool|string + */ + private function request($method, $url, $data = false) + { + $url = 'https://api.solapi.com/' . $url; + + if(!$data) + { + $data = null; + } + else + { + $data = json_encode($data); + } + $result = \FileHandler::getRemoteResource($url, $data, 3, $method, 'application/json', array('Authorization' => $this->getHeader())); + + return $result; + } +} diff --git a/layouts/xedition/demo/welcome_main.html b/layouts/xedition/demo/welcome_main.html index ce3a94f0d..09134c037 100644 --- a/layouts/xedition/demo/welcome_main.html +++ b/layouts/xedition/demo/welcome_main.html @@ -104,13 +104,13 @@
Rhymix와 관련한 다양한 커뮤니티를 만나보세요.
도움이 필요할 때에는 전문가들과 이야기할 수 있습니다.