Browse Source

Upload Yii-1 1.1.20

master v1.1.20
parent
commit
c2398a9d97
  1. 18
      CHANGELOG
  2. 5
      LICENSE
  3. 7
      UPGRADE
  4. 33
      framework/YiiBase.php
  5. 21
      framework/db/ar/CActiveFinder.php
  6. 10
      framework/db/ar/CActiveRecord.php
  7. 16
      framework/db/schema/mssql/CMssqlSqlsrvPdoAdapter.php
  8. 2
      framework/db/schema/mysql/CMysqlColumnSchema.php
  9. 22
      framework/gii/components/Pear/Text/Diff/Engine/native.php
  10. 2
      framework/gii/components/Pear/Text/Diff/Engine/shell.php
  11. 3
      framework/gii/generators/model/ModelCode.php
  12. 68
      framework/messages/el/yii.php
  13. 412
      framework/vendors/htmlpurifier/HTMLPurifier.standalone.php
  14. 18
      framework/vendors/zend-escaper/Escaper.php
  15. 2
      framework/web/CController.php
  16. 2
      framework/web/CDbHttpSession.php
  17. 59
      framework/web/CHttpSession.php
  18. 2
      framework/web/filters/CHttpCacheFilter.php
  19. 77
      framework/web/helpers/CHtml.php
  20. 2
      framework/web/widgets/CTabView.php
  21. 76
      framework/yiilite.php

18
CHANGELOG

@ -1,6 +1,22 @@
Yii Framework Change Log
 Yii Framework Change Log
========================
Version 1.1.20 July 6, 2018
---------------------------
- Bug #4182: CSecurityManager requires mcrypt extension to work, and for PHP 7.2 we need to install it from pecl (sergey-dryabzhinsky)
- Bug #4162: Adjusted Zend Escaper to be compatible with PHP <5.3 and fixed usage of non-existing Exceptions (cebe)
- Bug #4167: Fixed PHP 7.2 incompatibility of "count()" in `CActiveFinder` and CController::renderDynamic() (softark, ThePepster)
- Bug #4168: Fixed `CDbHttpSession` PHP 7.1 compatibility (csears123)
- Bug #4179: Fixed MariaDB 10.2 current_timestamp() (yaBliznyk)
- Bug #4191: Fixed "Headers already sent." error in CHttpSession (daniel1302)
- Bug #4191: Fixed "CHtml::value() behaves differently for objects" for PHP 7.2 (daniel1302)
- Bug #4197: Fixed PHP 7.2 assert with string argument is deprecated warning using Gii (ThePepster)
- Bug #4203: Fixed `CHttpCacheFilter::sendCacheControlHeader` PHP 7.2 compatibility (b1rdex)
- Enh #4191: Added option for filter classes loaded by YiiBase autoloader (daniel1302)
- Chg #4160: Updated HTMLPurifier to version 4.9.3 (takobell)
- Bug #4198: Fixed PHP 7.2 SQLSRV lastInsertId (agusdrs)
Version 1.1.19 June 8, 2017
---------------------------

5
LICENSE

@ -1,7 +1,4 @@
The Yii framework is free software. It is released under the terms of
the following BSD License.
Copyright (c) 2008-2014 by Yii Software LLC (http://www.yiisoft.com)
Copyright (c) 2008 by Yii Software LLC (http://www.yiisoft.com)
All rights reserved.
Redistribution and use in source and binary forms, with or without

7
UPGRADE

@ -1,4 +1,4 @@
Upgrading Instructions for Yii Framework v1.1.19
Upgrading Instructions for Yii Framework v1.1.20
================================================
!!!IMPORTANT!!!
@ -18,6 +18,11 @@ General upgrade instructions
issues to Yii issue tracker.
Upgrading from v1.1.19
----------------------
No significant changes were made.
Upgrading from v1.1.18
----------------------

33
framework/YiiBase.php

@ -53,6 +53,13 @@ defined('YII_ZII_PATH') or define('YII_ZII_PATH',YII_PATH.DIRECTORY_SEPARATOR.'z
*/
class YiiBase
{
/**
* @var array filters for autoloading mechanism.
* It should be callable. For callable function autoloader pass className.
* If filter function returns true Yii autoloader will be skipped.
* @since 1.1.20
*/
public static $autoloaderFilters=array();
/**
* @var array class map used by the Yii autoloading mechanism.
* The array keys are the class names and the array values are the corresponding class file paths.
@ -80,7 +87,7 @@ class YiiBase
*/
public static function getVersion()
{
return '1.1.19';
return '1.1.20';
}
/**
@ -399,6 +406,30 @@ class YiiBase
*/
public static function autoload($className,$classMapOnly=false)
{
foreach (self::$autoloaderFilters as $filter)
{
if (is_array($filter)
&& isset($filter[0]) && isset($filter[1])
&& is_string($filter[0]) && is_string($filter[1])
&& true === call_user_func(array($filter[0], $filter[1]), $className)
)
{
return true;
}
elseif (is_string($filter)
&& true === call_user_func($filter, $className)
)
{
return true;
}
elseif (is_callable($filter)
&& true === $filter($className)
)
{
return true;
}
}
// use include so that the error PHP file may appear
if(isset(self::$classMap[$className]))
include(self::$classMap[$className]);

21
framework/db/ar/CActiveFinder.php

@ -588,9 +588,10 @@ class CJoinElement
$childCondition=array();
$count=0;
$params=array();
$pkCount=is_array($parent->_table->primaryKey)?count($parent->_table->primaryKey):1;
foreach($fks as $i=>$fk)
{
if($i<count($parent->_table->primaryKey))
if($i<$pkCount)
{
$pk=is_array($parent->_table->primaryKey) ? $parent->_table->primaryKey[$i] : $parent->_table->primaryKey;
$parentCondition[$pk]=$joinAlias.'.'.$schema->quoteColumnName($fk).'=:ypl'.$count;
@ -599,7 +600,7 @@ class CJoinElement
}
else
{
$j=$i-count($parent->_table->primaryKey);
$j=$i-$pkCount;
$pk=is_array($this->_table->primaryKey) ? $this->_table->primaryKey[$j] : $this->_table->primaryKey;
$childCondition[$pk]=$this->getColumnPrefix().$schema->quoteColumnName($pk).'='.$joinAlias.'.'.$schema->quoteColumnName($fk);
}
@ -1173,16 +1174,17 @@ class CJoinElement
{
$parentCondition=array();
$childCondition=array();
$pkCount=is_array($parent->_table->primaryKey)?count($parent->_table->primaryKey):1;
foreach($fks as $i=>$fk)
{
if($i<count($parent->_table->primaryKey))
if($i<$pkCount)
{
$pk=is_array($parent->_table->primaryKey) ? $parent->_table->primaryKey[$i] : $parent->_table->primaryKey;
$parentCondition[$pk]=$parent->getColumnPrefix().$schema->quoteColumnName($pk).'='.$joinAlias.'.'.$schema->quoteColumnName($fk);
}
else
{
$j=$i-count($parent->_table->primaryKey);
$j=$i-$pkCount;
$pk=is_array($this->_table->primaryKey) ? $this->_table->primaryKey[$j] : $this->_table->primaryKey;
$childCondition[$pk]=$this->getColumnPrefix().$schema->quoteColumnName($pk).'='.$joinAlias.'.'.$schema->quoteColumnName($fk);
}
@ -1426,9 +1428,10 @@ class CStatElement
$table=$model->getTableSchema();
$parent=$this->_parent;
$pkTable=$parent->model->getTableSchema();
$pkCount=is_array($pkTable->primaryKey)?count($pkTable->primaryKey):1;
$fks=preg_split('/\s*,\s*/',$relation->foreignKey,-1,PREG_SPLIT_NO_EMPTY);
if(count($fks)!==count($pkTable->primaryKey))
if(count($fks)!==$pkCount)
throw new CDbException(Yii::t('yii','The relation "{relation}" in active record class "{class}" is specified with an invalid foreign key. The columns in the key must match the primary keys of the table "{table}".',
array('{class}'=>get_class($parent->model), '{relation}'=>$relation->name, '{table}'=>$pkTable->name)));
@ -1534,9 +1537,11 @@ class CStatElement
$relation=$this->relation;
$model=$this->_finder->getModel($relation->className);
$table=$model->getTableSchema();
$pkCount=is_array($table->primaryKey)?count($table->primaryKey):1;
$builder=$model->getCommandBuilder();
$schema=$builder->getSchema();
$pkTable=$this->_parent->model->getTableSchema();
$pkCountPk=is_array($pkTable->primaryKey)?count($pkTable->primaryKey):1;
$tableAlias=$model->getTableAlias(true);
@ -1545,7 +1550,7 @@ class CStatElement
array('{class}'=>get_class($this->_parent->model), '{relation}'=>$relation->name, '{joinTable}'=>$joinTableName)));
$fks=preg_split('/\s*,\s*/',$keys,-1,PREG_SPLIT_NO_EMPTY);
if(count($fks)!==count($table->primaryKey)+count($pkTable->primaryKey))
if(count($fks)!==$pkCount+$pkCountPk)
throw new CDbException(Yii::t('yii','The relation "{relation}" in active record class "{class}" is specified with an incomplete foreign key. The foreign key must consist of columns referencing both joining tables.',
array('{class}'=>get_class($this->_parent->model), '{relation}'=>$relation->name)));
@ -1585,14 +1590,14 @@ class CStatElement
$map=array();
foreach($fks as $i=>$fk)
{
if($i<count($pkTable->primaryKey))
if($i<$pkCountPk)
{
$pk=is_array($pkTable->primaryKey) ? $pkTable->primaryKey[$i] : $pkTable->primaryKey;
$map[$pk]=$fk;
}
else
{
$j=$i-count($pkTable->primaryKey);
$j=$i-$pkCountPk;
$pk=is_array($table->primaryKey) ? $table->primaryKey[$j] : $table->primaryKey;
$joinCondition[$pk]=$tableAlias.'.'.$schema->quoteColumnName($pk).'='.$joinTable->rawName.'.'.$schema->quoteColumnName($fk);
}

10
framework/db/ar/CActiveRecord.php

@ -1455,7 +1455,7 @@ abstract class CActiveRecord extends CModel
* @param array $params parameters to be bound to an SQL statement.
* This is only used when the first parameter is a string (query condition).
* In other cases, please use {@link CDbCriteria::params} to set parameters.
* @return static the record found. Null if no record is found.
* @return static|null the record found. Null if no record is found.
*/
public function find($condition='',$params=array())
{
@ -1484,7 +1484,7 @@ abstract class CActiveRecord extends CModel
* @param mixed $pk primary key value(s). Use array for multiple primary keys. For composite key, each key value must be an array (column name=>column value).
* @param mixed $condition query condition or criteria.
* @param array $params parameters to be bound to an SQL statement.
* @return static the record found. Null if none is found.
* @return static|null the record found. Null if none is found.
*/
public function findByPk($pk,$condition='',$params=array())
{
@ -1517,7 +1517,7 @@ abstract class CActiveRecord extends CModel
* An attribute value can be an array which will be used to generate an IN condition.
* @param mixed $condition query condition or criteria.
* @param array $params parameters to be bound to an SQL statement.
* @return static the record found. Null if none is found.
* @return static|null the record found. Null if none is found.
*/
public function findByAttributes($attributes,$condition='',$params=array())
{
@ -1548,7 +1548,7 @@ abstract class CActiveRecord extends CModel
* Finds a single active record with the specified SQL statement.
* @param string $sql the SQL statement
* @param array $params parameters to be bound to the SQL statement
* @return static the record found. Null if none is found.
* @return static|null the record found. Null if none is found.
*/
public function findBySql($sql,$params=array())
{
@ -1850,7 +1850,7 @@ abstract class CActiveRecord extends CModel
* This method is internally used by the find methods.
* @param array $attributes attribute values (column name=>column value)
* @param boolean $callAfterFind whether to call {@link afterFind} after the record is populated.
* @return static the newly created active record. The class of the object is the same as the model class.
* @return static|null the newly created active record. The class of the object is the same as the model class.
* Null is returned if the input data is false.
*/
public function populateRecord($attributes,$callAfterFind=true)

16
framework/db/schema/mssql/CMssqlSqlsrvPdoAdapter.php

@ -20,16 +20,22 @@ class CMssqlSqlsrvPdoAdapter extends PDO
{
/**
* Returns last inserted ID value.
* SQLSRV driver supports PDO::lastInsertId() with one peculiarity: when $sequence's value is null or empty
* string it returns empty string. But when parameter is not specified at all it's working as expected
* and returns actual last inserted ID (like other PDO drivers).
* Before version 5.0, the SQLSRV driver supports PDO::lastInsertId() with one peculiarity: when $sequence's
* value is null or empty string it returns empty string. But when parameter is not specified at all it's working as
* expected and returns actual last inserted ID (like other PDO drivers).
* Version 5.0 of the Microsoft PHP Drivers for SQL Server changes the behaviour of PDO::lastInsertID to be
* consistent with the behaviour outlined in the PDO documentation. It returns the ID of the
* last inserted sequence or row.
*
* @param string|null $sequence the sequence name. Defaults to null.
* @param string|null $sequence the sequence/table name. Defaults to null.
* @return integer last inserted ID value.
*/
public function lastInsertId($sequence=null)
{
if(!$sequence)
$parts = explode('.', phpversion('pdo_sqlsrv'));
$sqlsrvVer = phpversion('pdo_sqlsrv') ? intval(array_shift($parts)) : 0;
if(!$sequence || $sqlsrvVer >= 5)
return parent::lastInsertId();
return parent::lastInsertId($sequence);
}

2
framework/db/schema/mysql/CMysqlColumnSchema.php

@ -44,7 +44,7 @@ class CMysqlColumnSchema extends CDbColumnSchema
{
if(strncmp($this->dbType,'bit',3)===0)
$this->defaultValue=bindec(trim($defaultValue,'b\''));
elseif(($this->dbType==='timestamp' || $this->dbType==='datetime') && $defaultValue==='CURRENT_TIMESTAMP')
elseif(($this->dbType==='timestamp' || $this->dbType==='datetime') && ($defaultValue==='CURRENT_TIMESTAMP' || $defaultValue==='current_timestamp()'))
$this->defaultValue=null;
else
parent::extractDefault($defaultValue);

22
framework/gii/components/Pear/Text/Diff/Engine/native.php

@ -192,7 +192,9 @@ class Text_Diff_Engine_native {
}
$matches = $ymatches[$line];
reset($matches);
while (list(, $y) = each($matches)) {
foreach($matches as $match) {
reset($match);
$y = next($match);
if (empty($this->in_seq[$y])) {
$k = $this->_lcsPos($y);
assert($k > 0);
@ -200,7 +202,9 @@ class Text_Diff_Engine_native {
break;
}
}
while (list(, $y) = each($matches)) {
foreach($matches as $match) {
reset($match);
$y = next($match);
if ($y > $this->seq[$k - 1]) {
assert($y <= $this->seq[$k]);
/* Optimization: this is a common case: next match is
@ -332,7 +336,7 @@ class Text_Diff_Engine_native {
$i = 0;
$j = 0;
assert('count($lines) == count($changed)');
assert(count($lines) == count($changed));
$len = count($lines);
$other_len = count($other_changed);
@ -353,7 +357,7 @@ class Text_Diff_Engine_native {
}
while ($i < $len && ! $changed[$i]) {
assert('$j < $other_len && ! $other_changed[$j]');
assert($j < $other_len && ! $other_changed[$j]);
$i++; $j++;
while ($j < $other_len && $other_changed[$j]) {
$j++;
@ -385,11 +389,11 @@ class Text_Diff_Engine_native {
while ($start > 0 && $changed[$start - 1]) {
$start--;
}
assert('$j > 0');
assert($j > 0);
while ($other_changed[--$j]) {
continue;
}
assert('$j >= 0 && !$other_changed[$j]');
assert($j >= 0 && !$other_changed[$j]);
}
/* Set CORRESPONDING to the end of the changed run, at the
@ -410,7 +414,7 @@ class Text_Diff_Engine_native {
$i++;
}
assert('$j < $other_len && ! $other_changed[$j]');
assert($j < $other_len && ! $other_changed[$j]);
$j++;
if ($j < $other_len && $other_changed[$j]) {
$corresponding = $i;
@ -426,11 +430,11 @@ class Text_Diff_Engine_native {
while ($corresponding < $i) {
$changed[--$start] = 1;
$changed[--$i] = 0;
assert('$j > 0');
assert($j > 0);
while ($other_changed[--$j]) {
continue;
}
assert('$j >= 0 && !$other_changed[$j]');
assert($j >= 0 && !$other_changed[$j]);
}
}
}

2
framework/gii/components/Pear/Text/Diff/Engine/shell.php

@ -85,7 +85,7 @@ class Text_Diff_Engine_shell {
if ($from_line_no < $match[1] || $to_line_no < $match[4]) {
// copied lines
assert('$match[1] - $from_line_no == $match[4] - $to_line_no');
assert($match[1] - $from_line_no == $match[4] - $to_line_no);
array_push($edits,
new Text_Diff_Op_copy(
$this->_getLines($from_lines, $from_line_no, $match[1] - 1),

3
framework/gii/generators/model/ModelCode.php

@ -368,7 +368,8 @@ class ModelCode extends CCodeModel
protected function isRelationTable($table)
{
$pk=$table->primaryKey;
return (count($pk) === 2 // we want 2 columns
$count=is_array($pk) ? count($pk) : 1;
return ($count === 2 // we want 2 columns
&& isset($table->foreignKeys[$pk[0]]) // pk column 1 is also a foreign key
&& isset($table->foreignKeys[$pk[1]]) // pk column 2 is also a foriegn key
&& $table->foreignKeys[$pk[0]][0] !== $table->foreignKeys[$pk[1]][0]); // and the foreign keys point different tables

68
framework/messages/el/yii.php

@ -17,57 +17,55 @@
* NOTE, this file must be saved in UTF-8 encoding.
*/
return array (
'CDbConnection failed to open the DB connection.' => 'Το CDbConnection απέτυχε να ανοίξει τη σύνδεση με τη βάση δεδομένων.',
'CDbConnection is unable to find PDO class "{className}". Make sure PDO is installed correctly.' => 'Το CDbConnection αδυνατεί να βρει την PDO κλάση "{className}". Σιγουρευτείτε ότι το PDO είναι σωστά εγκατεστημένο.',
'CSecurityManager::generateRandomString() cannot generate random string in the current environment.' => 'Η μέθοδος CSecurityManager::generateRandomString() δεν μπορεί να δημιουργήσει τυχαία αλφαριθμητική φράση στο τρέχον περιβάλλον.',
'Cannot hash a password that is empty or not a string.' => 'Δεν είναι δυνατός ο κατακερματισμός ένας συνθηματικού που δεν έχει τιμή ή δεν είναι αλφαριθμητική φράση.',
'Internal error while generating hash.' => 'Εσωτερικό σφάλμα κατά τον κατακερματισμό.',
'No' => 'Όχι',
'Only SHA1 and MD5 hashing algorithms are supported when using PHP 5.1.1 or below.' => 'Μόνο αλγόριθμοι κατακερματισμού SHA1 και MD5 υποστηρίζονται όταν χρησιμοποιείται έκδοση PHP 5.1.1 και πιο κάτω.',
'Script HTML options are not allowed for "CClientScript::POS_LOAD" and "CClientScript::POS_READY".' => 'Οι επιλογές σεναρίου HTML δεν επιτρέπονται για τα "CClientScript::POS_LOAD" και "CClientScript::POS_READY".',
'The $converter argument must be a valid callback or null.' => 'Το όρισμα $converter πρέπει να είναι έγκυρη συνάρτηση επανάκλησης ή null.',
'Unable to generate random string.' => 'Δεν ήταν δυνατή η δημιουργία τυχαίας αλφαριθμητικής φράσης.',
'Yes' => 'Ναι',
'{class} requires the Blowfish option of the PHP crypt() function. This system does not have it.' => 'Η κλάση {class} απαιτεί την επιλογή Blowfish της συνάρτησης crypt() της PHP. Το σύστημα δεν την έχει.',
'{class} requires the PHP crypt() function. This system does not have it.' => 'Η κλάση {class} απαιτεί τη συνάρτηση crypt() της PHP. Το σύστημα δεν την έχει.',
'{class}::$cost must be a number.' => 'Το {class}::$cost πρέπει να είναι αριθμός.',
'{class}::$cost must be between 4 and 31.' => 'Το {class}::$cost πρέπει να είναι μεταξύ 4 και 31.',
'\'{db}\' component doesn\'t exist.' => 'Δεν υπάρχει το δομικό στοιχείο \'{db}\'.',
'\'{db}\' component is not a valid CDbConnection instance.' => 'Το δομικό στοιχείο \'{db}\' δεν είναι έγκυρο στιγμιότυπο CDbConnection.',
'A PHP extension stopped the file upload.' => 'Μια επέκταση της PHP διέκοψε την αποστολή του αρχείου.',
'CApcCache requires PHP {extension} extension to be loaded.' => 'Το CApcCache απαιτεί την επέκταση {extension} της PHP να έχει φορτωθεί.',
'Can not generate multiple insert command with empty data set.' => 'Δεν είναι δυνατή η δημιουργία πολλαπλών εντολών insert με κενό σετ δεδομένων.',
'Can\'t create state persister table. Check CREATE privilege for \'{db}\' connection user or create table manually with SQL: {sql}.' => 'Δεν είναι δυνατή η δημιουργία του πίνακα διατήρησης κατάστασης. Ελέγξτε αν ο χρήστης της βάσης \'{db}\' έχει το δικαίωμα CREATE ή δημιουργήστε τον πίνακα χειροκίνητα με την εντολή SQL: {sql}',
'Encryption key length can be {keyLengths}.' => 'Το μήκος του κλειδιού κρυπτογράφησης πρέπει να είναι {keyLengths}.',
'Encryption key length must be between {minLength} and {maxLength}.' => 'Το μήκος του κλειδιού κρυπτογράφησης πρέπει να είναι μεταξύ {minLength} και {maxLength}.',
'Encryption key should be a string.' => 'Το κλειδί κρυπτογράφησης πρέπει να είναι αλφαριθμητικό.',
'Failed to validate key. Supported key lengths of cipher not known.' => 'Δεν ήταν δυνατή η επαλήθευση του κλειδιού. Δεν είναι γνωστά τα υποστηριζόμενα μήκη κλειδιών του κώδικα κρυπτογράφησης.',
'No encryption key specified.' => 'Δεν ορίστηκε κλειδί κρυπτογράφησης.',
'Unable to upload the file "{file}" because of an unrecognized error.' => 'Δεν ήταν δυνατή η αποστολή του αρχείου "{file}" λόγω άγνωστου σφάλματος.',
'stateTableName param cannot be null.' => 'Η παράμετρος stateTableName δεν μπορεί να είναι κενή.',
'"{path}" is not a valid directory.' => 'Η διαδρομή "{path}" δεν είναι έγκυρος κατάλογος.',
'&lt; Previous' => '&lt; Προηγούμενη',
'&lt;&lt; First' => '&lt;&lt; Αρχική',
'Action class {class} must implement the "run" method.' => 'Η κλάση ενέργεια {class} πρέπει να υλοποιεί την μέθοδο "run".',
'Active Record requires a "db" CDbConnection application component.' => 'Το Active Record απαιτεί ένα "db" CDbConnection συστατικό της εφαρμογής.',
'Active Record requires a "db" CDbConnection application component.' => 'Το Active Record απαιτεί ένα "db" CDbConnection δομικό στοιχείο της εφαρμογής.',
'Active record "{class}" has an invalid configuration for relation "{relation}". It must specify the relation type, the related active record class and the foreign key.' => 'Η Active record κλάση "{class}" έχει μια μη έγκυρη παραμετροποίηση για τη σχέση "{relation}". Θα πρέπει να ορίζεται ο τύπος της σχέσης, η σχετιζόμενη κλάση Active record και το ξένο κλειδί.',
'Active record "{class}" is trying to select an invalid column "{column}". Note, the column must exist in the table or be an expression with alias.' => 'Η Active record κλάση "{class}" προσπαθεί να επιλέξει μια μη έγκυρη στήλη "{column}". Πρέπει να σημειωθεί, ότι η στήλη θα πρέπει να υπάρχει στον πίνακα ή να είναι μια έκφραση με κάποιο ψευδώνυμο.',
'Adding a foreign key constraint to an existing table is not supported by SQLite.' => 'Η προσθήκη περιορισμού ξένου κλειδιού σε υπάρχοντα πίνακα δεν υποστηρίζεται από την SQLite.',
'Adding a primary key after table has been created is not supported by SQLite.' => 'Η προσθήκη πρωτεύοντος κλειδιού αφού έχει δημιουργηθεί ο πίνακας δεν υποστηρίζεται από το SQLite.',
'Alias "{alias}" is invalid. Make sure it points to an existing PHP file and the file is readable.' => 'Το ψευδώνυμο "{alias}" δεν είναι έγκυρο. Βεβαιωθείτε ότι δείχνει σε υπάρχον αρχείο PHP.',
'Alias "{alias}" is invalid. Make sure it points to an existing directory or file.' => 'Το ψευδώνυμο "{alias}" δεν είναι έγκυρο. Επιβεβαιώστε ότι δείχνει σε ένα υπάρχων κατάλογο ή αρχείο.',
'Alias "{alias}" is invalid. Make sure it points to an existing directory.' => 'Το ψευδώνυμο "{alias}" είναι μη έγκυρο. Βεβαιωθείτε ότι δείχνει σε υπάρχοντα κατάλογο.',
'Altering a DB column is not supported by SQLite.' => 'Η τροποποίηση μια στήλης πίνακα της βάσης δεδομένων δεν υποστηρίζεται από την SQLite.',
'Application Log' => 'Ημερολόγιο εφαρμογής',
'Application base path "{path}" is not a valid directory.' => 'Η βασική διαδρομή της εφαρμογής "{path}" δεν είναι έγκυρος κατάλογος.',
'Application runtime path "{path}" is not valid. Please make sure it is a directory writable by the Web server process.' => 'Η βασική διαδρομή εκτέλεσης "{path}" δεν είναι έγκυρη. Επιβεβαιώστε ότι ο κατάλογος είναι εγγράψιμος από τη διεργασία του διακομιστή ιστοσελίδων.',
'Authorization item "{item}" has already been assigned to user "{user}".' => 'Το αντικείμενο πιστοποίησης "{item}" έχει οριστεί στο χρήστη "{user}".',
'Base path "{path}" is not a valid directory.' => 'Η βασική διαδρομή "{path}" δεν είναι έγκυρος κατάλογος.',
'CApcCache requires PHP apc extension to be loaded.' => 'Το CApcCache απαιτεί την επέκταση apc της PHP να έχει φορτωθεί.',
'CAssetManager.basePath "{path}" is invalid. Please make sure the directory exists and is writable by the Web server process.' => 'Η διαδρομή CAssetManager.basePath "{path}" δεν είναι έγκυρη. Επιβεβαιώστε ότι ο κατάλογος υπάρχει και είναι εγγράψιμος από τη διεργασία του διακομιστή ιστοσελίδων.',
'CCacheHttpSession.cacheID is invalid. Please make sure "{id}" refers to a valid cache application component.' => 'Το CCacheHttpSession.cacheID δεν είναι έγκυρο. Επιβεβαιώστε ότι το "{id}" αναφέρεται σε ένα έγκυρο συστατικό λανθάνουσας μνήμης της εφαρμογής.',
'CCacheHttpSession.cacheID is invalid. Please make sure "{id}" refers to a valid cache application component.' => 'Το CCacheHttpSession.cacheID δεν είναι έγκυρο. Επιβεβαιώστε ότι το "{id}" αναφέρεται σε ένα έγκυρο δομικό στοιχείο λανθάνουσας μνήμης της εφαρμογής.',
'CCaptchaValidator.action "{id}" is invalid. Unable to find such an action in the current controller.' => 'Το CCaptchaValidator.action "{id}" δεν είναι έγκυρο. Δεν ήταν δυνατή η εύρεση τέτοιας ενέργειας στον τρέχων ελεγκτή.',
'CDbAuthManager.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.' => 'Το CDbAuthManager.connectionID "{id}" δεν είναι έγκυρο. Επιβεβαιώστε ότι αναφέρεται στο αναγνωριστικό (ID) του συστατικού CDbConnection της εφαρμογής.',
'CDbCache.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.' => 'Το CDbCache.connectionID "{id}" δεν είναι έγκυρο. Επιβεβαιώστε ότι αναφέρεται στο αναγνωριστικό (ID) του συστατικού CDbConnection της εφαρμογής.',
'CDbCacheDependency.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.' => 'Το CDbCacheDependency.connectionID "{id}" δεν είναι έγκυρο. Βεβαιωθείτε ότι αυτό δείχνει στο αναγνωριστικό ενός συστατικού CDbConnection της εφαρμογής.',
'CDbAuthManager.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.' => 'Το CDbAuthManager.connectionID "{id}" δεν είναι έγκυρο. Επιβεβαιώστε ότι αναφέρεται στο αναγνωριστικό (ID) του δομικού στοιχείου CDbConnection της εφαρμογής.',
'CDbCache.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.' => 'Το CDbCache.connectionID "{id}" δεν είναι έγκυρο. Επιβεβαιώστε ότι αναφέρεται στο αναγνωριστικό (ID) του δομικού στοιχείου CDbConnection της εφαρμογής.',
'CDbCacheDependency.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.' => 'Το CDbCacheDependency.connectionID "{id}" δεν είναι έγκυρο. Βεβαιωθείτε ότι αυτό δείχνει στο αναγνωριστικό ενός δομικού στοιχείου CDbConnection της εφαρμογής.',
'CDbCacheDependency.sql cannot be empty.' => 'Το CDbCacheDependency.sql δεν πρέπει να είναι κενό.',
'CDbCommand failed to execute the SQL statement: {error}' => 'Το CDbCommand απέτυχε να εκτελέσει τη δήλωση SQL: {error}',
'CDbCommand failed to prepare the SQL statement: {error}' => 'Το CDbCommand απέτυχε να προετοιμάσει τη δήλωση SQL: {error}',
'CDbCommand::execute() failed: {error}. The SQL statement executed was: {sql}.' => 'Το CDbCommand::execute() απέτυχε: {error}. Η δήλωση SQL που εκτελέστηκε ήταν: {sql}.',
'CDbCommand::{method}() failed: {error}. The SQL statement executed was: {sql}.' => 'Το CDbCommand::{method}() απέτυχε: {error}. Η δήλωση SQL που εκτελέστηκε ήταν: {sql}.',
'CDbConnection does not support reading schema for {driver} database.' => 'Το CDbConnection δεν υποστηρίζει την ανάγνωση του σχήματος από τον οδηγό {driver} της βάσης δεδομένων.',
'CDbConnection failed to open the DB connection.' => 'Το CDbConnection απέτυχε να ανοίξει τη σύνδεση με τη βάση δεδομένων.',
'CDbConnection is unable to find PDO class "{className}". Make sure PDO is installed correctly.' => 'Το CDbConnection αδυνατεί να βρει την PDO κλάση "{className}". Βεβαιωθείτε ότι το PDO είναι σωστά εγκατεστημένο.',
'CDbDataReader cannot rewind. It is a forward-only reader.' => 'Το CDbDataReader δεν μπορεί να επιστρέψει πίσω. Είναι αναγνώστης μόνο προς τα εμπρός.',
'CDbHttpSession.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.' => 'Το CDbHttpSession.connectionID "{id}" δεν είναι έγκυρο. Επιβεβαιώστε ότι αναφέρεται στο αναγνωριστικό (ID) του συστατικού CDbConnection της εφαρμογής.',
'CDbLogRoute.connectionID "{id}" does not point to a valid CDbConnection application component.' => 'Το CDbLogRoute.connectionID "{id}" δεν δείχνει σε έγκυρο συστατικό CDbConnection της εφαρμογής.',
'CDbMessageSource.connectionID is invalid. Please make sure "{id}" refers to a valid database application component.' => 'Το CDbMessageSource.connectionID δεν είναι έγκυρο. Επιβεβαιώστε ότι το "{id}" αναφέρεται σε ένα έγκυρο συστατικό βάσης δεδομένων της εφαρμογής.',
'CDbTestFixture.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.' => 'Το CDbTestFixture.connectionID "{id}" δεν είναι έγκυρο. Σιγουρευτείτε ότι αναφέρεται στο ID ενός συστατικού CDbConnection της εφαρμογής.',
'CDbHttpSession.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.' => 'Το CDbHttpSession.connectionID "{id}" δεν είναι έγκυρο. Επιβεβαιώστε ότι αναφέρεται στο αναγνωριστικό (ID) του δομικού στοιχείου CDbConnection της εφαρμογής.',
'CDbLogRoute.connectionID "{id}" does not point to a valid CDbConnection application component.' => 'Το CDbLogRoute.connectionID "{id}" δεν δείχνει σε έγκυρο δομικό στοιχείο CDbConnection της εφαρμογής.',
'CDbMessageSource.connectionID is invalid. Please make sure "{id}" refers to a valid database application component.' => 'Το CDbMessageSource.connectionID δεν είναι έγκυρο. Επιβεβαιώστε ότι το "{id}" αναφέρεται σε ένα έγκυρο δομικό στοιχείο βάσης δεδομένων της εφαρμογής.',
'CDbTestFixture.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.' => 'Το CDbTestFixture.connectionID "{id}" δεν είναι έγκυρο. Βεβαιωθείτε ότι αναφέρεται στο ID ενός δομικού στοιχείου CDbConnection της εφαρμογής.',
'CDbTransaction is inactive and cannot perform commit or roll back operations.' => 'Το CDbTransaction είναι ανενεργό και δεν μπορεί να εκτελέσει την ολοκλήρωση ή ακύρωση ενεργειών.',
'CDirectoryCacheDependency.directory cannot be empty.' => 'Το CDirectoryCacheDependency.directory δεν πρέπει να είναι κενό.',
'CEAcceleratorCache requires PHP eAccelerator extension to be loaded, enabled or compiled with the "--with-eaccelerator-shared-memory" option.' => 'Το CEAcceleratorCache απαιτεί η επέκταση PHP eAccelerator να είναι φορτωμένη, ενεργοποιημένη ή μεταγλωττισμένη με την επιλογή "--with-eaccelerator-shared-memory".',
@ -91,8 +89,8 @@ return array (
'CProfileLogRoute found a mismatching code block "{token}". Make sure the calls to Yii::beginProfile() and Yii::endProfile() be properly nested.' => 'Το CProfileLogRoute βρήκε ένα τμήμα κώδικα "{token}" που δεν ταιριάζει. Επιβεβαιώστε ότι οι κλήσεις στο Yii::beginProfile() και Yii::endProfile() είναι σωστά φωλιασμένες.',
'CProfileLogRoute.report "{report}" is invalid. Valid values include "summary" and "callstack".' => 'Το CProfileLogRoute.report "{report}" είναι μη έγκυρο. Οι έγκυρες τιμές περιλαμβάνουν τα "summary" και "callstack".',
'CSecurityManager requires PHP mcrypt extension to be loaded in order to use data encryption feature.' => 'Το CSecurityManager απαιτεί να έχει φορτωθεί η επέκταση mcrypt της PHP προκειμένου να χρησιμοποιηθεί το χαρακτηριστικό κρυπτογράφησης των δεδομένων.',
'CSecurityManager.encryptionKey cannot be empty.' => 'Το CSecurityManager.encryptionKey δεν πρέπει να είναι κενό.',
'CSecurityManager.validationKey cannot be empty.' => 'Το CSecurityManager.validationKey δεν πρέπει να είναι κενό.',
'CSecurityManager::generateRandomString() cannot generate random string in the current environment.' => 'Η μέθοδος CSecurityManager::generateRandomString() δεν μπορεί να δημιουργήσει τυχαία αλφαριθμητική φράση στο τρέχον περιβάλλον.',
'CTypedList<{type}> can only hold objects of {type} class.' => 'Το CTypedList<{type}> μπορεί να περιέχει μόνο αντικείμενα τύπου {type}.',
'CTypedMap<{type}> can only hold objects of {type} class.' => 'Το CTypedMap<{type}> μπορεί να κρατάει μόνο αντικείμενα της κλάσης {type}.',
'CUrlManager.UrlFormat must be either "path" or "get".' => 'Το CUrlManager.UrlFormat μπορεί να είναι είτε "path" είτε "get".',
@ -118,12 +116,12 @@ return array (
'Failed to set unsafe attribute "{attribute}" of "{class}".' => 'Απέτυχε ο ορισμός της μη ασφαλούς ιδιότητας "{attribute}" της κλάσης "{class}".',
'Failed to start session.' => 'Απέτυχε η έναρξη συνόδου.',
'Failed to write the uploaded file "{file}" to disk.' => 'Δεν ήταν δυνατή η εγγραφή του απεσταλμένου αρχείου "{file}" στο δίσκο.',
'File upload was stopped by extension.' => 'Η αποστολή του αρχείου διακόπηκε από επέκταση.',
'Filter "{filter}" is invalid. Controller "{class}" does not have the filter method "filter{filter}".' => 'Το φίλτρο "{filter}" δεν είναι έγκυρο. Ο ελεγκτής "{class}" δεν περιέχει τη μέθοδο φίλτρου "filter{filter}".',
'GD with FreeType or ImageMagick PHP extensions are required.' => 'Απαιτούνται οι PHP επεκτάσεις GD με το FreeType ή το ImageMagick.',
'Get a new code' => 'Δημιουργία νέου κωδικού',
'Go to page: ' => 'Μετάβαση στη σελίδα: ',
'In order to use MIME-type validation provided by CFileValidator fileinfo PECL extension should be installed.' => 'Προκειμένου να χρησιμοποιήσετε την επαλήθευση για τον MIME τύπο που παρέχει το CFileValidator, απαιτείται να είναι εγκατεστημένη η επέκταση PECL fileinfo.',
'Internal error while generating hash.' => 'Εσωτερικό σφάλμα κατά τον κατακερματισμό.',
'Invalid MO file revision: {revision}.' => 'Μη έγκυρος αριθμός αρχείου MO αναθεώρησης: {revision}.',
'Invalid MO file: {file} (magic: {magic}).' => 'Μη έγκυρο αρχείο MO: {file} (magic: {magic}).',
'Invalid enumerable value "{value}". Please make sure it is among ({enum}).' => 'Μη έγκυρη τιμή απαρίθμησης "{value}". Βεβαιωθείτε ότι είναι μεταξύ ({enum}).',
@ -136,9 +134,11 @@ return array (
'Map data must be an array or an object implementing Traversable.' => 'Τα δεδομένα τύπου Map πρέπει να είναι πίνακας ή αντικείμενο που υλοποιεί το Traversable.',
'Missing the temporary folder to store the uploaded file "{file}".' => 'Δεν υπάρχει ο προσωρινός φάκελος για την αποθήκευση του ανεβασμένου αρχείου "{file}".',
'Next &gt;' => 'Επόμενη &gt;',
'No' => 'Όχι',
'No columns are being updated for table "{table}".' => 'Δεν ενημερώνονται στήλες για τον πίνακα "{table}".',
'No counter columns are being updated for table "{table}".' => 'Δεν ενημερώνονται στήλες για τον πίνακα "{table}".',
'Object configuration must be an array containing a "class" element.' => 'Η παραμετροποίηση αντικειμένου πρέπει να είναι πίνακας που να περιέχει ένα στοιχείο "class".',
'Only SHA1 and MD5 hashing algorithms are supported when using PHP 5.1.1 or below.' => 'Μόνο αλγόριθμοι κατακερματισμού SHA1 και MD5 υποστηρίζονται όταν χρησιμοποιείται έκδοση PHP 5.1.1 και πιο κάτω.',
'Please fix the following input errors:' => 'Παρακαλώ διορθώστε τα παρακάτω σφάλματα:',
'Powered by {yii}.' => 'Ο ιστοτόπος τρέχει {yii}.',
'Property "{class}.{property}" is not defined.' => 'Η ιδιότητα "{class}.{property}" δεν έχει ορισθεί.',
@ -148,16 +148,17 @@ return array (
'Relation "{name}" is not defined in active record class "{class}".' => 'Η σχέση "{name}" δεν έχει οριστεί για την active record κλάση "{class}".',
'Removing a primary key after table has been created is not supported by SQLite.' => 'Η αφαίρεση πρωτεύοντος κλειδιού αφού έχει δημιουργηθεί ο πίνακας δεν υποστηρίζεται από το SQLite.',
'Renaming a DB column is not supported by SQLite.' => 'Η μετονομασία μια στήλης πίνακα της βάσης δεδομένων δεν υποστηρίζεται από την SQLite.',
'Script HTML options are not allowed for "CClientScript::POS_LOAD" and "CClientScript::POS_READY".' => 'Οι επιλογές σεναρίου HTML δεν επιτρέπονται για τα "CClientScript::POS_LOAD" και "CClientScript::POS_READY".',
'Stack data must be an array or an object implementing Traversable.' => 'Τα δεδομένα στοίβας πρέπει να είναι πίνακας ή αντικείμενο που υλοποιεί το Traversable.',
'Table "{table}" does not exist.' => 'Ο πίνακας "{table}" δεν υπάρχει.',
'Table "{table}" does not have a column named "{column}".' => 'Ο πίνακας "{table}" δεν έχει στήλη με όνομα "{column}".',
'The "db" application component must be configured to be a CDbConnection object.' => 'Το συστατικό εφαρμογής "db" πρέπει να οριστεί ως αντικείμενο τύπου CDbConnection.',
'The "db" application component must be configured to be a CDbConnection object.' => 'Το δομικό στοιχείο της εφαρμογής "db" πρέπει να οριστεί ως αντικείμενο τύπου CDbConnection.',
'The "filter" property must be specified with a valid callback.' => 'Η ιδιότητα "filter" πρέπει να οριστεί με ένα έγκυρο callback.',
'The "forceCopy" and "linkAssets" cannot be both true.' => 'Τα "forceCopy" και "linkAssets" δεν μπορεί να είναι και τα δύο αληθή.',
'The "pattern" property must be specified with a valid regular expression.' => 'Η ιδιότητα "pattern" πρέπει να οριστεί με μια έγκυρη κανονική έκφραση.',
'The "range" property must be specified with a list of values.' => 'Η ιδιότητα "range" πρέπει να καθοριστεί με μια λίστα τιμών.',
'The $converter argument must be a valid callback or null.' => 'Το όρισμα $converter πρέπει να είναι έγκυρη συνάρτηση επανάκλησης ή null.',
'The CSRF token could not be verified.' => 'Ήταν αδύνατη η επαλήθευση του συμβόλου CSRF.',
'The DB query must contain the "from" portion.' => 'Το ερώτημα για τη βάση δεδομένων πρέπει να περιέχει το "from" τμήμα.',
'The STAT relation "{name}" cannot have child relations.' => 'Η σχέση STAT "{name}" δεν μπορεί να έχει σχέσεις-παιδιά.',
'The URL pattern "{pattern}" for route "{route}" is not a valid regular expression.' => 'Το URL πρότυπο "{pattern}" για τη διαδρομή "{route}" πρέπει να είναι έγκυρη κανονική έκφραση.',
'The active record cannot be deleted because it is new.' => 'Δεν είναι δυνατή η διαγραφή του active record, διότι είναι καινούριο.',
@ -196,7 +197,6 @@ return array (
'The pattern for week in month must be "W".' => 'Το πρότυπο για την εβδομάδα μέσα σε ένα μήνα πρέπει να είναι "W".',
'The pattern for week in year must be "w".' => 'Το πρότυπο για την εβδομάδα μέσα σε ένα έτος πρέπει να είναι "w".',
'The queue is empty.' => 'Η ουρά είναι άδεια.',
'The relation "{relation}" in active record class "{class}" is not specified correctly. The join table "{joinTable}" given in the foreign key cannot be found in the database.' => 'Η σχέση "{relation}" στην active record κλάση "{class}" δεν έχει οριστεί σωστά. Ο πίνακας σύζευξης "{joinTable}" που δίνεται στο ξένο κλειδί δεν μπορεί να βρεθεί στη βάση δεδομένων.',
'The relation "{relation}" in active record class "{class}" is not specified correctly: the join table "{joinTable}" given in the foreign key cannot be found in the database.' => 'Η σχέση "{relation}" στην active record κλάση "{class}" δεν έχει οριστεί σωστά: Ο πίνακας σύζευξης "{joinTable}" που δίνεται στο ξένο κλειδί δεν μπορεί να βρεθεί στη βάση δεδομένων.',
'The relation "{relation}" in active record class "{class}" is specified with a foreign key "{key}" that does not point to the parent table "{table}".' => 'Η σχέση "{relation}" στην active record κλάση "{class}" έχει οριστεί με το ξένο κλειδί "{key}" που δεν δείχνει στον γονικό πίνακα "{table}".',
'The relation "{relation}" in active record class "{class}" is specified with an incomplete foreign key. The foreign key must consist of columns referencing both joining tables.' => 'Η σχέση "{relation}" στην active record κλάση "{class}" έχει οριστεί με ελλειπές ξένο κλειδί. Το ξένο κλειδί θα πρέπει να περιέχει τις στήλες που αναφέρονται στους συζευγμένους πίνακες.',
@ -217,6 +217,7 @@ return array (
'Unable to change the item name. The name "{name}" is already used by another item.' => 'Δεν ήταν δυνατή η αλλαγή του ονόματος αντικειμένου. Το όνομα "{name}" χρησιμοποιείται ήδη από ένα άλλο αντικείμενο.',
'Unable to create application state file "{file}". Make sure the directory containing the file exists and is writable by the Web server process.' => 'Δεν ήταν δυνατή η δημιουργία του αρχείου κατάστασης της εφαρμογής "{file}". Βεβαιωθείτε ότι ο κατάλογος που περιέχει το αρχείο υπάρχει και είναι εγγράψιμος από τη διεργασία του διακομιστή ιστοσελίδων.',
'Unable to find "{column}" in table "{table}".' => 'Δεν ήταν δυνατή η εύρεση της στήλης "{column}" στον πίνακα "{table}".',
'Unable to generate random string.' => 'Δεν ήταν δυνατή η δημιουργία τυχαίας αλφαριθμητικής φράσης.',
'Unable to lock file "{file}" for reading.' => 'Δεν ήταν δυνατό το κλείδωμα του αρχείου "{file}" για ανάγνωση.',
'Unable to lock file "{file}" for writing.' => 'Δεν ήταν δυνατό το κλείδωμα του αρχείου "{file}" για εγγραφή.',
'Unable to read file "{file}".' => 'Δεν ήταν δυνατή η ανάγνωση του αρχείου "{file}".',
@ -228,6 +229,7 @@ return array (
'Unknown type "{type}".' => 'Άγνωστος τύπος "{type}".',
'Unrecognized locale "{locale}".' => 'Η τοπική ρύθμιση "{locale}" δεν αναγνωρίστηκε.',
'View file "{file}" does not exist.' => 'Το αρχείο όψης "{view}" δεν υπάρχει.',
'Yes' => 'Ναι',
'Yii application can only be created once.' => 'Η εφαρμογή Yii μπορεί να δημιουργηθεί μία μόνο φορά.',
'You are not authorized to perform this action.' => 'Δεν είστε πιστοποιημένος για την εκτέλεση αυτής της ενέργειας.',
'Your request is invalid.' => 'Η αίτησή σας δεν είναι έγκυρη.',
@ -266,7 +268,11 @@ return array (
'{class} does not support fetching all table names.' => 'Η κλάση {class} δεν υποστηρίζει τη λήψη όλων των ονομάτων πινάκων.',
'{class} has an invalid validation rule. The rule must specify attributes to be validated and the validator name.' => 'Η κλάση {class} έχει ένα μη έγκυρο κανόνα επαλήθευσης. Ο κανόνας πρέπει να ορίζει τα πεδία που θα επαληθεύονται, καθώς και το όνομα του επαληθευτή.',
'{class} must specify "model" and "attribute" or "name" property values.' => 'Η κλάση {class} πρέπει να ορίζει τα "model" και "attribute" ή "name" των τιμών των ιδιοτήτων.',
'{class} requires the Blowfish option of the PHP crypt() function. This system does not have it.' => 'Η κλάση {class} απαιτεί την επιλογή Blowfish της συνάρτησης crypt() της PHP. Το σύστημα δεν την έχει.',
'{class} requires the PHP crypt() function. This system does not have it.' => 'Η κλάση {class} απαιτεί τη συνάρτηση crypt() της PHP. Το σύστημα δεν την έχει.',
'{class}.allowAutoLogin must be set true in order to use cookie-based authentication.' => 'Το {class}.allowAutoLogin πρέπει να οριστεί σε αληθές για να χρησιμοποιηθεί η πιστοποίηση βάσει cookies.',
'{class}::$cost must be a number.' => 'Το {class}::$cost πρέπει να είναι αριθμός.',
'{class}::$cost must be between 4 and 31.' => 'Το {class}::$cost πρέπει να είναι μεταξύ 4 και 31.',
'{class}::authenticate() must be implemented.' => 'Η μέθοδος {class}::authenticate() πρέπει να οριστεί.',
'{controller} cannot find the requested view "{view}".' => 'Ο ελεγκτής {controller} δεν μπορεί να βρει την καλούμενη όψη "{view}".',
'{controller} contains improperly nested widget tags in its view "{view}". A {widget} widget does not have an endWidget() call.' => 'Ο ελεγκτής {controller} περιέχει λάθος εμφωλευμένες σημάνσεις widget στην όψη "{view}". Το widget {widget} δεν περιέχει την κλήση endWidget().',

412
framework/vendors/htmlpurifier/HTMLPurifier.standalone.php

@ -7,7 +7,7 @@
* primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
* FILE, changes will be overwritten the next time the script is run.
*
* @version 4.9.2
* @version 4.9.3
*
* @warning
* You must *not* include any other HTML Purifier files before this file,
@ -39,7 +39,7 @@
*/
/*
HTML Purifier 4.9.2 - Standards Compliant HTML Filtering
HTML Purifier 4.9.3 - Standards Compliant HTML Filtering
Copyright (C) 2006-2008 Edward Z. Yang
This library is free software; you can redistribute it and/or
@ -78,12 +78,12 @@ class HTMLPurifier
* Version of HTML Purifier.
* @type string
*/
public $version = '4.9.2';
public $version = '4.9.3';
/**
* Constant with version of HTML Purifier.
*/
const VERSION = '4.9.2';
const VERSION = '4.9.3';
/**
* Global configuration object.
@ -225,11 +225,11 @@ class HTMLPurifier
// purified HTML
$html =
$this->generator->generateFromTokens(
// list of tokens
// list of tokens
$this->strategy->execute(
// list of un-purified tokens
// list of un-purified tokens
$lexer->tokenizeHTML(
// un-purified HTML
// un-purified HTML
$html,
$config,
$context
@ -1105,7 +1105,7 @@ class HTMLPurifier_Bootstrap
} else {
$buggy = version_compare(PHP_VERSION, '5.2.11', '<');
$compat = version_compare(PHP_VERSION, '5.1.2', '<=') &&
version_compare(PHP_VERSION, '5.1.0', '>=');
version_compare(PHP_VERSION, '5.1.0', '>=');
foreach ($funcs as $func) {
if ($buggy && is_array($func)) {
// :TRICKY: There are some compatibility issues and some
@ -1225,24 +1225,24 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
);
$border_style =
$this->info['border-bottom-style'] =
$this->info['border-right-style'] =
$this->info['border-left-style'] =
$this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum(
array(
'none',
'hidden',
'dotted',
'dashed',
'solid',
'double',
'groove',
'ridge',
'inset',
'outset'
),
false
);
$this->info['border-bottom-style'] =
$this->info['border-right-style'] =
$this->info['border-left-style'] =
$this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum(
array(
'none',
'hidden',
'dotted',
'dashed',
'solid',
'double',
'groove',
'ridge',
'inset',
'outset'
),
false
);
$this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style);
@ -1308,31 +1308,31 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition();
$border_color =
$this->info['border-top-color'] =
$this->info['border-bottom-color'] =
$this->info['border-left-color'] =
$this->info['border-right-color'] =
$this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(
array(
new HTMLPurifier_AttrDef_Enum(array('transparent')),
new HTMLPurifier_AttrDef_CSS_Color()
)
);
$this->info['border-top-color'] =
$this->info['border-bottom-color'] =
$this->info['border-left-color'] =
$this->info['border-right-color'] =
$this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(
array(
new HTMLPurifier_AttrDef_Enum(array('transparent')),
new HTMLPurifier_AttrDef_CSS_Color()
)
);
$this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config);
$this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color);
$border_width =
$this->info['border-top-width'] =
$this->info['border-bottom-width'] =
$this->info['border-left-width'] =
$this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(
array(
new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')),
new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
)
);
$this->info['border-top-width'] =
$this->info['border-bottom-width'] =
$this->info['border-left-width'] =
$this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(
array(
new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')),
new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
)
);
$this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width);
@ -1380,30 +1380,30 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
);
$margin =
$this->info['margin-top'] =
$this->info['margin-bottom'] =
$this->info['margin-left'] =
$this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
array(
new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_Enum(array('auto'))
)
);
$this->info['margin-top'] =
$this->info['margin-bottom'] =
$this->info['margin-left'] =
$this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
array(
new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_Enum(array('auto'))
)
);
$this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin);
// non-negative
$padding =
$this->info['padding-top'] =
$this->info['padding-bottom'] =
$this->info['padding-left'] =
$this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
array(
new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true)
)
);
$this->info['padding-top'] =
$this->info['padding-bottom'] =
$this->info['padding-left'] =
$this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
array(
new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true)
)
);
$this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding);
@ -1764,7 +1764,7 @@ class HTMLPurifier_Config
* HTML Purifier's version
* @type string
*/
public $version = '4.9.2';
public $version = '4.9.3';
/**
* Whether or not to automatically finalize
@ -2076,7 +2076,7 @@ class HTMLPurifier_Config
}
// Raw type might be negative when using the fully optimized form
// of stdclass, which indicates allow_null == true
// of stdClass, which indicates allow_null == true
$rtype = is_int($def) ? $def : $def->type;
if ($rtype < 0) {
$type = -$rtype;
@ -2396,7 +2396,7 @@ class HTMLPurifier_Config
{
return $this->getDefinition('HTML', true, true);
}
/**
* @return HTMLPurifier_CSSDefinition
*/
@ -2404,7 +2404,7 @@ class HTMLPurifier_Config
{
return $this->getDefinition('CSS', true, true);
}
/**
* @return HTMLPurifier_URIDefinition
*/
@ -2525,8 +2525,8 @@ class HTMLPurifier_Config
*/
public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true)
{
$ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def);
$this->loadArray($ret);
$ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def);
$this->loadArray($ret);
}
/**
@ -2688,11 +2688,11 @@ class HTMLPurifier_ConfigSchema
*
* array(
* 'Namespace' => array(
* 'Directive' => new stdclass(),
* 'Directive' => new stdClass(),
* )
* )
*
* The stdclass may have the following properties:
* The stdClass may have the following properties:
*
* - If isAlias isn't set:
* - type: Integer type of directive, see HTMLPurifier_VarParser for definitions
@ -2703,8 +2703,8 @@ class HTMLPurifier_ConfigSchema
* - namespace: Namespace this directive aliases to
* - name: Directive name this directive aliases to
*
* In certain degenerate cases, stdclass will actually be an integer. In
* that case, the value is equivalent to an stdclass with the type
* In certain degenerate cases, stdClass will actually be an integer. In
* that case, the value is equivalent to an stdClass with the type
* property set to the integer. If the integer is negative, type is
* equal to the absolute value of integer, and allow_null is true.
*
@ -2769,7 +2769,7 @@ class HTMLPurifier_ConfigSchema
*/
public function add($key, $default, $type, $allow_null)
{
$obj = new stdclass();
$obj = new stdClass();
$obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type];
if ($allow_null) {
$obj->allow_null = true;
@ -2816,14 +2816,14 @@ class HTMLPurifier_ConfigSchema
*/
public function addAlias($key, $new_key)
{
$obj = new stdclass;
$obj = new stdClass;
$obj->key = $new_key;
$obj->isAlias = true;
$this->info[$key] = $obj;
}
/**
* Replaces any stdclass that only has the type property with type integer.
* Replaces any stdClass that only has the type property with type integer.
*/
public function postProcess()
{
@ -3140,8 +3140,8 @@ abstract class HTMLPurifier_DefinitionCache
public function generateKey($config)
{
return $config->version . ',' . // possibly replace with function calls
$config->getBatchSerial($this->type) . ',' .
$config->get($this->type . '.DefinitionRev');
$config->getBatchSerial($this->type) . ',' .
$config->get($this->type . '.DefinitionRev');
}
/**
@ -3923,7 +3923,7 @@ class HTMLPurifier_Encoder
}
$mState = 0; // cached expected number of octets after the current octet
// until the beginning of the next UTF8 character sequence
// until the beginning of the next UTF8 character sequence
$mUcs4 = 0; // cached Unicode character
$mBytes = 1; // cached expected number of octets in the current sequence
@ -4094,7 +4094,7 @@ class HTMLPurifier_Encoder
public static function unichr($code)
{
if ($code > 1114111 or $code < 0 or
($code >= 55296 and $code <= 57343) ) {
($code >= 55296 and $code <= 57343) ) {
// bits are set outside the "valid" range as defined
// by UNICODE 4.1.0
return '';
@ -4600,32 +4600,32 @@ class HTMLPurifier_EntityParser
*/
protected $_substituteEntitiesRegex =
'/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/';
// 1. hex 2. dec 3. string (XML style)
// 1. hex 2. dec 3. string (XML style)
/**
* Decimal to parsed string conversion table for special entities.
* @type array
*/
protected $_special_dec2str =
array(
34 => '"',
38 => '&',
39 => "'",
60 => '<',
62 => '>'
);
array(
34 => '"',
38 => '&',
39 => "'",
60 => '<',
62 => '>'
);
/**
* Stripped entity names to decimal conversion table for special entities.
* @type array
*/
protected $_special_ent2dec =
array(
'quot' => 34,
'amp' => 38,
'lt' => 60,
'gt' => 62
);
array(
'quot' => 34,
'amp' => 38,
'lt' => 60,
'gt' => 62
);
/**
* Substitutes non-special entities with their parsed equivalents. Since
@ -5228,11 +5228,11 @@ class HTMLPurifier_Generator
$tidy->parseString(
$html,
array(
'indent'=> true,
'output-xhtml' => $this->_xhtml,
'show-body-only' => true,
'indent-spaces' => 2,
'wrap' => 68,
'indent'=> true,
'output-xhtml' => $this->_xhtml,
'show-body-only' => true,
'indent-spaces' => 2,
'wrap' => 68,
),
'utf8'
);
@ -5268,7 +5268,7 @@ class HTMLPurifier_Generator
$attr = $this->generateAttributes($token->attr, $token->name);
if ($this->_flashCompat) {
if ($token->name == "object") {
$flash = new stdclass();
$flash = new stdClass();
$flash->attr = $token->attr;
$flash->param = array();
$this->_flashStack[] = $flash;
@ -5290,7 +5290,7 @@ class HTMLPurifier_Generator
$this->_flashStack[count($this->_flashStack)-1]->param[$token->attr['name']] = $token->attr['value'];
}
$attr = $this->generateAttributes($token->attr, $token->name);
return '<' . $token->name . ($attr ? ' ' : '') . $attr .
return '<' . $token->name . ($attr ? ' ' : '') . $attr .
( $this->_xhtml ? ' /': '' ) // <br /> v. <br>
. '>';
@ -5790,7 +5790,7 @@ class HTMLPurifier_HTMLDefinition extends HTMLPurifier_Definition
}
break;
}
// otherwise fall through
// otherwise fall through
case 1:
$attribute = htmlspecialchars($bits[0]);
trigger_error(
@ -6506,8 +6506,8 @@ class HTMLPurifier_HTMLModuleManager
// note the different choice
$this->contentSets = new HTMLPurifier_ContentSets(
// content set assembly deals with all possible modules,
// not just ones deemed to be "safe"
// content set assembly deals with all possible modules,
// not just ones deemed to be "safe"
$this->modules
);
$this->attrCollections = new HTMLPurifier_AttrCollections(
@ -7668,7 +7668,7 @@ class HTMLPurifier_Lexer
break;
}
if (class_exists('DOMDocument') &&
if (class_exists('DOMDocument', false) &&
method_exists('DOMDocument', 'loadHTML') &&
!extension_loaded('domxml')
) {
@ -7923,7 +7923,7 @@ class HTMLPurifier_Lexer
$hidden_elements = $config->get('Core.HiddenElements');
if ($config->get('Core.AggressivelyRemoveScript') &&
!($config->get('HTML.Trusted') || !$config->get('Core.RemoveScriptContents')
|| empty($hidden_elements["script"]))) {
|| empty($hidden_elements["script"]))) {
$html = preg_replace('#<script[^>]*>.*?</script>#i', '', $html);
}
@ -11082,7 +11082,7 @@ class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef
}
if ($caught['position'] !== false) {
$caught['position'] = $this->info['background-position']->
validate($caught['position'], $config, $context);
validate($caught['position'], $config, $context);
}
$ret = array();
@ -13345,9 +13345,9 @@ class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
if (function_exists('idn_to_ascii')) {
$string = idn_to_ascii($string);
// If we have Net_IDNA2 support, we can support IRIs by
// punycoding them. (This is the most portable thing to do,
// since otherwise we have to assume browsers support
// If we have Net_IDNA2 support, we can support IRIs by
// punycoding them. (This is the most portable thing to do,
// since otherwise we have to assume browsers support
} elseif ($config->get('Core.EnableIDNA')) {
$idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
// we need to encode each period separately
@ -14724,7 +14724,7 @@ class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
// a little sanity check to make sure it's not ALL whitespace
$all_whitespace = true;
$current_li = false;
$current_li = null;
foreach ($children as $node) {
if (!empty($node->is_whitespace)) {
@ -14745,7 +14745,7 @@ class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
// to handle non-list elements; non-list elements should
// not be appended to an existing li; only li created
// for non-list. This distinction is not currently made.
if ($current_li === false) {
if ($current_li === null) {
$current_li = new HTMLPurifier_Node_Element('li');
$result[] = $current_li;
}
@ -15005,8 +15005,8 @@ class HTMLPurifier_ChildDef_StrictBlockquote extends HTMLPurifier_ChildDef_Requi
if ($block_wrap === false) {
if (($node instanceof HTMLPurifier_Node_Text && !$node->is_whitespace) ||
($node instanceof HTMLPurifier_Node_Element && !isset($this->elements[$node->name]))) {
$block_wrap = new HTMLPurifier_Node_Element($def->info_block_wrapper);
$ret[] = $block_wrap;
$block_wrap = new HTMLPurifier_Node_Element($def->info_block_wrapper);
$ret[] = $block_wrap;
}
} else {
if ($node instanceof HTMLPurifier_Node_Element && isset($this->elements[$node->name])) {
@ -15129,7 +15129,7 @@ class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
$content = array();
$tbody_mode = false; // if true, then we need to wrap any stray
// <tr>s with a <tbody>.
// <tr>s with a <tbody>.
$ws_accum =& $initial_ws;
@ -15139,71 +15139,71 @@ class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
continue;
}
switch ($node->name) {
case 'tbody':
$tbody_mode = true;
case 'tbody':
$tbody_mode = true;
// fall through
case 'tr':
$content[] = $node;
$ws_accum =& $content;
break;
case 'caption':
// there can only be one caption!
if ($caption !== false) break;
$caption = $node;
$ws_accum =& $after_caption_ws;
break;
case 'thead':
$tbody_mode = true;
// XXX This breaks rendering properties with
// Firefox, which never floats a <thead> to
// the top. Ever. (Our scheme will float the
// first <thead> to the top.) So maybe
// <thead>s that are not first should be
// turned into <tbody>? Very tricky, indeed.
if ($thead === false) {
$thead = $node;
$ws_accum =& $after_thead_ws;
} else {
// Oops, there's a second one! What
// should we do? Current behavior is to
// transmutate the first and last entries into
// tbody tags, and then put into content.
// Maybe a better idea is to *attach
// it* to the existing thead or tfoot?
// We don't do this, because Firefox
// doesn't float an extra tfoot to the
// bottom like it does for the first one.
$node->name = 'tbody';
$content[] = $node;
$ws_accum =& $content;
}
break;
case 'tfoot':
// see above for some aveats
$tbody_mode = true;
if ($tfoot === false) {
$tfoot = $node;
$ws_accum =& $after_tfoot_ws;
} else {
$node->name = 'tbody';
case 'tr':
$content[] = $node;
$ws_accum =& $content;
}
break;
case 'colgroup':
case 'col':
$cols[] = $node;
$ws_accum =& $cols;
break;
case '#PCDATA':
// How is whitespace handled? We treat is as sticky to
// the *end* of the previous element. So all of the
// nonsense we have worked on is to keep things
// together.
if (!empty($node->is_whitespace)) {
$ws_accum[] = $node;
}
break;
break;
case 'caption':
// there can only be one caption!
if ($caption !== false) break;
$caption = $node;
$ws_accum =& $after_caption_ws;
break;
case 'thead':
$tbody_mode = true;
// XXX This breaks rendering properties with
// Firefox, which never floats a <thead> to
// the top. Ever. (Our scheme will float the
// first <thead> to the top.) So maybe
// <thead>s that are not first should be
// turned into <tbody>? Very tricky, indeed.
if ($thead === false) {
$thead = $node;
$ws_accum =& $after_thead_ws;
} else {
// Oops, there's a second one! What
// should we do? Current behavior is to
// transmutate the first and last entries into
// tbody tags, and then put into content.
// Maybe a better idea is to *attach
// it* to the existing thead or tfoot?
// We don't do this, because Firefox
// doesn't float an extra tfoot to the
// bottom like it does for the first one.
$node->name = 'tbody';
$content[] = $node;
$ws_accum =& $content;
}
break;
case 'tfoot':
// see above for some aveats
$tbody_mode = true;
if ($tfoot === false) {
$tfoot = $node;
$ws_accum =& $after_tfoot_ws;
} else {
$node->name = 'tbody';
$content[] = $node;
$ws_accum =& $content;
}
break;
case 'colgroup':
case 'col':
$cols[] = $node;
$ws_accum =& $cols;
break;
case '#PCDATA':
// How is whitespace handled? We treat is as sticky to
// the *end* of the previous element. So all of the
// nonsense we have worked on is to keep things
// together.
if (!empty($node->is_whitespace)) {
$ws_accum[] = $node;
}
break;
}
}
@ -15234,25 +15234,25 @@ class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
foreach($content as $node) {
switch ($node->name) {
case 'tbody':
$current_tr_tbody = null;
$ret[] = $node;
break;
case 'tr':
if ($current_tr_tbody === null) {
$current_tr_tbody = new HTMLPurifier_Node_Element('tbody');
$ret[] = $current_tr_tbody;
}
$current_tr_tbody->children[] = $node;
break;
case '#PCDATA':
//assert($node->is_whitespace);
if ($current_tr_tbody === null) {
case 'tbody':
$current_tr_tbody = null;
$ret[] = $node;
} else {
break;
case 'tr':
if ($current_tr_tbody === null) {
$current_tr_tbody = new HTMLPurifier_Node_Element('tbody');
$ret[] = $current_tr_tbody;
}
$current_tr_tbody->children[] = $node;
}
break;
break;
case '#PCDATA':
//assert($node->is_whitespace);
if ($current_tr_tbody === null) {
$ret[] = $node;
} else {
$current_tr_tbody->children[] = $node;
}
break;
}
}
} else {
@ -18929,7 +18929,7 @@ class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer
restore_error_handler();
$body = $doc->getElementsByTagName('html')->item(0)-> // <html>
getElementsByTagName('body')->item(0); // <body>
getElementsByTagName('body')->item(0); // <body>
$div = $body->getElementsByTagName('div')->item(0); // <div>
$tokens = array();
@ -19992,10 +19992,10 @@ class HTMLPurifier_Strategy_FixNesting extends HTMLPurifier_Strategy
$parent_def = $definition->info_parent_def;
$stack = array(
array($top_node,
$parent_def->descendants_are_inline,
$parent_def->excludes, // exclusions
0)
);
$parent_def->descendants_are_inline,
$parent_def->excludes, // exclusions
0)
);
while (!empty($stack)) {
list($node, $is_inline, $excludes, $ix) = array_pop($stack);
@ -20012,7 +20012,7 @@ class HTMLPurifier_Strategy_FixNesting extends HTMLPurifier_Strategy
// child_def, but double check this...
$is_inline || $def->descendants_are_inline,
empty($def->excludes) ? $excludes
: array_merge($excludes, $def->excludes),
: array_merge($excludes, $def->excludes),
0);
break;
}
@ -20222,8 +20222,8 @@ class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy
// isset is in loop because $tokens size changes during loop exec
for (;;
// only increment if we don't need to reprocess
$reprocess ? $reprocess = false : $token = $zipper->next($token)) {
// only increment if we don't need to reprocess
$reprocess ? $reprocess = false : $token = $zipper->next($token)) {
// check for a rewind
if (is_int($i)) {
@ -20804,7 +20804,7 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy
// there is a transformation for this tag
// DEFINITION CALL
$token = $definition->
info_tag_transform[$token->name]->transform($token, $config, $context);
info_tag_transform[$token->name]->transform($token, $config, $context);
if ($e) {
$e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name);
}
@ -22297,8 +22297,8 @@ class HTMLPurifier_URIScheme_tel extends HTMLPurifier_URIScheme
// Delete all non-numeric characters, non-x characters
// from phone number, EXCEPT for a leading plus sign.
$uri->path = preg_replace('/(?!^\+)[^\dx]/', '',
// Normalize e(x)tension to lower-case
str_replace('X', 'x', $uri->path));
// Normalize e(x)tension to lower-case
str_replace('X', 'x', $uri->path));
return true;
}

18
framework/vendors/zend-escaper/Escaper.php

@ -91,21 +91,21 @@ class Escaper
* is set for htmlspecialchars() calls.
*
* @param string $encoding
* @throws Exception\InvalidArgumentException
* @throws Exception
*/
public function __construct($encoding = null)
{
if ($encoding !== null) {
$encoding = (string) $encoding;
if ($encoding === '') {
throw new Exception\InvalidArgumentException(
throw new Exception(
get_class($this) . ' constructor parameter does not allow a blank value'
);
}
$encoding = strtolower($encoding);
if (!in_array($encoding, $this->supportedEncodings)) {
throw new Exception\InvalidArgumentException(
throw new Exception(
'Value of \'' . $encoding . '\' passed to ' . get_class($this)
. ' constructor parameter is invalid. Provide an encoding supported by htmlspecialchars()'
);
@ -251,8 +251,8 @@ class Escaper
$hex = bin2hex($chr);
$ord = hexdec($hex);
if (isset(static::$htmlNamedEntityMap[$ord])) {
return '&' . static::$htmlNamedEntityMap[$ord] . ';';
if (isset(self::$htmlNamedEntityMap[$ord])) {
return '&' . self::$htmlNamedEntityMap[$ord] . ';';
}
/**
@ -306,7 +306,7 @@ class Escaper
* class' constructor.
*
* @param string $string
* @throws Exception\RuntimeException
* @throws Exception
* @return string
*/
protected function toUtf8($string)
@ -318,7 +318,7 @@ class Escaper
}
if (!$this->isUtf8($result)) {
throw new Exception\RuntimeException(
throw new Exception(
sprintf('String to be escaped was not valid UTF-8 or could not be converted: %s', $result)
);
}
@ -359,7 +359,7 @@ class Escaper
* @param string $string
* @param string $to
* @param array|string $from
* @throws Exception\RuntimeException
* @throws Exception
* @return string
*/
protected function convertEncoding($string, $to, $from)
@ -369,7 +369,7 @@ class Escaper
} elseif (function_exists('mb_convert_encoding')) {
$result = mb_convert_encoding($string, $to, $from);
} else {
throw new Exception\RuntimeException(
throw new Exception(
get_class($this)
. ' requires either the iconv or mbstring extension to be installed'
. ' when escaping for non UTF-8 strings.'

2
framework/web/CController.php

@ -925,7 +925,7 @@ class CController extends CBaseController
*/
public function renderDynamic($callback)
{
$n=count($this->_dynamicOutput);
$n=($this->_dynamicOutput === null ? 0 : count($this->_dynamicOutput));
echo "<###dynamic-$n###>";
$params=func_get_args();
array_shift($params);

2
framework/web/CDbHttpSession.php

@ -228,7 +228,7 @@ class CDbHttpSession extends CHttpSession
->from($this->sessionTableName)
->where('expire>:expire AND id=:id',array(':expire'=>time(),':id'=>$id))
->queryScalar();
return $data===false?'':$data;
return ($data===null || $data===false)?'':$data;
}
/**

59
framework/web/CHttpSession.php

@ -76,6 +76,12 @@ class CHttpSession extends CApplicationComponent implements IteratorAggregate,Ar
*/
public $autoStart=true;
/**
* @var array Frozen session data
* @since 1.1.20
*/
private $_frozenData;
/**
* Initializes the application component.
* This method is required by IApplicationComponent and is invoked by application.
@ -270,18 +276,24 @@ class CHttpSession extends CApplicationComponent implements IteratorAggregate,Ar
{
if($value==='none')
{
$this->freeze();
ini_set('session.use_cookies','0');
ini_set('session.use_only_cookies','0');
$this->unfreeze();
}
elseif($value==='allow')
{
$this->freeze();
ini_set('session.use_cookies','1');
ini_set('session.use_only_cookies','0');
$this->unfreeze();
}
elseif($value==='only')
{
$this->freeze();
ini_set('session.use_cookies','1');
ini_set('session.use_only_cookies','1');
$this->unfreeze();
}
else
throw new CException(Yii::t('yii','CHttpSession.cookieMode can only be "none", "allow" or "only".'));
@ -303,9 +315,11 @@ class CHttpSession extends CApplicationComponent implements IteratorAggregate,Ar
{
if($value>=0 && $value<=100)
{
$this->freeze();
// percent * 21474837 / 2147483647 ≈ percent * 0.01
ini_set('session.gc_probability',floor($value*21474836.47));
ini_set('session.gc_divisor',2147483647);
$this->unfreeze();
}
else