mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-26 21:54:13 +01:00
Compare commits
31 Commits
3.0.2-rc1
...
saas-1.0.7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
163276a6c2 | ||
|
|
9b0c2f7324 | ||
|
|
e1807f598f | ||
|
|
02e63fff64 | ||
|
|
0864f05d9f | ||
|
|
1bbcd9656a | ||
|
|
34d8e52c22 | ||
|
|
ac7309e48c | ||
|
|
c8fade6013 | ||
|
|
ad052dd861 | ||
|
|
a5ea868609 | ||
|
|
0b03b3ef4d | ||
|
|
174cace20a | ||
|
|
e3f5dbfc80 | ||
|
|
40e24c25a2 | ||
|
|
c6e4466c53 | ||
|
|
6638eb4adc | ||
|
|
eb40968e34 | ||
|
|
766c9f0e7e | ||
|
|
2a064fd97d | ||
|
|
ca3c0cb163 | ||
|
|
44c0e236b0 | ||
|
|
6190429f51 | ||
|
|
6e3ff0e429 | ||
|
|
14facb4d6c | ||
|
|
f923ac879f | ||
|
|
0b46ab9e48 | ||
|
|
bdf11e32a7 | ||
|
|
1441b8a1d2 | ||
|
|
b1bc2cec1b | ||
|
|
e280f99996 |
@@ -5121,7 +5121,7 @@ HTML
|
||||
if ($sAttCode != MetaModel::GetStateAttributeCode($sClass) || !MetaModel::HasLifecycle($sClass)) {
|
||||
$sValueCheckbox = '<input type="checkbox" class="ibo-field--enable-bulk--checkbox" id="enable_'.$iFormId.'_'.$sAttCode.'" onClick="ToggleField(this.checked, \''.$iFormId.'_'.$sAttCode.'\')"/>';
|
||||
}
|
||||
$aComments[$sAttCode] .= '<div class="multi_values ibo-field--enable-bulk ibo-pill ibo-is-failure" id="multi_values_'.$sAttCode.'" data-tooltip-content="'.$sTip.'" data-tooltip-html-enabled="true">'.$iCount.$sValueCheckbox.'</div>';
|
||||
$aComments[$sAttCode] .= '<div class="multi_values ibo-field--enable-bulk ibo-pill ibo-is-failure" id="multi_values_'.$sAttCode.'" data-tooltip-content="'.$sTip.'" data-tooltip-html-enabled="true" data-tooltip-append-to="body">'.$iCount.$sValueCheckbox.'</div>';
|
||||
}
|
||||
$sReadyScript .= 'ToggleField('.(($iCount == 1) ? 'true' : 'false').', \''.$iFormId.'_'.$sAttCode.'\');'."\n";
|
||||
}
|
||||
|
||||
@@ -44,15 +44,15 @@ class CoreCannotSaveObjectException extends CoreException
|
||||
public function getHtmlMessage()
|
||||
{
|
||||
$sTitle = Dict::S('UI:Error:SaveFailed');
|
||||
$sContent = "<span><strong>{$sTitle}</strong></span>";
|
||||
$sContent = "<span><strong>".utils::HtmlEntities($sTitle)."</strong></span>";
|
||||
|
||||
if (count($this->aIssues) == 1) {
|
||||
$sIssue = reset($this->aIssues);
|
||||
$sContent .= " <span>{$sIssue}</span>";
|
||||
$sContent .= " <span>".utils::HtmlEntities($sIssue)."</span>";
|
||||
} else {
|
||||
$sContent .= '<ul>';
|
||||
foreach ($this->aIssues as $sError) {
|
||||
$sContent .= "<li>$sError</li>";
|
||||
$sContent .= "<li>".utils::HtmlEntities($sError)."</li>";
|
||||
}
|
||||
$sContent .= '</ul>';
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ class LoginBasic extends AbstractLoginFSMExtension
|
||||
$iErrorCode = LoginWebPage::EXIT_CODE_WRONGCREDENTIALS;
|
||||
return LoginWebPage::LOGIN_FSM_ERROR;
|
||||
}
|
||||
Session::Set('auth_user', $sAuthUser);
|
||||
}
|
||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||
}
|
||||
@@ -70,8 +71,7 @@ class LoginBasic extends AbstractLoginFSMExtension
|
||||
{
|
||||
if (Session::Get('login_mode') == 'basic')
|
||||
{
|
||||
list($sAuthUser) = $this->GetAuthUserAndPassword();
|
||||
LoginWebPage::OnLoginSuccess($sAuthUser, 'internal', Session::Get('login_mode'));
|
||||
LoginWebPage::OnLoginSuccess(Session::Get('auth_user'), 'internal', Session::Get('login_mode'));
|
||||
}
|
||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ class LoginExternal extends AbstractLoginFSMExtension
|
||||
$iErrorCode = LoginWebPage::EXIT_CODE_WRONGCREDENTIALS;
|
||||
return LoginWebPage::LOGIN_FSM_ERROR;
|
||||
}
|
||||
Session::Set('auth_user', $sAuthUser);
|
||||
}
|
||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||
}
|
||||
@@ -53,8 +54,7 @@ class LoginExternal extends AbstractLoginFSMExtension
|
||||
{
|
||||
if (Session::Get('login_mode') == 'external')
|
||||
{
|
||||
$sAuthUser = $this->GetAuthUser();
|
||||
LoginWebPage::OnLoginSuccess($sAuthUser, 'external', Session::Get('login_mode'));
|
||||
LoginWebPage::OnLoginSuccess(Session::Get('auth_user'), 'external', Session::Get('login_mode'));
|
||||
}
|
||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -71,6 +71,7 @@ class LoginForm extends AbstractLoginFSMExtension implements iLoginUIExtension
|
||||
$iErrorCode = LoginWebPage::EXIT_CODE_WRONGCREDENTIALS;
|
||||
return LoginWebPage::LOGIN_FSM_ERROR;
|
||||
}
|
||||
Session::Set('auth_user', $sAuthUser);
|
||||
}
|
||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||
}
|
||||
@@ -82,17 +83,8 @@ class LoginForm extends AbstractLoginFSMExtension implements iLoginUIExtension
|
||||
{
|
||||
if (Session::Get('login_mode') == 'form')
|
||||
{
|
||||
if (Session::IsSet('auth_user'))
|
||||
{
|
||||
// If FSM reenter this state (example 2FA) then the auth_user is not resubmitted
|
||||
$sAuthUser = Session::Get('auth_user');
|
||||
}
|
||||
else
|
||||
{
|
||||
$sAuthUser = utils::ReadPostedParam('auth_user', '', 'raw_data');
|
||||
}
|
||||
// Store 'auth_user' in session for further use
|
||||
LoginWebPage::OnLoginSuccess($sAuthUser, 'internal', Session::Get('login_mode'));
|
||||
LoginWebPage::OnLoginSuccess(Session::Get('auth_user'), 'internal', Session::Get('login_mode'));
|
||||
}
|
||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -60,6 +60,7 @@ class LoginURL extends AbstractLoginFSMExtension
|
||||
$iErrorCode = LoginWebPage::EXIT_CODE_WRONGCREDENTIALS;
|
||||
return LoginWebPage::LOGIN_FSM_ERROR;
|
||||
}
|
||||
Session::Set('auth_user', $sAuthUser);
|
||||
}
|
||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||
}
|
||||
@@ -68,8 +69,7 @@ class LoginURL extends AbstractLoginFSMExtension
|
||||
{
|
||||
if (Session::Get('login_mode') == 'url')
|
||||
{
|
||||
$sAuthUser = utils::ReadParam('auth_user', '', false, 'raw_data');
|
||||
LoginWebPage::OnLoginSuccess($sAuthUser, 'internal', Session::Get('login_mode'));
|
||||
LoginWebPage::OnLoginSuccess(Session::Get('auth_user'), 'internal', Session::Get('login_mode'));
|
||||
}
|
||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ class LoginWebPage extends NiceWebPage
|
||||
*/
|
||||
public static function SynchronizeProfiles(&$oUser, array $aProfiles, $sOrigin)
|
||||
{
|
||||
$oProfilesSet = $oUser->Get(‘profile_list’);
|
||||
$oProfilesSet = $oUser->Get('profile_list');
|
||||
//delete old profiles
|
||||
$aExistingProfiles = [];
|
||||
while ($oProfile = $oProfilesSet->Fetch())
|
||||
|
||||
@@ -23,6 +23,6 @@ define('ITOP_DESIGN_LATEST_VERSION', '3.0');
|
||||
* @used-by utils::GetItopVersionWikiSyntax()
|
||||
* @used-by iTopModulesPhpVersionIntegrationTest
|
||||
*/
|
||||
define('ITOP_CORE_VERSION', '3.0.1');
|
||||
define('ITOP_CORE_VERSION', '3.0.2');
|
||||
|
||||
require_once APPROOT.'bootstrap.inc.php';
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"symfony/twig-bundle": "~3.4.47",
|
||||
"symfony/yaml": "~3.4.47",
|
||||
"thenetworg/oauth2-azure": "^2.0",
|
||||
"twig/twig": "~1.42.5"
|
||||
"twig/twig": "~1.43.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/stopwatch": "~3.4.47",
|
||||
|
||||
30
composer.lock
generated
30
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "b3cdced77dc5a1160c12aadcafd9d7da",
|
||||
"content-hash": "86ca84263f7f271dfc10e5e63bd02385",
|
||||
"packages": [
|
||||
{
|
||||
"name": "combodo/tcpdf",
|
||||
@@ -4444,30 +4444,30 @@
|
||||
},
|
||||
{
|
||||
"name": "twig/twig",
|
||||
"version": "v1.42.5",
|
||||
"version": "v1.43.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/twigphp/Twig.git",
|
||||
"reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e"
|
||||
"reference": "2311602f6a208715252febe682fa7c38e56a3373"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
|
||||
"reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/2311602f6a208715252febe682fa7c38e56a3373",
|
||||
"reference": "2311602f6a208715252febe682fa7c38e56a3373",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.5.0",
|
||||
"php": ">=7.1.3",
|
||||
"symfony/polyfill-ctype": "^1.8"
|
||||
},
|
||||
"require-dev": {
|
||||
"psr/container": "^1.0",
|
||||
"symfony/phpunit-bridge": "^4.4|^5.0"
|
||||
"symfony/phpunit-bridge": "^4.4.9|^5.0.9"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.42-dev"
|
||||
"dev-master": "1.43-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@@ -4506,9 +4506,19 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/twigphp/Twig/issues",
|
||||
"source": "https://github.com/twigphp/Twig/tree/1.x"
|
||||
"source": "https://github.com/twigphp/Twig/tree/v1.43.1"
|
||||
},
|
||||
"time": "2020-02-11T05:59:23+00:00"
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/twig/twig",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-08-05T15:05:05+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [
|
||||
|
||||
@@ -11,7 +11,7 @@ define('UTF8_BOM', chr(239).chr(187).chr(191)); // 0xEF, 0xBB, 0xBF
|
||||
|
||||
/**
|
||||
* CellChangeSpec
|
||||
* A series of classes, keeping the information about a given cell: could it be changed or not (and why)?
|
||||
* A series of classes, keeping the information about a given cell: could it be changed or not (and why)?
|
||||
*
|
||||
* @package iTopORM
|
||||
*/
|
||||
@@ -42,6 +42,17 @@ abstract class CellChangeSpec
|
||||
return $this->m_sOql;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.1.0 N°5305
|
||||
*/
|
||||
public function GetDisplayableValueAndDescription(): string
|
||||
{
|
||||
return sprintf("%s%s",
|
||||
$this->GetDisplayableValue(),
|
||||
$this->GetDescription()
|
||||
);
|
||||
}
|
||||
|
||||
abstract public function GetDescription();
|
||||
}
|
||||
|
||||
@@ -86,26 +97,90 @@ class CellStatus_Issue extends CellStatus_Modify
|
||||
parent::__construct($proposedValue, $previousValue);
|
||||
}
|
||||
|
||||
public function GetDescription()
|
||||
public function GetDisplayableValue()
|
||||
{
|
||||
if (is_null($this->m_proposedValue))
|
||||
{
|
||||
return Dict::Format('UI:CSVReport-Value-SetIssue', $this->m_sReason);
|
||||
return Dict::Format('UI:CSVReport-Value-SetIssue');
|
||||
}
|
||||
return Dict::Format('UI:CSVReport-Value-ChangeIssue', $this->m_proposedValue, $this->m_sReason);
|
||||
return Dict::Format('UI:CSVReport-Value-ChangeIssue', \utils::EscapeHtml($this->m_proposedValue));
|
||||
}
|
||||
|
||||
public function GetDescription()
|
||||
{
|
||||
return $this->m_sReason;
|
||||
}
|
||||
/*
|
||||
* @since 3.1.0 N°5305
|
||||
*/
|
||||
public function GetDisplayableValueAndDescription(): string
|
||||
{
|
||||
return sprintf("%s. %s",
|
||||
$this->GetDisplayableValue(),
|
||||
$this->GetDescription()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class CellStatus_SearchIssue extends CellStatus_Issue
|
||||
{
|
||||
public function __construct()
|
||||
/** @var string|null $m_sAllowedValues */
|
||||
private $m_sAllowedValues;
|
||||
|
||||
/**
|
||||
* @since 3.1.0 N°5305
|
||||
* @var string $sSerializedSearch
|
||||
*/
|
||||
private $sSerializedSearch;
|
||||
|
||||
/** @var string|null $m_sTargetClass */
|
||||
private $m_sTargetClass;
|
||||
|
||||
/**
|
||||
* CellStatus_SearchIssue constructor.
|
||||
* @since 3.1.0 N°5305
|
||||
*
|
||||
* @param string $sOql : main message
|
||||
* @param string $sReason : main message
|
||||
* @param null $sClass : used for additional message that provides allowed values for current class $sClass
|
||||
* @param null $sAllowedValues : used for additional message that provides allowed values $sAllowedValues for current class
|
||||
*/
|
||||
public function __construct($sSerializedSearch, $sReason, $sClass=null, $sAllowedValues=null)
|
||||
{
|
||||
parent::__construct(null, null, null);
|
||||
parent::__construct(null, null, $sReason);
|
||||
$this->sSerializedSearch = $sSerializedSearch;
|
||||
$this->m_sAllowedValues = $sAllowedValues;
|
||||
$this->m_sTargetClass = $sClass;
|
||||
}
|
||||
|
||||
public function GetDisplayableValue()
|
||||
{
|
||||
if (null === $this->m_sReason) {
|
||||
return Dict::Format('UI:CSVReport-Value-NoMatch', '');
|
||||
}
|
||||
|
||||
return $this->m_sReason;
|
||||
}
|
||||
|
||||
public function GetDescription()
|
||||
{
|
||||
return Dict::S('UI:CSVReport-Value-NoMatch');
|
||||
if (\utils::IsNullOrEmptyString($this->m_sAllowedValues) ||
|
||||
\utils::IsNullOrEmptyString($this->m_sTargetClass)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return Dict::Format('UI:CSVReport-Value-NoMatch-PossibleValues', $this->m_sTargetClass, $this->m_sAllowedValues);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.1.0 N°5305
|
||||
* @return string
|
||||
*/
|
||||
public function GetSearchLinkUrl()
|
||||
{
|
||||
return sprintf("UI.php?operation=search&filter=%s",
|
||||
rawurlencode($this->sSerializedSearch)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,11 +201,24 @@ class CellStatus_NullIssue extends CellStatus_Issue
|
||||
class CellStatus_Ambiguous extends CellStatus_Issue
|
||||
{
|
||||
protected $m_iCount;
|
||||
/**
|
||||
* @since 3.1.0 N°5305
|
||||
* @var string
|
||||
*/
|
||||
protected $sSerializedSearch;
|
||||
|
||||
public function __construct($previousValue, $iCount, $sOql)
|
||||
/**
|
||||
* @since 3.1.0 N°5305
|
||||
*
|
||||
* @param $previousValue
|
||||
* @param int $iCount
|
||||
* @param string $sSerializedSearch
|
||||
*
|
||||
*/
|
||||
public function __construct($previousValue, $iCount, $sSerializedSearch)
|
||||
{
|
||||
$this->m_iCount = $iCount;
|
||||
$this->m_sQuery = $sOql;
|
||||
$this->sSerializedSearch = $sSerializedSearch;
|
||||
parent::__construct(null, $previousValue, '');
|
||||
}
|
||||
|
||||
@@ -139,12 +227,23 @@ class CellStatus_Ambiguous extends CellStatus_Issue
|
||||
$sCount = $this->m_iCount;
|
||||
return Dict::Format('UI:CSVReport-Value-Ambiguous', $sCount);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.1.0 N°5305
|
||||
* @return string
|
||||
*/
|
||||
public function GetSearchLinkUrl()
|
||||
{
|
||||
return sprintf("UI.php?operation=search&filter=%s",
|
||||
rawurlencode($this->sSerializedSearch)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* RowStatus
|
||||
* A series of classes, keeping the information about a given row: could it be changed or not (and why)?
|
||||
* A series of classes, keeping the information about a given row: could it be changed or not (and why)?
|
||||
*
|
||||
* @package iTopORM
|
||||
*/
|
||||
@@ -211,6 +310,26 @@ class RowStatus_Issue extends RowStatus
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* class dedicated to testability
|
||||
* not used/ignored in csv imports UI/CLI
|
||||
* @since 3.1.0 N°5305
|
||||
*/
|
||||
class RowStatus_Error extends RowStatus
|
||||
{
|
||||
/** @var string */
|
||||
protected $m_sError;
|
||||
|
||||
public function __construct($sError)
|
||||
{
|
||||
$this->m_sError = $sError;
|
||||
}
|
||||
|
||||
public function GetDescription()
|
||||
{
|
||||
return $this->m_sError;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* BulkChange
|
||||
@@ -220,17 +339,35 @@ class RowStatus_Issue extends RowStatus
|
||||
*/
|
||||
class BulkChange
|
||||
{
|
||||
protected $m_sClass;
|
||||
/** @var string */
|
||||
protected $m_sClass;
|
||||
protected $m_aData; // Note: hereafter, iCol maybe actually be any acceptable key (string)
|
||||
// #@# todo: rename the variables to sColIndex
|
||||
protected $m_aAttList; // attcode => iCol
|
||||
protected $m_aExtKeys; // aExtKeys[sExtKeyAttCode][sExtReconcKeyAttCode] = iCol;
|
||||
protected $m_aReconcilKeys; // attcode (attcode = 'id' for the pkey)
|
||||
protected $m_sSynchroScope; // OQL - if specified, then the missing items will be reported
|
||||
protected $m_aOnDisappear; // array of attcode => value, values to be set when an object gets out of scope (ignored if no scope has been defined)
|
||||
protected $m_sDateFormat; // Date format specification, see DateTime::createFromFormat
|
||||
protected $m_bLocalizedValues; // Values in the data set are localized (see AttributeEnum)
|
||||
protected $m_aExtKeysMappingCache; // Cache for resolving external keys based on the given search criterias
|
||||
/** @var array<string, string> attcode as key, iCol as value */
|
||||
protected $m_aAttList;
|
||||
/** @var array<string, array<string, string>> sExtKeyAttCode as key, array of sExtReconcKeyAttCode/iCol as value */
|
||||
protected $m_aExtKeys;
|
||||
/** @var string[] list of attcode (attcode = 'id' for the pkey) */
|
||||
protected $m_aReconcilKeys;
|
||||
/** @var string OQL - if specified, then the missing items will be reported */
|
||||
protected $m_sSynchroScope;
|
||||
/**
|
||||
* @var array<string, mixed> attcode as key, attvalue as value. Values to be set when an object gets out of scope
|
||||
* (ignored if no scope has been defined)
|
||||
*/
|
||||
protected $m_aOnDisappear;
|
||||
/**
|
||||
* @see DateTime::createFromFormat
|
||||
* @var string Date format specification
|
||||
*/
|
||||
protected $m_sDateFormat;
|
||||
/**
|
||||
* @see AttributeEnum
|
||||
* @var boolean true if Values in the data set are localized
|
||||
*/
|
||||
protected $m_bLocalizedValues;
|
||||
/** @var array Cache for resolving external keys based on the given search criterias */
|
||||
protected $m_aExtKeysMappingCache;
|
||||
|
||||
public function __construct($sClass, $aData, $aAttList, $aExtKeys, $aReconcilKeys, $sSynchroScope = null, $aOnDisappear = null, $sDateFormat = null, $bLocalize = false)
|
||||
{
|
||||
@@ -261,30 +398,30 @@ class BulkChange
|
||||
$this->m_sReportCsvSep = $sSeparator;
|
||||
$this->m_sReportCsvDelimiter = $sDelimiter;
|
||||
}
|
||||
|
||||
|
||||
protected function ResolveExternalKey($aRowData, $sAttCode, &$aResults)
|
||||
{
|
||||
$oExtKey = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode);
|
||||
$oReconFilter = new DBObjectSearch($oExtKey->GetTargetClass());
|
||||
foreach ($this->m_aExtKeys[$sAttCode] as $sForeignAttCode => $iCol)
|
||||
foreach ($this->m_aExtKeys[$sAttCode] as $sReconKeyAttCode => $iCol)
|
||||
{
|
||||
if ($sForeignAttCode == 'id')
|
||||
if ($sReconKeyAttCode == 'id')
|
||||
{
|
||||
$value = (int) $aRowData[$iCol];
|
||||
}
|
||||
else
|
||||
{
|
||||
// The foreign attribute is one of our reconciliation key
|
||||
$oForeignAtt = MetaModel::GetAttributeDef($oExtKey->GetTargetClass(), $sForeignAttCode);
|
||||
$oForeignAtt = MetaModel::GetAttributeDef($oExtKey->GetTargetClass(), $sReconKeyAttCode);
|
||||
$value = $oForeignAtt->MakeValueFromString($aRowData[$iCol], $this->m_bLocalizedValues);
|
||||
}
|
||||
$oReconFilter->AddCondition($sForeignAttCode, $value, '=');
|
||||
$oReconFilter->AddCondition($sReconKeyAttCode, $value, '=');
|
||||
$aResults[$iCol] = new CellStatus_Void(utils::HtmlEntities($aRowData[$iCol]));
|
||||
}
|
||||
|
||||
$oExtObjects = new CMDBObjectSet($oReconFilter);
|
||||
$aKeys = $oExtObjects->ToArray();
|
||||
return array($oReconFilter->ToOql(), $aKeys);
|
||||
return array($oReconFilter, $aKeys);
|
||||
}
|
||||
|
||||
// Returns true if the CSV data specifies that the external key must be left undefined
|
||||
@@ -318,10 +455,10 @@ class BulkChange
|
||||
{
|
||||
$aResults = array();
|
||||
$aErrors = array();
|
||||
|
||||
|
||||
// External keys reconciliation
|
||||
//
|
||||
foreach($this->m_aExtKeys as $sAttCode => $aKeyConfig)
|
||||
foreach($this->m_aExtKeys as $sAttCode => $aReconKeys)
|
||||
{
|
||||
// Skip external keys used for the reconciliation process
|
||||
// if (!array_key_exists($sAttCode, $this->m_aAttList)) continue;
|
||||
@@ -330,7 +467,7 @@ class BulkChange
|
||||
|
||||
if ($this->IsNullExternalKeySpec($aRowData, $sAttCode))
|
||||
{
|
||||
foreach ($aKeyConfig as $sForeignAttCode => $iCol)
|
||||
foreach ($aReconKeys as $sReconKeyAttCode => $iCol)
|
||||
{
|
||||
// Default reporting
|
||||
// $aRowData[$iCol] is always null
|
||||
@@ -352,25 +489,24 @@ class BulkChange
|
||||
$oReconFilter = new DBObjectSearch($oExtKey->GetTargetClass());
|
||||
|
||||
$aCacheKeys = array();
|
||||
foreach ($aKeyConfig as $sForeignAttCode => $iCol)
|
||||
foreach ($aReconKeys as $sReconKeyAttCode => $iCol)
|
||||
{
|
||||
// The foreign attribute is one of our reconciliation key
|
||||
if ($sForeignAttCode == 'id')
|
||||
if ($sReconKeyAttCode == 'id')
|
||||
{
|
||||
$value = $aRowData[$iCol];
|
||||
}
|
||||
else
|
||||
{
|
||||
$oForeignAtt = MetaModel::GetAttributeDef($oExtKey->GetTargetClass(), $sForeignAttCode);
|
||||
$oForeignAtt = MetaModel::GetAttributeDef($oExtKey->GetTargetClass(), $sReconKeyAttCode);
|
||||
$value = $oForeignAtt->MakeValueFromString($aRowData[$iCol], $this->m_bLocalizedValues);
|
||||
}
|
||||
$aCacheKeys[] = $value;
|
||||
$oReconFilter->AddCondition($sForeignAttCode, $value, '=');
|
||||
$oReconFilter->AddCondition($sReconKeyAttCode, $value, '=');
|
||||
$aResults[$iCol] = new CellStatus_Void(utils::HtmlEntities($aRowData[$iCol]));
|
||||
}
|
||||
$sCacheKey = implode('_|_', $aCacheKeys); // Unique key for this query...
|
||||
$iForeignKey = null;
|
||||
$sOQL = '';
|
||||
// TODO: check if *too long* keys can lead to collisions... and skip the cache in such a case...
|
||||
if (!array_key_exists($sAttCode, $this->m_aExtKeysMappingCache))
|
||||
{
|
||||
@@ -379,9 +515,8 @@ class BulkChange
|
||||
if (array_key_exists($sCacheKey, $this->m_aExtKeysMappingCache[$sAttCode]))
|
||||
{
|
||||
// Cache hit
|
||||
$iCount = $this->m_aExtKeysMappingCache[$sAttCode][$sCacheKey]['c'];
|
||||
$iObjectFoundCount = $this->m_aExtKeysMappingCache[$sAttCode][$sCacheKey]['c'];
|
||||
$iForeignKey = $this->m_aExtKeysMappingCache[$sAttCode][$sCacheKey]['k'];
|
||||
$sOQL = $this->m_aExtKeysMappingCache[$sAttCode][$sCacheKey]['oql'];
|
||||
// Record the hit
|
||||
$this->m_aExtKeysMappingCache[$sAttCode][$sCacheKey]['h']++;
|
||||
}
|
||||
@@ -389,34 +524,35 @@ class BulkChange
|
||||
{
|
||||
// Cache miss, let's initialize it
|
||||
$oExtObjects = new CMDBObjectSet($oReconFilter);
|
||||
$iCount = $oExtObjects->Count();
|
||||
if ($iCount == 1)
|
||||
$iObjectFoundCount = $oExtObjects->Count();
|
||||
if ($iObjectFoundCount == 1)
|
||||
{
|
||||
$oForeignObj = $oExtObjects->Fetch();
|
||||
$iForeignKey = $oForeignObj->GetKey();
|
||||
}
|
||||
$this->m_aExtKeysMappingCache[$sAttCode][$sCacheKey] = array(
|
||||
'c' => $iCount,
|
||||
'c' => $iObjectFoundCount,
|
||||
'k' => $iForeignKey,
|
||||
'oql' => $oReconFilter->ToOql(),
|
||||
'h' => 0, // number of hits on this cache entry
|
||||
);
|
||||
}
|
||||
switch($iCount)
|
||||
switch($iObjectFoundCount)
|
||||
{
|
||||
case 0:
|
||||
$aErrors[$sAttCode] = Dict::S('UI:CSVReport-Value-Issue-NotFound');
|
||||
$aResults[$sAttCode]= new CellStatus_SearchIssue();
|
||||
break;
|
||||
|
||||
$oCellStatus_SearchIssue = $this->GetCellSearchIssue($oReconFilter);
|
||||
$aResults[$sAttCode] = $oCellStatus_SearchIssue;
|
||||
$aErrors[$sAttCode] = Dict::S('UI:CSVReport-Value-Issue-NotFound');
|
||||
break;
|
||||
|
||||
case 1:
|
||||
// Do change the external key attribute
|
||||
$oTargetObj->Set($sAttCode, $iForeignKey);
|
||||
break;
|
||||
|
||||
// Do change the external key attribute
|
||||
$oTargetObj->Set($sAttCode, $iForeignKey);
|
||||
break;
|
||||
|
||||
default:
|
||||
$aErrors[$sAttCode] = Dict::Format('UI:CSVReport-Value-Issue-FoundMany', $iCount);
|
||||
$aResults[$sAttCode]= new CellStatus_Ambiguous($oTargetObj->Get($sAttCode), $iCount, $sOQL);
|
||||
$aErrors[$sAttCode] = Dict::Format('UI:CSVReport-Value-Issue-FoundMany', $iObjectFoundCount);
|
||||
$aResults[$sAttCode]= new CellStatus_Ambiguous($oTargetObj->Get($sAttCode), $iObjectFoundCount, $oReconFilter->serialize());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -433,7 +569,7 @@ class BulkChange
|
||||
else
|
||||
{
|
||||
$aResults[$sAttCode]= new CellStatus_Modify($iForeignObj, $oTargetObj->GetOriginal($sAttCode));
|
||||
foreach ($aKeyConfig as $sForeignAttCode => $iCol)
|
||||
foreach ($aReconKeys as $sReconKeyAttCode => $iCol)
|
||||
{
|
||||
// Report the change on reconciliation values as well
|
||||
$aResults[$iCol] = new CellStatus_Modify(utils::HtmlEntities($aRowData[$iCol]));
|
||||
@@ -446,7 +582,7 @@ class BulkChange
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set the object attributes
|
||||
//
|
||||
foreach ($this->m_aAttList as $sAttCode => $iCol)
|
||||
@@ -487,7 +623,13 @@ class BulkChange
|
||||
$value = $oAttDef->MakeValueFromString($aRowData[$iCol], $this->m_bLocalizedValues);
|
||||
if (is_null($value) && (strlen($aRowData[$iCol]) > 0))
|
||||
{
|
||||
$aErrors[$sAttCode] = Dict::Format('UI:CSVReport-Value-Issue-NoMatch', $sAttCode);
|
||||
if ($oAttDef instanceof AttributeEnum || $oAttDef instanceof AttributeTagSet){
|
||||
/** @var AttributeDefinition $oAttributeDefinition */
|
||||
$oAttributeDefinition = $oAttDef;
|
||||
$aErrors[$sAttCode] = Dict::Format('UI:CSVReport-Value-Issue-AllowedValues', $sAttCode, implode(',', $oAttributeDefinition->GetAllowedValues()));
|
||||
} else {
|
||||
$aErrors[$sAttCode] = Dict::Format('UI:CSVReport-Value-Issue-NoMatch', $sAttCode);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -504,7 +646,7 @@ class BulkChange
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Reporting on fields
|
||||
//
|
||||
$aChangedFields = $oTargetObj->ListChanges();
|
||||
@@ -556,7 +698,7 @@ class BulkChange
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Checks
|
||||
//
|
||||
$res = $oTargetObj->CheckConsistency();
|
||||
@@ -567,12 +709,101 @@ class BulkChange
|
||||
}
|
||||
return $aResults;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* search with current permissions did not match
|
||||
* let's search why and give some more feedbacks to the user through proper labels
|
||||
*
|
||||
* @param DBObjectSearch $oDbSearchWithConditions search used to find external key
|
||||
*
|
||||
* @return \CellStatus_SearchIssue
|
||||
* @throws \CoreException
|
||||
* @throws \MissingQueryArgument
|
||||
* @throws \MySQLException
|
||||
* @throws \MySQLHasGoneAwayException
|
||||
*
|
||||
* @since 3.1.0 N°5305
|
||||
*/
|
||||
protected function GetCellSearchIssue($oDbSearchWithConditions) : CellStatus_SearchIssue {
|
||||
//current search with current permissions did not match
|
||||
//let's search why and give some more feedback to the user
|
||||
|
||||
$sSerializedSearch = $oDbSearchWithConditions->serialize();
|
||||
|
||||
// Count all objects with all permissions without any condition
|
||||
$oDbSearchWithoutAnyCondition = new DBObjectSearch($oDbSearchWithConditions->GetClass());
|
||||
$oDbSearchWithoutAnyCondition->AllowAllData(true);
|
||||
$oExtObjectSet = new CMDBObjectSet($oDbSearchWithoutAnyCondition);
|
||||
$iAllowAllDataObjectCount = $oExtObjectSet->Count();
|
||||
|
||||
if ($iAllowAllDataObjectCount === 0) {
|
||||
$sReason = Dict::Format('UI:CSVReport-Value-NoMatch-NoObject', $oDbSearchWithConditions->GetClass());
|
||||
return new CellStatus_SearchIssue($sSerializedSearch, $sReason);
|
||||
}
|
||||
|
||||
// Count all objects with current user permissions
|
||||
$oDbSearchWithoutAnyCondition->AllowAllData(false);
|
||||
$oExtObjectSetWithCurrentUserPermissions = new CMDBObjectSet($oDbSearchWithoutAnyCondition);
|
||||
$iCurrentUserRightsObjectCount = $oExtObjectSetWithCurrentUserPermissions->Count();
|
||||
|
||||
if ($iCurrentUserRightsObjectCount === 0){
|
||||
// No objects visible by current user
|
||||
$sReason = Dict::Format('UI:CSVReport-Value-NoMatch-NoObject-ForCurrentUser', $oDbSearchWithConditions->GetClass());
|
||||
return new CellStatus_SearchIssue($sSerializedSearch, $sReason);
|
||||
}
|
||||
|
||||
try{
|
||||
$aDisplayedAllowedValues = [];
|
||||
// Possibles values are displayed to UI user. we have to limit the amount of displayed values
|
||||
$oExtObjectSetWithCurrentUserPermissions->SetLimit(4);
|
||||
for($i = 0; $i < 3; $i++){
|
||||
/** @var \DBObject $oVisibleObject */
|
||||
$oVisibleObject = $oExtObjectSetWithCurrentUserPermissions->Fetch();
|
||||
if (is_null($oVisibleObject)){
|
||||
break;
|
||||
}
|
||||
|
||||
$aCurrentAllowedValueFields = [];
|
||||
foreach ($oDbSearchWithConditions->GetInternalParams() as $sForeignAttCode => $sValue){
|
||||
$aCurrentAllowedValueFields[] = $oVisibleObject->Get($sForeignAttCode);
|
||||
}
|
||||
$aDisplayedAllowedValues[] = implode(" ", $aCurrentAllowedValueFields);
|
||||
|
||||
}
|
||||
$allowedValues = implode(", ", $aDisplayedAllowedValues);
|
||||
if ($oExtObjectSetWithCurrentUserPermissions->Count() > 3){
|
||||
$allowedValues .= "...";
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
IssueLog::Error("failure during CSV import when fetching few visible objects: ", null,
|
||||
[ 'target_class' => $oDbSearchWithConditions->GetClass(), 'criteria' => $oDbSearchWithConditions->GetCriteria(), 'message' => $e->getMessage()]
|
||||
);
|
||||
$sReason = Dict::Format('UI:CSVReport-Value-NoMatch-NoObject-ForCurrentUser', $oDbSearchWithConditions->GetClass());
|
||||
return new CellStatus_SearchIssue($sSerializedSearch, $sReason);
|
||||
}
|
||||
|
||||
if ($iAllowAllDataObjectCount != $iCurrentUserRightsObjectCount) {
|
||||
// No match and some objects NOT visible by current user. including current search maybe...
|
||||
$sReason = Dict::Format('UI:CSVReport-Value-NoMatch-SomeObjectNotVisibleForCurrentUser', $oDbSearchWithConditions->GetClass());
|
||||
return new CellStatus_SearchIssue($sSerializedSearch, $sReason, $oDbSearchWithConditions->GetClass(), $allowedValues);
|
||||
}
|
||||
|
||||
// No match. This is not linked to any right issue
|
||||
// Possible values: DD,DD
|
||||
$aCurrentValueFields = [];
|
||||
foreach ($oDbSearchWithConditions->GetInternalParams() as $sValue){
|
||||
$aCurrentValueFields[] = $sValue;
|
||||
}
|
||||
$value =implode(" ", $aCurrentValueFields);
|
||||
$sReason = Dict::Format('UI:CSVReport-Value-NoMatch', $value);
|
||||
return new CellStatus_SearchIssue($sSerializedSearch, $sReason, $oDbSearchWithConditions->GetClass(), $allowedValues);
|
||||
}
|
||||
|
||||
protected function PrepareMissingObject(&$oTargetObj, &$aErrors)
|
||||
{
|
||||
$aResults = array();
|
||||
$aErrors = array();
|
||||
|
||||
|
||||
// External keys
|
||||
//
|
||||
foreach($this->m_aExtKeys as $sAttCode => $aKeyConfig)
|
||||
@@ -585,7 +816,7 @@ class BulkChange
|
||||
$aResults[$iCol] = new CellStatus_Void('?');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Update attributes
|
||||
//
|
||||
foreach($this->m_aOnDisappear as $sAttCode => $value)
|
||||
@@ -596,7 +827,7 @@ class BulkChange
|
||||
}
|
||||
$oTargetObj->Set($sAttCode, $value);
|
||||
}
|
||||
|
||||
|
||||
// Reporting on fields
|
||||
//
|
||||
$aChangedFields = $oTargetObj->ListChanges();
|
||||
@@ -616,7 +847,7 @@ class BulkChange
|
||||
$aResults[$iCol]= new CellStatus_Void($oTargetObj->Get($sAttCode));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Checks
|
||||
//
|
||||
$res = $oTargetObj->CheckConsistency();
|
||||
@@ -674,14 +905,16 @@ class BulkChange
|
||||
}
|
||||
|
||||
$aResult[$iRow] = $this->PrepareObject($oTargetObj, $aRowData, $aErrors);
|
||||
|
||||
|
||||
if (count($aErrors) > 0)
|
||||
{
|
||||
$sErrors = implode(', ', $aErrors);
|
||||
$aResult[$iRow]["__STATUS__"] = new RowStatus_Issue(Dict::S('UI:CSVReport-Row-Issue-Attribute'));
|
||||
//__ERRORS__ used by tests only
|
||||
$aResult[$iRow]["__ERRORS__"] = new RowStatus_Error($sErrors);
|
||||
return $oTargetObj;
|
||||
}
|
||||
|
||||
|
||||
// Check that any external key will have a value proposed
|
||||
$aMissingKeys = array();
|
||||
foreach (MetaModel::GetExternalKeys($this->m_sClass) as $sExtKeyAttCode => $oExtKey)
|
||||
@@ -689,7 +922,7 @@ class BulkChange
|
||||
if (!$oExtKey->IsNullAllowed())
|
||||
{
|
||||
if (!array_key_exists($sExtKeyAttCode, $this->m_aExtKeys) && !array_key_exists($sExtKeyAttCode, $this->m_aAttList))
|
||||
{
|
||||
{
|
||||
$aMissingKeys[] = $oExtKey->GetLabel();
|
||||
}
|
||||
}
|
||||
@@ -745,14 +978,16 @@ class BulkChange
|
||||
{
|
||||
$sErrors = implode(', ', $aErrors);
|
||||
$aResult[$iRow]["__STATUS__"] = new RowStatus_Issue(Dict::S('UI:CSVReport-Row-Issue-Attribute'));
|
||||
//__ERRORS__ used by tests only
|
||||
$aResult[$iRow]["__ERRORS__"] = new RowStatus_Error($sErrors);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
$aChangedFields = $oTargetObj->ListChanges();
|
||||
if (count($aChangedFields) > 0)
|
||||
{
|
||||
$aResult[$iRow]["__STATUS__"] = new RowStatus_Modify(count($aChangedFields));
|
||||
|
||||
|
||||
// Optionaly record the results
|
||||
//
|
||||
if ($oChange)
|
||||
@@ -794,9 +1029,11 @@ class BulkChange
|
||||
{
|
||||
$sErrors = implode(', ', $aErrors);
|
||||
$aResult[$iRow]["__STATUS__"] = new RowStatus_Issue(Dict::S('UI:CSVReport-Row-Issue-Attribute'));
|
||||
//__ERRORS__ used by tests only
|
||||
$aResult[$iRow]["__ERRORS__"] = new RowStatus_Error($sErrors);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
$aChangedFields = $oTargetObj->ListChanges();
|
||||
if (count($aChangedFields) > 0)
|
||||
{
|
||||
@@ -821,7 +1058,7 @@ class BulkChange
|
||||
$aResult[$iRow]["__STATUS__"] = new RowStatus_Disappeared(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function Process(CMDBChange $oChange = null)
|
||||
{
|
||||
if ($oChange)
|
||||
@@ -866,7 +1103,7 @@ class BulkChange
|
||||
foreach ($this->m_aAttList as $sAttCode => $iCol)
|
||||
{
|
||||
if ($sAttCode == 'id') continue;
|
||||
|
||||
|
||||
$oAttDef = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode);
|
||||
if ($oAttDef instanceof AttributeDateTime) // AttributeDate is derived from AttributeDateTime
|
||||
{
|
||||
@@ -881,14 +1118,18 @@ class BulkChange
|
||||
$sFormat = $sDateFormat;
|
||||
}
|
||||
$oFormat = new DateTimeFormat($sFormat);
|
||||
$sDateExample = $oFormat->Format(new DateTime('2022-10-23 16:25:33'));
|
||||
$sRegExp = $oFormat->ToRegExpr('/');
|
||||
if (!preg_match($sRegExp, $this->m_aData[$iRow][$iCol]))
|
||||
$sErrorMsg = Dict::Format('UI:CSVReport-Row-Issue-ExpectedDateFormat', $sDateExample);
|
||||
if (!preg_match($sRegExp, $sValue))
|
||||
{
|
||||
$aResult[$iRow]["__STATUS__"]= new RowStatus_Issue(Dict::S('UI:CSVReport-Row-Issue-DateFormat'));
|
||||
$aResult[$iRow][$iCol] = new CellStatus_Issue(utils::HtmlEntities($sValue), null, $sErrorMsg);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$oDate = DateTime::createFromFormat($sFormat, $this->m_aData[$iRow][$iCol]);
|
||||
$oDate = DateTime::createFromFormat($sFormat, $sValue);
|
||||
if ($oDate !== false)
|
||||
{
|
||||
$sNewDate = $oDate->format($oAttDef->GetInternalFormat());
|
||||
@@ -898,7 +1139,7 @@ class BulkChange
|
||||
{
|
||||
// Leave the cell unchanged
|
||||
$aResult[$iRow]["__STATUS__"]= new RowStatus_Issue(Dict::S('UI:CSVReport-Row-Issue-DateFormat'));
|
||||
$aResult[$iRow][$sAttCode] = new CellStatus_Issue(null, utils::HtmlEntities($this->m_aData[$iRow][$iCol]), Dict::S('UI:CSVReport-Row-Issue-DateFormat'));
|
||||
$aResult[$iRow][$iCol] = new CellStatus_Issue($sValue, null, $sErrorMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -952,23 +1193,26 @@ class BulkChange
|
||||
else
|
||||
{
|
||||
// The value has to be found or verified
|
||||
list($sQuery, $aMatches) = $this->ResolveExternalKey($aRowData, $sAttCode, $aResult[$iRow]);
|
||||
|
||||
|
||||
/** var DBObjectSearch $oReconFilter */
|
||||
list($oReconFilter, $aMatches) = $this->ResolveExternalKey($aRowData, $sAttCode, $aResult[$iRow]);
|
||||
|
||||
if (count($aMatches) == 1)
|
||||
{
|
||||
$oRemoteObj = reset($aMatches); // first item
|
||||
$valuecondition = $oRemoteObj->GetKey();
|
||||
$aResult[$iRow][$sAttCode] = new CellStatus_Void($oRemoteObj->GetKey());
|
||||
}
|
||||
}
|
||||
elseif (count($aMatches) == 0)
|
||||
{
|
||||
$aResult[$iRow][$sAttCode] = new CellStatus_SearchIssue();
|
||||
}
|
||||
$oCellStatus_SearchIssue = $this->GetCellSearchIssue($oReconFilter);
|
||||
$aResult[$iRow][$sAttCode] = $oCellStatus_SearchIssue;
|
||||
}
|
||||
else
|
||||
{
|
||||
$aResult[$iRow][$sAttCode] = new CellStatus_Ambiguous(null, count($aMatches), $sQuery);
|
||||
$aResult[$iRow][$sAttCode] = new CellStatus_Ambiguous(null, count($aMatches), $oReconFilter->serialize());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1019,7 +1263,7 @@ class BulkChange
|
||||
default:
|
||||
// Found several matches, ambiguous
|
||||
$aResult[$iRow]["__STATUS__"]= new RowStatus_Issue(Dict::S('UI:CSVReport-Row-Issue-Ambiguous'));
|
||||
$aResult[$iRow]["id"]= new CellStatus_Ambiguous(0, $oReconciliationSet->Count(), $oReconciliationFilter->ToOql());
|
||||
$aResult[$iRow]["id"]= new CellStatus_Ambiguous(0, $oReconciliationSet->Count(), $oReconciliationFilter->serialize());
|
||||
$aResult[$iRow]["finalclass"]= 'n/a';
|
||||
}
|
||||
}
|
||||
@@ -1110,7 +1354,7 @@ class BulkChange
|
||||
}
|
||||
}
|
||||
$oBulkChanges->Seek(0);
|
||||
|
||||
|
||||
$aDetails = array();
|
||||
while ($oChange = $oBulkChanges->Fetch())
|
||||
{
|
||||
@@ -1274,7 +1518,7 @@ EOF
|
||||
$oOldTarget = MetaModel::GetObject($oAttDef->GetTargetClass(), $oOperation->Get('oldvalue'));
|
||||
$sOldValue = $oOldTarget->GetHyperlink();
|
||||
}
|
||||
|
||||
|
||||
$sNewValue = Dict::S('UI:UndefinedObject');
|
||||
if ($oOperation->Get('newvalue') != 0)
|
||||
{
|
||||
@@ -1300,11 +1544,11 @@ EOF
|
||||
}
|
||||
else
|
||||
{
|
||||
$aAttributes[$sAttCode] = 1;
|
||||
$aAttributes[$sAttCode] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$aDetails = array();
|
||||
foreach($aObjects as $iUId => $aObjData)
|
||||
{
|
||||
@@ -1356,6 +1600,6 @@ EOF
|
||||
$aConfig[$sAttCode] = array('label' => MetaModel::GetLabel($sClass, $sAttCode), 'description' => MetaModel::GetDescription($sClass, $sAttCode));
|
||||
}
|
||||
$oPage->table($aConfig, $aDetails);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ class CMDBChangeOp extends DBObject implements iCMDBChangeOp
|
||||
}
|
||||
|
||||
/**
|
||||
* Describe (as a text string) the modifications corresponding to this change
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function GetDescription()
|
||||
{
|
||||
|
||||
@@ -1238,6 +1238,14 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'navigation_menu.show_organization_filter' => [
|
||||
'type' => 'bool',
|
||||
'description' => 'Display organization filter in menu',
|
||||
'default' => true,
|
||||
'value' => true,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'quick_create.enabled' => [
|
||||
'type' => 'bool',
|
||||
'description' => 'Whether or not the quick create is enabled',
|
||||
@@ -1861,7 +1869,7 @@ class Config
|
||||
}
|
||||
if (strlen($sNoise) > 0)
|
||||
{
|
||||
// Note: sNoise is an html output, but so far it was ok for me (e.g. showing the entire call stack)
|
||||
// Note: sNoise is an html output, but so far it was ok for me (e.g. showing the entire call stack)
|
||||
throw new ConfigException('Syntax error in configuration file',
|
||||
array('file' => $sConfigFile, 'error' => '<tt>'.htmlentities($sNoise, ENT_QUOTES, 'UTF-8').'</tt>'));
|
||||
}
|
||||
@@ -2671,7 +2679,7 @@ class ConfigPlaceholdersResolver
|
||||
}
|
||||
|
||||
$sPattern = '/\%(env|server)\((\w+)\)(?:\?:(\w*))?\%/'; //3 capturing groups, ie `%env(HTTP_PORT)?:8080%` produce: `env` `HTTP_PORT` and `8080`.
|
||||
|
||||
|
||||
if (! preg_match_all($sPattern, $rawValue, $aMatchesCollection, PREG_SET_ORDER))
|
||||
{
|
||||
return $rawValue;
|
||||
|
||||
7
css/backoffice/pages/_csv-import.scss
vendored
7
css/backoffice/pages/_csv-import.scss
vendored
@@ -27,11 +27,6 @@ tr.ibo-csv-import--row-unchanged td {
|
||||
border-bottom: 1px $ibo-color-grey-400 solid;
|
||||
}
|
||||
|
||||
.wizContainer table tr.ibo-csv-import--row-error td {
|
||||
border-bottom: 1px $ibo-color-grey-400 solid;
|
||||
background-color: $ibo-color-red-200;
|
||||
}
|
||||
|
||||
tr.ibo-csv-import--row-modified td {
|
||||
border-bottom: 1px $ibo-color-grey-400 solid;
|
||||
}
|
||||
@@ -44,4 +39,4 @@ tr.ibo-csv-import--row-added td {
|
||||
font-size: 4em;
|
||||
color: $ibo-color-primary-400;
|
||||
margin: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'authent-cas/3.0.1',
|
||||
'authent-cas/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'authent-external/3.0.1',
|
||||
'authent-external/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -9,7 +9,7 @@ if (function_exists('ldap_connect'))
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'authent-ldap/3.0.1',
|
||||
'authent-ldap/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'authent-local/3.0.1',
|
||||
'authent-local/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'combodo-backoffice-darkmoon-theme/3.0.1',
|
||||
'combodo-backoffice-darkmoon-theme/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
/** @noinspection PhpUnhandledExceptionInspection */
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'combodo-db-tools/3.0.1',
|
||||
'combodo-db-tools/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-attachments/3.0.1',
|
||||
'itop-attachments/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-backup/3.0.1',
|
||||
'itop-backup/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-bridge-cmdb-ticket/3.0.1',
|
||||
'itop-bridge-cmdb-ticket/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-bridge-virtualization-storage/3.0.1',
|
||||
'itop-bridge-virtualization-storage/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-change-mgmt-itil/3.0.1',
|
||||
'itop-change-mgmt-itil/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-change-mgmt/3.0.1',
|
||||
'itop-change-mgmt/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-config-mgmt/3.0.1',
|
||||
'itop-config-mgmt/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-config/3.0.1',
|
||||
'itop-config/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
/** @noinspection PhpUnhandledExceptionInspection */
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-core-update/3.0.1',
|
||||
'itop-core-update/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-datacenter-mgmt/3.0.1',
|
||||
'itop-datacenter-mgmt/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-endusers-devices/3.0.1',
|
||||
'itop-endusers-devices/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-faq-light/3.0.1',
|
||||
'itop-faq-light/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
/** @noinspection PhpUnhandledExceptionInspection */
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-files-information/3.0.1',
|
||||
'itop-files-information/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-full-itil/3.0.1',
|
||||
'itop-full-itil/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-hub-connector/3.0.1',
|
||||
'itop-hub-connector/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-incident-mgmt-itil/3.0.1',
|
||||
'itop-incident-mgmt-itil/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-knownerror-mgmt/3.0.1',
|
||||
'itop-knownerror-mgmt/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-oauth-client/3.0.1',
|
||||
'itop-oauth-client/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
/** @noinspection PhpUnhandledExceptionInspection */
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-portal-base/3.0.1', array(
|
||||
'itop-portal-base/3.0.2', array(
|
||||
// Identification
|
||||
'label' => 'Portal Development Library',
|
||||
'category' => 'Portal',
|
||||
|
||||
@@ -612,7 +612,7 @@ $popover-arrow-color: $popover-bg !default;
|
||||
//** Popover outer arrow width
|
||||
$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;
|
||||
//** Popover outer arrow color
|
||||
$popover-arrow-outer-color: fadein($popover-border-color, 5%) !default;
|
||||
$popover-arrow-outer-color: fade-in($popover-border-color, 0.05) !default;
|
||||
//** Popover outer arrow fallback color
|
||||
$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%) !default;
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
/** @noinspection PhpUnhandledExceptionInspection */
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-portal/3.0.1', array(
|
||||
'itop-portal/3.0.2', array(
|
||||
// Identification
|
||||
'label' => 'Enhanced Customer Portal',
|
||||
'category' => 'Portal',
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-problem-mgmt/3.0.1',
|
||||
'itop-problem-mgmt/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-profiles-itil/3.0.1',
|
||||
'itop-profiles-itil/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-request-mgmt-itil/3.0.1',
|
||||
'itop-request-mgmt-itil/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-request-mgmt/3.0.1',
|
||||
'itop-request-mgmt/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-service-mgmt-provider/3.0.1',
|
||||
'itop-service-mgmt-provider/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-service-mgmt/3.0.1',
|
||||
'itop-service-mgmt/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-sla-computation/3.0.1',
|
||||
'itop-sla-computation/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-storage-mgmt/3.0.1',
|
||||
'itop-storage-mgmt/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-structure/3.0.1',
|
||||
'itop-structure/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-themes-compat/3.0.1',
|
||||
'itop-themes-compat/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__,
|
||||
'itop-tickets/3.0.1',
|
||||
'itop-tickets/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-virtualization-mgmt/3.0.1',
|
||||
'itop-virtualization-mgmt/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-welcome-itil/3.0.1',
|
||||
'itop-welcome-itil/3.0.2',
|
||||
array(
|
||||
// Identification
|
||||
//
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<information>
|
||||
<version>3.0.1</version>
|
||||
<version>3.0.2</version>
|
||||
</information>
|
||||
|
||||
@@ -644,9 +644,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Vyberte třídu pro hledání: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Upraveno',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Nemůže být změněno - důvod: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Nemůže být změněno na %1$s - důvod: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'Žádná shoda',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Chybí povinná hodnota',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Nejednoznačné: nalezeno %1$s objektů',
|
||||
'UI:CSVReport-Row-Unchanged' => 'nezměněn',
|
||||
|
||||
@@ -633,9 +633,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Vælg klasse at søge efter: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Ændret',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Kunne ikke ændres - årsag: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Kunne ikke ændres til %1$s - årsag: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Mangler obligatorisk værdi',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Tvetydig: fandt %1$s objekter',
|
||||
'UI:CSVReport-Row-Unchanged' => 'Uændret',
|
||||
|
||||
@@ -633,9 +633,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Wählen Sie für die Suche die Klasse aus: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Modifiziert',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Konnte nicht geändert werden - Grund: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Konnte nicht zu %1$s geändert werden - Grund: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'Kein Treffer',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Pflichtfeld fehlt',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Doppeldeutig: %1$s Objekte gefunden',
|
||||
'UI:CSVReport-Row-Unchanged' => 'Unverändert',
|
||||
|
||||
@@ -650,9 +650,14 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Select the class to search: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Modified',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Could not be changed - reason: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Could not be changed to %1$s - reason: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Invalid value for attribute',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'',
|
||||
'UI:CSVReport-Value-NoMatch-PossibleValues' => 'Some possible \'%1$s\' value(s): %2$s',
|
||||
'UI:CSVReport-Value-NoMatch-NoObject' => 'There are no \'%1$s\' objects',
|
||||
'UI:CSVReport-Value-NoMatch-NoObject-ForCurrentUser' => 'There are no \'%1$s\' objects found with your current profile',
|
||||
'UI:CSVReport-Value-NoMatch-SomeObjectNotVisibleForCurrentUser' => 'There are some \'%1$s\' objects not visible with your current profile',
|
||||
|
||||
'UI:CSVReport-Value-Missing' => 'Missing mandatory value',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Ambiguous: found %1$s objects',
|
||||
'UI:CSVReport-Row-Unchanged' => 'unchanged',
|
||||
@@ -666,11 +671,13 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:CSVReport-Value-Issue-Readonly' => 'The attribute \'%1$s\' is read-only and cannot be modified (current value: %2$s, proposed value: %3$s)',
|
||||
'UI:CSVReport-Value-Issue-Format' => 'Failed to process input: %1$s',
|
||||
'UI:CSVReport-Value-Issue-NoMatch' => 'Unexpected value for attribute \'%1$s\': no match found, check spelling',
|
||||
'UI:CSVReport-Value-Issue-AllowedValues' => 'Allowed \'%1$s\' value(s): %2$s',
|
||||
'UI:CSVReport-Value-Issue-Unknown' => 'Unexpected value for attribute \'%1$s\': %2$s',
|
||||
'UI:CSVReport-Row-Issue-Inconsistent' => 'Attributes not consistent with each others: %1$s',
|
||||
'UI:CSVReport-Row-Issue-Attribute' => 'Unexpected attribute value(s)',
|
||||
'UI:CSVReport-Row-Issue-MissingExtKey' => 'Could not be created, due to missing external key(s): %1$s',
|
||||
'UI:CSVReport-Row-Issue-DateFormat' => 'wrong date format',
|
||||
'UI:CSVReport-Row-Issue-ExpectedDateFormat' => 'Expected format: %1$s',
|
||||
'UI:CSVReport-Row-Issue-Reconciliation' => 'failed to reconcile',
|
||||
'UI:CSVReport-Row-Issue-Ambiguous' => 'ambiguous reconciliation',
|
||||
'UI:CSVReport-Row-Issue-Internal' => 'Internal error: %1$s, %2$s',
|
||||
|
||||
@@ -644,9 +644,9 @@ Esperamos distrute de esta versión tanto como nosotros la imaginamos y creamos.
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Seleccione la clase a buscar: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Modificado',
|
||||
'UI:CSVReport-Value-SetIssue' => 'No puede ser modificado - motivo: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'No puede ser cambiado a %1$s - motivo: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No hay Coincidencias',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Falta valor obligatorio',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Ambigüedad: encontrados %1$s objetos',
|
||||
'UI:CSVReport-Row-Unchanged' => 'Sin Cambios',
|
||||
|
||||
@@ -633,9 +633,14 @@ Nous espérons que vous aimerez cette version autant que nous avons eu du plaisi
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Sélectionnez le type d\'objets à rechercher : ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Modifié',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Modification impossible - cause : %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Ne peut pas prendre la valeur \'%1$s\' - cause : %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'Pas de correspondance',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Valeur invalide',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Ne peut pas prendre la valeur \'%1$s\'',
|
||||
'UI:CSVReport-Value-NoMatch' => 'Pas de correspondance avec \'%1$s\'',
|
||||
'UI:CSVReport-Value-NoMatch-PossibleValues' => 'Valeur(s) possible(s) pour l\'objet \'%1$s\' : %2$s',
|
||||
'UI:CSVReport-Value-NoMatch-NoObject' => 'Il n\'y a aucun objet \'%1$s\'',
|
||||
'UI:CSVReport-Value-NoMatch-NoObject-ForCurrentUser' => 'Il n\'y a aucun objet \'%1$s\' visible par votre utilisateur',
|
||||
'UI:CSVReport-Value-NoMatch-SomeObjectNotVisibleForCurrentUser' => 'Il existe des objet(s) \'%1$s\' non visible(s) par votre utilisateur',
|
||||
|
||||
'UI:CSVReport-Value-Missing' => 'Absence de valeur obligatoire',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Ambigüité: %1$d objets trouvés',
|
||||
'UI:CSVReport-Row-Unchanged' => 'inchangé',
|
||||
|
||||
@@ -633,9 +633,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Keresendő osztály kiválasztása:',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Modified~~',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Could not be changed - reason: %1$s~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Could not be changed to %1$s - reason: %2$s~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match~~',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Missing mandatory value~~',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Ambiguous: found %1$s objects~~',
|
||||
'UI:CSVReport-Row-Unchanged' => 'unchanged~~',
|
||||
|
||||
@@ -644,9 +644,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Seleziona la classe per la ricerca: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Modified~~',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Could not be changed - reason: %1$s~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Could not be changed to %1$s - reason: %2$s~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match~~',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Missing mandatory value~~',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Ambiguous: found %1$s objects~~',
|
||||
'UI:CSVReport-Row-Unchanged' => 'unchanged~~',
|
||||
|
||||
@@ -633,9 +633,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => '検索するクラスを選択してください。',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => '修正済み',
|
||||
'UI:CSVReport-Value-SetIssue' => '変更出来ません - 理由: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '%1$s へ変更出来ません - 理由: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'マッチしません',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => '必須の値がありません',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'あいまいな値: %1$s オブジェクト',
|
||||
'UI:CSVReport-Row-Unchanged' => '未変更',
|
||||
|
||||
@@ -644,9 +644,9 @@ We hopen dat je even hard van deze versie geniet als dat we zelf ervan hebben ge
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Selecteer de klasse om te zoeken: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Aangepast',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Kon niet worden aangepast - reden: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Kon niet worden aangepast naar %1$s - reden: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'Geen match',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Ontbrekende verplichte waarde',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Onduidelijk: gevonden %1$s objecten',
|
||||
'UI:CSVReport-Row-Unchanged' => 'onveranderd',
|
||||
|
||||
@@ -643,9 +643,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Wybierz klasę do przeszukania: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Zmodyfikowano',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Nie można było zmienić - powód: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Nie można zmienić na %1$s - powód: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'Nie pasuje',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Brak wymaganej wartości',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Uwaga: znaleziono %1$s obiektów',
|
||||
'UI:CSVReport-Row-Unchanged' => 'niezmieniony',
|
||||
|
||||
@@ -644,9 +644,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Selecione a classe para pesquisar: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Modificado',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Não pode ser modificado - razão: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Não pode ser modificado para %1$s - razão: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'Não combina',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Faltando valor obrigatório',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Ambiguous: found %1$s objects',
|
||||
'UI:CSVReport-Row-Unchanged' => 'unchanged',
|
||||
|
||||
@@ -645,9 +645,9 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Выбор класса для поиска: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Изменен',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Не может быть изменен - причина: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Не может быть изменен %1$s - причина: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'Нет совпадений',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Отсутствует обязательное значение',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Неоднозначное сопоставление: найдено %1$s объектов',
|
||||
'UI:CSVReport-Row-Unchanged' => 'без изменений',
|
||||
|
||||
@@ -634,9 +634,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Vyberte triedu na vyhľadávanie: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Upravený',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Nemožno zmeniť - dôvod: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => 'Nemožno zmeniť na %1$s - dôvod: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'Žiadna zhoda',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Chýbajúca povinná hodnota',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Nejednoznačné: nájdených %1$s objektov',
|
||||
'UI:CSVReport-Row-Unchanged' => 'Nezmený',
|
||||
|
||||
@@ -661,9 +661,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => 'Aranacak sınıfı seçiniz: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => 'Değiştiridi',
|
||||
'UI:CSVReport-Value-SetIssue' => 'Değiştirilemedi - Sebep: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '%1$s olarak değiştirilemedi - Sebep: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => 'Eşleşme yok',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => 'Eksik Zorunlu Değer',
|
||||
'UI:CSVReport-Value-Ambiguous' => 'Belirsiz: %1$s nesnelerini buldum',
|
||||
'UI:CSVReport-Row-Unchanged' => 'Değiştirilmedi',
|
||||
|
||||
@@ -649,9 +649,9 @@ We hope you’ll enjoy this version as much as we enjoyed imagining and creating
|
||||
'UI:UniversalSearch:LabelSelectTheClass' => '选择要搜索的类别: ',
|
||||
|
||||
'UI:CSVReport-Value-Modified' => '已修改',
|
||||
'UI:CSVReport-Value-SetIssue' => '无法修改 - 原因: %1$s',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '无法修改成 %1$s - 原因: %2$s',
|
||||
'UI:CSVReport-Value-NoMatch' => '不匹配',
|
||||
'UI:CSVReport-Value-SetIssue' => 'invalid value for attribute~~',
|
||||
'UI:CSVReport-Value-ChangeIssue' => '\'%1$s\' is an invalid value~~',
|
||||
'UI:CSVReport-Value-NoMatch' => 'No match for value \'%1$s\'~~',
|
||||
'UI:CSVReport-Value-Missing' => '缺少必填项',
|
||||
'UI:CSVReport-Value-Ambiguous' => '模糊匹配: 找到 %1$s 个对象',
|
||||
'UI:CSVReport-Row-Unchanged' => '保持不变',
|
||||
|
||||
@@ -24,8 +24,21 @@ use Composer\Semver\VersionParser;
|
||||
*/
|
||||
class InstalledVersions
|
||||
{
|
||||
/**
|
||||
* @var mixed[]|null
|
||||
* @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
|
||||
*/
|
||||
private static $installed;
|
||||
|
||||
/**
|
||||
* @var bool|null
|
||||
*/
|
||||
private static $canGetVendors;
|
||||
|
||||
/**
|
||||
* @var array[]
|
||||
* @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
|
||||
*/
|
||||
private static $installedByVendor = array();
|
||||
|
||||
/**
|
||||
|
||||
@@ -4848,32 +4848,32 @@
|
||||
},
|
||||
{
|
||||
"name": "twig/twig",
|
||||
"version": "v1.42.5",
|
||||
"version_normalized": "1.42.5.0",
|
||||
"version": "v1.43.1",
|
||||
"version_normalized": "1.43.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/twigphp/Twig.git",
|
||||
"reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e"
|
||||
"reference": "2311602f6a208715252febe682fa7c38e56a3373"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
|
||||
"reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/2311602f6a208715252febe682fa7c38e56a3373",
|
||||
"reference": "2311602f6a208715252febe682fa7c38e56a3373",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.5.0",
|
||||
"php": ">=7.1.3",
|
||||
"symfony/polyfill-ctype": "^1.8"
|
||||
},
|
||||
"require-dev": {
|
||||
"psr/container": "^1.0",
|
||||
"symfony/phpunit-bridge": "^4.4|^5.0"
|
||||
"symfony/phpunit-bridge": "^4.4.9|^5.0.9"
|
||||
},
|
||||
"time": "2020-02-11T05:59:23+00:00",
|
||||
"time": "2020-08-05T15:05:05+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.42-dev"
|
||||
"dev-master": "1.43-dev"
|
||||
}
|
||||
},
|
||||
"installation-source": "dist",
|
||||
@@ -4913,8 +4913,18 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/twigphp/Twig/issues",
|
||||
"source": "https://github.com/twigphp/Twig/tree/1.x"
|
||||
"source": "https://github.com/twigphp/Twig/tree/v1.43.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/twig/twig",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"install-path": "../twig/twig"
|
||||
}
|
||||
],
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
<?php return array(
|
||||
'root' => array(
|
||||
'pretty_version' => 'dev-develop',
|
||||
'version' => 'dev-develop',
|
||||
'pretty_version' => '3.0.2-rc1',
|
||||
'version' => '3.0.2.0-RC1',
|
||||
'type' => 'project',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
'reference' => 'e4343ded01403f5b8b0499190ab60b004175bb19',
|
||||
'reference' => 'c5d5379c492059a80eb72cc1dab148dd6e82705f',
|
||||
'name' => 'combodo/itop',
|
||||
'dev' => true,
|
||||
),
|
||||
'versions' => array(
|
||||
'combodo/itop' => array(
|
||||
'pretty_version' => 'dev-develop',
|
||||
'version' => 'dev-develop',
|
||||
'pretty_version' => '3.0.2-rc1',
|
||||
'version' => '3.0.2.0-RC1',
|
||||
'type' => 'project',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
'reference' => 'e4343ded01403f5b8b0499190ab60b004175bb19',
|
||||
'reference' => 'c5d5379c492059a80eb72cc1dab148dd6e82705f',
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'combodo/tcpdf' => array(
|
||||
@@ -654,12 +654,12 @@
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'twig/twig' => array(
|
||||
'pretty_version' => 'v1.42.5',
|
||||
'version' => '1.42.5.0',
|
||||
'pretty_version' => 'v1.43.1',
|
||||
'version' => '1.43.1.0',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../twig/twig',
|
||||
'aliases' => array(),
|
||||
'reference' => '87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e',
|
||||
'reference' => '2311602f6a208715252febe682fa7c38e56a3373',
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'zendframework/zend-loader' => array(
|
||||
|
||||
@@ -1,46 +1,36 @@
|
||||
language: php
|
||||
|
||||
dist: trusty
|
||||
|
||||
sudo: false
|
||||
dist: xenial
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- vendor
|
||||
- $HOME/.composer/cache/files
|
||||
|
||||
|
||||
env:
|
||||
global:
|
||||
- TWIG_EXT=no
|
||||
- SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1
|
||||
- SYMFONY_PHPUNIT_DISABLE_RESULT_CACHE=1
|
||||
|
||||
before_install:
|
||||
- phpenv config-rm xdebug.ini || return 0
|
||||
- echo memory_limit = -1 >> ~/.phpenv/versions/$TRAVIS_PHP_VERSION/etc/conf.d/travis.ini
|
||||
|
||||
install:
|
||||
- travis_retry composer install
|
||||
- export PHPUNIT=$(readlink -f ./vendor/bin/simple-phpunit)
|
||||
- $PHPUNIT install
|
||||
|
||||
before_script:
|
||||
- if [ "$TWIG_EXT" == "yes" ]; then sh -c "cd ext/twig && phpize && ./configure --enable-twig && make && make install"; fi
|
||||
- if [ "$TWIG_EXT" == "yes" ]; then echo "extension=twig.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`; fi
|
||||
|
||||
script: ./vendor/bin/simple-phpunit
|
||||
script:
|
||||
- $PHPUNIT
|
||||
|
||||
jobs:
|
||||
fast_finish: true
|
||||
include:
|
||||
- php: 5.5
|
||||
- php: 5.5
|
||||
env: TWIG_EXT=yes
|
||||
- php: 5.6
|
||||
- php: 5.6
|
||||
env: TWIG_EXT=yes
|
||||
- php: 7.0
|
||||
- php: 7.1
|
||||
- php: 7.2
|
||||
- php: 7.3
|
||||
- php: 7.4snapshot
|
||||
- php: 7.4
|
||||
- php: nightly
|
||||
- stage: integration tests
|
||||
php: 7.3
|
||||
script: ./drupal_test.sh
|
||||
|
||||
@@ -1,13 +1,29 @@
|
||||
* 1.42.5 (2020-02-11)
|
||||
# 1.43.1 (2020-08-05)
|
||||
|
||||
* Fix sandbox not disabled if syntax error occurs within {% sandbox %} tag
|
||||
* Fix a regression when not using a space before an operator
|
||||
* Restrict callables to closures in filters
|
||||
* Allow trailing commas in argument lists (in calls as well as definitions)
|
||||
|
||||
# 1.43.0 (2020-07-05)
|
||||
|
||||
* Throw exception in case non-Traversable data is passed to "filter"
|
||||
* Fix context optimization on PHP 7.4
|
||||
* Fix PHP 8 compatibility
|
||||
* Drop PHP 5.5 5.6, and 7.0 support
|
||||
* Fix ambiguous syntax parsing
|
||||
* In sandbox, the `filter`, `map` and `reduce` filters require Closures in `arrow` parameter
|
||||
|
||||
# 1.42.5 (2020-02-11)
|
||||
|
||||
* Fix implementation of case-insensitivity for method names
|
||||
|
||||
* 1.42.4 (2019-11-11)
|
||||
# 1.42.4 (2019-11-11)
|
||||
|
||||
* optimized "block('foo') ?? 'bar"
|
||||
* added supported for exponential numbers
|
||||
|
||||
* 1.42.3 (2019-08-24)
|
||||
# 1.42.3 (2019-08-24)
|
||||
|
||||
* fixed the "split" filter when the delimiter is "0"
|
||||
* fixed the "empty" test on Traversable instances
|
||||
@@ -15,34 +31,34 @@
|
||||
* fixed PHP 7.4 compatibility
|
||||
* bumped the minimal PHP version to 5.5
|
||||
|
||||
* 1.42.2 (2019-06-18)
|
||||
# 1.42.2 (2019-06-18)
|
||||
|
||||
* Display partial output (PHP buffer) when an error occurs in debug mode
|
||||
|
||||
* 1.42.1 (2019-06-04)
|
||||
# 1.42.1 (2019-06-04)
|
||||
|
||||
* added support for "Twig\Markup" instances in the "in" test (again)
|
||||
* allowed string operators as variables names in assignments
|
||||
|
||||
* 1.42.0 (2019-05-31)
|
||||
# 1.42.0 (2019-05-31)
|
||||
|
||||
* fixed the "filter" filter when the argument is \Traversable but does not implement \Iterator (\SimpleXmlElement for instance)
|
||||
* fixed a PHP fatal error when calling a macro imported in a block in a nested block
|
||||
* fixed a PHP fatal error when calling a macro imported in the template in another macro
|
||||
* fixed wrong error message on "import" and "from"
|
||||
|
||||
* 1.41.0 (2019-05-14)
|
||||
# 1.41.0 (2019-05-14)
|
||||
|
||||
* fixed support for PHP 7.4
|
||||
* added "filter", "map", and "reduce" filters (and support for arrow functions)
|
||||
* fixed partial output leak when a PHP fatal error occurs
|
||||
* optimized context access on PHP 7.4
|
||||
|
||||
* 1.40.1 (2019-04-29)
|
||||
# 1.40.1 (2019-04-29)
|
||||
|
||||
* fixed regression in NodeTraverser
|
||||
# fixed regression in NodeTraverser
|
||||
|
||||
* 1.40.0 (2019-04-28)
|
||||
# 1.40.0 (2019-04-28)
|
||||
|
||||
* allowed Twig\NodeVisitor\NodeVisitorInterface::leaveNode() to return "null" instead of "false" (same meaning)
|
||||
* added the "apply" tag as a replacement for the "filter" tag
|
||||
@@ -51,11 +67,11 @@
|
||||
* fixed Lexer when using custom options containing the # char
|
||||
* fixed "import" when macros are stored in a template string
|
||||
|
||||
* 1.39.1 (2019-04-16)
|
||||
# 1.39.1 (2019-04-16)
|
||||
|
||||
* fixed EscaperNodeVisitor
|
||||
|
||||
* 1.39.0 (2019-04-16)
|
||||
# 1.39.0 (2019-04-16)
|
||||
|
||||
* added Traversable support for the length filter
|
||||
* fixed some wrong location in error messages
|
||||
@@ -66,11 +82,11 @@
|
||||
* fixed "include" with "ignore missing" when an error loading occurs in the included template
|
||||
* added support for a new whitespace trimming option ({%~ ~%}, {{~ ~}}, {#~ ~#})
|
||||
|
||||
* 1.38.4 (2019-03-23)
|
||||
# 1.38.4 (2019-03-23)
|
||||
|
||||
* fixed CheckToStringNode implementation (broken when a function/filter is variadic)
|
||||
|
||||
* 1.38.3 (2019-03-21)
|
||||
# 1.38.3 (2019-03-21)
|
||||
|
||||
* fixed the spaceless filter so that it behaves like the spaceless tag
|
||||
* fixed BC break on Environment::resolveTemplate()
|
||||
@@ -78,15 +94,15 @@
|
||||
* allowed Traversable objects to be used in the "with" tag
|
||||
* allowed Traversable objects to be used in the "with" argument of the "include" and "embed" tags
|
||||
|
||||
* 1.38.2 (2019-03-12)
|
||||
# 1.38.2 (2019-03-12)
|
||||
|
||||
* added TemplateWrapper::getTemplateName()
|
||||
|
||||
* 1.38.1 (2019-03-12)
|
||||
# 1.38.1 (2019-03-12)
|
||||
|
||||
* fixed class aliases
|
||||
|
||||
* 1.38.0 (2019-03-12)
|
||||
# 1.38.0 (2019-03-12)
|
||||
|
||||
* fixed sandbox security issue (under some circumstances, calling the
|
||||
__toString() method on an object was possible even if not allowed by the
|
||||
@@ -103,12 +119,12 @@
|
||||
* added Twig\Loader\ChainLoader::getLoaders()
|
||||
* changed internal code to use the namespaced classes as much as possible
|
||||
|
||||
* 1.37.1 (2019-01-14)
|
||||
# 1.37.1 (2019-01-14)
|
||||
|
||||
* fixed regression (key exists check for non ArrayObject objects)
|
||||
* fixed logic in TemplateWrapper
|
||||
|
||||
* 1.37.0 (2019-01-14)
|
||||
# 1.37.0 (2019-01-14)
|
||||
|
||||
* fixed ArrayObject access with a null value
|
||||
* fixed embedded templates starting with a BOM
|
||||
@@ -118,7 +134,7 @@
|
||||
* fixed float representation in compiled templates
|
||||
* added a second argument to the join filter (last separator configuration)
|
||||
|
||||
* 1.36.0 (2018-12-16)
|
||||
# 1.36.0 (2018-12-16)
|
||||
|
||||
* made sure twig_include returns a string
|
||||
* fixed multi-byte UFT-8 in escape('html_attr')
|
||||
@@ -127,24 +143,24 @@
|
||||
* fixed GlobalsInterface extended class
|
||||
* fixed filesystem loader throwing an exception instead of returning false
|
||||
|
||||
* 1.35.4 (2018-07-13)
|
||||
# 1.35.4 (2018-07-13)
|
||||
|
||||
* ensured that syntax errors are triggered with the right line
|
||||
* added the Symfony ctype polyfill as a dependency
|
||||
* "js" filter now produces valid JSON
|
||||
|
||||
* 1.35.3 (2018-03-20)
|
||||
# 1.35.3 (2018-03-20)
|
||||
|
||||
* fixed block names unicity
|
||||
* fixed counting children of SimpleXMLElement objects
|
||||
* added missing else clause to avoid infinite loops
|
||||
* fixed .. (range operator) in sandbox policy
|
||||
|
||||
* 1.35.2 (2018-03-03)
|
||||
# 1.35.2 (2018-03-03)
|
||||
|
||||
* fixed a regression in the way the profiler is registered in templates
|
||||
|
||||
* 1.35.1 (2018-03-02)
|
||||
# 1.35.1 (2018-03-02)
|
||||
|
||||
* added an exception when using "===" instead of "same as"
|
||||
* fixed possible array to string conversion concealing actual error
|
||||
@@ -152,31 +168,31 @@
|
||||
* fixed length filter when passing an instance of IteratorAggregate
|
||||
* fixed Environment::resolveTemplate to accept instances of TemplateWrapper
|
||||
|
||||
* 1.35.0 (2017-09-27)
|
||||
# 1.35.0 (2017-09-27)
|
||||
|
||||
* added Twig_Profiler_Profile::reset()
|
||||
* fixed use TokenParser to return an empty Node
|
||||
* added RuntimeExtensionInterface
|
||||
* added circular reference detection when loading templates
|
||||
|
||||
* 1.34.4 (2017-07-04)
|
||||
# 1.34.4 (2017-07-04)
|
||||
|
||||
* added support for runtime loaders in IntegrationTestCase
|
||||
* fixed deprecation when using Twig_Profiler_Dumper_Html
|
||||
|
||||
* 1.34.3 (2017-06-07)
|
||||
# 1.34.3 (2017-06-07)
|
||||
|
||||
* fixed namespaces introduction
|
||||
|
||||
* 1.34.2 (2017-06-05)
|
||||
# 1.34.2 (2017-06-05)
|
||||
|
||||
* fixed namespaces introduction
|
||||
|
||||
* 1.34.1 (2017-06-05)
|
||||
# 1.34.1 (2017-06-05)
|
||||
|
||||
* fixed namespaces introduction
|
||||
|
||||
* 1.34.0 (2017-06-05)
|
||||
# 1.34.0 (2017-06-05)
|
||||
|
||||
* added support for PHPUnit 6 when testing extensions
|
||||
* fixed PHP 7.2 compatibility
|
||||
@@ -186,15 +202,15 @@
|
||||
* dropped HHVM support
|
||||
* dropped PHP 5.2 support
|
||||
|
||||
* 1.33.2 (2017-04-20)
|
||||
# 1.33.2 (2017-04-20)
|
||||
|
||||
* fixed edge case in the method cache for Twig attributes
|
||||
|
||||
* 1.33.1 (2017-04-18)
|
||||
# 1.33.1 (2017-04-18)
|
||||
|
||||
* fixed the empty() test
|
||||
|
||||
* 1.33.0 (2017-03-22)
|
||||
# 1.33.0 (2017-03-22)
|
||||
|
||||
* fixed a race condition handling when writing cache files
|
||||
* "length" filter now returns string length when applied to an object that does
|
||||
@@ -203,13 +219,13 @@
|
||||
objects implement __toString() but not \Countable
|
||||
* fixed JS escaping for unicode characters with higher code points
|
||||
|
||||
* 1.32.0 (2017-02-26)
|
||||
# 1.32.0 (2017-02-26)
|
||||
|
||||
* fixed deprecation notice in Twig_Util_DeprecationCollector
|
||||
* added a PSR-11 compatible runtime loader
|
||||
* added `side` argument to `trim` to allow left or right trimming only.
|
||||
|
||||
* 1.31.0 (2017-01-11)
|
||||
# 1.31.0 (2017-01-11)
|
||||
|
||||
* added Twig_NodeCaptureInterface for nodes that capture all output
|
||||
* fixed marking the environment as initialized too early
|
||||
@@ -217,13 +233,13 @@
|
||||
* turned fatal error into exception when a previously generated cache is corrupted
|
||||
* fixed offline cache warm-ups for embedded templates
|
||||
|
||||
* 1.30.0 (2016-12-23)
|
||||
# 1.30.0 (2016-12-23)
|
||||
|
||||
* added Twig_FactoryRuntimeLoader
|
||||
* deprecated function/test/filter/tag overriding
|
||||
* deprecated the "disable_c_ext" attribute on Twig_Node_Expression_GetAttr
|
||||
|
||||
* 1.29.0 (2016-12-13)
|
||||
# 1.29.0 (2016-12-13)
|
||||
|
||||
* fixed sandbox being left enabled if an exception is thrown while rendering
|
||||
* marked some classes as being final (via @final)
|
||||
@@ -232,16 +248,16 @@
|
||||
* deprecated silent display of undefined blocks
|
||||
* deprecated support for mbstring.func_overload != 0
|
||||
|
||||
* 1.28.2 (2016-11-23)
|
||||
# 1.28.2 (2016-11-23)
|
||||
|
||||
* fixed precedence between getFoo() and isFoo() in Twig_Template::getAttribute()
|
||||
* improved a deprecation message
|
||||
|
||||
* 1.28.1 (2016-11-18)
|
||||
# 1.28.1 (2016-11-18)
|
||||
|
||||
* fixed block() function when used with a template argument
|
||||
|
||||
* 1.28.0 (2016-11-17)
|
||||
# 1.28.0 (2016-11-17)
|
||||
|
||||
* added support for the PHP 7 null coalescing operator for the ?? Twig implementation
|
||||
* exposed a way to access template data and methods in a portable way
|
||||
@@ -251,7 +267,7 @@
|
||||
* added "is defined" support for block() and constant()
|
||||
* optimized the way attributes are fetched
|
||||
|
||||
* 1.27.0 (2016-10-25)
|
||||
# 1.27.0 (2016-10-25)
|
||||
|
||||
* deprecated Twig_Parser::getEnvironment()
|
||||
* deprecated Twig_Parser::addHandler() and Twig_Parser::addNodeVisitor()
|
||||
@@ -269,13 +285,13 @@
|
||||
* fixed template paths when a template name contains a protocol like vfs://
|
||||
* improved debugging with Twig_Sandbox_SecurityError exceptions for disallowed methods and properties
|
||||
|
||||
* 1.26.1 (2016-10-05)
|
||||
# 1.26.1 (2016-10-05)
|
||||
|
||||
* removed template source code from generated template classes when debug is disabled
|
||||
* fixed default implementation of Twig_Template::getDebugInfo() for better BC
|
||||
* fixed regression on static calls for functions/filters/tests
|
||||
|
||||
* 1.26.0 (2016-10-02)
|
||||
# 1.26.0 (2016-10-02)
|
||||
|
||||
* added template cache invalidation based on more environment options
|
||||
* added a missing deprecation notice
|
||||
@@ -283,7 +299,7 @@
|
||||
* allowed filters/functions/tests implementation to use a different class than the extension they belong to
|
||||
* deprecated Twig_ExtensionInterface::getName()
|
||||
|
||||
* 1.25.0 (2016-09-21)
|
||||
# 1.25.0 (2016-09-21)
|
||||
|
||||
* changed the way we store template source in template classes
|
||||
* removed usage of realpath in cache keys
|
||||
@@ -293,13 +309,13 @@
|
||||
* deprecated Twig_Environment::getLexer(), Twig_Environment::getParser(), Twig_Environment::getCompiler()
|
||||
* deprecated Twig_Compiler::getFilename()
|
||||
|
||||
* 1.24.2 (2016-09-01)
|
||||
# 1.24.2 (2016-09-01)
|
||||
|
||||
* fixed static callables
|
||||
* fixed a potential PHP warning when loading the cache
|
||||
* fixed a case where the autoescaping does not work as expected
|
||||
|
||||
* 1.24.1 (2016-05-30)
|
||||
# 1.24.1 (2016-05-30)
|
||||
|
||||
* fixed reserved keywords (forbids true, false, null and none keywords for variables names)
|
||||
* fixed support for PHP7 (Throwable support)
|
||||
@@ -308,36 +324,36 @@
|
||||
getTokenParsers(), getTags(), getNodeVisitors(), getUnaryOperators(), getBinaryOperators(),
|
||||
getFunctions(), getFilters(), getGlobals(), initGlobals(), initExtensions(), and initExtension()
|
||||
|
||||
* 1.24.0 (2016-01-25)
|
||||
# 1.24.0 (2016-01-25)
|
||||
|
||||
* adding support for the ?? operator
|
||||
* fixed the defined test when used on a constant, a map, or a sequence
|
||||
* undeprecated _self (should only be used to get the template name, not the template instance)
|
||||
* fixed parsing on PHP7
|
||||
|
||||
* 1.23.3 (2016-01-11)
|
||||
# 1.23.3 (2016-01-11)
|
||||
|
||||
* fixed typo
|
||||
|
||||
* 1.23.2 (2015-01-11)
|
||||
# 1.23.2 (2015-01-11)
|
||||
|
||||
* added versions in deprecated messages
|
||||
* made file cache tolerant for trailing (back)slashes on directory configuration
|
||||
* deprecated unused Twig_Node_Expression_ExtensionReference class
|
||||
|
||||
* 1.23.1 (2015-11-05)
|
||||
# 1.23.1 (2015-11-05)
|
||||
|
||||
* fixed some exception messages which triggered PHP warnings
|
||||
* fixed BC on Twig_Test_NodeTestCase
|
||||
|
||||
* 1.23.0 (2015-10-29)
|
||||
# 1.23.0 (2015-10-29)
|
||||
|
||||
* deprecated the possibility to override an extension by registering another one with the same name
|
||||
* deprecated Twig_ExtensionInterface::getGlobals() (added Twig_Extension_GlobalsInterface for BC)
|
||||
* deprecated Twig_ExtensionInterface::initRuntime() (added Twig_Extension_InitRuntimeInterface for BC)
|
||||
* deprecated Twig_Environment::computeAlternatives()
|
||||
|
||||
* 1.22.3 (2015-10-13)
|
||||
# 1.22.3 (2015-10-13)
|
||||
|
||||
* fixed regression when using null as a cache strategy
|
||||
* improved performance when checking template freshness
|
||||
@@ -346,15 +362,15 @@
|
||||
* fixed logic for custom escapers to call them even on integers and null values
|
||||
* changed template cache names to take into account the Twig C extension
|
||||
|
||||
* 1.22.2 (2015-09-22)
|
||||
# 1.22.2 (2015-09-22)
|
||||
|
||||
* fixed a race condition in template loading
|
||||
|
||||
* 1.22.1 (2015-09-15)
|
||||
# 1.22.1 (2015-09-15)
|
||||
|
||||
* fixed regression in template_from_string
|
||||
|
||||
* 1.22.0 (2015-09-13)
|
||||
# 1.22.0 (2015-09-13)
|
||||
|
||||
* made Twig_Test_IntegrationTestCase more flexible
|
||||
* added an option to force PHP bytecode invalidation when writing a compiled template into the cache
|
||||
@@ -365,23 +381,23 @@
|
||||
* added a way to override the filesystem template cache system
|
||||
* added a way to get the original template source from Twig_Template
|
||||
|
||||
* 1.21.2 (2015-09-09)
|
||||
# 1.21.2 (2015-09-09)
|
||||
|
||||
* fixed variable names for the deprecation triggering code
|
||||
* fixed escaping strategy detection based on filename
|
||||
* added Traversable support for replace, merge, and sort
|
||||
* deprecated support for character by character replacement for the "replace" filter
|
||||
|
||||
* 1.21.1 (2015-08-26)
|
||||
# 1.21.1 (2015-08-26)
|
||||
|
||||
* fixed regression when using the deprecated Twig_Test_* classes
|
||||
|
||||
* 1.21.0 (2015-08-24)
|
||||
# 1.21.0 (2015-08-24)
|
||||
|
||||
* added deprecation notices for deprecated features
|
||||
* added a deprecation "framework" for filters/functions/tests and test fixtures
|
||||
|
||||
* 1.20.0 (2015-08-12)
|
||||
# 1.20.0 (2015-08-12)
|
||||
|
||||
* forbid access to the Twig environment from templates and internal parts of Twig_Template
|
||||
* fixed limited RCEs when in sandbox mode
|
||||
@@ -390,7 +406,7 @@
|
||||
* added Twig_BaseNodeVisitor to ease the compatibility of node visitors
|
||||
between 1.x and 2.x
|
||||
|
||||
* 1.19.0 (2015-07-31)
|
||||
# 1.19.0 (2015-07-31)
|
||||
|
||||
* fixed wrong error message when including an undefined template in a child template
|
||||
* added support for variadic filters, functions, and tests
|
||||
@@ -400,19 +416,19 @@
|
||||
* deprecated Twig_Environment::clearTemplateCache()
|
||||
* fixed sandbox disabling when using the include function
|
||||
|
||||
* 1.18.2 (2015-06-06)
|
||||
# 1.18.2 (2015-06-06)
|
||||
|
||||
* fixed template/line guessing in exceptions for nested templates
|
||||
* optimized the number of inodes and the size of realpath cache when using the cache
|
||||
|
||||
* 1.18.1 (2015-04-19)
|
||||
# 1.18.1 (2015-04-19)
|
||||
|
||||
* fixed memory leaks in the C extension
|
||||
* deprecated Twig_Loader_String
|
||||
* fixed the slice filter when used with a SimpleXMLElement object
|
||||
* fixed filesystem loader when trying to load non-files (like directories)
|
||||
|
||||
* 1.18.0 (2015-01-25)
|
||||
# 1.18.0 (2015-01-25)
|
||||
|
||||
* fixed some error messages where the line was wrong (unknown variables or argument names)
|
||||
* added a new way to customize the main Module node (via empty nodes)
|
||||
@@ -420,18 +436,18 @@
|
||||
* added a profiler
|
||||
* fixed filesystem loader cache when different file paths are used for the same template
|
||||
|
||||
* 1.17.0 (2015-01-14)
|
||||
# 1.17.0 (2015-01-14)
|
||||
|
||||
* added a 'filename' autoescaping strategy, which dynamically chooses the
|
||||
autoescaping strategy for a template based on template file extension.
|
||||
|
||||
* 1.16.3 (2014-12-25)
|
||||
# 1.16.3 (2014-12-25)
|
||||
|
||||
* fixed regression for dynamic parent templates
|
||||
* fixed cache management with statcache
|
||||
* fixed a regression in the slice filter
|
||||
|
||||
* 1.16.2 (2014-10-17)
|
||||
# 1.16.2 (2014-10-17)
|
||||
|
||||
* fixed timezone on dates as strings
|
||||
* fixed 2-words test names when a custom node class is not used
|
||||
@@ -442,7 +458,7 @@
|
||||
* fixed a regression in the in operator
|
||||
* fixed a regression in the slice filter
|
||||
|
||||
* 1.16.1 (2014-10-10)
|
||||
# 1.16.1 (2014-10-10)
|
||||
|
||||
* improved error reporting in a sandboxed template
|
||||
* fixed missing error file/line information under certain circumstances
|
||||
@@ -452,20 +468,20 @@
|
||||
* fixed for mb function overload mb_substr acting different
|
||||
* fixed the attribute() function when passing a variable for the arguments
|
||||
|
||||
* 1.16.0 (2014-07-05)
|
||||
# 1.16.0 (2014-07-05)
|
||||
|
||||
* changed url_encode to always encode according to RFC 3986
|
||||
* fixed inheritance in a 'use'-hierarchy
|
||||
* removed the __toString policy check when the sandbox is disabled
|
||||
* fixed recursively calling blocks in templates with inheritance
|
||||
|
||||
* 1.15.1 (2014-02-13)
|
||||
# 1.15.1 (2014-02-13)
|
||||
|
||||
* fixed the conversion of the special '0000-00-00 00:00' date
|
||||
* added an error message when trying to import an undefined block from a trait
|
||||
* fixed a C extension crash when accessing defined but uninitialized property.
|
||||
|
||||
* 1.15.0 (2013-12-06)
|
||||
# 1.15.0 (2013-12-06)
|
||||
|
||||
* made ignoreStrictCheck in Template::getAttribute() works with __call() methods throwing BadMethodCallException
|
||||
* added min and max functions
|
||||
@@ -475,19 +491,19 @@
|
||||
* added a source function to include the content of a template without rendering it
|
||||
* fixed the C extension sandbox behavior when get or set is prepend to method name
|
||||
|
||||
* 1.14.2 (2013-10-30)
|
||||
# 1.14.2 (2013-10-30)
|
||||
|
||||
* fixed error filename/line when an error occurs in an included file
|
||||
* allowed operators that contain whitespaces to have more than one whitespace
|
||||
* allowed tests to be made of 1 or 2 words (like "same as" or "divisible by")
|
||||
|
||||
* 1.14.1 (2013-10-15)
|
||||
# 1.14.1 (2013-10-15)
|
||||
|
||||
* made it possible to use named operators as variables
|
||||
* fixed the possibility to have a variable named 'matches'
|
||||
* added support for PHP 5.5 DateTimeInterface
|
||||
|
||||
* 1.14.0 (2013-10-03)
|
||||
# 1.14.0 (2013-10-03)
|
||||
|
||||
* fixed usage of the html_attr escaping strategy to avoid double-escaping with the html strategy
|
||||
* added new operators: ends with, starts with, and matches
|
||||
@@ -499,12 +515,12 @@
|
||||
* fixed template_from_string when the template includes or extends other ones
|
||||
* fixed a crash of the C extension on an edge case
|
||||
|
||||
* 1.13.2 (2013-08-03)
|
||||
# 1.13.2 (2013-08-03)
|
||||
|
||||
* fixed the error line number for an error occurs in and embedded template
|
||||
* fixed crashes of the C extension on some edge cases
|
||||
|
||||
* 1.13.1 (2013-06-06)
|
||||
# 1.13.1 (2013-06-06)
|
||||
|
||||
* added the possibility to ignore the filesystem constructor argument in Twig_Loader_Filesystem
|
||||
* fixed Twig_Loader_Chain::exists() for a loader which implements Twig_ExistsLoaderInterface
|
||||
@@ -512,7 +528,7 @@
|
||||
* added support for object instances as the second argument of the constant test
|
||||
* fixed the include function when used in an assignment
|
||||
|
||||
* 1.13.0 (2013-05-10)
|
||||
# 1.13.0 (2013-05-10)
|
||||
|
||||
* fixed getting a numeric-like item on a variable ('09' for instance)
|
||||
* fixed getting a boolean or float key on an array, so it is consistent with PHP's array access:
|
||||
@@ -521,7 +537,7 @@
|
||||
* changed ☃ to § in tests
|
||||
* enforced usage of named arguments after positional ones
|
||||
|
||||
* 1.12.3 (2013-04-08)
|
||||
# 1.12.3 (2013-04-08)
|
||||
|
||||
* fixed a security issue in the filesystem loader where it was possible to include a template one
|
||||
level above the configured path
|
||||
@@ -529,25 +545,25 @@
|
||||
* added a batch filter
|
||||
* added support for encoding an array as query string in the url_encode filter
|
||||
|
||||
* 1.12.2 (2013-02-09)
|
||||
# 1.12.2 (2013-02-09)
|
||||
|
||||
* fixed the timezone used by the date filter and function when the given date contains a timezone (like 2010-01-28T15:00:00+02:00)
|
||||
* fixed globals when getGlobals is called early on
|
||||
* added the first and last filter
|
||||
|
||||
* 1.12.1 (2013-01-15)
|
||||
# 1.12.1 (2013-01-15)
|
||||
|
||||
* added support for object instances as the second argument of the constant function
|
||||
* relaxed globals management to avoid a BC break
|
||||
* added support for {{ some_string[:2] }}
|
||||
|
||||
* 1.12.0 (2013-01-08)
|
||||
# 1.12.0 (2013-01-08)
|
||||
|
||||
* added verbatim as an alias for the raw tag to avoid confusion with the raw filter
|
||||
* fixed registration of tests and functions as anonymous functions
|
||||
* fixed globals management
|
||||
|
||||
* 1.12.0-RC1 (2012-12-29)
|
||||
# 1.12.0-RC1 (2012-12-29)
|
||||
|
||||
* added an include function (does the same as the include tag but in a more flexible way)
|
||||
* added the ability to use any PHP callable to define filters, functions, and tests
|
||||
@@ -557,14 +573,14 @@
|
||||
* moved filters/functions/tests syntax errors to the parser
|
||||
* added support for extended ternary operator syntaxes
|
||||
|
||||
* 1.11.1 (2012-11-11)
|
||||
# 1.11.1 (2012-11-11)
|
||||
|
||||
* fixed debug info line numbering (was off by 2)
|
||||
* fixed escaping when calling a macro inside another one (regression introduced in 1.9.1)
|
||||
* optimized variable access on PHP 5.4
|
||||
* fixed a crash of the C extension when an exception was thrown from a macro called without being imported (using _self.XXX)
|
||||
|
||||
* 1.11.0 (2012-11-07)
|
||||
# 1.11.0 (2012-11-07)
|
||||
|
||||
* fixed macro compilation when a variable name is a PHP reserved keyword
|
||||
* changed the date filter behavior to always apply the default timezone, except if false is passed as the timezone
|
||||
@@ -574,41 +590,41 @@
|
||||
* optimized the way Twig exceptions are managed (to make them faster)
|
||||
* added Twig_ExistsLoaderInterface (implementing this interface in your loader make the chain loader much faster)
|
||||
|
||||
* 1.10.3 (2012-10-19)
|
||||
# 1.10.3 (2012-10-19)
|
||||
|
||||
* fixed wrong template location in some error messages
|
||||
* reverted a BC break introduced in 1.10.2
|
||||
* added a split filter
|
||||
|
||||
* 1.10.2 (2012-10-15)
|
||||
# 1.10.2 (2012-10-15)
|
||||
|
||||
* fixed macro calls on PHP 5.4
|
||||
|
||||
* 1.10.1 (2012-10-15)
|
||||
# 1.10.1 (2012-10-15)
|
||||
|
||||
* made a speed optimization to macro calls when imported via the "import" tag
|
||||
* fixed C extension compilation on Windows
|
||||
* fixed a segfault in the C extension when using DateTime objects
|
||||
|
||||
* 1.10.0 (2012-09-28)
|
||||
# 1.10.0 (2012-09-28)
|
||||
|
||||
* extracted functional tests framework to make it reusable for third-party extensions
|
||||
* added namespaced templates support in Twig_Loader_Filesystem
|
||||
* added Twig_Loader_Filesystem::prependPath()
|
||||
* fixed an error when a token parser pass a closure as a test to the subparse() method
|
||||
|
||||
* 1.9.2 (2012-08-25)
|
||||
# 1.9.2 (2012-08-25)
|
||||
|
||||
* fixed the in operator for objects that contain circular references
|
||||
* fixed the C extension when accessing a public property of an object implementing the \ArrayAccess interface
|
||||
|
||||
* 1.9.1 (2012-07-22)
|
||||
# 1.9.1 (2012-07-22)
|
||||
|
||||
* optimized macro calls when auto-escaping is on
|
||||
* fixed wrong parent class for Twig_Function_Node
|
||||
* made Twig_Loader_Chain more explicit about problems
|
||||
|
||||
* 1.9.0 (2012-07-13)
|
||||
# 1.9.0 (2012-07-13)
|
||||
|
||||
* made the parsing independent of the template loaders
|
||||
* fixed exception trace when an error occurs when rendering a child template
|
||||
@@ -616,26 +632,26 @@
|
||||
* fixed nested embed tag calls
|
||||
* added the date_modify filter
|
||||
|
||||
* 1.8.3 (2012-06-17)
|
||||
# 1.8.3 (2012-06-17)
|
||||
|
||||
* fixed paths in the filesystem loader when passing a path that ends with a slash or a backslash
|
||||
* fixed escaping when a project defines a function named html or js
|
||||
* fixed chmod mode to apply the umask correctly
|
||||
|
||||
* 1.8.2 (2012-05-30)
|
||||
# 1.8.2 (2012-05-30)
|
||||
|
||||
* added the abs filter
|
||||
* fixed a regression when using a number in template attributes
|
||||
* fixed compiler when mbstring.func_overload is set to 2
|
||||
* fixed DateTimeZone support in date filter
|
||||
|
||||
* 1.8.1 (2012-05-17)
|
||||
# 1.8.1 (2012-05-17)
|
||||
|
||||
* fixed a regression when dealing with SimpleXMLElement instances in templates
|
||||
* fixed "is_safe" value for the "dump" function when "html_errors" is not defined in php.ini
|
||||
* switched to use mbstring whenever possible instead of iconv (you might need to update your encoding as mbstring and iconv encoding names sometimes differ)
|
||||
|
||||
* 1.8.0 (2012-05-08)
|
||||
# 1.8.0 (2012-05-08)
|
||||
|
||||
* enforced interface when adding tests, filters, functions, and node visitors from extensions
|
||||
* fixed a side-effect of the date filter where the timezone might be changed
|
||||
@@ -644,7 +660,7 @@
|
||||
* changed the autoescape option to also accept a supported escaping strategy (for BC, true is equivalent to html)
|
||||
* added an embed tag
|
||||
|
||||
* 1.7.0 (2012-04-24)
|
||||
# 1.7.0 (2012-04-24)
|
||||
|
||||
* fixed a PHP warning when using CIFS
|
||||
* fixed template line number in some exceptions
|
||||
@@ -658,30 +674,30 @@
|
||||
* fixed filesystem loader freshness logic for high traffic websites
|
||||
* fixed random function when charset is null
|
||||
|
||||
* 1.6.5 (2012-04-11)
|
||||
# 1.6.5 (2012-04-11)
|
||||
|
||||
* fixed a regression when a template only extends another one without defining any blocks
|
||||
|
||||
* 1.6.4 (2012-04-02)
|
||||
# 1.6.4 (2012-04-02)
|
||||
|
||||
* fixed PHP notice in Twig_Error::guessTemplateLine() introduced in 1.6.3
|
||||
* fixed performance when compiling large files
|
||||
* optimized parent template creation when the template does not use dynamic inheritance
|
||||
|
||||
* 1.6.3 (2012-03-22)
|
||||
# 1.6.3 (2012-03-22)
|
||||
|
||||
* fixed usage of Z_ADDREF_P for PHP 5.2 in the C extension
|
||||
* fixed compilation of numeric values used in templates when using a locale where the decimal separator is not a dot
|
||||
* made the strategy used to guess the real template file name and line number in exception messages much faster and more accurate
|
||||
|
||||
* 1.6.2 (2012-03-18)
|
||||
# 1.6.2 (2012-03-18)
|
||||
|
||||
* fixed sandbox mode when used with inheritance
|
||||
* added preserveKeys support for the slice filter
|
||||
* fixed the date filter when a DateTime instance is passed with a specific timezone
|
||||
* added a trim filter
|
||||
|
||||
* 1.6.1 (2012-02-29)
|
||||
# 1.6.1 (2012-02-29)
|
||||
|
||||
* fixed Twig C extension
|
||||
* removed the creation of Twig_Markup instances when not needed
|
||||
@@ -689,7 +705,7 @@
|
||||
* fixed the slice filter on strings when the length is not specified
|
||||
* fixed the creation of the cache directory in case of a race condition
|
||||
|
||||
* 1.6.0 (2012-02-04)
|
||||
# 1.6.0 (2012-02-04)
|
||||
|
||||
* fixed raw blocks when used with the whitespace trim option
|
||||
* made a speed optimization to macro calls when imported via the "from" tag
|
||||
@@ -704,22 +720,22 @@
|
||||
* added recursive parsing support in the parser
|
||||
* added string and integer handling for the random function
|
||||
|
||||
* 1.5.1 (2012-01-05)
|
||||
# 1.5.1 (2012-01-05)
|
||||
|
||||
* fixed a regression when parsing strings
|
||||
|
||||
* 1.5.0 (2012-01-04)
|
||||
# 1.5.0 (2012-01-04)
|
||||
|
||||
* added Traversable objects support for the join filter
|
||||
|
||||
* 1.5.0-RC2 (2011-12-30)
|
||||
# 1.5.0-RC2 (2011-12-30)
|
||||
|
||||
* added a way to set the default global date interval format
|
||||
* fixed the date filter for DateInterval instances (setTimezone() does not exist for them)
|
||||
* refactored Twig_Template::display() to ease its extension
|
||||
* added a number_format filter
|
||||
|
||||
* 1.5.0-RC1 (2011-12-26)
|
||||
# 1.5.0-RC1 (2011-12-26)
|
||||
|
||||
* removed the need to quote hash keys
|
||||
* allowed hash keys to be any expression
|
||||
@@ -734,19 +750,19 @@
|
||||
* added string interpolation support
|
||||
* enhanced exceptions for unknown filters, functions, tests, and tags
|
||||
|
||||
* 1.4.0 (2011-12-07)
|
||||
# 1.4.0 (2011-12-07)
|
||||
|
||||
* fixed lexer when using big numbers (> PHP_INT_MAX)
|
||||
* added missing preserveKeys argument to the reverse filter
|
||||
* fixed macros containing filter tag calls
|
||||
|
||||
* 1.4.0-RC2 (2011-11-27)
|
||||
# 1.4.0-RC2 (2011-11-27)
|
||||
|
||||
* removed usage of Reflection in Twig_Template::getAttribute()
|
||||
* added a C extension that can optionally replace Twig_Template::getAttribute()
|
||||
* added negative timestamp support to the date filter
|
||||
|
||||
* 1.4.0-RC1 (2011-11-20)
|
||||
# 1.4.0-RC1 (2011-11-20)
|
||||
|
||||
* optimized variable access when using PHP 5.4
|
||||
* changed the precedence of the .. operator to be more consistent with languages that implements such a feature like Ruby
|
||||
@@ -764,11 +780,11 @@
|
||||
* moved all node manipulations outside the compile() Node method
|
||||
* made several speed optimizations
|
||||
|
||||
* 1.3.0 (2011-10-08)
|
||||
# 1.3.0 (2011-10-08)
|
||||
|
||||
no changes
|
||||
|
||||
* 1.3.0-RC1 (2011-10-04)
|
||||
# 1.3.0-RC1 (2011-10-04)
|
||||
|
||||
* added an optimization for the parent() function
|
||||
* added cache reloading when auto_reload is true and an extension has been modified
|
||||
@@ -776,11 +792,11 @@ no changes
|
||||
* allowed empty templates to be used as traits
|
||||
* added traits support for the "parent" function
|
||||
|
||||
* 1.2.0 (2011-09-13)
|
||||
# 1.2.0 (2011-09-13)
|
||||
|
||||
no changes
|
||||
|
||||
* 1.2.0-RC1 (2011-09-10)
|
||||
# 1.2.0-RC1 (2011-09-10)
|
||||
|
||||
* enhanced the exception when a tag remains unclosed
|
||||
* added support for empty Countable objects for the "empty" test
|
||||
@@ -797,7 +813,7 @@ no changes
|
||||
* removed the possibility to use the "extends" tag from a block
|
||||
* added "if" modifier support to "for" loops
|
||||
|
||||
* 1.1.2 (2011-07-30)
|
||||
# 1.1.2 (2011-07-30)
|
||||
|
||||
* fixed json_encode filter on PHP 5.2
|
||||
* fixed regression introduced in 1.1.1 ({{ block(foo|lower) }})
|
||||
@@ -807,28 +823,28 @@ no changes
|
||||
* fixed a parsing problem when a large chunk of text is enclosed in a comment tag
|
||||
* added PHPDoc for all Token parsers and Core extension functions
|
||||
|
||||
* 1.1.1 (2011-07-17)
|
||||
# 1.1.1 (2011-07-17)
|
||||
|
||||
* added a performance optimization in the Optimizer (also helps to lower the number of nested level calls)
|
||||
* made some performance improvement for some edge cases
|
||||
|
||||
* 1.1.0 (2011-06-28)
|
||||
# 1.1.0 (2011-06-28)
|
||||
|
||||
* fixed json_encode filter
|
||||
|
||||
* 1.1.0-RC3 (2011-06-24)
|
||||
# 1.1.0-RC3 (2011-06-24)
|
||||
|
||||
* fixed method case-sensitivity when using the sandbox mode
|
||||
* added timezone support for the date filter
|
||||
* fixed possible security problems with NUL bytes
|
||||
|
||||
* 1.1.0-RC2 (2011-06-16)
|
||||
# 1.1.0-RC2 (2011-06-16)
|
||||
|
||||
* added an exception when the template passed to "use" is not a string
|
||||
* made 'a.b is defined' not throw an exception if a is not defined (in strict mode)
|
||||
* added {% line \d+ %} directive
|
||||
|
||||
* 1.1.0-RC1 (2011-05-28)
|
||||
# 1.1.0-RC1 (2011-05-28)
|
||||
|
||||
Flush your cache after upgrading.
|
||||
|
||||
@@ -842,13 +858,13 @@ Flush your cache after upgrading.
|
||||
* wrapped all compilation and runtime exceptions with Twig_Error_Runtime and added logic to guess the template name and line
|
||||
* moved display() method to Twig_Template (generated templates should now use doDisplay() instead)
|
||||
|
||||
* 1.0.0 (2011-03-27)
|
||||
# 1.0.0 (2011-03-27)
|
||||
|
||||
* fixed output when using mbstring
|
||||
* fixed duplicate call of methods when using the sandbox
|
||||
* made the charset configurable for the escape filter
|
||||
|
||||
* 1.0.0-RC2 (2011-02-21)
|
||||
# 1.0.0-RC2 (2011-02-21)
|
||||
|
||||
* changed the way {% set %} works when capturing (the content is now marked as safe)
|
||||
* added support for macro name in the endmacro tag
|
||||
@@ -859,7 +875,7 @@ Flush your cache after upgrading.
|
||||
* removed coupling between Twig_Node and Twig_Template
|
||||
* fixed the ternary operator precedence rule
|
||||
|
||||
* 1.0.0-RC1 (2011-01-09)
|
||||
# 1.0.0-RC1 (2011-01-09)
|
||||
|
||||
Backward incompatibilities:
|
||||
|
||||
@@ -885,7 +901,7 @@ Changes:
|
||||
* the "default" filter now uses the "empty" test instead of just checking for null
|
||||
* added the "empty" test
|
||||
|
||||
* 0.9.10 (2010-12-16)
|
||||
# 0.9.10 (2010-12-16)
|
||||
|
||||
Backward incompatibilities:
|
||||
|
||||
@@ -920,7 +936,7 @@ Changes:
|
||||
* added an Optimizer extension (enabled by default; optimizes "for" loops and "raw" filters)
|
||||
* added priority to node visitors
|
||||
|
||||
* 0.9.9 (2010-11-28)
|
||||
# 0.9.9 (2010-11-28)
|
||||
|
||||
Backward incompatibilities:
|
||||
* the self special variable has been renamed to _self
|
||||
@@ -969,7 +985,7 @@ Changes:
|
||||
* renamed self to _self (to avoid conflict)
|
||||
* fixed Twig_Template::getAttribute() for protected properties
|
||||
|
||||
* 0.9.8 (2010-06-28)
|
||||
# 0.9.8 (2010-06-28)
|
||||
|
||||
Backward incompatibilities:
|
||||
* the trans tag plural count is now attached to the plural tag:
|
||||
@@ -984,7 +1000,7 @@ Backward incompatibilities:
|
||||
* fixed set tag when used with a capture
|
||||
* fixed type hinting for Twig_Environment::addFilter() method
|
||||
|
||||
* 0.9.7 (2010-06-12)
|
||||
# 0.9.7 (2010-06-12)
|
||||
|
||||
Backward incompatibilities:
|
||||
* changed 'as' to '=' for the set tag ({% set title as "Title" %} must now be {% set title = "Title" %})
|
||||
@@ -1011,7 +1027,7 @@ Backward incompatibilities:
|
||||
* fixed sandbox mode (__toString() method check was not enforced if called implicitly from a simple statement like {{ article }})
|
||||
* added an exception when a child template has a non-empty body (as it is always ignored when rendering)
|
||||
|
||||
* 0.9.6 (2010-05-12)
|
||||
# 0.9.6 (2010-05-12)
|
||||
|
||||
* fixed variables defined outside a loop and for which the value changes in a for loop
|
||||
* fixed the test suite for PHP 5.2 and older versions of PHPUnit
|
||||
@@ -1028,7 +1044,7 @@ Backward incompatibilities:
|
||||
* added support for escaping strategy in the autoescape tag
|
||||
* fixed lexer when a template has a big chunk of text between/in a block
|
||||
|
||||
* 0.9.5 (2010-01-20)
|
||||
# 0.9.5 (2010-01-20)
|
||||
|
||||
As for any new release, don't forget to remove all cached templates after
|
||||
upgrading.
|
||||
@@ -1065,7 +1081,7 @@ stable).
|
||||
* added support for arrays (same behavior as in PHP, a mix between lists and dictionaries, arrays and hashes)
|
||||
* enhanced some error messages to provide better feedback in case of parsing errors
|
||||
|
||||
* 0.9.4 (2009-12-02)
|
||||
# 0.9.4 (2009-12-02)
|
||||
|
||||
If you have custom loaders, you MUST upgrade them for this release: The
|
||||
Twig_Loader base class has been removed, and the Twig_LoaderInterface has also
|
||||
@@ -1078,7 +1094,7 @@ been changed (see the source code for more information or the documentation).
|
||||
* fixed bug when the filename of a template contains */
|
||||
* refactored loaders
|
||||
|
||||
* 0.9.3 (2009-11-11)
|
||||
# 0.9.3 (2009-11-11)
|
||||
|
||||
This release is NOT backward compatible with the previous releases.
|
||||
|
||||
@@ -1107,7 +1123,7 @@ This release is NOT backward compatible with the previous releases.
|
||||
* extended set tag to support expression as value ({% set foo as 'foo' ~ 'bar' %} )
|
||||
* fixed bug when \ was used in HTML
|
||||
|
||||
* 0.9.2 (2009-10-29)
|
||||
# 0.9.2 (2009-10-29)
|
||||
|
||||
* made some speed optimizations
|
||||
* changed the cache extension to .php
|
||||
@@ -1125,7 +1141,7 @@ This release is NOT backward compatible with the previous releases.
|
||||
* enhanced some error messages to ease debugging
|
||||
* fixed empty cache files when the template contains an error
|
||||
|
||||
* 0.9.1 (2009-10-14)
|
||||
# 0.9.1 (2009-10-14)
|
||||
|
||||
* fixed a bug in PHP 5.2.6
|
||||
* fixed numbers with one than one decimal
|
||||
@@ -1133,6 +1149,6 @@ This release is NOT backward compatible with the previous releases.
|
||||
* made small speed optimizations
|
||||
* made minor tweaks to allow better extensibility and flexibility
|
||||
|
||||
* 0.9.0 (2009-10-12)
|
||||
# 0.9.0 (2009-10-12)
|
||||
|
||||
* Initial release
|
||||
|
||||
@@ -1,29 +1,27 @@
|
||||
Copyright (c) 2009-2020 by the Twig Team.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
All rights reserved.
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
* The names of the contributors may not be used to endorse or
|
||||
promote products derived from this software without specific
|
||||
prior written permission.
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of Twig nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"keywords": ["templating"],
|
||||
"homepage": "https://twig.symfony.com",
|
||||
"license": "BSD-3-Clause",
|
||||
"minimum-stability": "dev",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Fabien Potencier",
|
||||
@@ -23,11 +24,11 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.5.0",
|
||||
"php": ">=7.1.3",
|
||||
"symfony/polyfill-ctype": "^1.8"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/phpunit-bridge": "^4.4|^5.0",
|
||||
"symfony/phpunit-bridge": "^4.4.9|^5.0.9",
|
||||
"psr/container": "^1.0"
|
||||
},
|
||||
"autoload": {
|
||||
@@ -45,7 +46,7 @@
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.42-dev"
|
||||
"dev-master": "1.43-dev"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ class Twig_Loader_String implements LoaderInterface, ExistsLoaderInterface, Sour
|
||||
{
|
||||
public function getSource($name)
|
||||
{
|
||||
@trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', \get_class($this)), E_USER_DEPRECATED);
|
||||
@trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', static::class), E_USER_DEPRECATED);
|
||||
|
||||
return $name;
|
||||
}
|
||||
|
||||
@@ -35,17 +35,17 @@ use Twig\RuntimeLoader\RuntimeLoaderInterface;
|
||||
use Twig\TokenParser\TokenParserInterface;
|
||||
|
||||
/**
|
||||
* Stores the Twig configuration.
|
||||
* Stores the Twig configuration and renders templates.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class Environment
|
||||
{
|
||||
const VERSION = '1.42.5';
|
||||
const VERSION_ID = 14205;
|
||||
const VERSION = '1.43.1';
|
||||
const VERSION_ID = 14301;
|
||||
const MAJOR_VERSION = 1;
|
||||
const MINOR_VERSION = 42;
|
||||
const RELEASE_VERSION = 5;
|
||||
const MINOR_VERSION = 43;
|
||||
const RELEASE_VERSION = 1;
|
||||
const EXTRA_VERSION = '';
|
||||
|
||||
protected $charset;
|
||||
|
||||
@@ -598,6 +598,11 @@ class ExpressionParser
|
||||
while (!$stream->test(Token::PUNCTUATION_TYPE, ')')) {
|
||||
if (!empty($args)) {
|
||||
$stream->expect(Token::PUNCTUATION_TYPE, ',', 'Arguments must be separated by a comma');
|
||||
|
||||
// if the comma above was a trailing comma, early exit the argument parse loop
|
||||
if ($stream->test(Token::PUNCTUATION_TYPE, ')')) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($definition) {
|
||||
@@ -740,7 +745,7 @@ class ExpressionParser
|
||||
$message .= sprintf('. Use "%s" instead', $test->getAlternative());
|
||||
}
|
||||
$src = $stream->getSourceContext();
|
||||
$message .= sprintf(' in %s at line %d.', $src->getPath() ? $src->getPath() : $src->getName(), $stream->getCurrent()->getLine());
|
||||
$message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $stream->getCurrent()->getLine());
|
||||
|
||||
@trigger_error($message, E_USER_DEPRECATED);
|
||||
}
|
||||
@@ -770,7 +775,7 @@ class ExpressionParser
|
||||
$message .= sprintf('. Use "%s" instead', $function->getAlternative());
|
||||
}
|
||||
$src = $this->parser->getStream()->getSourceContext();
|
||||
$message .= sprintf(' in %s at line %d.', $src->getPath() ? $src->getPath() : $src->getName(), $line);
|
||||
$message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $line);
|
||||
|
||||
@trigger_error($message, E_USER_DEPRECATED);
|
||||
}
|
||||
@@ -800,7 +805,7 @@ class ExpressionParser
|
||||
$message .= sprintf('. Use "%s" instead', $filter->getAlternative());
|
||||
}
|
||||
$src = $this->parser->getStream()->getSourceContext();
|
||||
$message .= sprintf(' in %s at line %d.', $src->getPath() ? $src->getPath() : $src->getName(), $line);
|
||||
$message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $line);
|
||||
|
||||
@trigger_error($message, E_USER_DEPRECATED);
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ abstract class AbstractExtension implements ExtensionInterface
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return \get_class($this);
|
||||
return static::class;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -194,9 +194,9 @@ class CoreExtension extends AbstractExtension
|
||||
new TwigFilter('sort', 'twig_sort_filter'),
|
||||
new TwigFilter('merge', 'twig_array_merge'),
|
||||
new TwigFilter('batch', 'twig_array_batch'),
|
||||
new TwigFilter('filter', 'twig_array_filter'),
|
||||
new TwigFilter('map', 'twig_array_map'),
|
||||
new TwigFilter('reduce', 'twig_array_reduce'),
|
||||
new TwigFilter('filter', 'twig_array_filter', ['needs_environment' => true]),
|
||||
new TwigFilter('map', 'twig_array_map', ['needs_environment' => true]),
|
||||
new TwigFilter('reduce', 'twig_array_reduce', ['needs_environment' => true]),
|
||||
|
||||
// string/array filters
|
||||
new TwigFilter('reverse', 'twig_reverse_filter', ['needs_environment' => true]),
|
||||
@@ -539,11 +539,11 @@ function twig_replace_filter($str, $from, $to = null)
|
||||
*/
|
||||
function twig_round($value, $precision = 0, $method = 'common')
|
||||
{
|
||||
if ('common' == $method) {
|
||||
if ('common' === $method) {
|
||||
return round($value, $precision);
|
||||
}
|
||||
|
||||
if ('ceil' != $method && 'floor' != $method) {
|
||||
if ('ceil' !== $method && 'floor' !== $method) {
|
||||
throw new RuntimeError('The round filter only supports the "common", "ceil", and "floor" methods.');
|
||||
}
|
||||
|
||||
@@ -1214,7 +1214,7 @@ function _twig_escape_js_callback($matches)
|
||||
|
||||
/*
|
||||
* A few characters have short escape sequences in JSON and JavaScript.
|
||||
* Escape sequences supported only by JavaScript, not JSON, are ommitted.
|
||||
* Escape sequences supported only by JavaScript, not JSON, are omitted.
|
||||
* \" is also supported but omitted, because the resulting string is not HTML safe.
|
||||
*/
|
||||
static $shortMap = [
|
||||
@@ -1504,7 +1504,7 @@ function twig_to_array($seq, $preserveKeys = true)
|
||||
function twig_test_empty($value)
|
||||
{
|
||||
if ($value instanceof \Countable) {
|
||||
return 0 == \count($value);
|
||||
return 0 === \count($value);
|
||||
}
|
||||
|
||||
if ($value instanceof \Traversable) {
|
||||
@@ -1693,8 +1693,16 @@ function twig_array_batch($items, $size, $fill = null, $preserveKeys = true)
|
||||
return $result;
|
||||
}
|
||||
|
||||
function twig_array_filter($array, $arrow)
|
||||
function twig_array_filter(Environment $env, $array, $arrow)
|
||||
{
|
||||
if (!twig_test_iterable($array)) {
|
||||
throw new RuntimeError(sprintf('The "filter" filter expects an array or "Traversable", got "%s".', \is_object($array) ? \get_class($array) : \gettype($array)));
|
||||
}
|
||||
|
||||
if (!$arrow instanceof Closure && $env->hasExtension('\Twig\Extension\SandboxExtension') && $env->getExtension('\Twig\Extension\SandboxExtension')->isSandboxed()) {
|
||||
throw new RuntimeError('The callable passed to "filter" filter must be a Closure in sandbox mode.');
|
||||
}
|
||||
|
||||
if (\is_array($array)) {
|
||||
if (\PHP_VERSION_ID >= 50600) {
|
||||
return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH);
|
||||
@@ -1707,8 +1715,12 @@ function twig_array_filter($array, $arrow)
|
||||
return new \CallbackFilterIterator(new \IteratorIterator($array), $arrow);
|
||||
}
|
||||
|
||||
function twig_array_map($array, $arrow)
|
||||
function twig_array_map(Environment $env, $array, $arrow)
|
||||
{
|
||||
if (!$arrow instanceof Closure && $env->hasExtension('\Twig\Extension\SandboxExtension') && $env->getExtension('\Twig\Extension\SandboxExtension')->isSandboxed()) {
|
||||
throw new RuntimeError('The callable passed to the "map" filter must be a Closure in sandbox mode.');
|
||||
}
|
||||
|
||||
$r = [];
|
||||
foreach ($array as $k => $v) {
|
||||
$r[$k] = $arrow($v, $k);
|
||||
@@ -1717,8 +1729,12 @@ function twig_array_map($array, $arrow)
|
||||
return $r;
|
||||
}
|
||||
|
||||
function twig_array_reduce($array, $arrow, $initial = null)
|
||||
function twig_array_reduce(Environment $env, $array, $arrow, $initial = null)
|
||||
{
|
||||
if (!$arrow instanceof Closure && $env->hasExtension('\Twig\Extension\SandboxExtension') && $env->getExtension('\Twig\Extension\SandboxExtension')->isSandboxed()) {
|
||||
throw new RuntimeError('The callable passed to the "reduce" filter must be a Closure in sandbox mode.');
|
||||
}
|
||||
|
||||
if (!\is_array($array)) {
|
||||
$array = iterator_to_array($array);
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ class ProfilerExtension extends AbstractExtension
|
||||
|
||||
public function getNodeVisitors()
|
||||
{
|
||||
return [new ProfilerNodeVisitor(\get_class($this))];
|
||||
return [new ProfilerNodeVisitor(static::class)];
|
||||
}
|
||||
|
||||
public function getName()
|
||||
|
||||
@@ -499,11 +499,15 @@ class Lexer implements \Twig_LexerInterface
|
||||
$regex = [];
|
||||
foreach ($operators as $operator => $length) {
|
||||
// an operator that ends with a character must be followed by
|
||||
// a whitespace or a parenthesis
|
||||
// a whitespace, a parenthesis, an opening map [ or sequence {
|
||||
$r = preg_quote($operator, '/');
|
||||
if (ctype_alpha($operator[$length - 1])) {
|
||||
$r = preg_quote($operator, '/').'(?=[\s()])';
|
||||
} else {
|
||||
$r = preg_quote($operator, '/');
|
||||
$r .= '(?=[\s()\[{])';
|
||||
}
|
||||
|
||||
// an operator that begins with a character must not have a dot or pipe before
|
||||
if (ctype_alpha($operator[0])) {
|
||||
$r = '(?<![\.\|])'.$r;
|
||||
}
|
||||
|
||||
// an operator with a space can be any amount of whitespaces
|
||||
|
||||
@@ -53,7 +53,7 @@ class ArrayLoader implements LoaderInterface, ExistsLoaderInterface, SourceConte
|
||||
|
||||
public function getSource($name)
|
||||
{
|
||||
@trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', \get_class($this)), E_USER_DEPRECATED);
|
||||
@trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', static::class), E_USER_DEPRECATED);
|
||||
|
||||
$name = (string) $name;
|
||||
if (!isset($this->templates[$name])) {
|
||||
|
||||
@@ -52,7 +52,7 @@ class ChainLoader implements LoaderInterface, ExistsLoaderInterface, SourceConte
|
||||
|
||||
public function getSource($name)
|
||||
{
|
||||
@trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', \get_class($this)), E_USER_DEPRECATED);
|
||||
@trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', static::class), E_USER_DEPRECATED);
|
||||
|
||||
$exceptions = [];
|
||||
foreach ($this->loaders as $loader) {
|
||||
|
||||
@@ -138,7 +138,7 @@ class FilesystemLoader implements LoaderInterface, ExistsLoaderInterface, Source
|
||||
|
||||
public function getSource($name)
|
||||
{
|
||||
@trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', \get_class($this)), E_USER_DEPRECATED);
|
||||
@trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', static::class), E_USER_DEPRECATED);
|
||||
|
||||
if (null === ($path = $this->findTemplate($name)) || false === $path) {
|
||||
return '';
|
||||
@@ -180,7 +180,7 @@ class FilesystemLoader implements LoaderInterface, ExistsLoaderInterface, Source
|
||||
try {
|
||||
return null !== ($path = $this->findTemplate($name, false)) && false !== $path;
|
||||
} catch (LoaderError $e) {
|
||||
@trigger_error(sprintf('In %s::findTemplate(), you must accept a second argument that when set to "false" returns "false" instead of throwing an exception. Not supporting this argument is deprecated since version 1.27.', \get_class($this)), E_USER_DEPRECATED);
|
||||
@trigger_error(sprintf('In %s::findTemplate(), you must accept a second argument that when set to "false" returns "false" instead of throwing an exception. Not supporting this argument is deprecated since version 1.27.', static::class), E_USER_DEPRECATED);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ use Twig\Node\Expression\ConstantExpression;
|
||||
class EmbedNode extends IncludeNode
|
||||
{
|
||||
// we don't inject the module to avoid node visitors to traverse it twice (as it will be already visited in the main module)
|
||||
public function __construct($name, $index, AbstractExpression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null)
|
||||
public function __construct($name, $index, ?AbstractExpression $variables, $only, $ignoreMissing, $lineno, $tag = null)
|
||||
{
|
||||
parent::__construct(new ConstantExpression('not_used', $lineno), $variables, $only, $ignoreMissing, $lineno, $tag);
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ class BlockReferenceExpression extends AbstractExpression
|
||||
/**
|
||||
* @param Node|null $template
|
||||
*/
|
||||
public function __construct(\Twig_NodeInterface $name, $template = null, $lineno, $tag = null)
|
||||
public function __construct(\Twig_NodeInterface $name, $template, $lineno, $tag = null)
|
||||
{
|
||||
if (\is_bool($template)) {
|
||||
@trigger_error(sprintf('The %s method "$asString" argument is deprecated since version 1.28 and will be removed in 2.0.', __METHOD__), E_USER_DEPRECATED);
|
||||
|
||||
@@ -254,7 +254,8 @@ abstract class CallExpression extends AbstractExpression
|
||||
}
|
||||
if ($isVariadic) {
|
||||
$argument = end($parameters);
|
||||
if ($argument && $argument->isArray() && $argument->isDefaultValueAvailable() && [] === $argument->getDefaultValue()) {
|
||||
$isArray = $argument && $argument->hasType() && 'array' === $argument->getType()->getName();
|
||||
if ($isArray && $argument->isDefaultValueAvailable() && [] === $argument->getDefaultValue()) {
|
||||
array_pop($parameters);
|
||||
} else {
|
||||
$callableName = $r->name;
|
||||
|
||||
@@ -17,7 +17,7 @@ use Twig\Template;
|
||||
|
||||
class GetAttrExpression extends AbstractExpression
|
||||
{
|
||||
public function __construct(AbstractExpression $node, AbstractExpression $attribute, AbstractExpression $arguments = null, $type, $lineno)
|
||||
public function __construct(AbstractExpression $node, AbstractExpression $attribute, ?AbstractExpression $arguments, string $type, int $lineno)
|
||||
{
|
||||
$nodes = ['node' => $node, 'attribute' => $attribute];
|
||||
if (null !== $arguments) {
|
||||
|
||||
@@ -36,7 +36,7 @@ class NameExpression extends AbstractExpression
|
||||
if ($this->getAttribute('is_defined_test')) {
|
||||
if ($this->isSpecial()) {
|
||||
$compiler->repr(true);
|
||||
} elseif (\PHP_VERSION_ID >= 700400) {
|
||||
} elseif (\PHP_VERSION_ID >= 70400) {
|
||||
$compiler
|
||||
->raw('array_key_exists(')
|
||||
->string($name)
|
||||
|
||||
@@ -33,7 +33,7 @@ use Twig\Node\Expression\TestExpression;
|
||||
*/
|
||||
class DefinedTest extends TestExpression
|
||||
{
|
||||
public function __construct(\Twig_NodeInterface $node, $name, \Twig_NodeInterface $arguments = null, $lineno)
|
||||
public function __construct(\Twig_NodeInterface $node, $name, ?\Twig_NodeInterface $arguments, $lineno)
|
||||
{
|
||||
if ($node instanceof NameExpression) {
|
||||
$node->setAttribute('is_defined_test', true);
|
||||
|
||||
@@ -16,7 +16,7 @@ use Twig\TwigTest;
|
||||
|
||||
class TestExpression extends CallExpression
|
||||
{
|
||||
public function __construct(\Twig_NodeInterface $node, $name, \Twig_NodeInterface $arguments = null, $lineno)
|
||||
public function __construct(\Twig_NodeInterface $node, $name, ?\Twig_NodeInterface $arguments, $lineno)
|
||||
{
|
||||
$nodes = ['node' => $node];
|
||||
if (null !== $arguments) {
|
||||
|
||||
@@ -25,7 +25,7 @@ class ForNode extends Node
|
||||
{
|
||||
protected $loop;
|
||||
|
||||
public function __construct(AssignNameExpression $keyTarget, AssignNameExpression $valueTarget, AbstractExpression $seq, AbstractExpression $ifexpr = null, \Twig_NodeInterface $body, \Twig_NodeInterface $else = null, $lineno, $tag = null)
|
||||
public function __construct(AssignNameExpression $keyTarget, AssignNameExpression $valueTarget, AbstractExpression $seq, ?AbstractExpression $ifexpr, \Twig_NodeInterface $body, ?\Twig_NodeInterface $else, $lineno, $tag = null)
|
||||
{
|
||||
$body = new Node([$body, $this->loop = new ForLoopNode($lineno, $tag)]);
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ use Twig\Compiler;
|
||||
*/
|
||||
class IfNode extends Node
|
||||
{
|
||||
public function __construct(\Twig_NodeInterface $tests, \Twig_NodeInterface $else = null, $lineno, $tag = null)
|
||||
public function __construct(\Twig_NodeInterface $tests, ?\Twig_NodeInterface $else, $lineno, $tag = null)
|
||||
{
|
||||
$nodes = ['tests' => $tests];
|
||||
if (null !== $else) {
|
||||
|
||||
@@ -22,7 +22,7 @@ use Twig\Node\Expression\AbstractExpression;
|
||||
*/
|
||||
class IncludeNode extends Node implements NodeOutputInterface
|
||||
{
|
||||
public function __construct(AbstractExpression $expr, AbstractExpression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null)
|
||||
public function __construct(AbstractExpression $expr, ?AbstractExpression $variables, $only, $ignoreMissing, $lineno, $tag = null)
|
||||
{
|
||||
$nodes = ['expr' => $expr];
|
||||
if (null !== $variables) {
|
||||
|
||||
@@ -28,7 +28,7 @@ use Twig\Source;
|
||||
*/
|
||||
class ModuleNode extends Node
|
||||
{
|
||||
public function __construct(\Twig_NodeInterface $body, AbstractExpression $parent = null, \Twig_NodeInterface $blocks, \Twig_NodeInterface $macros, \Twig_NodeInterface $traits, $embeddedTemplates, $name, $source = '')
|
||||
public function __construct(\Twig_NodeInterface $body, ?AbstractExpression $parent, \Twig_NodeInterface $blocks, \Twig_NodeInterface $macros, \Twig_NodeInterface $traits, $embeddedTemplates, $name, $source = '')
|
||||
{
|
||||
if (!$name instanceof Source) {
|
||||
@trigger_error(sprintf('Passing a string as the $name argument of %s() is deprecated since version 1.27. Pass a \Twig\Source instance instead.', __METHOD__), E_USER_DEPRECATED);
|
||||
|
||||
@@ -40,7 +40,7 @@ class Node implements \Twig_NodeInterface
|
||||
{
|
||||
foreach ($nodes as $name => $node) {
|
||||
if (!$node instanceof \Twig_NodeInterface) {
|
||||
@trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', \is_object($node) ? \get_class($node) : (null === $node ? 'null' : \gettype($node)), $name, \get_class($this)), E_USER_DEPRECATED);
|
||||
@trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', \is_object($node) ? \get_class($node) : (null === $node ? 'null' : \gettype($node)), $name, static::class), E_USER_DEPRECATED);
|
||||
}
|
||||
}
|
||||
$this->nodes = $nodes;
|
||||
@@ -56,7 +56,7 @@ class Node implements \Twig_NodeInterface
|
||||
$attributes[] = sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true)));
|
||||
}
|
||||
|
||||
$repr = [\get_class($this).'('.implode(', ', $attributes)];
|
||||
$repr = [static::class.'('.implode(', ', $attributes)];
|
||||
|
||||
if (\count($this->nodes)) {
|
||||
foreach ($this->nodes as $name => $node) {
|
||||
@@ -89,7 +89,7 @@ class Node implements \Twig_NodeInterface
|
||||
$dom->appendChild($xml = $dom->createElement('twig'));
|
||||
|
||||
$xml->appendChild($node = $dom->createElement('node'));
|
||||
$node->setAttribute('class', \get_class($this));
|
||||
$node->setAttribute('class', static::class);
|
||||
|
||||
foreach ($this->attributes as $name => $value) {
|
||||
$node->appendChild($attribute = $dom->createElement('attribute'));
|
||||
@@ -153,7 +153,7 @@ class Node implements \Twig_NodeInterface
|
||||
public function getAttribute($name)
|
||||
{
|
||||
if (!\array_key_exists($name, $this->attributes)) {
|
||||
throw new \LogicException(sprintf('Attribute "%s" does not exist for Node "%s".', $name, \get_class($this)));
|
||||
throw new \LogicException(sprintf('Attribute "%s" does not exist for Node "%s".', $name, static::class));
|
||||
}
|
||||
|
||||
return $this->attributes[$name];
|
||||
@@ -187,7 +187,7 @@ class Node implements \Twig_NodeInterface
|
||||
public function getNode($name)
|
||||
{
|
||||
if (!\array_key_exists($name, $this->nodes)) {
|
||||
throw new \LogicException(sprintf('Node "%s" does not exist for Node "%s".', $name, \get_class($this)));
|
||||
throw new \LogicException(sprintf('Node "%s" does not exist for Node "%s".', $name, static::class));
|
||||
}
|
||||
|
||||
return $this->nodes[$name];
|
||||
@@ -196,7 +196,7 @@ class Node implements \Twig_NodeInterface
|
||||
public function setNode($name, $node = null)
|
||||
{
|
||||
if (!$node instanceof \Twig_NodeInterface) {
|
||||
@trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', \is_object($node) ? \get_class($node) : (null === $node ? 'null' : \gettype($node)), $name, \get_class($this)), E_USER_DEPRECATED);
|
||||
@trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', \is_object($node) ? \get_class($node) : (null === $node ? 'null' : \gettype($node)), $name, static::class), E_USER_DEPRECATED);
|
||||
}
|
||||
|
||||
$this->nodes[$name] = $node;
|
||||
@@ -236,7 +236,7 @@ class Node implements \Twig_NodeInterface
|
||||
{
|
||||
$this->sourceContext = $source;
|
||||
foreach ($this->nodes as $node) {
|
||||
if ($node instanceof Node) {
|
||||
if ($node instanceof self) {
|
||||
$node->setSourceContext($source);
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user