Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Здравствуйте, добавьте в скайпе la_2_ha
Проблема была не в Laravel, а в том что в php 5.3 по умолчанию влючено экранирование http://www.php.net/manual/ru/security.magicquotes.php
Есть таблица с фильмами:
id, name
Есть таблица с людьми:
id, name
Есть связующая таблица:
id, film_id, person_id, post
Где поле post это должность.
Проблема в том что у одного человека может быть несколько должностей в одном фильме:
Пример:
режиссер: Фрэнк Дарабонт
сценарий: Фрэнк Дарабонт, Стивен Кинг
Фрэнк Дарабонт — в базе имеет id=1
Стивен Кинг — в базе имеет id=2
Судя по документации добавлять данные в связующую таблицу нужно так
$user->roles()->sync(array(1 => array('expires' => true)));
И вот тут проблемка возникает исходя из наших данных запрос будет таким
$film->people()->sync(array(
1 => array('post' => 'режиссер'),
1 => array('post' => 'сценарий'),
2 => array('post' => 'сценарий'),
));
Ну и сохранится только то что Фрэнк Дарабонт работал над сценарием т.к. мы потом переопределили ключ 1
В общем появился проектик, достаточно большой, чтот то вроде CMS узкоспециализированной, так вот он написано на чиcтом php и очень не хватает некоторых классов laravel для того чтоб быстро работать над ним используя средства к которым привык, к оннтроллерах речи не идет, но некоторые классы хотелось бы именно из laravel(работа с БД, Валидация форм, помощник построения форм) ну и естественно для этого нужно как то подключить их, но они ж там завязаны один за другой, поэтому по ходу придется весь laravel подключить, и вот хотеось бы узнать как это сделать. То есть например закинул я дистрибутив laravel в папочку laravel которая в корне, и что мне прописать например в index.php который лежит в корне, чтоб я в нем мог юзать классы laravel?
В общем на зарубежном форуме кажется нашел решение проблемы, в общем в куках можно хранить только 4кб, а у меня наверно больше, поэтому в общем ключик этот и не до конца записан, оно не может его расшифровать, вот и получается борода такая.
вот скрин, судя по всему в куках больше ничего и нет
session_payload
5933d10e770650b4755fff2d194dde0f76ddecdc+M0OSWRbMT5EMO15rbZdp0THJFVg9yCWupVv/LfXa0zFbgy1ypR2nk0PjT0t6L23fudUVrTAGA4Mln9bP4xMFEUP8pbM2jGvAKccVVFMqXQQPolyduQwaq3z9QflYZ2Z5ztKpqcZ3FM0onFoIF3onnamyvvyxTM77j+JAJlgeMmAGpG3SVeQ4pQbupWWnUQp0E9EI4vmLgLxQmBwHEG/hy2J5lDSGgR6w4ORE8FWdBWNII2i9veRVl3hCNqQQkzAjnYG+HN1O2zasEu/9/B9B8hxof4Fr3BQjbo2xFH2fVcT6rFRfOWFeE5OTxnkTVg6xrUmARrfkL+5P+rdvkDugQzXeL9pMqD5Rz5e6gPtfzHV7901P4PRvgkPV3Q3a+P/u9fAxMMVeXsoA23AKpXpRKwkcsLFh78CNwRqk9wuvAfPQIgPFR7EthatvNakmCUo2AupU/13gbvQJTtyKao38ldvmD76wWMdKnMXsIL0aDsYBq9S0TEDUZSDs45l8aCZeZY9N/iBwCkUEenSYSAXE0p20FFGXbjhOS7naE+jd0fE=
laravel_session
fec14f75f39a2e61a0d1129b2b9de2347a971e47+unXbqnLVwFEoXA9wZTm4cxJDe0Wi1jo6ExD0iyyy
Ключик из конфига
'key' => '53sOegYpEFj1Hov8HgtFbkw6AOTM2UMr',
Кстати не знаю что за session_payload но он у меня меняется каждые 5-10 секунд примерно. То есть вот показывается эта страница с ошибкой, я ничего не делаю, а значение меняется
В общем после попытки залогиниться, и не правильно введенных данных выскакиевает вот такая штука иногда и не убирается до тех пор пока не почищу куки, на всех страницах отображается. Чет не могу понять что за нафиг?
sqlSELECT a.* FROM autos a LEFT JOIN bids b ON (b.auto_id = a.id AND b.user_id = 5) WHERE b.id IS NULL
Надо его как, то написать не с использованием Fluent.
Возникли проблемы с написанием left_join, не хочет он принимать то что я пишу, Mysql ошибку выдает.
UPD;
Запрос по ходу должен так выглядеть. Но результат не тот почему-то
$query->left_join('cms_autos_bids', function ($join) {
$join->on('cms_autos.id', '=', 'cms_autos_bids.auto_id');
$join->on('cms_autos_bids.user_id', '=', DB::raw(5));
});
$query->where_null('cms_autos_bids.id');
UPD2;
В общем выяснил что запрос правильно написан(тот что сверху), единственное что скобки он не ставит для этого,
sql(b.auto_id = a.id AND b.user_id = 5)
Сейчас они вроде не нужны особо, но все же интересно как их можно поставить(или они никогда не могут пригодиться? А то я с SQL не особо дружу).
А результат не тот был потому что я случайно ошибся с тем какой результат должен быть.
$this->layout->content = View::make('autos::admin.bids_index')
->with('bids', Bids::get_bids());
public static function get_bids()
{
return self::select(array(
'cms_autos_bids.*',
'users.email',
'autos.name as auto_name',
))
->join('auth_users as users', 'cms_autos_bids.user_id', '=', 'users.id')
->join('cms_autos as autos', 'cms_autos_bids.auto_id', '=', 'autos.id')
->order_by('cms_autos_bids.created_at', 'desc')
->paginate(20);
}
public static function get_bid($id)
{
return self::select(array(
'cms_autos_bids.*',
'autos.name as auto_name',
))
->join('cms_autos as autos', 'cms_autos_bids.auto_id', '=', 'autos.id')
->order_by('cms_autos_bids.created_at', 'desc')
->where('cms_autos_bids.id','=',$id)
->first();
}
<?foreach ($bids->results as $bid) {
?>
<tr>
<td><?=$bid->id?></td>
<td><?=$bid->type?></td>
<td><?=HTML::link('admin/bids/edit/' . $bid->id, 'id: ' . $bid->auto_id . ' | ' . $bid->auto_name)?></td>
<td><?=$bid->bid?>$</td>
<td><?=$bid->status?></td>
<td><?=$bid->created_at?></td>
<td><?=$bid->email?></td>
</tr>
<? }?>
</tbody>
Вывод в бразуер:
Missing argument 1 for Bids::get_bid(),
Казалось бы, при чем тут get_bid??
Я его нигде не вызываю.
Но поиск того де она вызывается привел меня к строке.
<td><?=$bid->bid?>$</td>
Именно она вызывает get_bid, я было подумал что эта фишка такая, типа оно сначала смотрит есть ли в модели метод get_bid, а потому уже в $bid, но потом попробовал передать какой-нибудь параметр вот так $bid->bid(3), но оно говорит что нет у меня такого метода, в общем что это за нафиг такой, пришлось метод переименовывать.
Дико извиняюсь за вопрос, нет времени сейчас установить четверку и разобраться с ней. Но интересует возможность создания в ней независымых модулей как сейчас пакеты сделаны. С возможностью назначать для них свои папки как то так:
'autos' => array(
'auto' => true,
'location' => '../modules/autos',
),
'auth' => array(
'auto' => true,
'location' => '../modules/auth',
),
'chat' => array(
'location' => '../modules/chat',
),
'money' => array(
'location' => '../modules/money',
),
'password' => 'required',
'confirm_password' => 'required|same:password',
для password есть перевод в языковом файле и он отображается если поле не запонено, а вот когда подтверждение пароля не такое-же как пароль выдает ошибку «Значение “Повторите пароль” должно совпадать с password.» у меня щас это единственная связка в форме, поэтому я могу задать Нормальное сообщение для ошибки переписав в $messages сообщение для same но в случае если у меня будет несколько таких, этот вариант уже не прокатит, и придется регистрировать собственные правила валидации для каждого случая и прописывать ошибки для них?
UPD: что то не работает разметка о которой тут написано [url]http://laravel.ru/forum/viewtopic.php?id=15[/url]
Спасибо. Гляну. И про модель действительно хорошая идея, что-то я не подумал. Призы - это я так. Увидел на каком-то форуме в качестве приза при наборе определенного количества чего-то регистрацию в Яндекс Каталоге. И еще кучу разных штук. Ну и ляпнул)
Ну и еще вопрос по валидации, есть ли тут возможность вызывать функции которые возвращают не только true|false а которые бы обрабатывали поля как-ниудь. Например. Поле ввода адреса сайта. Оно проверяет есть ли там http:// и если нет то добавляет. А потом я использую что нибудь типа.
$url=$validation->get_value('url');
И у меня там уже измененое значение. Ну или чтоб оно сами $inputs редактировало.
P.S. Когда уже призы будут самым активным участникам форума)??
@la2ha Задать нормальные имена при валидации ты можешь в языковом файле validation.php того языка, который используешь.
Там снизу будет что то типа этого
/*
|--------------------------------------------------------------------------
| 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(
'images'=>'"Картинки"',
'title'=>'"Заголовок"'
),
И вот в attributes пиши свои name и переводы для них.
Хоят конечно не очень сделано, было бы хорошо если бы можно было писать еще и так
$input = array(
'user_email' => $user_email,
'user_password' => $user_password
);
$rules = array(
'user_email' => 'required|email|exists:users',
'user_password' => 'required'
);
$friendly_names = array(
'user_email' => 'Email Address',
'user_password' => 'Password'
);
$validation = Validator::make( $input, $rules, null, $friendly_names );
Дошел я до валидации форм, и тут меня ждал неприятный сюрприз.
Есть поле у которого label = 'Заголовок'
а name для него title.
Так вот когда я валидирую и поле не заполнено например оно мне выдает ошибку.
"Поле title обязательно для заполнения."
А мне этот title нафиг не нужен в сообщении об ошибке, я хочу чтоб было написано то что я хочу. В этом случае "заголовок". В CodeIgniter задавался параметр name, потом писал по русски то что хочу 'заголовок' например, а потом правила валидации. Тут я такого как-то не заметил. Так как мне задавать нормальные человеческие имена?
Печально будет если laravel 4, не будет позволять это все делать, на сколько я понял там бандлов не будет, а библиотеки будут устанавливаться через Composer. Тоже удобно конечно. Но мне как любителю HMVC это не по душе, хотя я думаю гибкость останется и все же получится раскидать это все по отдельным папкам.
OrlandoST на tutsplus.com вроде видел инфу по laravel 4, и там видео даже было как устанавливать, погугли.
Тот бандл уже не актуален по ходу, все что он делает, это позволяет вызывать контроллер из контролера, но это можно делать и средствами laravel. ВОзможно он был написан для ранних версий, где этого не было.
Все оказалось очень просто, PHP 5.3 для меня новая штука, так вот и мучаюсь. А тут подсказали на англоязычном форуме. Полез в документацию почитать. И оказалось что не дочитал до этого один абзац.
$data='test';
Route::any($url, function ($route = array()) use ($data) {
echo $data;
});
Как тут сделать подсветку php?
Спасибо, с ходу так не понял особо как это сделать, но нашел кажется то как я могу переделать роуты под свои нужды, но возник вопрос как их так расширить, чтоб заменить добавить функций или заменить на свои.
Нужно отредактировать
/laravel/routing/route.php
/laravel/routing/router.php
Почитал еще раз как ты рекомендовал класс базы данных расшинить и все равно не въехал. Суть то понимаю что надо сделать класс который насделует этот класс. Но как мне сделать чтоб потом когда вызывается Route->call() где-то оно использовало мой код, а не laravel.
Столкнулся с задачей передачи переменной в замыкание.
Т.е.
$data='test';
Route::any($url, function ($route = array()) {
echo $data;
});
Но так естественно не получится т.к. в замыкании переменной $data не видно. Глобальные переменные использовать очень не хочется. По идее прийдется переписывать Route::any точнее написать свою
$data='test';
Route::my_any($url,$data, function ($data,$route = array()) {
echo $data;
});
или есть варианты проще?
UPD:
Начал искать, как передать ее расширив роутер, но что то как то остановился на регистрации роута. Там он просто регистрируется, т.е. оттуда я могу сохранить свою $data, а вот передать ее в свой callback что-то не могу найти как.
UPD:
Попробовал с глобальной переменной, не получилось. У меня там цикл в реальном коде идет. используется последнее присвоенное значение. А сделать уникальные ключи я не могу, т.к. вызвать по уникальным ключам не получится, я ж не могу их туда передать.
Так я же и говорю что в пакеты всовывать не хочу, поэтому и создал эту тему, вариант location подошел отлично, даже лучше чем в CodeIgniter можно все настраивать, там вложенные модули нельзя было делать, а тут как хочу так и кручу вообще огонь). Кстати только что увидел что папка application это тоже пакет, который расположен в другом месте просто, вроде.
public static function detect($bundle = DEFAULT_BUNDLE, $directory = null)
Где DEFAULT_BUNDLE и есть application
Спасибо, попробую.