Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#51 Re: Laravel 4 » route::post для любой страницы » 01.03.2015 16:37:29

Функция получения данных $_POST и $_FILES и отправка сообщения указаны в HomeController@post.

Переделайте. Поместите код, например, в CallBack@postCallback.
В routes.php впишите:

Route::post('callback', 'CallBack@postCallback');

А запрос с помощью post-ajax отправляйте на адрес: http://ваш-сайт.ру/callback

#52 Re: Laravel 4 » Проверка существования постов в виде » 25.02.2015 11:59:06

dima9595, Вам нужно где-то в отдельно блоке указать, есть ли posts? Или если есть, то вывести их, а если нет, то вывести "Постов нет"?
Если так, то в blade можно сделать так:

@forelse( $posts as $post )
    {{-- Выводим тут данные, если есть --}}
@empty
    <p>Постов нет!</p>
@endforelse

#53 Re: Laravel 4 » Eloquent: Пользователи, Сообщения, Лайки » 22.02.2015 07:07:30

Почему неправильно? Если запрос правильно составляется, и данные правильно вытягиваются, значит правильно. smile

#54 Re: Laravel 4 » Validation домены в зоне рф. » 19.02.2015 17:04:04

Да, я знаю, что правило active_url использует функцию checkdnsrr. Поэтому именно её я и использовал.
У меня ссылка на сайт пишется в базу, поэтому, если предварительно преобразовать её, то в базу запишется преобразованный вариант, хотя конечно можно и дополнительную переменную создать для сохранения исходного значения.

#55 Re: Laravel 4 » Validation домены в зоне рф. » 19.02.2015 15:36:34

Wide пишет:
Дмитрий пишет:

библиотеку, которая преобразует IDN

http://php.net/manual/ru/ref.intl.idn.php

Wide, спасибо. Только к сожалению не на всех хостингах установлено это дополнение PECL.

#56 Re: Laravel 4 » Json данные » 19.02.2015 10:56:47

Вы из базы хотите точно в таком формате получить или вытащить из базы и подставить в ответ? Если подставить, то так можно:

# Получаем все имена из базы
$names = DB::table('таблица')->lists('извлекаемое поле');

# Возвращаем ответ
return 
    Response::json($names);

#57 Re: Laravel 4 » Eloquent: Пользователи, Сообщения, Лайки » 19.02.2015 06:33:37

Так есть же активная загрузка отношений:

Message::with('название отношения')->...

И не будет кучи запросов.

#58 Re: Laravel 4 » Validation домены в зоне рф. » 19.02.2015 06:29:21

Нашёл решение. Пишу, если кому-то понадобится.
Значит, я пытался проверить корректность введённого адреса сайта с помощью 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, которую я создал ранее.

#59 Laravel 4 » Validation домены в зоне рф. » 18.02.2015 09:31:42

Дмитрий
Ответов: 7

Здравствуйте. Подскажите пожалуйста, как можно провести проверку URL доменов, находящихся в зоне РФ?

#60 Laravel 4 » Как запретить вводить недопустимые значения страниц? Paginator. » 14.02.2015 06:28:40

Дмитрий
Ответов: 2

Здравствуйте. Подскажите пожалуйста мне решение такой, казалось бы простейшей проблемы.
Есть постраничная навигация, всё работает отлично, но если ввести значение в адресной строке для "page" некорректное - данные не выводятся.  Сама постраничная навигация выводится, а данные - нет.
Например, у нас всего две страницы, а если ввести ?page=25, то возникает вышеописанная ситуация.
Как решить проблему?

#62 Re: Laravel 4 » при return Redirect::to('/') не сохраняются переменные сессии » 05.02.2015 08:31:30

А зачем столько лишнего?
Можно же так:

# Получаем данные для входа
$data=Input::only('email', 'password');

# Если успешно вошёл
if( Auth::attempt( $data, true ) )
    # Тут можно перенаправить в кабинет или на главную

А проверять, авторизован ли так:

if( Auth::check() )
    # Авторизован

#63 Re: Laravel 4 » Проверка массива checkbox на наличие в БД. » 03.02.2015 10:02:14

Вот я заморочился с этой проверкой. Нужно было сразу проверить существующие правила проверки. Оказывается никаких расширений для класса Validator не нужно. Правило exists отлично справляется и с массивами. Даже с многомерными.
Пишу на всякий случай, вдруг кто-то с таким же столкнётся...
P.S. Версия Laravel 4.2

#64 Re: Laravel 4 » TinyMCE и Laravel » 02.02.2015 06:39:17

Для сведения:
На адрес, который я указал, перенаправляет нас с этого адреса: http://test.shop-my.ru/tinymce3/jscript … index.html
В index.php тоже загляните.

#65 Re: Laravel 4 » TinyMCE и Laravel » 02.02.2015 06:38:07

Когда скрипт в public - laravel ничего не порушит. Тут нужно просмотреть пути в Вашем загрузчике картинок и изменить где нужно.
Я посмотрел, там по адресу "http://test.shop-my.ru/tinymce3/jscript … index.html"
Все пути указаны относительно. Измените эти пути на абсолютные, т.е. от корня папки public укажите, без "../".

#66 Re: Прочее » 502 Bad Gateway на форуме » 01.02.2015 09:48:58

Я тоже кстати заметил, что на некоторых страницах такую ошибку выдаёт. Вот тут, например: https://laravel.ru/forum/viewtopic.php?id=169

#67 Re: Laravel 4 » Проверка массива checkbox на наличие в БД. » 01.02.2015 09:08:22

Проблема решена. Оказывается не меня одного такая задумка беспокоила smile. На одном америкосском форуме нашел ответ.
Рассказываю, как сделал - вдруг кому-то понадобится.
Итак, мы хотим, чтобы полученные от пользователя в виде массива значения выделенных 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);
});

Вот и всё. Глаза бояться, а руки делают smile.
И самое интересное - как пользоваться. Нужно для проверки создать такое правило:
"required|array|each:exists,имя_таблицы,имя_поля"
Т.е. работаем практически так же, как и с обычным правилом exists, только в данном случае после exists не ставим двоеточие, а через запятую перечисляем, в какой таблице и в каком проверить на наличие.

#68 Re: Laravel 4 » TinyMCE и Laravel » 01.02.2015 07:11:13

Вы попробовали так подключить?

{{ HTML::script('тут путь к файлу/tinymce.min.js') }}

И папка с tinymce должна лежать в папке public, так как редактор должен быть доступен из Web.

#69 Re: Laravel 4 » TinyMCE и Laravel » 31.01.2015 14:05:52

Как Вы подключили TinyMCE? Если указали относительные пути, то переделайте. Сделайте так, например:

{{-- Подключаем редактор tinymce --}}
        {{ HTML::script('тут путь к файлу/tinymce.min.js') }}

#70 Re: Laravel 4 » Проверка массива checkbox на наличие в БД. » 31.01.2015 12:53:13

HunterNomad пишет:

Приведите пример (в Вашем понимании):
1) правильно
2) не правильно

Не понял Вас. smile Я просто хотел как-нибудь с помощью класса Validator сделать, чтобы было примерно так:

# Правила проверки
$rules = array(
    'categories' => 'array|exists:categories,id'
);
# Это выделенные категории
$input = array('
    'categories' => array(1,2,3,4,5,6,7)
');

Т.е. если мы указали "array", то все значения из массива проверились на наличие в таблице categories.

#71 Laravel 4 » Проверка массива checkbox на наличие в БД. » 31.01.2015 12:26:34

Дмитрий
Ответов: 4

Здравствуйте. Помогите мне советом, пожалуйста.
Есть в базе список категорий. Эти категории выводятся пользователю в виде списка checkbox-ов. Пользователь может выбрать несколько категорий и его выбор запишется в БД. С этим всё просто.
Возник вопрос: а если злоумышленник подменит значения этих checkbox и в базу запишутся несуществующие значения? Из этого вопроса вытекает следующий:
Как можно провести проверку (валидацию) массива выбранных с помощью checkbox значений на наличие их в базе?

#72 Laravel 4 » After-фильтр не отрабатывает. » 05.07.2014 10:04:49

Дмитрий
Ответов: 1

Здравствуйте. И снова пишу вам, уважаемые эксперты Laravel smile. Дело такое:
- Есть фильтр (конечно это урезанный вариант, в таком виде его я использовать не буду):

Route::filter('test', function()
{
    return Redirect::to('/');
});

И есть маршрут:

Route::get('test', array(
    'after' => 'test',
    function(){
        return 'TEST';
    }
));

Так вот, теперь вопрос: почему это не работает? smile Т.е. если заместо "after" там вписать "before" - то всё правильно отрабатывает и меня перенаправляет на главную страницу сайта. А в таком виде лишь выводится "TEST", никакого перенаправления не происходит.
Пробовал в интернете поискать, каким образом фильтры работают, ничего путного не нашёл. Думаю это в особенностях after-фильтра что-то...

#73 Re: Laravel 4 » Авторизация с проверкой дополнительных полей. » 26.06.2014 09:53:49

Agel_Nash, огромное Вам спасибо за ответ! Я задал вопрос, а потом дошло вроде, что нужно сделать так:

Можно только на один маршрут login подвесить фильтрацию after и если пользователь заблокирован - то разавторизовывать его.

Оказывается правильно мыслю smile.

Большое спасибо Вам обоим, Agel_Nash, Proger_XP ещё раз!

#74 Re: Laravel 4 » Авторизация с проверкой дополнительных полей. » 25.06.2014 10:47:51

Proger_XP, Agel_Nash, большое Вам спасибо за ответы. Ответ Proger_XP понятен предельно, а Agel_Nash, не могли бы Вы показать пример? Простите, если надоедаю smile

#75 Laravel 4 » Авторизация с проверкой дополнительных полей. » 24.06.2014 08:58:29

Дмитрий
Ответов: 5

Здравствуйте. Пожалуйста, подскажите мне решение такого вопроса:
- Есть авторизация на сайте, написанном на 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, но не знаю, насколько это правильно.
В общем, подскажите самый правильный путь решения проблемы, как лучше это проверять?
Большое всем спасибо!

Подвал раздела