diff --git a/extensions/gii/generators/crud/templates/views/view.php b/extensions/gii/generators/crud/templates/views/view.php
index 9e74aff..7087d48 100644
--- a/extensions/gii/generators/crud/templates/views/view.php
+++ b/extensions/gii/generators/crud/templates/views/view.php
@@ -1,7 +1,7 @@
title = $model->= $generator->getNameAttribute() ?>;
-$this->params['breadcrumbs'][] = ['label' => '= Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>', 'url' => ['index']];
+$this->params['breadcrumbs'][] = ['label' => '= Inflector::pluralize(Inflector::camel2words(FileHelper::basename($generator->modelClass))) ?>', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
-
+
= "= " ?>Html::encode($this->title) ?>
diff --git a/extensions/gii/generators/module/Generator.php b/extensions/gii/generators/module/Generator.php
index 5946e07..2209ace 100644
--- a/extensions/gii/generators/module/Generator.php
+++ b/extensions/gii/generators/module/Generator.php
@@ -10,7 +10,7 @@ namespace yii\gii\generators\module;
use Yii;
use yii\gii\CodeFile;
use yii\helpers\Html;
-use yii\helpers\StringHelper;
+use yii\helpers\FileHelper;
/**
* This generator will generate the skeleton code needed by a module.
@@ -119,7 +119,7 @@ EOD;
$files = [];
$modulePath = $this->getModulePath();
$files[] = new CodeFile(
- $modulePath . '/' . StringHelper::basename($this->moduleClass) . '.php',
+ $modulePath . '/' . FileHelper::basename($this->moduleClass) . '.php',
$this->render("module.php")
);
$files[] = new CodeFile(
diff --git a/extensions/redis/ActiveRecord.php b/extensions/redis/ActiveRecord.php
index f227ed1..9de9f6c 100644
--- a/extensions/redis/ActiveRecord.php
+++ b/extensions/redis/ActiveRecord.php
@@ -8,8 +8,8 @@
namespace yii\redis;
use yii\base\InvalidConfigException;
-use yii\base\NotSupportedException;
use yii\db\BaseActiveRecord;
+use yii\helpers\FileHelper;
use yii\helpers\Inflector;
use yii\helpers\StringHelper;
@@ -97,7 +97,7 @@ class ActiveRecord extends BaseActiveRecord
*/
public static function keyPrefix()
{
- return Inflector::camel2id(StringHelper::basename(get_called_class()), '_');
+ return Inflector::camel2id(FileHelper::basename(get_called_class()), '_');
}
/**
@@ -288,7 +288,7 @@ class ActiveRecord extends BaseActiveRecord
if (is_numeric($key)) {
return $key;
} elseif (is_string($key)) {
- return ctype_alnum($key) && StringHelper::strlen($key) <= 32 ? $key : md5($key);
+ return ctype_alnum($key) && StringHelper::byteLen($key) <= 32 ? $key : md5($key);
} elseif (is_array($key)) {
if (count($key) == 1) {
return self::buildKey(reset($key));
diff --git a/extensions/sphinx/ActiveRecord.php b/extensions/sphinx/ActiveRecord.php
index 7128b79..9831cbd 100644
--- a/extensions/sphinx/ActiveRecord.php
+++ b/extensions/sphinx/ActiveRecord.php
@@ -12,8 +12,8 @@ use yii\db\BaseActiveRecord;
use yii\base\NotSupportedException;
use yii\db\ActiveRelationInterface;
use yii\db\StaleObjectException;
+use yii\helpers\FileHelper;
use yii\helpers\Inflector;
-use yii\helpers\StringHelper;
use Yii;
/**
@@ -166,7 +166,7 @@ abstract class ActiveRecord extends BaseActiveRecord
*/
public static function indexName()
{
- return Inflector::camel2id(StringHelper::basename(get_called_class()), '_');
+ return Inflector::camel2id(FileHelper::basename(get_called_class()), '_');
}
/**
diff --git a/framework/yii/caching/Cache.php b/framework/yii/caching/Cache.php
index 371f91a..ee471b3 100644
--- a/framework/yii/caching/Cache.php
+++ b/framework/yii/caching/Cache.php
@@ -100,7 +100,7 @@ abstract class Cache extends Component implements \ArrayAccess
protected function buildKey($key)
{
if (is_string($key)) {
- $key = ctype_alnum($key) && StringHelper::strlen($key) <= 32 ? $key : md5($key);
+ $key = ctype_alnum($key) && StringHelper::byteLen($key) <= 32 ? $key : md5($key);
} else {
$key = md5(json_encode($key));
}
diff --git a/framework/yii/db/ActiveRecord.php b/framework/yii/db/ActiveRecord.php
index adcf508..ada79b6 100644
--- a/framework/yii/db/ActiveRecord.php
+++ b/framework/yii/db/ActiveRecord.php
@@ -9,12 +9,7 @@
namespace yii\db;
use yii\base\InvalidConfigException;
-use yii\base\Model;
-use yii\base\InvalidParamException;
-use yii\base\ModelEvent;
-use yii\base\UnknownMethodException;
-use yii\base\InvalidCallException;
-use yii\helpers\StringHelper;
+use yii\helpers\FileHelper;
use yii\helpers\Inflector;
/**
@@ -174,7 +169,7 @@ class ActiveRecord extends BaseActiveRecord
*/
public static function tableName()
{
- return 'tbl_' . Inflector::camel2id(StringHelper::basename(get_called_class()), '_');
+ return 'tbl_' . Inflector::camel2id(FileHelper::basename(get_called_class()), '_');
}
/**
diff --git a/framework/yii/helpers/BaseFileHelper.php b/framework/yii/helpers/BaseFileHelper.php
index 325cc8a..7994773 100644
--- a/framework/yii/helpers/BaseFileHelper.php
+++ b/framework/yii/helpers/BaseFileHelper.php
@@ -292,11 +292,11 @@ class BaseFileHelper
if ($isDir = is_dir($path)) {
$path .= '/';
}
- $n = StringHelper::strlen($path);
+ $n = StringHelper::byteLen($path);
if (!empty($options['except'])) {
foreach ($options['except'] as $name) {
- if (StringHelper::substr($path, -StringHelper::strlen($name), $n) === $name) {
+ if (StringHelper::byteSubstr($path, -StringHelper::byteLen($name), $n) === $name) {
return false;
}
}
@@ -304,7 +304,7 @@ class BaseFileHelper
if (!$isDir && !empty($options['only'])) {
foreach ($options['only'] as $name) {
- if (StringHelper::substr($path, -StringHelper::strlen($name), $n) === $name) {
+ if (StringHelper::byteSubstr($path, -StringHelper::byteLen($name), $n) === $name) {
return true;
}
}
@@ -338,4 +338,48 @@ class BaseFileHelper
chmod($path, $mode);
return $result;
}
+
+ /**
+ * Returns the trailing name component of a path.
+ * This method is similar to the php function `basename()` except that it will
+ * treat both \ and / as directory separators, independent of the operating system.
+ * This method was mainly created to work on php namespaces. When working with real
+ * file paths, php's `basename()` should work fine for you.
+ * Note: this method is not aware of the actual filesystem, or path components such as "..".
+ *
+ * @param string $path A path string.
+ * @param string $suffix If the name component ends in suffix this will also be cut off.
+ * @return string the trailing name component of the given path.
+ * @see http://www.php.net/manual/en/function.basename.php
+ */
+ public static function basename($path, $suffix = '')
+ {
+ if (($len = mb_strlen($suffix)) > 0 && mb_substr($path, -$len) == $suffix) {
+ $path = mb_substr($path, 0, -$len);
+ }
+ $path = rtrim(str_replace('\\', '/', $path), '/\\');
+ if (($pos = mb_strrpos($path, '/')) !== false) {
+ return mb_substr($path, $pos + 1);
+ }
+ return $path;
+ }
+
+ /**
+ * Returns parent directory's path.
+ * This method is similar to `dirname()` except that it will treat
+ * both \ and / as directory separators, independent of the operating system.
+ *
+ * @param string $path A path string.
+ * @return string the parent directory's path.
+ * @see http://www.php.net/manual/en/function.basename.php
+ */
+ public static function dirname($path)
+ {
+ $pos = mb_strrpos(str_replace('\\', '/', $path), '/');
+ if ($pos !== false) {
+ return mb_substr($path, 0, $pos);
+ } else {
+ return $path;
+ }
+ }
}
diff --git a/framework/yii/helpers/BaseSecurity.php b/framework/yii/helpers/BaseSecurity.php
index 03af81d..6abdd04 100644
--- a/framework/yii/helpers/BaseSecurity.php
+++ b/framework/yii/helpers/BaseSecurity.php
@@ -80,10 +80,10 @@ class BaseSecurity
}
$module = static::openCryptModule();
$ivSize = mcrypt_enc_get_iv_size($module);
- $iv = StringHelper::substr($data, 0, $ivSize);
+ $iv = StringHelper::byteSubstr($data, 0, $ivSize);
$key = static::deriveKey($password, $iv);
mcrypt_generic_init($module, $key, $iv);
- $decrypted = mdecrypt_generic($module, StringHelper::substr($data, $ivSize, StringHelper::strlen($data)));
+ $decrypted = mdecrypt_generic($module, StringHelper::byteSubstr($data, $ivSize, StringHelper::byteLen($data)));
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return static::stripPadding($decrypted);
@@ -96,7 +96,7 @@ class BaseSecurity
*/
protected static function addPadding($data)
{
- $pad = self::CRYPT_BLOCK_SIZE - (StringHelper::strlen($data) % self::CRYPT_BLOCK_SIZE);
+ $pad = self::CRYPT_BLOCK_SIZE - (StringHelper::byteLen($data) % self::CRYPT_BLOCK_SIZE);
return $data . str_repeat(chr($pad), $pad);
}
@@ -107,11 +107,11 @@ class BaseSecurity
*/
protected static function stripPadding($data)
{
- $end = StringHelper::substr($data, -1, NULL);
+ $end = StringHelper::byteSubstr($data, -1, NULL);
$last = ord($end);
- $n = StringHelper::strlen($data) - $last;
- if (StringHelper::substr($data, $n, NULL) == str_repeat($end, $last)) {
- return StringHelper::substr($data, 0, $n);
+ $n = StringHelper::byteLen($data) - $last;
+ if (StringHelper::byteSubstr($data, $n, NULL) == str_repeat($end, $last)) {
+ return StringHelper::byteSubstr($data, 0, $n);
}
return false;
}
@@ -164,11 +164,11 @@ class BaseSecurity
*/
public static function validateData($data, $key, $algorithm = 'sha256')
{
- $hashSize = StringHelper::strlen(hash_hmac($algorithm, 'test', $key));
- $n = StringHelper::strlen($data);
+ $hashSize = StringHelper::byteLen(hash_hmac($algorithm, 'test', $key));
+ $n = StringHelper::byteLen($data);
if ($n >= $hashSize) {
- $hash = StringHelper::substr($data, 0, $hashSize);
- $data2 = StringHelper::substr($data, $hashSize, $n - $hashSize);
+ $hash = StringHelper::byteSubstr($data, 0, $hashSize);
+ $data2 = StringHelper::byteSubstr($data, $hashSize, $n - $hashSize);
return $hash === hash_hmac($algorithm, $data2, $key) ? $data2 : false;
} else {
return false;
diff --git a/framework/yii/helpers/BaseStringHelper.php b/framework/yii/helpers/BaseStringHelper.php
index e1622b9..8f6c002 100644
--- a/framework/yii/helpers/BaseStringHelper.php
+++ b/framework/yii/helpers/BaseStringHelper.php
@@ -26,7 +26,7 @@ class BaseStringHelper
* @param string $string the string being measured for length
* @return integer the number of bytes in the given string.
*/
- public static function strlen($string)
+ public static function byteLen($string)
{
return mb_strlen($string, '8bit');
}
@@ -40,52 +40,11 @@ class BaseStringHelper
* @return string the extracted part of string, or FALSE on failure or an empty string.
* @see http://www.php.net/manual/en/function.substr.php
*/
- public static function substr($string, $start, $length)
+ public static function byteSubstr($string, $start, $length)
{
return mb_substr($string, $start, $length, '8bit');
}
- /**
- * Returns the trailing name component of a path.
- * This method is similar to the php function `basename()` except that it will
- * treat both \ and / as directory separators, independent of the operating system.
- * This method was mainly created to work on php namespaces. When working with real
- * file paths, php's `basename()` should work fine for you.
- * Note: this method is not aware of the actual filesystem, or path components such as "..".
- * @param string $path A path string.
- * @param string $suffix If the name component ends in suffix this will also be cut off.
- * @return string the trailing name component of the given path.
- * @see http://www.php.net/manual/en/function.basename.php
- */
- public static function basename($path, $suffix = '')
- {
- if (($len = mb_strlen($suffix)) > 0 && mb_substr($path, -$len) == $suffix) {
- $path = mb_substr($path, 0, -$len);
- }
- $path = rtrim(str_replace('\\', '/', $path), '/\\');
- if (($pos = mb_strrpos($path, '/')) !== false) {
- return mb_substr($path, $pos + 1);
- }
- return $path;
- }
-
- /**
- * Returns parent directory's path.
- * This method is similar to `dirname()` except that it will treat
- * both \ and / as directory separators, independent of the operating system.
- * @param string $path A path string.
- * @return string the parent directory's path.
- * @see http://www.php.net/manual/en/function.basename.php
- */
- public static function dirname($path)
- {
- $pos = mb_strrpos(str_replace('\\', '/', $path), '/');
- if ($pos !== false) {
- return mb_substr($path, 0, $pos);
- } else {
- return $path;
- }
- }
/**
* Compares two strings or string arrays, and return their differences.
diff --git a/framework/yii/web/Response.php b/framework/yii/web/Response.php
index bb77848..9fe8ed4 100644
--- a/framework/yii/web/Response.php
+++ b/framework/yii/web/Response.php
@@ -382,7 +382,7 @@ class Response extends \yii\base\Response
public function sendContentAsFile($content, $attachmentName, $mimeType = 'application/octet-stream')
{
$headers = $this->getHeaders();
- $contentLength = StringHelper::strlen($content);
+ $contentLength = StringHelper::byteLen($content);
$range = $this->getHttpRange($contentLength);
if ($range === false) {
$headers->set('Content-Range', "bytes */$contentLength");
@@ -395,14 +395,14 @@ class Response extends \yii\base\Response
->setDefault('Content-Type', $mimeType)
->setDefault('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->setDefault('Content-Transfer-Encoding', 'binary')
- ->setDefault('Content-Length', StringHelper::strlen($content))
+ ->setDefault('Content-Length', StringHelper::byteLen($content))
->setDefault('Content-Disposition', "attachment; filename=\"$attachmentName\"");
list($begin, $end) = $range;
if ($begin !=0 || $end != $contentLength - 1) {
$this->setStatusCode(206);
$headers->set('Content-Range', "bytes $begin-$end/$contentLength");
- $this->content = StringHelper::substr($content, $begin, $end - $begin + 1);
+ $this->content = StringHelper::byteSubstr($content, $begin, $end - $begin + 1);
} else {
$this->setStatusCode(200);
$this->content = $content;
diff --git a/framework/yii/web/XmlResponseFormatter.php b/framework/yii/web/XmlResponseFormatter.php
index 292424a..c072ee6 100644
--- a/framework/yii/web/XmlResponseFormatter.php
+++ b/framework/yii/web/XmlResponseFormatter.php
@@ -12,7 +12,7 @@ use DOMElement;
use DOMText;
use yii\base\Arrayable;
use yii\base\Component;
-use yii\helpers\StringHelper;
+use yii\helpers\FileHelper;
/**
* XmlResponseFormatter formats the given data into an XML response content.
@@ -66,7 +66,7 @@ class XmlResponseFormatter extends Component implements ResponseFormatterInterfa
protected function buildXml($element, $data)
{
if (is_object($data)) {
- $child = new DOMElement(StringHelper::basename(get_class($data)));
+ $child = new DOMElement(FileHelper::basename(get_class($data)));
$element->appendChild($child);
if ($data instanceof Arrayable) {
$this->buildXml($child, $data->toArray());
diff --git a/tests/unit/framework/helpers/StringHelperTest.php b/tests/unit/framework/helpers/StringHelperTest.php
index 2f1fb06..125386d 100644
--- a/tests/unit/framework/helpers/StringHelperTest.php
+++ b/tests/unit/framework/helpers/StringHelperTest.php
@@ -1,6 +1,7 @@
assertEquals(4, StringHelper::strlen('this'));
- $this->assertEquals(6, StringHelper::strlen('это'));
+ $this->assertEquals(4, StringHelper::byteLen('this'));
+ $this->assertEquals(6, StringHelper::byteLen('это'));
}
public function testSubstr()
{
- $this->assertEquals('th', StringHelper::substr('this', 0, 2));
- $this->assertEquals('э', StringHelper::substr('это', 0, 2));
+ $this->assertEquals('th', StringHelper::byteSubstr('this', 0, 2));
+ $this->assertEquals('э', StringHelper::byteSubstr('это', 0, 2));
}
public function testBasename()
{
- $this->assertEquals('', StringHelper::basename(''));
+ $this->assertEquals('', FileHelper::basename(''));
- $this->assertEquals('file', StringHelper::basename('file'));
- $this->assertEquals('file.test', StringHelper::basename('file.test', '.test2'));
- $this->assertEquals('file', StringHelper::basename('file.test', '.test'));
+ $this->assertEquals('file', FileHelper::basename('file'));
+ $this->assertEquals('file.test', FileHelper::basename('file.test', '.test2'));
+ $this->assertEquals('file', FileHelper::basename('file.test', '.test'));
- $this->assertEquals('file', StringHelper::basename('/file'));
- $this->assertEquals('file.test', StringHelper::basename('/file.test', '.test2'));
- $this->assertEquals('file', StringHelper::basename('/file.test', '.test'));
+ $this->assertEquals('file', FileHelper::basename('/file'));
+ $this->assertEquals('file.test', FileHelper::basename('/file.test', '.test2'));
+ $this->assertEquals('file', FileHelper::basename('/file.test', '.test'));
- $this->assertEquals('file', StringHelper::basename('/path/to/file'));
- $this->assertEquals('file.test', StringHelper::basename('/path/to/file.test', '.test2'));
- $this->assertEquals('file', StringHelper::basename('/path/to/file.test', '.test'));
+ $this->assertEquals('file', FileHelper::basename('/path/to/file'));
+ $this->assertEquals('file.test', FileHelper::basename('/path/to/file.test', '.test2'));
+ $this->assertEquals('file', FileHelper::basename('/path/to/file.test', '.test'));
- $this->assertEquals('file', StringHelper::basename('\file'));
- $this->assertEquals('file.test', StringHelper::basename('\file.test', '.test2'));
- $this->assertEquals('file', StringHelper::basename('\file.test', '.test'));
+ $this->assertEquals('file', FileHelper::basename('\file'));
+ $this->assertEquals('file.test', FileHelper::basename('\file.test', '.test2'));
+ $this->assertEquals('file', FileHelper::basename('\file.test', '.test'));
- $this->assertEquals('file', StringHelper::basename('C:\file'));
- $this->assertEquals('file.test', StringHelper::basename('C:\file.test', '.test2'));
- $this->assertEquals('file', StringHelper::basename('C:\file.test', '.test'));
+ $this->assertEquals('file', FileHelper::basename('C:\file'));
+ $this->assertEquals('file.test', FileHelper::basename('C:\file.test', '.test2'));
+ $this->assertEquals('file', FileHelper::basename('C:\file.test', '.test'));
- $this->assertEquals('file', StringHelper::basename('C:\path\to\file'));
- $this->assertEquals('file.test', StringHelper::basename('C:\path\to\file.test', '.test2'));
- $this->assertEquals('file', StringHelper::basename('C:\path\to\file.test', '.test'));
+ $this->assertEquals('file', FileHelper::basename('C:\path\to\file'));
+ $this->assertEquals('file.test', FileHelper::basename('C:\path\to\file.test', '.test2'));
+ $this->assertEquals('file', FileHelper::basename('C:\path\to\file.test', '.test'));
// mixed paths
- $this->assertEquals('file.test', StringHelper::basename('/path\to/file.test'));
- $this->assertEquals('file.test', StringHelper::basename('/path/to\file.test'));
- $this->assertEquals('file.test', StringHelper::basename('\path/to\file.test'));
+ $this->assertEquals('file.test', FileHelper::basename('/path\to/file.test'));
+ $this->assertEquals('file.test', FileHelper::basename('/path/to\file.test'));
+ $this->assertEquals('file.test', FileHelper::basename('\path/to\file.test'));
// \ and / in suffix
- $this->assertEquals('file', StringHelper::basename('/path/to/filete/st', 'te/st'));
- $this->assertEquals('st', StringHelper::basename('/path/to/filete/st', 'te\st'));
- $this->assertEquals('file', StringHelper::basename('/path/to/filete\st', 'te\st'));
- $this->assertEquals('st', StringHelper::basename('/path/to/filete\st', 'te/st'));
+ $this->assertEquals('file', FileHelper::basename('/path/to/filete/st', 'te/st'));
+ $this->assertEquals('st', FileHelper::basename('/path/to/filete/st', 'te\st'));
+ $this->assertEquals('file', FileHelper::basename('/path/to/filete\st', 'te\st'));
+ $this->assertEquals('st', FileHelper::basename('/path/to/filete\st', 'te/st'));
// http://www.php.net/manual/en/function.basename.php#72254
- $this->assertEquals('foo', StringHelper::basename('/bar/foo/'));
- $this->assertEquals('foo', StringHelper::basename('\\bar\\foo\\'));
+ $this->assertEquals('foo', FileHelper::basename('/bar/foo/'));
+ $this->assertEquals('foo', FileHelper::basename('\\bar\\foo\\'));
}
}
diff --git a/tests/unit/framework/web/ResponseTest.php b/tests/unit/framework/web/ResponseTest.php
index 6077945..69fb60d 100644
--- a/tests/unit/framework/web/ResponseTest.php
+++ b/tests/unit/framework/web/ResponseTest.php
@@ -57,7 +57,7 @@ class ResponseTest extends \yiiunit\TestCase
$this->assertEquals(206, $this->response->statusCode);
$headers = $this->response->headers;
$this->assertEquals("bytes", $headers->get('Accept-Ranges'));
- $this->assertEquals("bytes " . $expectedHeader . '/' . StringHelper::strlen($fullContent), $headers->get('Content-Range'));
+ $this->assertEquals("bytes " . $expectedHeader . '/' . StringHelper::byteLen($fullContent), $headers->get('Content-Range'));
$this->assertEquals('text/plain', $headers->get('Content-Type'));
$this->assertEquals("$length", $headers->get('Content-Length'));
}