Laravel по-русски
Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Функция получения данных $_POST и $_FILES и отправка сообщения указаны в HomeController@post.
Переделайте. Поместите код, например, в CallBack@postCallback.
В routes.php впишите:
Route::post('callback', 'CallBack@postCallback');А запрос с помощью post-ajax отправляйте на адрес: http://ваш-сайт.ру/callback
dima9595, Вам нужно где-то в отдельно блоке указать, есть ли posts? Или если есть, то вывести их, а если нет, то вывести "Постов нет"?
Если так, то в blade можно сделать так:
@forelse( $posts as $post )
{{-- Выводим тут данные, если есть --}}
@empty
<p>Постов нет!</p>
@endforelseПочему неправильно? Если запрос правильно составляется, и данные правильно вытягиваются, значит правильно. ![]()
Да, я знаю, что правило active_url использует функцию checkdnsrr. Поэтому именно её я и использовал.
У меня ссылка на сайт пишется в базу, поэтому, если предварительно преобразовать её, то в базу запишется преобразованный вариант, хотя конечно можно и дополнительную переменную создать для сохранения исходного значения.
Дмитрий пишет:библиотеку, которая преобразует IDN
Wide, спасибо. Только к сожалению не на всех хостингах установлено это дополнение PECL.
Вы из базы хотите точно в таком формате получить или вытащить из базы и подставить в ответ? Если подставить, то так можно:
# Получаем все имена из базы
$names = DB::table('таблица')->lists('извлекаемое поле');
# Возвращаем ответ
return
Response::json($names);Так есть же активная загрузка отношений:
Message::with('название отношения')->...И не будет кучи запросов.
Нашёл решение. Пишу, если кому-то понадобится.
Значит, я пытался проверить корректность введённого адреса сайта с помощью active_url. Но IDN (интернациональные доменные имена), а в частности домены в зоне ".рф" не проверялись. Решил проблему следующим образом:
Нашёл на GITHUB библиотеку, которая преобразует IDN. Вписал в composer.json следующую строку в раздел "require":
"mabrahamde/idna-converter": "dev-master"
Затем выполнил в консоли такую команду: composer update
А потом в классе, расширяющем стандартный Validator переопределил метод validateActiveUrl таким образом:
public function validateActiveUrl($attribute, $value){
# Конвертируем URL в ASCII
$idn = new idna_convert(['idn_version'=>2008]);
return
parent::validateActiveUrl( $attribute, $idn->encode($value) );
}P.S. Класс, расширяющий Validator у меня лежит в папке app/extensions, которую я создал ранее.
Здравствуйте. Подскажите пожалуйста, как можно провести проверку URL доменов, находящихся в зоне РФ?
Здравствуйте. Подскажите пожалуйста мне решение такой, казалось бы простейшей проблемы.
Есть постраничная навигация, всё работает отлично, но если ввести значение в адресной строке для "page" некорректное - данные не выводятся. Сама постраничная навигация выводится, а данные - нет.
Например, у нас всего две страницы, а если ввести ?page=25, то возникает вышеописанная ситуация.
Как решить проблему?
Да, есть. Я вот отсюда скачивал: https://github.com/caouecs/Laravel4-lang/
А зачем столько лишнего?
Можно же так:
# Получаем данные для входа
$data=Input::only('email', 'password');
# Если успешно вошёл
if( Auth::attempt( $data, true ) )
# Тут можно перенаправить в кабинет или на главнуюА проверять, авторизован ли так:
if( Auth::check() )
# АвторизованВот я заморочился с этой проверкой. Нужно было сразу проверить существующие правила проверки. Оказывается никаких расширений для класса Validator не нужно. Правило exists отлично справляется и с массивами. Даже с многомерными.
Пишу на всякий случай, вдруг кто-то с таким же столкнётся...
P.S. Версия Laravel 4.2
Для сведения:
На адрес, который я указал, перенаправляет нас с этого адреса: http://test.shop-my.ru/tinymce3/jscript … index.html
В index.php тоже загляните.
Когда скрипт в public - laravel ничего не порушит. Тут нужно просмотреть пути в Вашем загрузчике картинок и изменить где нужно.
Я посмотрел, там по адресу "http://test.shop-my.ru/tinymce3/jscript … index.html"
Все пути указаны относительно. Измените эти пути на абсолютные, т.е. от корня папки public укажите, без "../".
Я тоже кстати заметил, что на некоторых страницах такую ошибку выдаёт. Вот тут, например: https://laravel.ru/forum/viewtopic.php?id=169
Проблема решена. Оказывается не меня одного такая задумка беспокоила
. На одном америкосском форуме нашел ответ.
Рассказываю, как сделал - вдруг кому-то понадобится.
Итак, мы хотим, чтобы полученные от пользователя в виде массива значения выделенных checkbox проверились на наличие их в базе данных. Для этого нам нужно расширить класс Validator, добавив свои правила проверки. Вот код класса, расширяющего функционал стандартного Validator'а:
class CustomValidator extends Illuminate\Validation\Validator {
public function validateEach($attribute, $value, $parameters)
{
// Transform the each rule
// For example, `each:exists,users,name` becomes `exists:users,name`
$ruleName = array_shift($parameters);
$rule = $ruleName . (count($parameters) > 0 ? ':' . implode(',', $parameters) : '');
foreach ($value as $arrayKey => $arrayValue)
{
$this->validate($attribute . '.' . $arrayKey, $rule);
}
// Always return true, since the errors occur for individual elements.
return true;
}
protected function getAttribute($attribute)
{
// Get the second to last segment in singular form for arrays.
// For example, `group.names.0` becomes `name`.
if (str_contains($attribute, '.'))
{
$segments = explode('.', $attribute);
$attribute = str_singular($segments[count($segments) - 2]);
}
return parent::getAttribute($attribute);
}
}Хорошо, код у нас есть. Теперь его нужно куда-то поместить. Я для этого создал в папке app/ папку extensions/ и поместил туда файл (название файла CustomValidator.php) с кодом нашего проверяльщика.
Затем в файл composer.json в блок "autoload" -> "classmap" добавил такую строку:
"app/extensions"
Затем в терминале (консоли) выполнил следующую команду:
composer dump-autoload
чтобы наш класс проверяльщика зарегистрировался.
Затем в файл app/start/global.php поместил такой код:
/**
*
* @var Регистрируем расширение валидатора
*
*/
Validator::resolver(function($translator, $data, $rules, $messages)
{
return new CustomValidator($translator, $data, $rules, $messages);
});Вот и всё. Глаза бояться, а руки делают
.
И самое интересное - как пользоваться. Нужно для проверки создать такое правило:
"required|array|each:exists,имя_таблицы,имя_поля"
Т.е. работаем практически так же, как и с обычным правилом exists, только в данном случае после exists не ставим двоеточие, а через запятую перечисляем, в какой таблице и в каком проверить на наличие.
Вы попробовали так подключить?
{{ HTML::script('тут путь к файлу/tinymce.min.js') }}И папка с tinymce должна лежать в папке public, так как редактор должен быть доступен из Web.
Как Вы подключили TinyMCE? Если указали относительные пути, то переделайте. Сделайте так, например:
{{-- Подключаем редактор tinymce --}}
{{ HTML::script('тут путь к файлу/tinymce.min.js') }}Приведите пример (в Вашем понимании):
1) правильно
2) не правильно
Не понял Вас.
Я просто хотел как-нибудь с помощью класса Validator сделать, чтобы было примерно так:
# Правила проверки
$rules = array(
'categories' => 'array|exists:categories,id'
);
# Это выделенные категории
$input = array('
'categories' => array(1,2,3,4,5,6,7)
');Т.е. если мы указали "array", то все значения из массива проверились на наличие в таблице categories.
Здравствуйте. Помогите мне советом, пожалуйста.
Есть в базе список категорий. Эти категории выводятся пользователю в виде списка checkbox-ов. Пользователь может выбрать несколько категорий и его выбор запишется в БД. С этим всё просто.
Возник вопрос: а если злоумышленник подменит значения этих checkbox и в базу запишутся несуществующие значения? Из этого вопроса вытекает следующий:
Как можно провести проверку (валидацию) массива выбранных с помощью checkbox значений на наличие их в базе?
Здравствуйте. И снова пишу вам, уважаемые эксперты Laravel
. Дело такое:
- Есть фильтр (конечно это урезанный вариант, в таком виде его я использовать не буду):
Route::filter('test', function()
{
return Redirect::to('/');
});И есть маршрут:
Route::get('test', array(
'after' => 'test',
function(){
return 'TEST';
}
));Так вот, теперь вопрос: почему это не работает?
Т.е. если заместо "after" там вписать "before" - то всё правильно отрабатывает и меня перенаправляет на главную страницу сайта. А в таком виде лишь выводится "TEST", никакого перенаправления не происходит.
Пробовал в интернете поискать, каким образом фильтры работают, ничего путного не нашёл. Думаю это в особенностях after-фильтра что-то...
Agel_Nash, огромное Вам спасибо за ответ! Я задал вопрос, а потом дошло вроде, что нужно сделать так:
Можно только на один маршрут login подвесить фильтрацию after и если пользователь заблокирован - то разавторизовывать его.
Оказывается правильно мыслю
.
Большое спасибо Вам обоим, Agel_Nash, Proger_XP ещё раз!
Proger_XP, Agel_Nash, большое Вам спасибо за ответы. Ответ Proger_XP понятен предельно, а Agel_Nash, не могли бы Вы показать пример? Простите, если надоедаю ![]()
Здравствуйте. Пожалуйста, подскажите мне решение такого вопроса:
- Есть авторизация на сайте, написанном на Laravel. Работает нормально, но, мне нужно сделать проверку на "заблокирован ли пользователь". Т.е. в базе с пользователями есть поле "blocked" и если в нём содержится единица, то при авторизации вывести пользователю: "Ваш аккаунт блокирован".
Я знаю, можно сделать примерно так:
$data = [
'email' => Input::get('email'),
'password' => Input::get('password'),
'blocked' => 0
];
# Вход успешно произведён
if(Auth::attempt($data))
return Redirect::intended();И, если email и пароль совпадут и в поле "blocked" содержится ноль, то пользователь успешно будет авторизован. Если что-либо не совпадёт, то Auth::attempt() вернёт "false". В этом-то и проблема, ведь Auth::attempt() возвращает только true или только false, и невозможно определить, запись ли блокирована или логин и пароль не совпали.
Думал повесить эту проверку на событие auth.login или auth.attempt, но не знаю, насколько это правильно.
В общем, подскажите самый правильный путь решения проблемы, как лучше это проверять?
Большое всем спасибо!