Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Всем привет,
Перевожу Laravel 5.6/vue.js 2.5 приложение с bootstrap 3.3.7 на 4.1 и обнаружил проблемку с вставкой кода из темплейта
в том что строка
<template>
рендерится с использованием классов
panel
panel-default
из bootstrap 3:
https://imgur.com/a/qh26Clv
Это где-то настраивается и наверно лучше заменить на класс card ?
Спасибо!
Спасибо, но видимо к коллекциям нужно привыкнуть...
Хочу сделать сортировку по среднему из 2х полей, где tempmostRatingArtistsList - коллекция из данных базы:
$mostRatingArtistsList= $tempmostRatingArtistsList->sort(function ($a, $b) {
if ( empty($a->related_votes_count) or empty($b->related_votes_count)) return 0;
$a_rating= floor($a->related_votes_sum / $a->related_votes_count);
$b_rating= floor($b->related_votes_sum / $b->related_votes_count);
if ( $a_rating == $b_rating ) {
return 0;
}
return ($a_rating < $b_rating) ? -1 : 1;
});
Судя по описанию метод sort это обертка для uasort - и вроде логика правильна
Но выходные данные в mostRatingArtistsList неотсортированные...
Или неправильное опеределение выше ?
Про in_array я в курсе Для меня привычно если нужно выбрать из данных часть набора делать что-то вроде:
$dataArray= [];
foreach( $artistConcertsList as $next_key=>$nextArtistConcert ) {
if ( in_array($nextArtistConcert['event_date_is_past'], [ 'is_today', 'is_tomorrow', 'is_future' ]) ) {
$dataArray[]= $nextArtistConcert;
}
}
То есть часть данных удаляется Можно лим сделать так и для коллекций?
Коллекции - это вроде как более прогрессивно чем старые циклы ?
Всем привет!
В Laravel 5.6 разбираясь с коллекциями https://laravel.ru/docs/v5/collections
не нашел а можно ли в результирующей коллекции пропустить некоторые элементы, вроде :
$aliasArray = ['contact_us','tdes_quiz', 'NONE', 'NO'];
$collection = collect($aliasArray)->map(function ($next_alias) {
echo '<pre>$next_alias::'.print_r($next_alias,true).'</pre>';
if (empty($next_alias)) {
// SKIP;
}
$cmsItemContent = CmsItem::getBodyContentByAlias($next_alias, ['show_song_name' => 1]);
if ($cmsItemContent !== null) {
// SKIP;
}
return $cmsItemContent;
});
// $collection = $collection->where('ID IS SET', 100);
// $collection->all();
}
Сейчас в collection 2 последних элемента имеют значение false.
Их никак пропустить не можно ?
Я пытался использовать where после цикла - но непонятно как если елемент имеет значение false.
Можно ли и как?
Спасибо !
Кто работал с laravel с базой firebase ?
Поделитесь опытом: в каких случаях firebase удобнее привычных mysql/postgres и для каких задач стоит его использовать?
И чем его пользовать в laravel ?
Я гуглил, но результаты были протеворечивы...
Спасибо !
Сорри, если я криво выразился чего хочу : хочу сохранять копии проекта копируя только необходимое
Нужны каталоги :
app
config
database
resources
routes
tests (если я делаю в проекте тесты)
И файлы:
.env
composer.json
package.json
webpack.mix.js
Непонятны нужны ли :
phpunit.xml
server.php
ссылка https://github.com/codekerala/laravel-v … pa-invoice
проект на гитхабе - к нему инструкция по установке
Привел как пример - чтобы свой архив можно было запустить командами
composer install
npm install
Или я что-то упустил?
Может есть утилиты для автоматизации?
Подскажите, пожалуйста, многие примеры в нете имеют вид небольшого архива
и инструкцию к установке вроде
https://github.com/codekerala/laravel-v … pa-invoice
Как из-рабочего проекта сделать архив(минимального размера) чтобы можно было быстро запустить ?
Спасибо!
Я тут одному сэру с этого сайта написал в личку и жду ответа - но не нашел в профайле а куда должны приходить ответы ?
Это где-то на сайте или только на мой мейл?
code_bright_anywhere, не мог бы выложить заголовки своих тестов с использованием методов assertEquals, assertStatus ?
По-прежнему ищу решение...
Пересоздал еще раз:
$ php artisan dusk:make documentCategoriesCRUD
Test created successfully.
И получаю файл tests/Browser/documentCategoriesCRUD.php:
<?php
namespace Tests\Browser;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class documentCategoriesCRUD extends DuskTestCase
{
/**
* A Dusk test example.
*
* @return void
*/
public function testExample()
{
$this->browse(function (Browser $browser) {
$browser->visit('/')
->assertSee('Laravel');
});
}
}
И в tests/DuskTestCase.php :
<?php
namespace Tests;
use Laravel\Dusk\TestCase as BaseTestCase;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
abstract class DuskTestCase extends BaseTestCase
{
use CreatesApplication;
/**
* Prepare for Dusk test execution.
*
* @beforeClass
* @return void
*/
public static function prepare()
{
static::startChromeDriver();
}
/**
* Create the RemoteWebDriver instance.
*
* @return \Facebook\WebDriver\Remote\RemoteWebDriver
*/
protected function driver()
{
$options = (new ChromeOptions)->addArguments([
'--disable-gpu',
'--headless'
]);
return RemoteWebDriver::create(
'http://localhost:9515', DesiredCapabilities::chrome()->setCapability(
ChromeOptions::CAPABILITY, $options
)
);
}
}
Если поменять вручную
abstract class DuskTestCase extends PHPUnitTestCase
То ошибка что PHPUnitTestCase не найден и как его подключить ?
Имею :
$ php artisan --version
Laravel Framework 5.5.35
В composer.json :
"require-dev": {
...
"phpunit/phpunit": "~6.0"
...
},
?
А как прапвильно подключить, получаю ошибку
BadMethodCallException: Call to undefined method [assertEquals].
?
Я нашел
use PhpUnit\Framework;
use Tests\TestCase;
но не помогает...
Спасибо, еще раз!
1) А что это за метод assertEquals
Тут https://laravel.com/docs/5.5/dusk#available-assertions я такого не нашел ...
И чем его заменить - типа данное условие истинно ?
2) Пока с клиентом речь идет что будет одно приложение(поэтому тесты запускать ночью), но с двумя базами, поэтому я полагаю сделать в .env :
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tasks
DB_DUSK_DATABASE=tasks_dusk
DB_USERNAME=root
DB_PASSWORD=1
И в config/database.php :
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => 'tsk_',
'strict' => true,
'engine' => null,
],
'testing' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DUSK_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => 'tsk_',
'strict' => true,
'engine' => null,
],
И для тестирования будет взята база данных из 'testing' ?
3) И как сделать тестируемую базу ? Из рабочей очистить таблицы CRUD-ы к кторым будут тестироваться ? Еще есть нюансы?
Спасибо за развернутый коментарий - очень полезно!
1)Но если юзать отдельную БД (не рабочую) и использовать трейт RefreshDatabase - не есть ли это излишне ?
2) Да и я бы предпочел 1 строку создать отредактировать и следом удалить(да и клиент так пишет) позтову вопрос почему не работает
DB::getPdo()->lastInsertId();
по-прежнему актуален
3) А чем http теcтирование лучше? Ведь при таком тестировании проверяются только контрол и модел?
А в случае Dusk-а и view. Или нет?
4) Клиент хочет сделать несколько файлов тестов чтобы их кроном запускать ночью(меньше нагрузка)
Можно ли получить результаты выполнения(кол-во успешных тестов и ошибок) и выслать их мейлом на админа?
Приходит мысль делать буферизацию и парсить оутпут, нет ли способа лучше?
Всем привет,
В Laravel 5.5/vue.js2.5 приложении делаю проверку CRUD операций с помощью Dusk для таблицы document_categories:
public function testExample()
{
$site_name = Settings::getValue('site_name', '');
// try {
// DB::beginTransaction();
$document_category_id= '';
$this->browse(function (Browser $browser) use ($site_name, $document_category_id) {
$browser->resize(1920, 1080); // Width and Height
$new_document_category = 'new document category created at ' . time();
$browser->loginAs(User::find(5))
->visit('/admin/dashboard#/admin/document_categories/edit/new')
->type('#name', $new_document_category)// Поле заполняется ->type , но НЕ заполняется если ->value
->select('#type', 'D')// Enum field
->type('#document_category_content', $new_document_category . ' content lorem...')// textarea input
->click('.editor_button_submit')
->waitUntilMissing('.editor_button_submit')
->assertTitle('Document Categories of ' . $site_name)
// ->assertPathIs('/admin/dashboard#/admin/document_categories')
;
$document_category_id= DB::getPdo()->lastInsertId();
echo ' New document category id::'.print_r($document_category_id,true);
});
echo ' New document category id::'.print_r($document_category_id,true);
/* } catch (Exception $e) {
DB::rollBack();
throw $e;
}
DB::commit();*/
}
Новая строка вставляется, но:
1) Кроме добавления строки хочу по $document_category_id эту строку отредактировать и удалить для чего погуглив в коде выше
считываю
DB::getPdo()->lastInsertId();
но в консоль выводится 0. Тут нужно как-то иначе получить lastInsertId ?
Если раскоментарить блоки транзакции - то также получаю 0.
2) Это Vuejs 2.5 приложение с настройкой рутов:
const routes = [
{
path: '/',
...
{path: '/admin/document_categories', component: DocumentCategoriesIndex, name: 'documentCategoriesIndex'},
{path: '/admin/document_categories/edit/:id', component: DocumentCategoryEdit, name: 'editDocumentCategory'},
...
]
const router = new VueRouter( {
mode: 'hash', // default
routes
})
И при открытии формы для создания открывается урл :
http://local-tasks.com/admin/dashboard#/admin/document_categories/edit/new
И при сохранении переходит на
http://local-tasks.com/admin/dashboard#/admin/document_categories
И на последний assertPathIs получаю ошибку :
Tests\Browser\ExampleTest::testBasicExample
Failed asserting that '/admin/dashboard' matches PCRE pattern "/^\/admin\/dashboard#\/admin\/document_categories$/u".
Почему ошибка и как ее исправить ?
3) Кто в курсе реализации тестов Dusk-а подскажите а стоит ли заворачивать эти тесты в блоки транзакции как закоментировано выше ?
Спасибо !
Всем привет,
В laravel 5.5 приложения удаляю строку со связанными строками
public function destroy($id)
{
try {
DB::beginTransaction();
$userChat = UserChat::find($id);
if ($userChat == null) {
return response()->json(['error_code' => 11, 'message' => 'User chat # "' . $id . '" not found!', 'userChat' => null],
HTTP_RESPONSE_INTERNAL_SERVER_ERROR);
}
$userChat->delete();
DB::commit();
} catch (Exception $e) {
DB::rollBack();
return response()->json(['error_code' => 1, 'message' => $e->getMessage(), 'userChat' => null], HTTP_RESPONSE_INTERNAL_SERVER_ERROR);
}
return response()->json(['error_code' => 0, 'message' => ''], HTTP_RESPONSE_OK);
}
В app/UserChat.php описаны отношения со связанными таблицами:
<?php
namespace App;
use DB;
use App\MyAppModel;
use App\User;
use App\Task;
use App\UserChatMessage;
use App\UserChatParticipant;
use App\UserChatLastVisited;
use App\UserChatMessageDocument;
use App\UserChatNewMessage;
use App\library\ListingReturnData;
use App\Events\UserChatUpdatingEvent;
use App\Rules\CheckUserChatParticipantSelected;
class UserChat extends MyAppModel
{
protected $table = 'user_chats';
protected $primaryKey = 'id';
public $timestamps = false;
protected $dispatchesEvents = [
'updating' => UserChatUpdatingEvent::class,
];
public function userChatParticipants()
{
return $this->hasMany('App\UserChatParticipant');
}
public function userChatMessageDocuments()
{
return $this->hasMany('App\UserChatMessageDocument');
}
public function userChatLastVisited()
{
return $this->hasMany('App\UserChatLastVisited');
}
public function userChatMessages()
{
return $this->hasMany('App\UserChatMessage');
}
public function task()
{
return $this->hasOne('App\Task');
}
protected static function boot() {
parent::boot();
self::deleting(function($userChat) {
$userChat->userChatParticipants()->delete();
echo '<pre>BEFORE DELETE $userChat->userChatMessages()->delete()::'.print_r(-5,true).'</pre>'; // Эта строка отладки выводится
$userChat->userChatMessages()->delete();
$userChat->userChatMessageDocuments()->delete();
$userChat->userChatLastVisited()->delete();
});
}
Также существует класс UserChatNewMessage определенный в app/UserChatNewMessage.php:
<?php
namespace App;
use DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image as Image;
use App\MyAppModel;
use App\User;
use App\Config;
use App\UserChatMessage;
use App\library\ListingReturnData;
class UserChatNewMessage extends MyAppModel
{
protected $table = 'user_user_chat_new_messages';
protected $primaryKey = 'id';
public $timestamps = false;
protected $userChatNewMessageImagePropsArray = [];
protected $fillable = [ 'user_chat_message_id', 'user_id' ];
public function userChatMessage(){
return $this->belongsTo('App\UserChatMessage', 'user_chat_message_id','id');
}
Этот класс свзян с классом userChatMessage поэтому в определеннии этого класса я определяю метод для удаления связанных данных :
<?php
namespace App;
use DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
use App\MyAppModel;
use App\User;
use App\Task;
use App\UserProfileDocument;
use App\DocumentCategory;
use App\UserChatNewMessage;
use App\library\ListingReturnData;
use App\Events\UserChatMessageUpdatingEvent;
class UserChatMessage extends MyAppModel
{
protected $fillable = [ 'user_id', 'user_chat_id', 'is_top', 'text'];
protected $table = 'user_chat_messages';
protected $primaryKey = 'id';
public $timestamps = false;
protected $dispatchesEvents = [
'updating' => UserChatMessageUpdatingEvent::class,
];
public function user(){
return $this->belongsTo('App\User', 'user_id','id');
}
public function userChat(){
return $this->belongsTo('App\UserChat', 'user_chat_id','id');
}
public function userChatNewMessages()
{
echo '<pre>userChatNewMessages -13::'.print_r(-13,true).'</pre>';
return $this->hasMany('App\UserChatNewMessage');
}
protected static function boot() {
parent::boot();
echo '<pre>boot -1::'.print_r(-1,true).'</pre>'; // Это сообщение выводится
self::deleting(function(UserChatMessage $userChatMessage) {
echo '<pre>boot $userChatMessage->id::'.print_r($userChatMessage->id,true).'</pre>'; // Это сообщение НЕ ВЫВОДИТСЯ
$userChatMessage->userChatNewMessages()->delete();
});
}
Я как раз не пойму почему НЕ вызывается цикл
self::deleting(function(UserChatMessage $userChatMessage) {
и соотвественно строки userChatNewMessages не удаляются ?
Что-то упустил в описании моделей?
Спасибо!
Мне удалось вывести модальное окно и массив с данными assigningTasksListing основываясь на котором мне нужно вывести список:
<template>
<div >
<button id="show-modal" @click="show_new_tasks_modal_modal = true">Show Modal</button>
<newTasksModalDialog v-if="show_new_tasks_modal_modal" @close="show_new_tasks_modal_modal = false">
</newTasksModalDialog>
<!-- Template with dialog html definition -->
<script type="text/x-template" id="template_new_tasks_modal_dialog">
<transition name="modal">
<div class="modal-mask">
<div class="modal-wrapper">
<div class="modal-container">
<div class="modal-header">
assigningTasksListing::{{ assigningTasksListing}} <!-- This data array is shown ok -->
default header
</div>
<div class="modal-body">
CONTENT
assigningTasksListing::{{ assigningTasksListing}} <!-- This data array is shown ok -->
<hr>
<ul>
<li v-for="nextAssigningTask in assigningTasksListing">
={{ nextAssigningTask.id }}
</li>
</ul>
<!-- Many errors like : Property or method "nextAssigningTask" is not defined on the instance but referenced during render. -->
<hr>
</div>
<div class="modal-footer">
<slot name="footer">
default footer
<button class="modal-default-button" @click="$emit('close')">
OK
</button>
</slot>
</div>
</div>
</div>
</div>
</transition>
</script> <!-- template_new_tasks_modal_dialog -->
</div>
</template>
<script>
import {bus} from '../../app';
// define the dialog component START
Vue.component('newTasksModalDialog', {
template: "#template_new_tasks_modal_dialog",
mounted: function () {
document.addEventListener("keydown", (e) => {
if (/*this.show &&*/ e.keyCode == 27) {
this.close();
}
});
}, // mounted: function () {
props: {
},
data() {
return {
title: '',
body: '',
}
}, // data() {
methods: {
close: function () {
this.$emit('close');
this.title = '';
this.body = '';
}
}, // methods: {
})
// define the dialog component END
export default {
data() {
return {
...
show_new_tasks_modal_modal: false,
assigningTasksListing:[]
}
},
mounted() {
},
methods: {
viewFutureEvents() {
// alert( "viewFutureEvents::"+var_dump(-13) )
},
viewAssigningTasks() {
axios.get(window.API_VERSION_LINK + '/get_assigning_tasks_details').then((response) => {
this.assigningTasksListing = response.data.assigningTasksListing
this.show_new_tasks_modal_modal = true;
}).catch((error) => {
if (error.response.data.error_code == 11) {
this.showPopupMessage(error.response.data.message, 'error');
this.$router.push({path: '/'});
}
this.is_page_loaded = true
this.showRunTimeError(error, app);
});
},
} // methods: {
}
</script>
Метод viewAssigningTasks вызывается кликом на кнопке.
Совершенно непонятно почему внутри блока
<script type="text/x-template" ...
массив assigningTasksListing выводится полностью как одна переменная, но ошибка при обращении к переменной цикла...
Если убрать цикл
<li v-for="nextAssigningTask in assigningTasksListing">
то ошибки нет...
Или этот блок нужно определять как-то иначе ?
По-прежнему ищу решение : пробую теймплейт определить как отдельный див с ссылкой на него в определении компонента:
<template>
<div>
<button id="show-modal" @click="showModal = true">Show Modal</button>
<modal v-if="showModal" @close="showModal = false">
</modal>
<div id="template_1" class="modal-mask" v-if="showModal">
<div class="modal-wrapper">
<div class="modal-container">
<div class="modal-header">
default header
</div>
<div class="modal-body">
CONTENT
</div>
</div>
</div>
</div>
</div>
</template>
<script>
// define the dialog component START
Vue.component('modal', {
template: "#template_1",
mounted: function () {
document.addEventListener("keydown", (e) => {
if (/*this.show &&*/ e.keyCode == 27) {
this.close();
}
});
}, // mounted: function () {
data() {
return {
show: false,
}
}, // data() {
methods: {
close: function () {
this.$emit('close');
}
}, // methods: {
})
// define the dialog component END
export default {
data() {
return {
showModal: false,
}
},
mounted() {
},
methods: {}
}
</script>
Частично работает - то есть при клике на “Show Modal” кнопке модальное окно открывается Но в консоле ошибка :
app.js:1964 [Vue warn]: Cannot find element: #template_1
warn @ app.js:1964
query @ app.js:6607
(anonymous) @ app.js:12104
cachedFn @ app.js:1540
Vue$3.$mount @ app.js:12130
init @ app.js:5449
createComponent @ app.js:6896
createElm @ app.js:6844
updateChildren @ app.js:7133
patchVnode @ app.js:7224
patch @ app.js:7384
Vue._update @ app.js:4031
updateComponent @ app.js:4149
get @ app.js:4499
run @ app.js:4576
flushSchedulerQueue @ app.js:4338
(anonymous) @ app.js:3197
flushCallbacks @ app.js:3118
14:09:14.909 app.js:1964 [Vue warn]: Template element not found or is empty: #template_1
found in
---> <Modal>
<DialogTest> at resources/assets/js/components/DialogTest.vue
<Root>
И чтобы модальное окно не было видимо при открытии окна я поставил условие :
<div id="template_1" class="modal-mask" v-if="showModal">
Не уверен что это правильно...
А как правильно определить шаблон для модального окна ?
Всем привет,
Делая статусную строку внизу приложения(laravel5.5/vue.js2.5) в конце блока обработки vue вставил компонент:
resources/views/layouts/app.blade.php
<div id="app">
...
@yield('content')
...
<status-line></status-line>
</div> <!-- id="app">-->
В resources/assets/js/components/lib/StatusLine.vue при клике на кнопке(метод viewAssigningTasks) считываю данные в массив assigningTasksListing с сервера
и передаю в событие setAssigningTasksListingEvent полученные данные. Кроме массива передаю две скалярные переменные(title и body) для примера.
В компоненте модального окна StatusLine.vue слушаю событие setAssigningTasksListingEvent и в его обработчике открываю модальное окно присваиванием :
this.show_new_tasks_modal_modal= true;
Шаблон темплейта заполняю как строку, предварительно в переменной сформировав цикл для всех строк assigningTasksListing, что я хотел отобразить :
var assigningTasksListingHTML=
'<div class="row"> assigningTasksListing::{{ assigningTasksListing }}<br><br><hr> <ul><li v-for="nextAssigningTask,index in assigningTasksListing">{{nextAssigningTask.id}}={{nextAssigningTask.task_name}} of </li></ul></div>';
console.log("-2 assigningTasksListingHTML:::")
console.log(assigningTasksListingHTML)
Vue.component('newTasksModalDialog', {
template: '\n' +
...
Итого модально окно открывается и выводится массив assigningTasksListing который я вывожу на экран
Инпуты со значениями title и body выводятся правильно, но не работает вывод массива assigningTasksListing в цикле.
Просто переменные в цикле не выводятся. На странице есть один вывод :
= of - это константы что я вывожу между переменными. Если в цикле написать неправильную переменную - то в консоле куча ошибок.
Это как-то можно исправить ?
Ниже шаблон компонента:
<template>
<div class="row">
...
<span v-if="assigning_tasks_count > 0">
| <i class="glyphicon glyphicon-tasks red"></i> <a href="#" @click.prevent="viewAssigningTasks">{{ assigning_tasks_count }} New tasks</a>
</span>
...
<newTasksModalDialog v-show="show_new_tasks_modal_modal" @close="show_new_tasks_modal_modal = false" bus="bus">
<h4 slot="header">New tasks assigned to you</h4>
<p slot="footer" class="text-info">You have to accept or cancel these tasks</p>
</newTasksModalDialog>
</div>
</template>
<script>
import {bus} from '../../app';
// DEFINE THE NEW TASKS MODAL DIALOG COMPONENT START
var assigningTasksListingHTML=
'<div class="row"> assigningTasksListing::{{ assigningTasksListing }}<br><br><hr> <ul><li v-for="nextAssigningTask,index in assigningTasksListing">{{nextAssigningTask.id}}={{nextAssigningTask.task_name}} of </li></ul></div>';
console.log("-2 assigningTasksListingHTML:::")
console.log(assigningTasksListingHTML)
Vue.component('newTasksModalDialog', {
template: '\n' +
' <div class="modal-mask" @click="close" >\n' + // v-show="show"
' <div class="modal-wrapper" >\n' +
' <div class="modal-container" @click.stop>\n' +
'\n' +
' <div class="modal-header">\n' +
' <slot name="header">\n' +
' default header\n' +
' </slot>\n' +
' </div>\n' +
'\n' +
' <div class="modal-body">\n' + assigningTasksListingHTML +
' <div class="row" >'+
' <label class="form-label">\n' +
' Title\n' +
' <input v-model="title" class="form-control">\n' +
' </label>\n' +
' </div>\n' +
' <div class="row" >'+
' <label class="form-label">\n' +
' Body\n' +
' <textarea v-model="body" rows="5" class="form-control"></textarea>\n' +
' </label>'+
' </div>\n' +
' </div>\n' +
'\n' +
' <div class="modal-footer">\n' +
' <slot name="footer">\n' +
' default footer\n' +
' <button class="modal-default-button" @click="$emit(\'close\')">\n' +
' OK\n' +
' </button>\n' +
' </slot>\n' +
' </div>\n' +
' </div>\n' +
' </div>\n' +
' </div>\n',
created() {
bus.$on('setAssigningTasksListingEvent', (assigningTasksListing) => {
this.title= 'Set New title value 1:'+(new Date)
this.body= 'Set New body value 2:'+(new Date)
this.assigningTasksListing = assigningTasksListing
})
},
mounted: function () {
...
}, // mounted: function () {
data() {
return{
show: false,
title: 'Default title value',
body: 'Default body value',
assigningTasksListing:['Default assigningTasksListing value']
}
}, // data() {
})
// DEFINE THE NEW TASKS MODAL DIALOG COMPONENT END
export default { // StatusLine.vue
data: function () {
return {
...
show_new_tasks_modal_modal: false,
}
}, // data: function () {
mounted() {
}, // mounted() {
methods: {
viewAssigningTasks() {
axios.get(window.API_VERSION_LINK + '/get_assigning_tasks_details').then((response) => {
bus.$emit('setAssigningTasksListingEvent', {
'assigningTasksListing': response.data.assigningTasksListing
}); // this resources/assets/js/components/user_chats/UserChatsRun.vue file will receive it
this.show_new_tasks_modal_modal= true;
})
},
} // methods: {
}
Спасибо !
По-прежнему ищу решение.
Никто я такой проблемой не сталкивался ?
Или есть средства лучшие упомянутой DropboxAdapter либы( для API 2 ) ?
Всем привет,
В laravel 5.5 приложении нужно загрузить файл на dropbox и получить shared link этого файла.
Я использовал DropboxAdapter либу и эту https://murze.be/dropbox-will-turn-off- … pplication доку
И также читая тут о версии 2 dropbox-а
https://laravel.com/docs/5.5/filesystem … ving-files
Мне удалось загузить файл на dropbox, но проблема с получением shared link-а этого файла.
Делая :
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Auth;
use Intervention\Image\Facades\Image as Image;
use Carbon\Carbon;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client;
use Spatie\FlysystemDropbox\DropboxAdapter;
...
class TmpCsvp extends MyAppModel
{
...
public static function setToIsApplied($id,bool $to_copy, $to_employee_id)
{
...
$dropboxClient = new Client(env('DROPBOX_OATH'));
$adapter = new DropboxAdapter($dropboxClient);
$filesystem = new Filesystem($adapter);
echo '<pre>$filesystem::'.print_r($filesystem,true).'</pre>'; // Вывод League\Flysystem\Filesystem Object класса
echo '<pre>$dropboxClient::'.print_r($dropboxClient,true).'</pre>'; // вывод Spatie\Dropbox\Client класса
$uploaded = $filesystem->put($dest_dropbox_file_name, $file, []);
echo '<pre>$uploaded::'.print_r($uploaded,true).'</pre>'; // The output is 1
$exists = Storage::disk('dropbox')->exists($dest_dropbox_file_name);
echo '<pre>$exists::'.print_r($exists,true).'</pre>';
$url = Storage::disk('dropbox')->url($dest_dropbox_file_name); // THAT LINE RAISE EXCEPTION
echo '<pre>$url::'.print_r($url,true).'</pre>';
Но получаю ошибку:
This driver does not support retrieving URLs.
с выводом https://imgur.com/a/HpE4M
При этом файл благополучно загружен по пути в $dest_dropbox_file_name вроде “docs/-doc-130/lender_image_1.jpg”
Мой composer.json :
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.0.0",
"doctrine/dbal": "^2.5",
"fideloper/proxy": "~3.3",
"intervention/image": "^2.4",
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0",
"maatwebsite/excel": "~2.1.0",
"mcamara/laravel-localization": "^1.3",
"rcrowe/twigbridge": "^0.9.5",
"sebastiansulinski/dotenv": "^2.0",
"sebastiansulinski/php-backup": "^2.0",
"spatie/flysystem-dropbox": "^1.0",
"spatie/laravel-backup": "^3.0.0"
},
"require-dev": {
"filp/whoops": "~2.0",
"fzaninotto/faker": "~1.4",
"mockery/mockery": "~1.0",
"phpunit/phpunit": "~6.0"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"extra": {
"laravel": {
"dont-discover": [
]
}
},
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
}
}
В моем коде/конфигурации ошибка?
Спасибо !
Всем привет,
В модели app/User.php прописан :
public function userChatMessages()
{
return $this->hasMany('App\UserChatMessage');
}
В модели app/UserChatMessage.php прописан :
public function user(){
return $this->belongsTo('App\User', 'user_id','id');
}
И выполняя фактори :
foreach( $users as $next_key=>$nextUser ) {
$nextUser->userChatMessages()->save( factory( App\UserChatMessage::class, 5 )->make() ); // line 52 with error !
}
Получаю ошибку :
Type error: Argument 1 passed to Illuminate\Database\Eloquent\Relations\HasOneOrMany::save() must be an instance of Illuminate\Database\Eloquent\Model, instance of Illuminate\Database\Eloquent\Collection given, called in /mnt/_work_
sdb8/wwwroot/lar/tasks/database/migrations/2018_01_13_135147_add_faker_data_user_chat_messages.php on line 52
Причем этой ошибки нет если написать без указания колва строк сообщений:
$nextUser->userChatMessages()->save( factory( App\UserChatMessage::class )->make() ); // Создана одна строка
В чем проблема и как исправить ?
Спасибо !
Всем привет,
Не подскажите работая с laravel 5.5 в консоле под Kubuntu 17.10 обычно вводя консольные команды эти команды сохраняются
в истории и их можно вывести в консоле наажатием на клавиши "Up/Down"
Но команды
php artisan migrate
php artisan migrate:rollback
в истории консоли не сохраняются . Это поправимо?
Спасибо !
Всем привет,
Мой laravel 5.5 проект в стадии разработки локально начал заметно подтармаживать что с какого-то момента что при запуске страниц
браузер отображает обращение к fonts.googleapis.com
В файлах
package.json:
{
"private": true,
"scripts": {
"dev": "npm run development",
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch-poll": "npm run watch -- --watch-poll",
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"prod": "npm run production",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"axios": "^0.17",
"bootstrap-sass": "^3.3.7",
"cross-env": "^5.1",
"jquery": "^3.2.1",
"laravel-mix": "^1.0",
"lodash": "^4.17.4",
"vue": "^2.5.7",
"vue-template-compiler": "^2.5.13"
},
"dependencies": {
"element-ui": "^2.0.9",
"laravel-echo": "^1.3.2",
"pusher-js": "^4.2.1",
"uiv": "^0.15.4",
"v-toaster": "^1.0.3",
"vue-chat-scroll": "^1.2.1",
"vue-router": "^3.0.1",
"vue-simple-table": "0.0.6",
"vue-sweetalert": "^0.1.18",
"vue-timeago": "^3.4.2"
}
}
composer.json:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.0.0",
"doctrine/dbal": "^2.6",
"fideloper/proxy": "~3.3",
"intervention/image": "^2.4",
"laracasts/utilities": "^3.0",
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0",
"pusher/pusher-php-server": "^3.0",
"spatie/laravel-backup": "^5.1",
"wboyz/laravel-enum": "^0.2.1"
},
"require-dev": {
"barryvdh/laravel-debugbar": "^3.1",
"filp/whoops": "~2.0",
"fzaninotto/faker": "~1.4",
"laravel/dusk": "^2.0",
"mockery/mockery": "~1.0",
"phpunit/phpunit": "~6.0"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"extra": {
"laravel": {
"dont-discover": [
]
}
},
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
}
}
Я не нашел явного обращения к сайту fonts.googleapis.com
Не подскажите что может вызывать обращение к fonts.googleapis.com и как это побороть ?
На стадии разработки локально обращение к внешним сайтам очень не к месту...
Спасибо !
Всем привет,
Просматривая примеры с vue.js наткнулся на такую либу https://wffranco.github.io/vue-strap/
где написано:
This repository contains a set of native Vue.js components based on Bootstrap's markup and CSS. As a result no dependency on jQuery or Bootstrap's JavaScript is required. The only required dependencies are:
Vue.js (required ^2.1.x, test with 2.1.6).
Bootstrap CSS (required 3.x.x, test with 3.3.6). VueStrap doesn't depend on a very precise version of Bootstrap. Just pull the latest.
Кто-нибудь работал с ней? Она кажется несколько староватой так как тестировалась на2.1.x?
Так же нашел другую библиотеку http://element.eleme.io/#/en-US/component/quickstart.
Кто-нибудь работал с ней? Хотелось бы иметь набор визуальных компонентов.
Может есть что-то лучше для vuejs совместимое с bootstrap 4?
Спасибо !
Всем привет,
В Laravel 5 приложении при сохранении делаю валидность на введенный цвет в app/Http/Requests/UserProfilesRequest.php:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;
use App\UserProfiles;
class UserProfilesRequest extends FormRequest
{
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules(Request $request)
{
return UserProfiles::getValidationRulesArray( $request->get('id') );
}
}
И на массив условий :
(
...
[color] => required|regex:~^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$~
[background_color] => required|regex:~^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$~
...
Получаю ошибку:
"message": "preg_match(): No ending delimiter '~' found",
Если проверить эту регулярку отдельно
$ret= preg_match('~^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$~', preg_quote ('#004300'), $matches, PREG_OFFSET_CAPTURE);
echo '<pre>$ret::'.print_r($ret,true).'</pre>';
echo '<pre>$matches::'.print_r($matches,true).'</pre>';
то работает нормально...
Не понимаю почему ошибка...
Если символ тильды заменить на “/”, то ошибка:
ssage": "preg_match(): No ending delimiter '/' found",
Была мысль введенное значение при проверке обернуть в preg_quote - но не знаю а можно ли при использовании класса FormRequest обернуть введенное значение?
Или причина в ином ?
Спасибо !