mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2024-11-15 03:18:26 +00:00
Merge branch 'master' into 2.6
Conflicts: lib/Cake/VERSION.txt
This commit is contained in:
commit
2e4d6eb009
26 changed files with 212 additions and 48 deletions
|
@ -5,6 +5,7 @@ php:
|
|||
- 5.3
|
||||
- 5.4
|
||||
- 5.5
|
||||
- 5.6
|
||||
|
||||
env:
|
||||
- DB=mysql
|
||||
|
|
0
lib/Cake/Cache/Engine/MemcachedEngine.php
Executable file → Normal file
0
lib/Cake/Cache/Engine/MemcachedEngine.php
Executable file → Normal file
|
@ -38,6 +38,7 @@ class RedisEngine extends CacheEngine {
|
|||
* - port = integer port number to the Redis server (default: 6379)
|
||||
* - timeout = float timeout in seconds (default: 0)
|
||||
* - persistent = boolean Connects to the Redis server with a persistent connection (default: true)
|
||||
* - unix_socket = path to the unix socket file (default: false)
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
|
@ -64,7 +65,8 @@ class RedisEngine extends CacheEngine {
|
|||
'port' => 6379,
|
||||
'password' => false,
|
||||
'timeout' => 0,
|
||||
'persistent' => true
|
||||
'persistent' => true,
|
||||
'unix_socket' => false
|
||||
), $settings)
|
||||
);
|
||||
|
||||
|
@ -80,7 +82,9 @@ class RedisEngine extends CacheEngine {
|
|||
$return = false;
|
||||
try {
|
||||
$this->_Redis = new Redis();
|
||||
if (empty($this->settings['persistent'])) {
|
||||
if (!empty($this->settings['unix_socket'])) {
|
||||
$return = $this->_Redis->connect($this->settings['unix_socket']);
|
||||
} elseif (empty($this->settings['persistent'])) {
|
||||
$return = $this->_Redis->connect($this->settings['server'], $this->settings['port'], $this->settings['timeout']);
|
||||
} else {
|
||||
$persistentId = $this->settings['port'] . $this->settings['timeout'] . $this->settings['database'];
|
||||
|
|
|
@ -839,8 +839,9 @@ class UpgradeShell extends AppShell {
|
|||
);
|
||||
|
||||
$parser->description(
|
||||
__d('cake_console', "A shell to help automate upgrading from CakePHP 1.3 to 2.0. \n" .
|
||||
"Be sure to have a backup of your application before running these commands."
|
||||
__d('cake_console', "A tool to help automate upgrading an application or plugin " .
|
||||
"from CakePHP 1.3 to 2.0. Be sure to have a backup of your application before " .
|
||||
"running these commands."
|
||||
))->addSubcommand('all', array(
|
||||
'help' => __d('cake_console', 'Run all upgrade commands.'),
|
||||
'parser' => $subcommandParser
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<ul>
|
||||
|
||||
<?php if (strpos($action, 'add') === false): ?>
|
||||
<li><?php echo "<?php echo \$this->Form->postLink(__('Delete'), array('action' => 'delete', \$this->Form->value('{$modelClass}.{$primaryKey}')), null, __('Are you sure you want to delete # %s?', \$this->Form->value('{$modelClass}.{$primaryKey}'))); ?>"; ?></li>
|
||||
<li><?php echo "<?php echo \$this->Form->postLink(__('Delete'), array('action' => 'delete', \$this->Form->value('{$modelClass}.{$primaryKey}')), array(), __('Are you sure you want to delete # %s?', \$this->Form->value('{$modelClass}.{$primaryKey}'))); ?>"; ?></li>
|
||||
<?php endif; ?>
|
||||
<li><?php echo "<?php echo \$this->Html->link(__('List " . $pluralHumanName . "'), array('action' => 'index')); ?>"; ?></li>
|
||||
<?php
|
||||
|
|
|
@ -45,7 +45,7 @@ foreach ($fields as $field) {
|
|||
<ul>
|
||||
<?php
|
||||
echo "\t\t<li><?php echo \$this->Html->link(__('Edit " . $singularHumanName ."'), array('action' => 'edit', \${$singularVar}['{$modelClass}']['{$primaryKey}'])); ?> </li>\n";
|
||||
echo "\t\t<li><?php echo \$this->Form->postLink(__('Delete " . $singularHumanName . "'), array('action' => 'delete', \${$singularVar}['{$modelClass}']['{$primaryKey}']), null, __('Are you sure you want to delete # %s?', \${$singularVar}['{$modelClass}']['{$primaryKey}'])); ?> </li>\n";
|
||||
echo "\t\t<li><?php echo \$this->Form->postLink(__('Delete " . $singularHumanName . "'), array('action' => 'delete', \${$singularVar}['{$modelClass}']['{$primaryKey}']), array(), __('Are you sure you want to delete # %s?', \${$singularVar}['{$modelClass}']['{$primaryKey}'])); ?> </li>\n";
|
||||
echo "\t\t<li><?php echo \$this->Html->link(__('List " . $pluralHumanName . "'), array('action' => 'index')); ?> </li>\n";
|
||||
echo "\t\t<li><?php echo \$this->Html->link(__('New " . $singularHumanName . "'), array('action' => 'add')); ?> </li>\n";
|
||||
|
||||
|
@ -119,7 +119,7 @@ echo "\t<?php foreach (\${$singularVar}['{$alias}'] as \${$otherSingularVar}): ?
|
|||
echo "\t\t\t<td class=\"actions\">\n";
|
||||
echo "\t\t\t\t<?php echo \$this->Html->link(__('View'), array('controller' => '{$details['controller']}', 'action' => 'view', \${$otherSingularVar}['{$details['primaryKey']}'])); ?>\n";
|
||||
echo "\t\t\t\t<?php echo \$this->Html->link(__('Edit'), array('controller' => '{$details['controller']}', 'action' => 'edit', \${$otherSingularVar}['{$details['primaryKey']}'])); ?>\n";
|
||||
echo "\t\t\t\t<?php echo \$this->Form->postLink(__('Delete'), array('controller' => '{$details['controller']}', 'action' => 'delete', \${$otherSingularVar}['{$details['primaryKey']}']), null, __('Are you sure you want to delete # %s?', \${$otherSingularVar}['{$details['primaryKey']}'])); ?>\n";
|
||||
echo "\t\t\t\t<?php echo \$this->Form->postLink(__('Delete'), array('controller' => '{$details['controller']}', 'action' => 'delete', \${$otherSingularVar}['{$details['primaryKey']}']), array(), __('Are you sure you want to delete # %s?', \${$otherSingularVar}['{$details['primaryKey']}'])); ?>\n";
|
||||
echo "\t\t\t</td>\n";
|
||||
echo "\t\t</tr>\n";
|
||||
|
||||
|
|
|
@ -202,6 +202,8 @@ class PaginatorComponent extends Component {
|
|||
$count = 0;
|
||||
} elseif ($object->hasMethod('paginateCount')) {
|
||||
$count = $object->paginateCount($conditions, $recursive, $extra);
|
||||
} elseif ($page === 1 && count($results) < $limit) {
|
||||
$count = count($results);
|
||||
} else {
|
||||
$parameters = compact('conditions');
|
||||
if ($recursive != $object->recursive) {
|
||||
|
|
|
@ -970,7 +970,7 @@ class Controller extends Object implements CakeEventListener {
|
|||
|
||||
$referer = $this->request->referer($local);
|
||||
if ($referer === '/' && $default) {
|
||||
return Router::url($default, true);
|
||||
return Router::url($default, !$local);
|
||||
}
|
||||
return $referer;
|
||||
}
|
||||
|
|
|
@ -1140,6 +1140,7 @@ class DboSource extends DataSource {
|
|||
$stack['_joined'] = $joined;
|
||||
|
||||
$db->queryAssociation($Model, $LinkModel, $type, $assoc, $assocData, $array, true, $resultSet, $Model->recursive - 1, $stack);
|
||||
unset($db);
|
||||
|
||||
if ($type === 'hasMany' || $type === 'hasAndBelongsToMany') {
|
||||
$filtered[] = $assoc;
|
||||
|
|
|
@ -2108,7 +2108,7 @@ class Model extends Object implements CakeEventListener {
|
|||
protected function _prepareUpdateFields($data) {
|
||||
$foreignKeys = array();
|
||||
foreach ($this->belongsTo as $assoc => $info) {
|
||||
if ($info['counterCache']) {
|
||||
if (isset($info['counterCache']) && $info['counterCache']) {
|
||||
$foreignKeys[$assoc] = $info['foreignKey'];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -756,8 +756,10 @@ class CakeEmail {
|
|||
}
|
||||
|
||||
$headers['MIME-Version'] = '1.0';
|
||||
if (!empty($this->_attachments) || $this->_emailFormat === 'both') {
|
||||
if (!empty($this->_attachments)) {
|
||||
$headers['Content-Type'] = 'multipart/mixed; boundary="' . $this->_boundary . '"';
|
||||
} elseif ($this->_emailFormat === 'both') {
|
||||
$headers['Content-Type'] = 'multipart/alternative; boundary="' . $this->_boundary . '"';
|
||||
} elseif ($this->_emailFormat === 'text') {
|
||||
$headers['Content-Type'] = 'text/plain; charset=' . $this->_getContentTypeCharset();
|
||||
} elseif ($this->_emailFormat === 'html') {
|
||||
|
@ -1521,6 +1523,7 @@ class CakeEmail {
|
|||
$hasInlineAttachments = count($contentIds) > 0;
|
||||
$hasAttachments = !empty($this->_attachments);
|
||||
$hasMultipleTypes = count($rendered) > 1;
|
||||
$multiPart = ($hasAttachments || $hasMultipleTypes);
|
||||
|
||||
$boundary = $relBoundary = $textBoundary = $this->_boundary;
|
||||
|
||||
|
@ -1531,7 +1534,7 @@ class CakeEmail {
|
|||
$relBoundary = $textBoundary = 'rel-' . $boundary;
|
||||
}
|
||||
|
||||
if ($hasMultipleTypes) {
|
||||
if ($hasMultipleTypes && $hasAttachments) {
|
||||
$msg[] = '--' . $relBoundary;
|
||||
$msg[] = 'Content-Type: multipart/alternative; boundary="alt-' . $boundary . '"';
|
||||
$msg[] = '';
|
||||
|
@ -1539,7 +1542,7 @@ class CakeEmail {
|
|||
}
|
||||
|
||||
if (isset($rendered['text'])) {
|
||||
if ($textBoundary !== $boundary || $hasAttachments) {
|
||||
if ($multiPart) {
|
||||
$msg[] = '--' . $textBoundary;
|
||||
$msg[] = 'Content-Type: text/plain; charset=' . $this->_getContentTypeCharset();
|
||||
$msg[] = 'Content-Transfer-Encoding: ' . $this->_getContentTransferEncoding();
|
||||
|
@ -1552,7 +1555,7 @@ class CakeEmail {
|
|||
}
|
||||
|
||||
if (isset($rendered['html'])) {
|
||||
if ($textBoundary !== $boundary || $hasAttachments) {
|
||||
if ($multiPart) {
|
||||
$msg[] = '--' . $textBoundary;
|
||||
$msg[] = 'Content-Type: text/html; charset=' . $this->_getContentTypeCharset();
|
||||
$msg[] = 'Content-Transfer-Encoding: ' . $this->_getContentTransferEncoding();
|
||||
|
@ -1564,7 +1567,7 @@ class CakeEmail {
|
|||
$msg[] = '';
|
||||
}
|
||||
|
||||
if ($hasMultipleTypes) {
|
||||
if ($textBoundary !== $relBoundary) {
|
||||
$msg[] = '--' . $textBoundary . '--';
|
||||
$msg[] = '';
|
||||
}
|
||||
|
|
0
lib/Cake/Test/Case/Cache/Engine/MemcachedEngineTest.php
Executable file → Normal file
0
lib/Cake/Test/Case/Cache/Engine/MemcachedEngineTest.php
Executable file → Normal file
|
@ -1052,8 +1052,8 @@ TEXT;
|
|||
$this->Task->args = array('all');
|
||||
$this->Task->expects($this->once())->method('_checkUnitTest')->will($this->returnValue(true));
|
||||
|
||||
$this->Task->Fixture->expects($this->exactly(5))->method('bake');
|
||||
$this->Task->Test->expects($this->exactly(5))->method('bake');
|
||||
$this->Task->Fixture->expects($this->exactly(6))->method('bake');
|
||||
$this->Task->Test->expects($this->exactly(6))->method('bake');
|
||||
|
||||
$filename = '/my/path/BakeArticle.php';
|
||||
$this->Task->expects($this->at(1))->method('createFile')
|
||||
|
@ -1083,6 +1083,10 @@ TEXT;
|
|||
$this->Task->expects($this->at(5))->method('createFile')
|
||||
->with($filename, $this->stringContains('class CategoryThread'));
|
||||
|
||||
$filename = '/my/path/NumberTree.php';
|
||||
$this->Task->expects($this->at(6))->method('createFile')
|
||||
->with($filename, $this->stringContains('class NumberTree'));
|
||||
|
||||
$this->Task->execute();
|
||||
|
||||
$this->assertEquals(count(ClassRegistry::keys()), 0);
|
||||
|
@ -1216,7 +1220,7 @@ TEXT;
|
|||
$this->Task->path = '/my/path/';
|
||||
$this->Task->args = array('all');
|
||||
$this->Task->expects($this->once())->method('_checkUnitTest')->will($this->returnValue(true));
|
||||
$this->Task->skipTables = array('bake_tags');
|
||||
$this->Task->skipTables = array('bake_tags', 'number_trees');
|
||||
|
||||
$this->Task->Fixture->expects($this->exactly(4))->method('bake');
|
||||
$this->Task->Test->expects($this->exactly(4))->method('bake');
|
||||
|
|
|
@ -959,7 +959,7 @@ class AuthComponentTest extends CakeTestCase {
|
|||
array($CakeRequest, $CakeResponse)
|
||||
);
|
||||
|
||||
$expected = Router::url($this->Auth->loginRedirect, true);
|
||||
$expected = Router::url($this->Auth->loginRedirect);
|
||||
$Controller->expects($this->once())
|
||||
->method('redirect')
|
||||
->with($this->equalTo($expected));
|
||||
|
|
|
@ -272,20 +272,17 @@ HTMLBLOC;
|
|||
$this->assertTextEquals($expected, DebugCompTransport::$lastEmail);
|
||||
|
||||
$this->Controller->EmailTest->sendAs = 'both';
|
||||
$expected = str_replace('{CONTENTTYPE}', 'multipart/mixed; boundary="{boundary}"', $header);
|
||||
$expected = str_replace('{CONTENTTYPE}', 'multipart/alternative; boundary="{boundary}"', $header);
|
||||
$expected .= "--{boundary}\n" .
|
||||
'Content-Type: multipart/alternative; boundary="alt-{boundary}"' . "\n\n" .
|
||||
'--alt-{boundary}' . "\n" .
|
||||
'Content-Type: text/plain; charset=UTF-8' . "\n" .
|
||||
'Content-Transfer-Encoding: 8bit' . "\n\n" .
|
||||
$text .
|
||||
"\n\n" .
|
||||
'--alt-{boundary}' . "\n" .
|
||||
'--{boundary}' . "\n" .
|
||||
'Content-Type: text/html; charset=UTF-8' . "\n" .
|
||||
'Content-Transfer-Encoding: 8bit' . "\n\n" .
|
||||
$html .
|
||||
"\n\n" .
|
||||
'--alt-{boundary}--' . "\n\n\n" .
|
||||
"\n\n\n" .
|
||||
'--{boundary}--' . "\n";
|
||||
|
||||
$expected = '<pre>' . $expected . '</pre>';
|
||||
|
|
|
@ -185,8 +185,8 @@ class PaginatorAuthor extends CakeTestModel {
|
|||
* @var string
|
||||
*/
|
||||
public $virtualFields = array(
|
||||
'joined_offset' => 'PaginatorAuthor.id + 1'
|
||||
);
|
||||
'joined_offset' => 'PaginatorAuthor.id + 1'
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
@ -358,7 +358,7 @@ class PaginatorComponentTest extends CakeTestCase {
|
|||
$this->assertEquals(1, $Controller->params['paging']['PaginatorControllerPost']['page']);
|
||||
$this->assertEquals(array(3, 2, 1), $results);
|
||||
|
||||
$Controller->request->params['named'] = array('sort' => 'NotExisting.field', 'direction' => 'desc');
|
||||
$Controller->request->params['named'] = array('sort' => 'NotExisting.field', 'direction' => 'desc', 'limit' => 2);
|
||||
$Controller->Paginator->paginate('PaginatorControllerPost');
|
||||
$this->assertEquals(1, $Controller->params['paging']['PaginatorControllerPost']['page']);
|
||||
$this->assertEquals(array(), $Controller->PaginatorControllerPost->lastQueries[1]['order'][0], 'no order should be set.');
|
||||
|
@ -367,7 +367,7 @@ class PaginatorComponentTest extends CakeTestCase {
|
|||
'sort' => 'PaginatorControllerPost.author_id', 'direction' => 'allYourBase'
|
||||
);
|
||||
$results = Hash::extract($Controller->Paginator->paginate('PaginatorControllerPost'), '{n}.PaginatorControllerPost.id');
|
||||
$this->assertEquals(array('PaginatorControllerPost.author_id' => 'asc'), $Controller->PaginatorControllerPost->lastQueries[1]['order'][0]);
|
||||
$this->assertEquals(array('PaginatorControllerPost.author_id' => 'asc'), $Controller->PaginatorControllerPost->lastQueries[0]['order'][0]);
|
||||
$this->assertEquals(array(1, 3, 2), $results);
|
||||
|
||||
$Controller->request->params['named'] = array();
|
||||
|
@ -466,7 +466,7 @@ class PaginatorComponentTest extends CakeTestCase {
|
|||
$result = $Controller->Paginator->paginate('PaginatorControllerPost');
|
||||
$this->assertEquals(1, $Controller->params['paging']['PaginatorControllerPost']['page']);
|
||||
$this->assertEquals(array(1, 2, 3), Hash::extract($result, '{n}.PaginatorControllerPost.id'));
|
||||
$this->assertTrue(isset($Controller->PaginatorControllerPost->lastQueries[1]['contain']));
|
||||
$this->assertTrue(isset($Controller->PaginatorControllerPost->lastQueries[0]['contain']));
|
||||
|
||||
$Controller->Paginator->settings = array(
|
||||
'PaginatorControllerPost' => array(
|
||||
|
@ -475,14 +475,14 @@ class PaginatorComponentTest extends CakeTestCase {
|
|||
);
|
||||
$result = $Controller->Paginator->paginate('PaginatorControllerPost');
|
||||
$this->assertEquals(array(2, 3), Hash::extract($result, '{n}.PaginatorControllerPost.id'));
|
||||
$this->assertEquals(array('PaginatorControllerPost.id > ' => '1'), $Controller->PaginatorControllerPost->lastQueries[1]['conditions']);
|
||||
$this->assertEquals(array('PaginatorControllerPost.id > ' => '1'), $Controller->PaginatorControllerPost->lastQueries[0]['conditions']);
|
||||
|
||||
$Controller->request->params['named'] = array('limit' => 12);
|
||||
$Controller->Paginator->settings = array('limit' => 30, 'maxLimit' => 100, 'paramType' => 'named');
|
||||
$result = $Controller->Paginator->paginate('PaginatorControllerPost');
|
||||
$paging = $Controller->params['paging']['PaginatorControllerPost'];
|
||||
|
||||
$this->assertEquals(12, $Controller->PaginatorControllerPost->lastQueries[1]['limit']);
|
||||
$this->assertEquals(12, $Controller->PaginatorControllerPost->lastQueries[0]['limit']);
|
||||
$this->assertEquals(12, $paging['options']['limit']);
|
||||
|
||||
$Controller = new PaginatorTestController($this->request);
|
||||
|
@ -551,7 +551,7 @@ class PaginatorComponentTest extends CakeTestCase {
|
|||
|
||||
$this->assertEquals(array(2, 3), Hash::extract($result, '{n}.PaginatorControllerPost.id'));
|
||||
$this->assertEquals(
|
||||
$Controller->PaginatorControllerPost->lastQueries[1]['conditions'],
|
||||
$Controller->PaginatorControllerPost->lastQueries[0]['conditions'],
|
||||
array('PaginatorControllerPost.id > ' => '1')
|
||||
);
|
||||
$this->assertFalse(isset($Controller->params['paging']['PaginatorControllerPost']['options'][0]));
|
||||
|
|
|
@ -1167,6 +1167,48 @@ class CakeEmailTest extends CakeTestCase {
|
|||
$this->assertContains('--' . $boundary . '--', $result['message']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test setting inline attachments and HTML only messages.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testSendWithInlineAttachmentsHtmlOnly() {
|
||||
$this->CakeEmail->transport('debug');
|
||||
$this->CakeEmail->from('cake@cakephp.org');
|
||||
$this->CakeEmail->to('cake@cakephp.org');
|
||||
$this->CakeEmail->subject('My title');
|
||||
$this->CakeEmail->emailFormat('html');
|
||||
$this->CakeEmail->attachments(array(
|
||||
'cake.png' => array(
|
||||
'file' => CAKE . 'VERSION.txt',
|
||||
'contentId' => 'abc123'
|
||||
)
|
||||
));
|
||||
$result = $this->CakeEmail->send('Hello');
|
||||
|
||||
$boundary = $this->CakeEmail->getBoundary();
|
||||
$this->assertContains('Content-Type: multipart/mixed; boundary="' . $boundary . '"', $result['headers']);
|
||||
$expected = "--$boundary\r\n" .
|
||||
"Content-Type: multipart/related; boundary=\"rel-$boundary\"\r\n" .
|
||||
"\r\n" .
|
||||
"--rel-$boundary\r\n" .
|
||||
"Content-Type: text/html; charset=UTF-8\r\n" .
|
||||
"Content-Transfer-Encoding: 8bit\r\n" .
|
||||
"\r\n" .
|
||||
"Hello" .
|
||||
"\r\n" .
|
||||
"\r\n" .
|
||||
"\r\n" .
|
||||
"--rel-$boundary\r\n" .
|
||||
"Content-Type: application/octet-stream\r\n" .
|
||||
"Content-Transfer-Encoding: base64\r\n" .
|
||||
"Content-ID: <abc123>\r\n" .
|
||||
"Content-Disposition: inline; filename=\"cake.png\"\r\n\r\n";
|
||||
$this->assertContains($expected, $result['message']);
|
||||
$this->assertContains('--rel-' . $boundary . '--', $result['message']);
|
||||
$this->assertContains('--' . $boundary . '--', $result['message']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test disabling content-disposition.
|
||||
*
|
||||
|
@ -1301,6 +1343,52 @@ class CakeEmailTest extends CakeTestCase {
|
|||
$this->assertNotContains('This email was sent using the CakePHP Framework', $result['message']);
|
||||
}
|
||||
|
||||
/**
|
||||
* testSendRender both method
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testSendRenderBoth() {
|
||||
$this->CakeEmail->reset();
|
||||
$this->CakeEmail->transport('debug');
|
||||
|
||||
$this->CakeEmail->from('cake@cakephp.org');
|
||||
$this->CakeEmail->to(array('you@cakephp.org' => 'You'));
|
||||
$this->CakeEmail->subject('My title');
|
||||
$this->CakeEmail->config(array('empty'));
|
||||
$this->CakeEmail->template('default', 'default');
|
||||
$this->CakeEmail->emailFormat('both');
|
||||
$result = $this->CakeEmail->send();
|
||||
|
||||
$this->assertContains('Message-ID: ', $result['headers']);
|
||||
$this->assertContains('To: ', $result['headers']);
|
||||
|
||||
$boundary = $this->CakeEmail->getBoundary();
|
||||
$this->assertContains('Content-Type: multipart/alternative; boundary="' . $boundary . '"', $result['headers']);
|
||||
|
||||
$expected = "--$boundary\r\n" .
|
||||
"Content-Type: text/plain; charset=UTF-8\r\n" .
|
||||
"Content-Transfer-Encoding: 8bit\r\n" .
|
||||
"\r\n" .
|
||||
"\r\n" .
|
||||
"\r\n" .
|
||||
"This email was sent using the CakePHP Framework, http://cakephp.org." .
|
||||
"\r\n" .
|
||||
"\r\n" .
|
||||
"--$boundary\r\n" .
|
||||
"Content-Type: text/html; charset=UTF-8\r\n" .
|
||||
"Content-Transfer-Encoding: 8bit\r\n" .
|
||||
"\r\n" .
|
||||
"<!DOCTYPE html";
|
||||
$this->assertStringStartsWith($expected, $result['message']);
|
||||
|
||||
$expected = "</html>\r\n" .
|
||||
"\r\n" .
|
||||
"\r\n" .
|
||||
"--$boundary--\r\n";
|
||||
$this->assertStringEndsWith($expected, $result['message']);
|
||||
}
|
||||
|
||||
/**
|
||||
* testSendRender method for ISO-2022-JP
|
||||
*
|
||||
|
@ -1542,8 +1630,6 @@ class CakeEmailTest extends CakeTestCase {
|
|||
$this->assertFalse(empty($boundary));
|
||||
$this->assertContains('--' . $boundary, $message);
|
||||
$this->assertContains('--' . $boundary . '--', $message);
|
||||
$this->assertContains('--alt-' . $boundary, $message);
|
||||
$this->assertContains('--alt-' . $boundary . '--', $message);
|
||||
|
||||
$this->CakeEmail->attachments(array('fake.php' => __FILE__));
|
||||
$this->CakeEmail->send();
|
||||
|
@ -2005,7 +2091,7 @@ class CakeEmailTest extends CakeTestCase {
|
|||
}
|
||||
|
||||
protected function _checkContentTransferEncoding($message, $charset) {
|
||||
$boundary = '--alt-' . $this->CakeEmail->getBoundary();
|
||||
$boundary = '--' . $this->CakeEmail->getBoundary();
|
||||
$result['text'] = false;
|
||||
$result['html'] = false;
|
||||
$length = count($message);
|
||||
|
|
|
@ -2242,6 +2242,25 @@ class HashTest extends CakeTestCase {
|
|||
$this->assertEquals($input, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that nest() returns an empty array for invalid input instead of throwing notices.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testNestInvalid() {
|
||||
$input = array(
|
||||
array(
|
||||
'ParentCategory' => array(
|
||||
'id' => '1',
|
||||
'name' => 'Lorem ipsum dolor sit amet',
|
||||
'parent_id' => '1'
|
||||
)
|
||||
)
|
||||
);
|
||||
$result = Hash::nest($input);
|
||||
$this->assertSame(array(), $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* testMergeDiff method
|
||||
*
|
||||
|
|
|
@ -1662,7 +1662,7 @@ class ValidationTest extends CakeTestCase {
|
|||
public function testDecimalLocaleSet() {
|
||||
$this->skipIf(DS === '\\', 'The locale is not supported in Windows and affects other tests.');
|
||||
$restore = setlocale(LC_NUMERIC, 0);
|
||||
$this->skipIf(setlocale(LC_NUMERIC, 'de_DE') === false, "The German locale isn't available.");
|
||||
$this->skipIf(setlocale(LC_NUMERIC, 'da_DK') === false, "The Danish locale isn't available.");
|
||||
|
||||
$this->assertTrue(Validation::decimal(1.54), '1.54 should be considered a valid float');
|
||||
$this->assertTrue(Validation::decimal('1.54'), '"1.54" should be considered a valid float');
|
||||
|
|
38
lib/Cake/Test/Case/View/Helper/FormHelperTest.php
Executable file → Normal file
38
lib/Cake/Test/Case/View/Helper/FormHelperTest.php
Executable file → Normal file
|
@ -1294,7 +1294,7 @@ class FormHelperTest extends CakeTestCase {
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testFormSecuredFileInput() {
|
||||
public function testSecuredFileInput() {
|
||||
$this->Form->request['_Token'] = array('key' => 'testKey');
|
||||
$this->assertEquals(array(), $this->Form->fields);
|
||||
|
||||
|
@ -1311,7 +1311,7 @@ class FormHelperTest extends CakeTestCase {
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testFormSecuredMultipleSelect() {
|
||||
public function testSecuredMultipleSelect() {
|
||||
$this->Form->request['_Token'] = array('key' => 'testKey');
|
||||
$this->assertEquals(array(), $this->Form->fields);
|
||||
$options = array('1' => 'one', '2' => 'two');
|
||||
|
@ -1330,7 +1330,7 @@ class FormHelperTest extends CakeTestCase {
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testFormSecuredRadio() {
|
||||
public function testSecuredRadio() {
|
||||
$this->Form->request['_Token'] = array('key' => 'testKey');
|
||||
$this->assertEquals(array(), $this->Form->fields);
|
||||
$options = array('1' => 'option1', '2' => 'option2');
|
||||
|
@ -1345,7 +1345,7 @@ class FormHelperTest extends CakeTestCase {
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testFormSecuredAndDisabledNotAssoc() {
|
||||
public function testSecuredAndDisabledNotAssoc() {
|
||||
$this->Form->request['_Token'] = array('key' => 'testKey');
|
||||
|
||||
$this->Form->select('Model.select', array(1, 2), array('disabled'));
|
||||
|
@ -1367,7 +1367,7 @@ class FormHelperTest extends CakeTestCase {
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testFormSecuredAndDisabled() {
|
||||
public function testSecuredAndDisabled() {
|
||||
$this->Form->request['_Token'] = array('key' => 'testKey');
|
||||
|
||||
$this->Form->checkbox('Model.checkbox', array('disabled' => true));
|
||||
|
@ -1389,6 +1389,34 @@ class FormHelperTest extends CakeTestCase {
|
|||
$this->assertEquals($expected, $this->Form->fields);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that only the path + query elements of a form's URL show up in their hash.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testSecuredFormUrlIgnoresHost() {
|
||||
$this->Form->request['_Token'] = array('key' => 'testKey');
|
||||
|
||||
$expected = '0ff0c85cd70584d8fd18fa136846d22c66c21e2d%3A';
|
||||
$this->Form->create('Address', array(
|
||||
'url' => array('controller' => 'articles', 'action' => 'view', 1, '?' => array('page' => 1))
|
||||
));
|
||||
$result = $this->Form->secure();
|
||||
$this->assertContains($expected, $result);
|
||||
|
||||
$this->Form->create('Address', array('url' => 'http://localhost/articles/view/1?page=1'));
|
||||
$result = $this->Form->secure();
|
||||
$this->assertContains($expected, $result, 'Full URL should only use path and query.');
|
||||
|
||||
$this->Form->create('Address', array('url' => '/articles/view/1?page=1'));
|
||||
$result = $this->Form->secure();
|
||||
$this->assertContains($expected, $result, 'URL path + query should work.');
|
||||
|
||||
$this->Form->create('Address', array('url' => '/articles/view/1'));
|
||||
$result = $this->Form->secure();
|
||||
$this->assertNotContains($expected, $result, 'URL is different');
|
||||
}
|
||||
|
||||
/**
|
||||
* testDisableSecurityUsingForm method
|
||||
*
|
||||
|
|
|
@ -136,9 +136,19 @@ class CakeTestSuiteDispatcher {
|
|||
if (class_exists('PHPUnit_Framework_TestCase')) {
|
||||
return true;
|
||||
}
|
||||
foreach (App::path('vendors') as $vendor) {
|
||||
$phpunitPath = 'phpunit' . DS . 'phpunit';
|
||||
if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
|
||||
$composerGlobalDir[] = env('APPDATA') . DS . 'Composer' . DS . 'vendor' . DS;
|
||||
} else {
|
||||
$composerGlobalDir[] = env('HOME') . DS . '.composer' . DS . 'vendor' . DS;
|
||||
}
|
||||
$vendors = array_merge(App::path('vendors'), $composerGlobalDir);
|
||||
foreach ($vendors as $vendor) {
|
||||
$vendor = rtrim($vendor, DS);
|
||||
if (is_dir($vendor . DS . 'PHPUnit')) {
|
||||
if (is_dir($vendor . DS . $phpunitPath)) {
|
||||
ini_set('include_path', $vendor . DS . $phpunitPath . PATH_SEPARATOR . ini_get('include_path'));
|
||||
break;
|
||||
} elseif (is_dir($vendor . DS . 'PHPUnit')) {
|
||||
ini_set('include_path', $vendor . PATH_SEPARATOR . ini_get('include_path'));
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -700,7 +700,7 @@ class Debugger {
|
|||
* @deprecated Use Debugger::outputAs() and Debugger::addFormat(). Will be removed
|
||||
* in 3.0
|
||||
*/
|
||||
public function output($format = null, $strings = array()) {
|
||||
public static function output($format = null, $strings = array()) {
|
||||
$self = Debugger::getInstance();
|
||||
$data = null;
|
||||
|
||||
|
|
|
@ -1037,6 +1037,8 @@ class Hash {
|
|||
|
||||
if ($options['root']) {
|
||||
$root = $options['root'];
|
||||
} elseif (!$return) {
|
||||
return array();
|
||||
} else {
|
||||
$root = self::get($return[0], $parentKeys);
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ $pluginDot = empty($plugin) ? null : $plugin . '.';
|
|||
</p>
|
||||
<p class="error">
|
||||
<strong><?php echo __d('cake_dev', 'Error'); ?>: </strong>
|
||||
<?php echo __d('cake_dev', 'Create the class %s below in file: %s', '<em>' . h($class) . '</em>', (empty($plugin) ? APP_DIR : CakePlugin::path($plugin)) . DS . 'Controller' . DS . 'Component' . DS . h($class) . '.php'); ?>
|
||||
<?php echo __d('cake_dev', 'Create the class %s below in file: %s', '<em>' . h($class) . '</em>', (empty($plugin) ? APP_DIR . DS : CakePlugin::path($plugin)) . 'Controller' . DS . 'Component' . DS . h($class) . '.php'); ?>
|
||||
</p>
|
||||
<pre>
|
||||
<?php
|
||||
|
|
9
lib/Cake/View/Helper/FormHelper.php
Executable file → Normal file
9
lib/Cake/View/Helper/FormHelper.php
Executable file → Normal file
|
@ -466,7 +466,14 @@ class FormHelper extends AppHelper {
|
|||
$this->setEntity($model, true);
|
||||
$this->_introspectModel($model, 'fields');
|
||||
}
|
||||
|
||||
$this->_lastAction = $action;
|
||||
if (strpos($action, '://')) {
|
||||
$query = parse_url($action, PHP_URL_QUERY);
|
||||
$query = $query ? '?' . $query : '';
|
||||
$this->_lastAction = parse_url($action, PHP_URL_PATH) . $query;
|
||||
}
|
||||
|
||||
return $this->Html->useTag('form', $action, $htmlAttributes) . $append;
|
||||
}
|
||||
|
||||
|
@ -1792,7 +1799,7 @@ class FormHelper extends AppHelper {
|
|||
* @link http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#FormHelper::postLink
|
||||
*/
|
||||
public function postLink($title, $url = null, $options = array(), $confirmMessage = false) {
|
||||
$options += array('inline' => true, 'block' => null);
|
||||
$options = (array)$options + array('inline' => true, 'block' => null);
|
||||
if (!$options['inline'] && empty($options['block'])) {
|
||||
$options['block'] = __FUNCTION__;
|
||||
}
|
||||
|
|
|
@ -597,8 +597,7 @@ class View extends Object {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns the contents of the given View variable or a block.
|
||||
* Blocks are checked before view variables.
|
||||
* Returns the contents of the given View variable.
|
||||
*
|
||||
* @param string $var The view var you want the contents of.
|
||||
* @param mixed $default The default/fallback content of $var.
|
||||
|
|
Loading…
Reference in a new issue