Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Он же ясно говорит что класс геоип не найден
Есть категории, есть цветы (розы, тюльпаны) короче говоря товары, и есть типы товаров (тип розы, типы тюльпаны). Товары относятся к категории (один ко многим), и так же товары относятся к типам (один ко многим).Я хочу вывести эти типы в категории, делую это так
public function types()
{
return $this->hasManyThrough('App\Type', 'App\Product', 'type_id', 'id');
}
Типы выводятся, но почему то совсем не правильно. В категории где есть товары, типы вообще не выводятся, в категории где товаров нет, выводятся по 2 - 3 типа, которые вообще не должны быть в этой категории. Что я делую не так?
BMTH пишет:Нет, не выходит. Кучу всего перепробовал....
А нет ли способа без аякса залить изображение в другую таблицу при добавлен пользователя?Думаю Вам поможет это https://laravel.ru/docs/v5/eloquent-relationships. Если я правильно понял, у Вас как-то модель изображений должна быть связана с другими моделями, которые будут использовать изображения. В выше приведенном разделе документации указан самый удобный способ (способы).
Со связями проблем нет. Проблема в отправке значения input type file, которое не отправляется
BMTH пишет:Что во вкладке нетворк?
status 500 Internal server error
Fatal error: Call to a member function comments() on null
(это про строчку в контроллере:
$comments = Post::find($id)->comments()->get();
)
Вот и ваша ошибка:)
Что во вкладке нетворк?
Нет, не выходит. Кучу всего перепробовал....
А нет ли способа без аякса залить изображение в другую таблицу при добавлен пользователя?
}%В форме enctype="multipart/form-data" прописан?
Да, я уже все перепроверял...
}%Вы при success возвращаете Status Code:422, нужно 200.
Все заработало теперь. Спасибо)
Есть еще 1 вопрос. Я пытаюсь так же загрузить картинки на аяксе, тк у меня отдельная таблица картинок для всех моделей. Вроде все нормально, но картинки не загружаются почему то, и ошибок нет, в консоле пусто
$('#img').on('change',function(){
var image = $(this).val();
$.ajax({
url: '{{ url('api/img/upload') }}',
type: 'post',
data: image,
headers: {
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
},
success: function(data){
console.log(data);
},
error: function(error){
console.log(error);
}
});
})
Код контроллера
public function uploadImg(Request $request)
{
if($request->hasFile('img'))
{
$image = $request->input('img');
$filename = str_replace('-','_',rand(111,99999) . '_' . strtolower(str_random(5)) . '.' . $image->getClientOriginalExtension());
$path = public_path('upload/img/' . $filename);
Img::make($image->getRealPath())->save($path);
if($filename)
{
$upload_img = new Image();
$upload_img->url = '/upload/img/' . $filename;
$upload_img->save();
return response()->json($filename);
}
}
}
}%Покажите что в контроллере, для success должно быть что-то вроде
%%(php)
public function postCreate(Create $request) {
//действия в котроллере
return response()->json([
'message' => 'Ok',
]);
}
%%
Для error - если вы используете стандартный подход в Laravel с Requests, при правильном ajax-запросе должны получить Status Code:422 и json с ошибками
Почти все получилось, методом проб и ошибок. Но теперь почимуто не происходит редирект после успешного добавления в базу.
<script type="text/javascript">
$('#form').on('submit', function(e) {
e.preventDefault();
var form = $("#form");
var formData = {
'meta_title': $('input[name=meta_title]').val(),
'meta_description': $('input[name=meta_description]').val(),
'meta_keywords': $('input[name=meta_keywords]').val(),
'name' : $('input[name=name]').val(),
'slug' : $('input[name=slug]').val()
};
$.ajax({
url : form.attr("action"),
type : form.attr("method"),
data : formData,
dataType: 'json',
headers: {
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
},
error :function( errors ) {
output = "<div class='alert alert-danger'><ul>";
$.each(errors.responseJSON, function(index, error){
output += "<li>" + error + "</li>";
});
output += "</ul></div>";
$('#append').html(output);
console.log(errors);
},
success: function(data){
output = "<div class='alert alert-success'><ul>";
$.each(data.responseJSON, function(index, success){
output += "<li>" + success + "</li>";
});
output += "</ul></div>";
$('#append').html(output);
console.log(data);
window.location = '{{ url('user') }}';
}
})
})
</script>
Даже если саксесс функция будит пустая,а в валидаторе возвращать буду редирект, всеравно он не происходит почему то.
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|unique:catalogs',
'slug' => 'required'
]);
if($validator->fails())
{
return response()->json($validator->messages(), 422);
}
User::create($request->all());
return response()->json(['success' => 'Все успешно добавлено. Вы будите перенаправлены!'], 422);
}
Вот что в консоле
jquery.min.js:4 POST http://test.app/user 422 (Unprocessable Entity)send @ jquery.min.js:4ajax @ jquery.min.js:4(anonymous function) @ create:217dispatch @ jquery.min.js:3r.handle @ jquery.min.js:3
create:232 Object {readyState: 4, responseText: "{"success":"\u0412\u0441\u0435 \u0443\u0441\u043f\…043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b!"}", responseJSON: Object, status: 422, statusText: "Unprocessable Entity"}
И почему то, сообщение об успешного добавления высвечивается в денджер алерте
Аякс*
Вопрос задал не корректно.
Форма отправляется аяксом. Json возвращается, но всеравно произходит редирект, как при обычной отправке формы. Подозреваю, что валидатор отправляет не правильный хедер, сделал в валидаторе проверку
if($request->ajax() || $request->wantJson())
{
// Тут отправка json
}
hasManyThrought как раз позволяет получить бренды товаров категории, а каталог - категории - товары это one to many.
вот когда решишь добавлять товар в несколько категорий с брендами, это да, - и то решаемо
Catalog: id | name (hasMany -> category)
Category: id | catalog_id | product_id | name (belongsTo -> catalog, hasMany -> product)
Product: id | brand_id | category_id | name ...(belongsTo -> brand, belongsTo -> category)
Brand: id | name (hasMany -> product)
Сейчас, что бы вывести товары в каталоге, использую хесменисро ($catalog->product;)
Когда так же пытаюсь получить бренды через товары,и вывести в категории, выплевывает ошибку, где говорит что не модет найти таблицу. Почему? Если по вашим словам это должно работать
Привет. hasManyThrought дает доступ к модели через модель которые связвны между собой one/many to many. Тоесть примерно так каталог->категории->товары через hasManyThrought можно получить товары через категорию. А если связь идет так
Категории -> товары <- бренды, как нибудь можно получить бренды через товары и вывести в категорию не джоинами а eloquent?
Зачем столько телодвижений?))
В App/Providers/AppServiceProvider вставьте этот код
public function boot()
{
view()->composer('путь до вьюхи',function($view) {
$view->with('catalog', Catalog::groupBy('id')->get());
});
}
Catalog замените на свою модель
View composer
Роут груп миддлевар веб убрать надо если версия 5.2.31 и выше вроде. Там автоматом веб мидлевар прописывается
Назрел еще один вопрос, на который не нашел однозначного ответа. Как мне самостоятельно разделить сайт на frontend и backend? Есть какие-нибудь общепринятые практики?
Route::group(['prefix' => 'admin', 'namespace' => 'путь до папки где лежат контроллеры для бекенда', 'middleware' => ['auth']], function() {
// Тут роуты для админки
});
BMTH пишет:Можно сделать инпут хидден с валуе айди новости,и потом в контроллере привязывать уже
В данном случае это не будет работать. Элемент input hidden хорош в тех случаях, когда данные в контроллер передаются методом POST при передаче данных формы.
Это варриант идеален когда отправка идент не на страницу с постом,а например куданибудь на post/reply
Можно сделать инпут хидден с валуе айди новости,и потом в контроллере привязывать уже
наверняка у статей есть таймштампы created_at и updated_at ?
если да, то самый простой вариант автоматизировать так, чтобы вообще не надо было никуда нажимать.
просто в конфиг пишешь длительность (например в часах) "новизны",
а при выводе в шаблоне смотришь, если дата create_at меньше чем created_at + Хчасов, то = "новая".
Вот, идеально. Спасибо
BMTH пишет:hzone пишет:И УЧТИТЕ (ВСЕ), ЧТО У VirtualDocumentRoot НЕТ DocumentRoot (И НЕ ИЩИТЕ), ВОЗМОЖНО РАБОТАТЬ НЕ БУДЕТ.
Поэтому никто так не делает.Значит мертвая тема...
не обязательно.
у меня проекты работают нормально.
однако ещё один хряк - DocumentRoot используется от несущего домена, хоть и неявно.
а проекты работают потому что они от realpath/dirname стартуют
Ну тогда я все же попробую, если что сюда напишу)
Есть еще один вопрос не по теме. Вот пользователи могут писать статьи, статьи ща тупо попадают на главную. В общем хочу сделать такой функционал,что бы статья была актуально до определенного времени. Например, при написании статьи поставил галку на "новая", и время выбрал до какого числа у статьи будит стоять эмблема "новая", по прошествию этого числа, эмблема "новая" убиралась. Как в интернет магазинах с товарами "новинка". Я просто не представляю как этот таймер сделать.
Самим писать надо)
И УЧТИТЕ (ВСЕ), ЧТО У VirtualDocumentRoot НЕТ DocumentRoot (И НЕ ИЩИТЕ), ВОЗМОЖНО РАБОТАТЬ НЕ БУДЕТ.
Поэтому никто так не делает.
Значит мертвая тема...
варианты для апача^
1.
просто и быстро
<VirtualHost 1.2.3.4:80>
DocumentRoot "/www/example3"
ServerName www.example.net
ServerAlias *.example.net
# ...
</VirtualHost>2.
сложно, но круто
надо изучить директиву
VirtualDocumentRoot
пример%% insert a % %p insert the port number of the virtual host %N.M insert (part of) the name 0 the whole name 1 the first part 2 the second part -1 the last part -2 the penultimate part 2+ the second and all subsequent parts -2+ the penultimate and all preceding parts 1+ and -1+ the same as 0
UseCanonicalName Off VirtualDocumentRoot "/usr/local/apache/vhosts/%0"
Ого. У меня апач. Это автоматом все бкдит, или придется для новом пользователе все
Прописывать?
Привет. Хочу вынести профили пользователей на сабдомены. Пример nickname.site.name.
В роутах прописал Route::group([domain=> {subdomain}.site.name]
А как быть с httpd.conf? Что ткда прописовать каждый раз?
<div id="divID">
<label for="text">myLabel</label>
<input type="text" name="text" id="text" value="text">
</div>jQuery
var $input = $('#myID').find('input[type="text"][name="text"]');
$input.attr('type','checkbox');был text input, стал checkbox
но чем тебе поможе этот js я не знаю, я вообще не понял зачем тебе всё это ;-)
по теме поставить selected
@foreach.....
<option value="XXX" @if($preDefinedValue==$page->value) selected @endif >YYY</option>
@endforeach
так понятно?
Ога)
А насчет js, ВиталН начал тему,что и на js селектед поставить мона)