Browse Source

Merge branch 'develop' of github.com:laravel/laravel into develop

Taylor Otwell 12 years ago
parent
commit
78243fedba

+ 19 - 0
application/language/ru/pagination.php

@@ -0,0 +1,19 @@
+<?php
+
+return array(
+
+	/*
+	|--------------------------------------------------------------------------
+	| Pagination Language Lines
+	|--------------------------------------------------------------------------
+	|
+	| The following language lines are used by the paginator library to build
+	| the pagination links. You're free to change them to anything you want.
+	| If you come up with something more exciting, let us know.
+	|
+	*/
+
+	'previous' => '← Назад',
+	'next'     => 'Вперёд →',
+
+);

+ 99 - 0
application/language/ru/validation.php

@@ -0,0 +1,99 @@
+<?php
+
+return array(
+
+	/*
+	|--------------------------------------------------------------------------
+	| Validation Language Lines
+	|--------------------------------------------------------------------------
+	|
+	| The following language lines contain the default error messages used
+	| by the validator class. Some of the rules contain multiple versions,
+	| such as the size (max, min, between) rules. These versions are used
+	| for different input types such as strings and files.
+	|
+	| These language lines may be easily changed to provide custom error
+	| messages in your application. Error messages for custom validation
+	| rules may also be added to this file.
+	|
+	*/
+
+	"accepted"       => "Вы должны принять :attribute.",
+	"active_url"     => "Поле :attribute должно быть полным URL.",
+	"after"          => "Поле :attribute должно быть датой после :date.",
+	"alpha"          => "Поле :attribute может содержать только буквы.",
+	"alpha_dash"     => "Поле :attribute может содержать только буквы, цифры и тире.",
+	"alpha_num"      => "Поле :attribute может содержать только буквы и цифры.",
+	"before"         => "Поле :attribute должно быть датой перед :date.",
+	"between"        => array(
+		"numeric" => "Поле :attribute должно быть между :min и :max.",
+		"file"    => "Поле :attribute должно быть от :min до :max Килобайт.",
+		"string"  => "Поле :attribute должно быть от :min до :max символов.",
+	),
+	"confirmed"      => "Поле :attribute не совпадает с подтверждением.",
+	"different"      => "Поля :attribute и :other должны различаться.",
+	"email"          => "Поле :attribute имеет неверный формат.",
+	"exists"         => "Выбранное значение для :attribute уже существует.",
+	"image"          => "Поле :attribute должно быть картинкой.",
+	"in"             => "Выбранное значение для :attribute не верно.",
+	"integer"        => "Поле :attribute должно быть целым числом.",
+	"ip"             => "Поле :attribute должно быть полным IP-адресом.",
+	"match"          => "Поле :attribute имеет неверный формат.",
+	"max"            => array(
+		"numeric" => "Поле :attribute должно быть меньше :max.",
+		"file"    => "Поле :attribute должно быть меньше :max Килобайт.",
+		"string"  => "Поле :attribute должно быть короче :max символов.",
+	),
+	"mimes"          => "Поле :attribute должно быть файлом одного из типов: :values.",
+	"min"            => array(
+		"numeric" => "Поле :attribute должно быть не менее :min.",
+		"file"    => "Поле :attribute должно быть не менее :min Килобайт.",
+		"string"  => "Поле :attribute должно быть не короче :min символов.",
+	),
+	"not_in"         => "Выбранное значение для :attribute не верно.",
+	"numeric"        => "Поле :attribute должно быть числом.",
+	"required"       => "Поле :attribute обязательно для заполнения.",
+	"same"           => "Значение :attribute должно совпадать с :other.",
+	"size"           => array(
+		"numeric" => "Поле :attribute должно быть :size.",
+		"file"    => "Поле :attribute должно быть :size Килобайт.",
+		"string"  => "Поле :attribute должно быть длиной :size символов.",
+	),
+	"unique"         => "Такое значение поля :attribute уже существует.",
+	"url"            => "Поле :attribute имеет неверный формат.",
+
+	/*
+	|--------------------------------------------------------------------------
+	| Custom Validation Language Lines
+	|--------------------------------------------------------------------------
+	|
+	| Here you may specify custom validation messages for attributes using the
+	| convention "attribute_rule" to name the lines. This helps keep your
+	| custom validation clean and tidy.
+	|
+	| So, say you want to use a custom validation message when validating that
+	| the "email" attribute is unique. Just add "email_unique" to this array
+	| with your custom message. The Validator will handle the rest!
+	|
+	*/
+
+	'custom' => array(),
+
+	/*
+	|--------------------------------------------------------------------------
+	| Validation Attributes
+	|--------------------------------------------------------------------------
+	|
+	| The following language lines are used to swap attribute place-holders
+	| with something more reader friendly such as "E-Mail Address" instead
+	| of "email". Your users will thank you.
+	|
+	| The Validator class will automatically search this array of lines it
+	| is attempting to replace the :attribute place-holder in messages.
+	| It's pretty slick. We think you'll like it.
+	|
+	*/
+
+	'attributes' => array(),
+
+);

+ 105 - 83
application/views/error/404.php

@@ -1,92 +1,113 @@
 <!doctype html>
-<html>
-	<head>
-		<meta charset="utf-8">
-
-		<title>Error 404 - Not Found</title>
-
-		<style>
-			@import url(http://fonts.googleapis.com/css?family=Ubuntu);
-
-			body {
-				background: #eee;
-				color: #6d6d6d;
-				font: normal normal normal 14px/1.253 Ubuntu, sans-serif;
-				margin: 0 0 25px 0;
-				min-width: 800px;
-				padding: 0;
-			}
-
-			#main {
-				background-clip: padding-box;
-				background-color: #fff;
-				border:1px solid #ccc;
-				border-radius: 5px;
-				box-shadow: 0 0 10px #cdcdcd;
-				margin: 25px auto 0;
-				padding: 30px;
-				width: 700px;
-				position: relative;
-			}
-
-			#main h1 {
-				font-family: 'Ubuntu';
-				font-size: 38px;
-				letter-spacing: 2px;
-				margin: 0 0 10px 0;
-				padding: 0;
-			}
-
-			#main h2 {
-				color: #999;
-				font-size: 18px;
-				letter-spacing: 3px;
-				margin: 0 0 25px 0;
-				padding: 0 0 0 0;
-			}
-
-			#main h3 {
-				color: #999;
-				margin-top: 24px;
-				padding: 0 0 0 0;
-			}
-
-			#main h3 {
-				font-size: 18px;
-			}
-
-			#main p {
-				line-height: 25px;
-				margin: 10px 0;
-			}
-
-			#main pre {
-				background-color: #333;
-				border-left: 1px solid #d8d8d8;
-				border-top: 1px solid #d8d8d8;
-				border-radius: 5px;
-				color: #eee;
-				padding: 10px;
-			}
-
-			#main ul {
-				margin: 10px 0;
-				padding: 0 30px;
-			}
-
-			#main li {
-				margin: 5px 0;
-			}
-		</style>
-	</head>
-	<body>
-		<div id="main">
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+	<title>Error 404 - Not Found</title>
+	<meta name="viewport" content="width=device-width">
+	<style type="text/css">
+		@import url(http://fonts.googleapis.com/css?family=Droid+Sans);
+
+		article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; }
+		audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
+		audio:not([controls]) { display: none; }
+		[hidden] { display: none; }
+		html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
+		html, button, input, select, textarea { font-family: sans-serif; color: #222; }
+		body { margin: 0; font-size: 1em; line-height: 1.4; }
+		::-moz-selection { background: #E37B52; color: #fff; text-shadow: none; }
+		::selection { background: #E37B52; color: #fff; text-shadow: none; }
+		a { color: #00e; }
+		a:visited { color: #551a8b; }
+		a:hover { color: #06e; }
+		a:focus { outline: thin dotted; }
+		a:hover, a:active { outline: 0; }
+		abbr[title] { border-bottom: 1px dotted; }
+		b, strong { font-weight: bold; }
+		blockquote { margin: 1em 40px; }
+		dfn { font-style: italic; }
+		hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
+		ins { background: #ff9; color: #000; text-decoration: none; }
+		mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
+		pre, code, kbd, samp { font-family: monospace, serif; _font-family: 'courier new', monospace; font-size: 1em; }
+		pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
+		q { quotes: none; }
+		q:before, q:after { content: ""; content: none; }
+		small { font-size: 85%; }
+		sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
+		sup { top: -0.5em; }
+		sub { bottom: -0.25em; }
+		ul, ol { margin: 1em 0; padding: 0 0 0 40px; }
+		dd { margin: 0 0 0 40px; }
+		nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; }
+		img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
+		svg:not(:root) { overflow: hidden; }
+		figure { margin: 0; }
+		form { margin: 0; }
+		fieldset { border: 0; margin: 0; padding: 0; }
+		label { cursor: pointer; }
+		legend { border: 0; *margin-left: -7px; padding: 0; white-space: normal; }
+		button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; }
+		button, input { line-height: normal; }
+		button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; *overflow: visible; }
+		button[disabled], input[disabled] { cursor: default; }
+		input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; *width: 13px; *height: 13px; }
+		input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
+		input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; }
+		button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
+		textarea { overflow: auto; vertical-align: top; resize: vertical; }
+		input:valid, textarea:valid {  }
+		input:invalid, textarea:invalid { background-color: #f0dddd; }
+		table { border-collapse: collapse; border-spacing: 0; }
+		td { vertical-align: top; }
+
+		body
+		{
+			font-family:'Droid Sans', sans-serif;
+			font-size:10pt;
+			color:#555;
+			line-height: 25px;
+		}
+
+		.wrapper
+		{
+			width:760px;
+			margin:0 auto 5em auto;
+		}
+
+		.main
+		{
+			overflow:hidden;
+		}
+
+		.error-spacer
+		{
+			height:4em;
+		}
+
+		a, a:visited
+		{
+			color:#2972A3;
+		}
+
+		a:hover
+		{
+			color:#72ADD4;
+		}
+	</style>
+</head>
+<body onload="prettyPrint()">
+	<div class="wrapper">
+		<div class="error-spacer"></div>
+		<div role="main" class="main">
 			<?php $messages = array('We need a map.', 'I think we\'re lost.', 'We took a wrong turn.'); ?>
 
 			<h1><?php echo $messages[mt_rand(0, 2)]; ?></h1>
 
 			<h2>Server Error: 404 (Not Found)</h2>
 
+			<hr>
+
 			<h3>What does this mean?</h3>
 
 			<p>
@@ -99,5 +120,6 @@
 				Perhaps you would like to go to our <?php echo HTML::link('/', 'home page'); ?>?
 			</p>
 		</div>
-	</body>
+	</div>
+</body>
 </html>

+ 105 - 83
application/views/error/500.php

@@ -1,92 +1,113 @@
 <!doctype html>
-<html>
-	<head>
-		<meta charset="utf-8">
-
-		<title>Error 500 - Internal Server Error</title>
-
-		<style>
-			@import url(http://fonts.googleapis.com/css?family=Ubuntu);
-
-			body {
-				background: #eee;
-				color: #6d6d6d;
-				font: normal normal normal 14px/1.253 Ubuntu, sans-serif;
-				margin: 0 0 25px 0;
-				min-width: 800px;
-				padding: 0;
-			}
-
-			#main {
-				background-clip: padding-box;
-				background-color: #fff;
-				border:1px solid #ccc;
-				border-radius: 5px;
-				box-shadow: 0 0 10px #cdcdcd;
-				margin: 25px auto 0;
-				padding: 30px;
-				width: 700px;
-				position: relative;
-			}
-
-			#main h1 {
-				font-family: 'Ubuntu';
-				font-size: 38px;
-				letter-spacing: 2px;
-				margin: 0 0 10px 0;
-				padding: 0;
-			}
-
-			#main h2 {
-				color: #999;
-				font-size: 18px;
-				letter-spacing: 3px;
-				margin: 0 0 25px 0;
-				padding: 0 0 0 0;
-			}
-
-			#main h3 {
-				color: #999;
-				margin-top: 24px;
-				padding: 0 0 0 0;
-			}
-
-			#main h3 {
-				font-size: 18px;
-			}
-
-			#main p {
-				line-height: 25px;
-				margin: 10px 0;
-			}
-
-			#main pre {
-				background-color: #333;
-				border-left: 1px solid #d8d8d8;
-				border-top: 1px solid #d8d8d8;
-				border-radius: 5px;
-				color: #eee;
-				padding: 10px;
-			}
-
-			#main ul {
-				margin: 10px 0;
-				padding: 0 30px;
-			}
-
-			#main li {
-				margin: 5px 0;
-			}
-		</style>
-	</head>
-	<body>
-		<div id="main">
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+	<title>Error 500 - Internal Server Error</title>
+	<meta name="viewport" content="width=device-width">
+	<style type="text/css">
+		@import url(http://fonts.googleapis.com/css?family=Droid+Sans);
+
+		article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; }
+		audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
+		audio:not([controls]) { display: none; }
+		[hidden] { display: none; }
+		html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
+		html, button, input, select, textarea { font-family: sans-serif; color: #222; }
+		body { margin: 0; font-size: 1em; line-height: 1.4; }
+		::-moz-selection { background: #E37B52; color: #fff; text-shadow: none; }
+		::selection { background: #E37B52; color: #fff; text-shadow: none; }
+		a { color: #00e; }
+		a:visited { color: #551a8b; }
+		a:hover { color: #06e; }
+		a:focus { outline: thin dotted; }
+		a:hover, a:active { outline: 0; }
+		abbr[title] { border-bottom: 1px dotted; }
+		b, strong { font-weight: bold; }
+		blockquote { margin: 1em 40px; }
+		dfn { font-style: italic; }
+		hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
+		ins { background: #ff9; color: #000; text-decoration: none; }
+		mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
+		pre, code, kbd, samp { font-family: monospace, serif; _font-family: 'courier new', monospace; font-size: 1em; }
+		pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
+		q { quotes: none; }
+		q:before, q:after { content: ""; content: none; }
+		small { font-size: 85%; }
+		sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
+		sup { top: -0.5em; }
+		sub { bottom: -0.25em; }
+		ul, ol { margin: 1em 0; padding: 0 0 0 40px; }
+		dd { margin: 0 0 0 40px; }
+		nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; }
+		img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
+		svg:not(:root) { overflow: hidden; }
+		figure { margin: 0; }
+		form { margin: 0; }
+		fieldset { border: 0; margin: 0; padding: 0; }
+		label { cursor: pointer; }
+		legend { border: 0; *margin-left: -7px; padding: 0; white-space: normal; }
+		button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; }
+		button, input { line-height: normal; }
+		button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; *overflow: visible; }
+		button[disabled], input[disabled] { cursor: default; }
+		input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; *width: 13px; *height: 13px; }
+		input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
+		input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; }
+		button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
+		textarea { overflow: auto; vertical-align: top; resize: vertical; }
+		input:valid, textarea:valid {  }
+		input:invalid, textarea:invalid { background-color: #f0dddd; }
+		table { border-collapse: collapse; border-spacing: 0; }
+		td { vertical-align: top; }
+
+		body
+		{
+			font-family:'Droid Sans', sans-serif;
+			font-size:10pt;
+			color:#555;
+			line-height: 25px;
+		}
+
+		.wrapper
+		{
+			width:760px;
+			margin:0 auto 5em auto;
+		}
+
+		.main
+		{
+			overflow:hidden;
+		}
+
+		.error-spacer
+		{
+			height:4em;
+		}
+
+		a, a:visited
+		{
+			color:#2972A3;
+		}
+
+		a:hover
+		{
+			color:#72ADD4;
+		}
+	</style>
+</head>
+<body onload="prettyPrint()">
+	<div class="wrapper">
+		<div class="error-spacer"></div>
+		<div role="main" class="main">
 			<?php $messages = array('Ouch.', 'Oh no!', 'Whoops!'); ?>
 
 			<h1><?php echo $messages[mt_rand(0, 2)]; ?></h1>
 
 			<h2>Server Error: 500 (Internal Server Error)</h2>
 
+			<hr>
+
 			<h3>What does this mean?</h3>
 
 			<p>
@@ -99,5 +120,6 @@
 				Perhaps you would like to go to our <?php echo HTML::link('/', 'home page'); ?>?
 			</p>
 		</div>
-	</body>
+	</div>
+</body>
 </html>

+ 5 - 5
laravel/cache/drivers/memcached.php

@@ -1,11 +1,11 @@
-<?php namespace Laravel\Cache\Drivers; use Memcache;
+<?php namespace Laravel\Cache\Drivers;
 
 class Memcached extends Driver {
 
 	/**
 	 * The Memcache instance.
 	 *
-	 * @var Memcache
+	 * @var Memcached
 	 */
 	protected $memcache;
 
@@ -19,10 +19,10 @@ class Memcached extends Driver {
 	/**
 	 * Create a new Memcached cache driver instance.
 	 *
-	 * @param  Memcache  $memcache
+	 * @param  Memcached  $memcache
 	 * @return void
 	 */
-	public function __construct(Memcache $memcache, $key)
+	public function __construct(\Memcached $memcache, $key)
 	{
 		$this->key = $key;
 		$this->memcache = $memcache;
@@ -68,7 +68,7 @@ class Memcached extends Driver {
 	 */
 	public function put($key, $value, $minutes)
 	{
-		$this->memcache->set($this->key.$key, $value, 0, $minutes * 60);
+		$this->memcache->set($this->key.$key, $value, $minutes * 60);
 	}
 
 	/**

+ 2 - 0
laravel/documentation/changes.md

@@ -33,6 +33,8 @@
 - [Added `unless` structure to Blade template engine](/docs/views/templating#blade-unless).
 - [Added Blade comments](/docs/views/templating#blade-comments).
 - [Added simpler environment management](/docs/install#environments).
+- Added `View::exists` method.
+- Use [Memcached](http://php.net/manual/en/book.memcached.php) API instead of older [Memcache](http://php.net/manual/en/book.memcache.php) API.
 - Added support for bundles outside of the bundle directory.
 - Added support for DateTime database query bindings.
 - Migrated to the Symfony HttpFoundation component for core request / response handling.

+ 4 - 0
laravel/documentation/views/home.md

@@ -39,6 +39,10 @@ All views are stored within the **application/views** directory and use the PHP
 		return View::make('home.index');
 	});
 
+#### Determining if a view exists:
+
+	$exists = View::exists('home.index');
+
 Sometimes you will need a little more control over the response sent to the browser. For example, you may need to set a custom header on the response, or change the HTTP status code. Here's how:
 
 #### Returning a custom response:

+ 3 - 3
laravel/memcached.php

@@ -5,7 +5,7 @@ class Memcached {
 	/**
 	 * The Memcached connection instance.
 	 *
-	 * @var Memcache
+	 * @var Memcached
 	 */
 	protected static $connection;
 
@@ -40,11 +40,11 @@ class Memcached {
 	 */
 	protected static function connect($servers)
 	{
-		$memcache = new \Memcache;
+		$memcache = new \Memcached;
 
 		foreach ($servers as $server)
 		{
-			$memcache->addServer($server['host'], $server['port'], true, $server['weight']);
+			$memcache->addServer($server['host'], $server['port'], $server['weight']);
 		}
 
 		if ($memcache->getVersion() === false)

+ 21 - 4
laravel/view.php

@@ -110,12 +110,13 @@ class View implements ArrayAccess {
 	}
 
 	/**
-	 * Get the path to a given view on disk.
+	 * Determine if the given view exists.
 	 *
-	 * @param  string  $view
-	 * @return string
+	 * @param  string       $view
+	 * @param  boolean      $return_path
+	 * @return string|bool
 	 */
-	protected function path($view)
+	public static function exists($view, $return_path = false)
 	{
 		list($bundle, $view) = Bundle::parse($view);
 
@@ -127,6 +128,22 @@ class View implements ArrayAccess {
 		$path = Event::first(static::loader, array($bundle, $view));
 
 		if ( ! is_null($path))
+		{
+			return $return_path ? $path : true;
+		}
+
+		return false;
+	}
+
+	/**
+	 * Get the path to a given view on disk.
+	 *
+	 * @param  string  $view
+	 * @return string
+	 */
+	protected function path($view)
+	{
+		if ($path = $this->exists($view,true))
 		{
 			return $path;
 		}