'qr', 'chl' => '', 'choe' => '', 'chs' => ''); public $ecLevels = array('H', 'Q', 'M', 'L'); # 30%..7% public $formattingTypes = array('url' => 'http', 'tel' => 'tel', 'sms' => 'smsto', 'card' => 'mecard'); public function __construct(View $View, $settings = array()) { parent::__construct($View, $settings); $this->reset(); } /** * main barcode display function * @param string $text (utf8 encoded) * @param array $imageOptions * NOTE: set size or level manually prior to calling this method * 2010-02-06 ms */ public function image($text, $options = array()) { return $this->Html->image($this->uri($text), $options); } /** * Just the url - without image tag * Note: cannot be url() due to AppHelper conflicts * * @param string $text * @return string Url * 2010-02-25 ms */ public function uri($text) { $params = array(); $params['chl'] = rawurlencode($text); return $this->_uri($params); } /** * @return string Url */ protected function _uri($params = array()) { $params = array_merge($this->options, $params); $pieces = array(); foreach ($params as $key => $value) { $pieces[] = $key . '=' . $value; } return $this->url . implode('&', $pieces); } /** * format a text in a specific format * - url, sms, tel, email, market, geo * @return string $formattedText * 2010-02-06 ms */ public function formatText($text, $type = null) { switch ($type) { case 'text': break; case 'url': $text = $this->Html->url($text, true); break; case 'sms': $text = 'smsto:' . implode(':', (array)$text); break; case 'tel': $text = 'tel:' . $text; break; case 'email': $text = 'mailto:' . $text; break; case 'geo': $text = 'geo:' . implode(',', (array)$text); #like 77.1,11.8 break; case 'market': $text = 'market://search?q=pname:' . $text; } return $text; } /** * generate mecard string * 1: name, nickname, note, birthday, sound * 1..n (as array or string): address, tel, url, email * for details on cards see: * http://www.nttdocomo.co.jp/english/service/imode/make/content/barcode/function/application/addressbook/index.html * example: MECARD: N:Docomo,Taro; SOUND:docomotaro; TEL:03XXXXXXXX; EMAIL:d@e.de; * @return string $mecard * 2010-02-26 ms */ public function formatCard($data) { $data = (array)$data; $res = array(); foreach ($data as $key => $val) { switch ($key) { case 'name': $res[] = 'N:' . $val; # //TODO: support array break; case 'nickname': $res[] = 'NICKNAME:' . $val; break; case 'sound': $res[] = 'SOUND:' . $val; break; case 'note': $val = str_replace(';', ',', $val); $res[] = 'NOTE:' . $val; //TODO: remove other invalid characters break; case 'birthday': if (strlen($val) !== 8) { $val = substr($val, 0, 4) . substr($val, 6, 2) . substr($val, 10, 2); } $res[] = 'BDAY:' . $val; break; case 'tel': $val = (array)$val; foreach ($val as $v) { $res[] = 'TEL:' . $v; } break; case 'video': $val = (array)$val; foreach ($val as $v) { $res[] = 'TEL-AV:' . $v; } break; case 'address': $val = (array)$val; foreach ($val as $v) { $res[] = 'ADR:' . $v; //TODO: reformat (array etc) } break; case 'org': $val = (array)$val; foreach ($val as $v) { $res[] = 'ORG:' . $v; } break; case 'role': $val = (array)$val; foreach ($val as $v) { $res[] = 'ROLE:' . $v; } break; case 'email': $val = (array)$val; foreach ($val as $v) { $res[] = 'EMAIL:' . $v; } break; case 'url': $val = (array)$val; foreach ($val as $v) { $res[] = 'URL:' . $this->Html->url($v, true); } break; } } return 'MECARD:' . implode(';', $res) . ';'; } /** * //TODO * calendar event * e.g.: BEGIN:VEVENT SUMMARY:dfdfd DTSTART:20100226T092900Z DTEND:20100226T102900Z END:VEVENT * @see http://zxing.appspot.com/generator/ * 2010-02-26 ms */ public function formatEvent() { } /** * QrCodeHelper::format() * * @param mixed $protocol * @param mixed $string * @return string */ public function format($protocol, $string) { return $protocol . ':' . $string; } /** * change size * result format: chs=x * @return boolean Success * * //TODO: automatic detection * //default is 2x size (plus margin) of typical QR version for the error correction level (L=V.2, M/Q=V.3, H=V.4) * //$ecCodes = array('L' => 58, 'M' => 66, 'Q' => 66, 'H' => 74); * 2010-02-06 ms */ public function setSize($value) { if ($value === 'auto') { //TODO } $value = (int)$value; if ($value >= self::MIN_SIZE && $value <= self::MAX_SIZE) { $this->options['chs'] = $value. 'x' . $value; return true; } return false; } /** * change level and margin - optional * result format: chld=| * @return boolean Success * 2010-02-06 ms */ public function setLevel($level, $margin = null) { if (in_array($level, $this->ecLevels)) { if ($margin === null) { $margin = 4; # minimum } $this->options['chld'] = strtoupper($level). '|' . $margin; return true; } return false; } public function setEncoding() { //TODO } /** * QrCodeHelper::reset() * * @return void */ public function reset() { $this->setSize(self::DEFAULT_SIZE); //$this->setLevel(QS_CODE_DEFAULT_LEVEL); $this->options['chld'] = ''; $this->options['choe'] = Configure::read('App.encoding'); } /** * show current options - for debugging only * 2010-02-06 ms */ public function debug() { return $this->options; } /** * 25 => 21x21 (L) * ... * 4000 => 547x547 (L) * @param integer $length * @return integer $size * 2011-06-06 ms */ protected function _findSuitableSize() { } }