ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE3/trunk/lib/helper/opUtilHelper.php @ 12228

Last change on this file since 12228 was 12228, checked in by ebihara, 11 years ago

#3970:メンバーのメール投稿アドレスにハッシュを含められるようにした

File size: 14.0 KB
Line 
1<?php
2
3/**
4 * This file is part of the OpenPNE package.
5 * (c) OpenPNE Project (http://www.openpne.jp/)
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file and the NOTICE file that were distributed with this source code.
9 */
10
11/**
12 * opUtilHelper provides basic utility helper functions.
13 *
14 * @package    OpenPNE
15 * @subpackage helper
16 * @author     Kousuke Ebihara <ebihara@tejimaya.com>
17 * @author     Rimpei Ogawa <ogawa@tejimaya.com>
18 */
19
20/**
21 * Creates a <a> link tag for the pager link
22 *
23 * @param string  $name
24 * @param string  $internal_uri
25 * @param integer $page_no
26 * @param options $options
27 * @return string
28 */
29function op_link_to_for_pager($name, $internal_uri, $page_no, $options)
30{
31  $html_options = _parse_attributes($options);
32
33  $html_options = _convert_options_to_javascript($html_options);
34
35  $absolute = false;
36  if (isset($html_options['absolute_url']))
37  {
38    $absolute = (boolean) $html_options['absolute'];
39    unset($html_options['absolute_url']);
40  }
41 
42  $internal_uri = sprintf($internal_uri, $page_no);
43  $html_options['href'] = url_for($internal_uri, $absolute);
44
45  if (isset($html_options['query_string']))
46  {
47    if (strpos($html_options['href'], '?') !== false)
48    {
49      $html_options['href'] .= '&'.$html_options['query_string'];
50    }
51    else
52    {
53      $html_options['href'] .= '?'.$html_options['query_string'];
54    }
55    unset($html_options['query_string']);
56  }
57
58  if (!strlen($name))
59  {
60    $name = $html_options['href'];
61  }
62 
63  return content_tag('a', $name, $html_options);
64}
65
66/**
67 * Includes a navigation for paginated list
68 *
69 * @param sfPager $pager
70 * @param string  $internal_uri
71 * @param array   $options
72 */
73function op_include_pager_navigation($pager, $internal_uri, $options = array())
74{
75  $uri = url_for($internal_uri);
76
77  if (isset($options['use_current_query_string']) && $options['use_current_query_string'])
78  {
79    $options['query_string'] = sfContext::getInstance()->getRequest()->getCurrentQueryString();
80    $pageFieldName = isset($options['page_field_name']) ? $options['page_field_name'] : 'page';
81    $options['query_string'] = preg_replace('/'.$pageFieldName.'=\d\&*/', '', $options['query_string']);
82    unset($options['page_field_name']);
83    unset($options['use_current_query_string']);
84  }
85
86  if (isset($options['query_string']))
87  {
88    $options['link_options']['query_string'] = $options['query_string'];
89    unset($options['query_string']);
90  }
91
92  $params = array(
93    'pager' => $pager,
94    'internalUri' => $internal_uri,
95    'options' => new opPartsOptionHolder($options)
96  );
97  $pager = sfOutputEscaper::unescape($pager);
98  if ($pager instanceof sfReversibleDoctrinePager)
99  {
100    include_partial('global/pagerReversibleNavigation', $params);
101  }
102  else
103  {
104    include_partial('global/pagerNavigation', $params);
105  }
106}
107
108/**
109 * Includes pager total
110 *
111 * @param sfPager $pager
112 */
113function op_include_pager_total($pager)
114{
115  include_partial('global/pagerTotal', array('pager' => $pager));
116}
117
118/**
119 * Returns a navigation for paginated list.
120 *
121 * @deprecated since 3.0.3
122 * @param  sfPager $pager
123 * @param  string  $link_to  A path to go to next/previous page.
124                             "%d" will be converted to number of page.
125 * @return string  A navigation for paginated list.
126 */
127function pager_navigation($pager, $link_to, $is_total = true, $query_string = '')
128{
129  $params = array(
130    'pager' => $pager,
131    'link_to' => $link_to,
132    'options' => new opPartsOptionHolder(array(
133      'is_total' => $is_total,
134      'query_string' => $query_string
135    )
136  ));
137  return get_partial('global/pagerNavigation', $params);
138}
139
140/**
141 * Returns a pager total
142 *
143 * @deprecated since 3.0.3
144 * @param  sfPager $pager
145 * @return string
146 */
147function pager_total($pager)
148{
149  return get_partial('global/pagerTotal', array('pager' => $pager));
150}
151
152function cycle_vars($name, $items, $delimiter = ',')
153{
154  static $cycles = array();
155  if (!isset($cycles[$name]))
156  {
157    $cycles[$name] = array(
158      'count' => 0,
159      'items' => explode($delimiter, $items),
160    );
161  }
162
163  $items = $cycles[$name]['items'];
164
165  $result = $items[$cycles[$name]['count']];
166  $cycles[$name]['count']++;
167
168  if ($cycles[$name]['count'] >= count($items))
169  {
170    $cycles[$name]['count'] = 0;
171  }
172
173  return $result;
174}
175
176/**
177 * Returns a project URL is over an application.
178 *
179 * @see url_for()
180 *
181 * @param string $application
182 *
183 * @return string
184 */
185function app_url_for()
186{
187  $arguments = func_get_args();
188  if (is_array($arguments[1]) || '@' == substr($arguments[1], 0, 1) || false !== strpos($arguments[1], '/'))
189  {
190    return call_user_func_array('_app_url_for_internal_uri', $arguments);
191  }
192  else
193  {
194    return call_user_func_array('_app_url_for_route', $arguments);
195  }
196}
197
198function _app_url_for_route($application, $routeName, $params = array(), $absolute = false)
199{
200  $params = array_merge(array('sf_route' => $routeName), is_object($params) ? array('sf_subject' => $params) : $params);
201
202  return _app_url_for_internal_uri($application, $params, $absolute);
203}
204
205function _app_url_for_internal_uri($application, $internal_uri, $absolute = false)
206{
207  // stores current states
208  $current_application = sfContext::getInstance()->getConfiguration()->getApplication();
209  $current_environment = sfContext::getInstance()->getConfiguration()->getEnvironment();
210  $current_is_debug = sfContext::getInstance()->getConfiguration()->isDebug();
211  $current_config = sfConfig::getAll();
212
213  // computes a url
214  if (sfContext::hasInstance($application))
215  {
216    $context = sfContext::getInstance($application);
217    sfContext::switchTo($application);
218  }
219  else
220  {
221    $config = ProjectConfiguration::getApplicationConfiguration($application, $current_environment, $current_is_debug);
222    $context = sfContext::createInstance($config, $application);
223  }
224  $is_strip_script_name = (bool)sfConfig::get('sf_no_script_name');
225  $result_url = $context->getController()->genUrl($internal_uri, $absolute);
226
227  // restores the previous states
228  sfContext::switchTo($current_application);
229  sfConfig::add($current_config);
230
231  // replaces a script name
232  $before_script_name = basename(sfContext::getInstance()->getRequest()->getScriptName());
233  $after_script_name = _create_script_name($application, $current_environment);
234  if ($is_strip_script_name)
235  {
236    $before_script_name = '/'.$before_script_name;
237    $after_script_name = '';
238  }
239  return str_replace($before_script_name, $after_script_name, $result_url);
240}
241
242function _create_script_name($application, $environment)
243{
244  $script_name = $application;
245  if ($environment !== 'prod')
246  {
247    $script_name .= '_'.$environment;
248  }
249  $script_name .= '.php';
250
251  return $script_name;
252}
253
254function op_format_date($date, $format = 'd', $culture = null, $charset = null)
255{
256  use_helper('Date');
257
258  if (!$culture)
259  {
260    $culture = sfContext::getInstance()->getUser()->getCulture();
261  }
262
263  switch ($format)
264  {
265    case 'XShortDate':
266      switch ($culture)
267      {
268        case 'ja_JP':
269          $format = 'MM/dd';
270          break;
271        default:
272          $format = 'd';
273          break;
274      }
275      break;
276    case 'XShortDateJa':
277      switch ($culture)
278      {
279        case 'ja_JP':
280          $format = 'MM月dd日';
281          break;
282        default:
283          $format = 'd';
284          break;
285      }
286      break;
287    case 'XDateTime':
288      switch ($culture)
289      {
290        case 'ja_JP':
291          $format = 'yyyy/MM/dd HH:mm';
292          break;
293        default:
294          $format = 'f';
295          break;
296      }
297      break;
298    case 'XDateTimeJa':
299      switch ($culture)
300      {
301        case 'ja_JP':
302          $format = 'yyyy年MM月dd日 HH:mm';
303          break;
304        default:
305          $format = 'f';
306          break;
307      }
308      break;
309    case 'XDateTimeJaBr':
310      switch ($culture)
311      {
312        case 'ja_JP':
313          $format = "yyyy年\nMM月dd日\nHH:mm";
314          break;
315        default:
316          $format = 'f';
317          break;
318      }
319      break;
320    case 'XCalendarMonth':
321      switch ($culture)
322      {
323        case 'ja_JP':
324          $format = 'yyyy年M月';
325          break;
326        default:
327          $format = 'MMMM yyyy';
328          break;
329      }
330      break;
331  }
332
333  return format_date($date, $format, $culture, $charset);
334}
335
336function op_url_cmd($text)
337{
338  $url_pattern = '/https?:\/\/([a-zA-Z0-9\-.]+)\/?(?:[a-zA-Z0-9_\-\/.,:;~?@=+$%#!()]|&amp;)*/';
339
340  return preg_replace_callback($url_pattern, '_op_url_cmd', $text);
341}
342
343if (!defined('SF_AUTO_LINK_RE'))
344{
345  define('SF_AUTO_LINK_RE', '~
346    (                       # leading text
347      <\w+.*?>|             #   leading HTML tag, or
348      [^=!:\'"/]|           #   leading punctuation, or
349      ^                     #   beginning of line
350    )
351    (
352      (?:https?://)|        # protocol spec, or
353      (?:www\.)             # www.*
354    )
355    (
356      [-\w]+                   # subdomain or domain
357      (?:\.[-\w]+)*            # remaining subdomains or domain
358      (?::\d+)?                # port
359      \/?
360      [a-zA-Z0-9_\-\/.,:;\~\?@&=+$%#!()]*
361    )
362    ([[:punct:]]|\s|<|$)    # trailing text
363   ~x');
364}
365
366function _op_url_cmd($matches)
367{
368  $url = $matches[0];
369  $cmd = $matches[1];
370
371  $file = $cmd . '.js';
372  $path = './cmd/' . $file;
373
374  if (!is_readable($path)) {
375    return str_replace('&', '&amp;', op_auto_link_text(str_replace('&amp;', '&', $url)));
376  }
377
378  sfContext::getInstance()->getResponse()->addJavascript('util');
379
380  $public_path = _compute_public_path($file, 'cmd', 'js');
381  $result = <<<EOD
382<script type="text/javascript" src="{$public_path}"></script>
383<script type="text/javascript">
384<!--
385url2cmd('{$url}');
386//-->
387</script>
388EOD;
389  return $result;
390}
391
392/**
393 * @see auto_link_text
394 */
395function op_auto_link_text($text, $link = 'urls', $href_options = array('target' => '_blank'), $truncate = true, $truncate_len = 57, $pad = '...')
396{
397  use_helper('Text');
398  return auto_link_text($text, $link, $href_options, $truncate, $truncate_len, $pad);
399}
400
401/**
402 * truncates a string
403 *
404 * @param string $string
405 * @param int    $width
406 * @param string $etc
407 * @param int    $rows
408 * @param bool   $is_html
409 *
410 * @return string
411 */
412function op_truncate($string, $width = 80, $etc = '', $rows = 1, $is_html = true)
413{
414  $rows = (int)$rows;
415  if (!($rows > 0))
416  {
417    $rows = 1;
418  }
419
420  // converts special chars
421  $trans = array(
422    "\r\n" => ' ',
423    "\r"   => ' ',
424    "\n"   => ' ',
425  );
426
427  // converts special chars (for HTML)
428  if ($is_html)
429  {
430    $trans += array(
431      // for htmlspecialchars
432      '&amp;'  => '&',
433      '&lt;'   => '<',
434      '&gt;'   => '>',
435      '&quot;' => '"',
436      '&#039;' => "'",
437      // for IE's bug
438      ' '     => ' ',
439    );
440  }
441  $string = strtr($string, $trans);
442
443  $result = array();
444  $p_string = $string;
445  for ($i = 1; $i <= $rows; $i++)
446  {
447    if ($i === $rows)
448    {
449      $p_etc = $etc;
450    }
451    else
452    {
453      $p_etc = '';
454    }
455
456    if ($i > 0)
457    {
458      // strips the string of pre-line
459      if (isset($result[$i - 1]))
460      {
461        $p_string = substr($p_string, strlen($result[$i - 1]));
462      }
463      if (!$p_string && ($p_string !== '0'))
464      {
465        break;
466      }
467    }
468
469    $result[$i] = op_truncate_callback($p_string, $width, $p_etc);
470  }
471  $string = implode("\n", $result);
472
473  if ($is_html)
474  {
475    $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
476  }
477
478  return nl2br($string);
479}
480
481function op_truncate_callback($string, $width, $etc = '')
482{
483  if (mb_strwidth($string) > $width)
484  {
485    $width = $width - mb_strwidth($etc);
486
487    // for Emoji
488    $offset = 0;
489    $tmp_string = $string;
490    while (preg_match('/\[[ies]:[0-9]{1,3}\]/', $tmp_string, $matches, PREG_OFFSET_CAPTURE))
491    {
492      $emoji_str = $matches[0][0];
493      $emoji_pos = $matches[0][1] + $offset;
494      $emoji_len = strlen($emoji_str);
495      $emoji_width = $emoji_len;
496
497      // a width by Emoji
498      $substr_width = mb_strwidth(substr($string, 0, $emoji_pos));
499
500      if ($substr_width >= $width)  // Emoji position is after a width
501      {
502        break;
503      }
504
505      if ($substr_width + 2 == $width)  // substr_width + Emoji width is equal to a width
506      {
507        $width = $substr_width + $emoji_width;
508        break;
509      }
510
511      if ($substr_width + 2 > $width)  // substr_width + Emoji width is rather than a width
512      {
513        $width = $substr_width;
514        break;
515      }
516
517      // less than a width
518      $offset = $emoji_pos + $emoji_len;
519      $width = $width + $emoji_width - 2;
520
521      $tmp_string = substr($string, $offset);
522    }
523
524    $string = mb_strimwidth($string, 0, $width, $etc, 'UTF-8');
525  }
526
527  return $string;
528}
529
530function op_within_page_link($marker = '▼')
531{
532  static $n = 0;
533
534  $options = array();
535  if ($n)
536  {
537    $options['name'] = sprintf('a%d', $n);
538  }
539  if ($marker)
540  {
541    $options['href'] = sprintf('#a%d', $n+1);
542  }
543
544  $n++;
545
546  return content_tag('a', $marker, $options);
547}
548
549function op_maiL_to($route, $params = array(), $name = '', $options = array(), $default_value = array())
550{
551  $configuration = sfContext::getInstance()->getConfiguration();
552  $configPath = '/mobile_mail_frontend/config/routing.yml';
553  $files = array_merge(array(sfConfig::get('sf_apps_dir').$configPath), $configuration->globEnablePlugin('/apps'.$configPath));
554
555  $user = sfContext::getInstance()->getUser();
556
557  if (sfConfig::get('op_is_mail_address_contain_hash') && $user->hasCredential('SNSMember'))
558  {
559    $params['hash'] = $user->getMember()->getMailAddressHash();
560  }
561
562  $routing = new opMailRouting(new sfEventDispatcher());
563  $config = new sfRoutingConfigHandler();
564  $routes = $config->evaluate($files);
565
566  $routing->setRoutes(array_merge(sfContext::getInstance()->getRouting()->getRoutes(), $routes));
567
568  return mail_to($routing->generate($route, $params), $name, $options, $default_value);
569}
570
571function op_banner($name)
572{
573  $banner = Doctrine::getTable('Banner')->findByName($name);
574  if (!$banner)
575  {
576    return false;
577  }
578
579  if ($banner->getIsUseHtml())
580  {
581    return $banner->getHtml();
582  }
583
584  $bannerImage = $banner->getRandomImage();
585  if (!$bannerImage)
586  {
587    return false;
588  }
589  $imgHtml = image_tag_sf_image($bannerImage->getFile(), array('alt' => $bannerImage->getName()));
590  if ($bannerImage->getUrl() != '')
591  {
592    return link_to($imgHtml, $bannerImage->getUrl(), array('target' => '_blank'));
593  }
594
595  return $imgHtml;
596}
597
598?>
Note: See TracBrowser for help on using the repository browser.