Laravel по-русски

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

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

#51 Laravel 5.x » Laravel 5.6 на bootstrap 4.1 использует устаревшие классы » 04.05.2018 06:42:57

mstdmstd
Ответов: 0

Всем привет,
Перевожу  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 ?


Спасибо!

#52 Re: Laravel 5.x » Как в результирующей коллекции пропустить некоторые элементы » 23.04.2018 15:37:56

Спасибо, но видимо к коллекциям нужно привыкнуть...
Хочу сделать сортировку по среднему из 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 неотсортированные...
Или неправильное опеределение выше ?

#53 Re: Laravel 5.x » Как в результирующей коллекции пропустить некоторые элементы » 21.04.2018 13:26:53

Про 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;
                }
            }

То есть часть данных удаляется Можно лим сделать так и для  коллекций?
Коллекции - это вроде как более прогрессивно чем старые циклы ?

#54 Laravel 5.x » Как в результирующей коллекции пропустить некоторые элементы » 21.04.2018 10:56:43

mstdmstd
Ответов: 5

Всем привет!

В 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.

Можно ли и как?

Спасибо !

#55 Laravel 5.x » о firebase » 20.04.2018 17:49:33

mstdmstd
Ответов: 0

Кто работал с laravel с базой firebase ?
Поделитесь опытом:  в каких случаях firebase удобнее привычных mysql/postgres  и для каких задач стоит его использовать?
И чем его пользовать в laravel ?
Я гуглил, но результаты были протеворечивы...

Спасибо !

#56 Re: Прочее » Как из-рабочего проекта сделать архив » 07.04.2018 15:29:36

Сорри, если я криво выразился чего хочу  : хочу сохранять копии проекта копируя только необходимое

Нужны каталоги :

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

Или я что-то упустил?
Может есть утилиты для автоматизации?

#57 Прочее » Как из-рабочего проекта сделать архив » 04.04.2018 19:10:24

mstdmstd
Ответов: 3

Подскажите, пожалуйста, многие примеры в нете имеют вид небольшого архива
и инструкцию к установке вроде
https://github.com/codekerala/laravel-v … pa-invoice
Как из-рабочего проекта сделать архив(минимального размера) чтобы можно было быстро запустить ?

Спасибо!

#58 Прочее » Куда должны приходить ответы в личку » 30.03.2018 11:00:37

mstdmstd
Ответов: 2

Я тут одному сэру с этого сайта написал в личку и жду ответа - но не нашел в профайле а куда должны приходить ответы ?
Это где-то на сайте или только на мой мейл?

#59 Re: Laravel 5.x » В Laravel 5.5/vue.js2.5 приложении делаю проверку CRUD Dusk-ом » 21.03.2018 15:04:03

code_bright_anywhere, не мог бы выложить заголовки своих тестов с использованием методов assertEquals, assertStatus ?
По-прежнему ищу решение...

#60 Re: Laravel 5.x » В Laravel 5.5/vue.js2.5 приложении делаю проверку CRUD Dusk-ом » 16.03.2018 09:23:02

Пересоздал еще раз:

$ 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"
        ...
    },

?

#61 Re: Laravel 5.x » В Laravel 5.5/vue.js2.5 приложении делаю проверку CRUD Dusk-ом » 15.03.2018 14:50:59

А как прапвильно подключить, получаю ошибку

BadMethodCallException: Call to undefined method [assertEquals].

?
Я нашел

use PhpUnit\Framework; 
use Tests\TestCase;

но не помогает...

#62 Re: Laravel 5.x » В Laravel 5.5/vue.js2.5 приложении делаю проверку CRUD Dusk-ом » 15.03.2018 12:02:30

Спасибо, еще раз!

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-ы к кторым будут тестироваться ? Еще есть нюансы?

#63 Re: Laravel 5.x » В Laravel 5.5/vue.js2.5 приложении делаю проверку CRUD Dusk-ом » 14.03.2018 14:43:19

Спасибо за развернутый коментарий - очень полезно!
1)Но если юзать отдельную БД (не рабочую) и использовать трейт RefreshDatabase - не есть ли это излишне ?

2) Да и я бы предпочел 1 строку создать отредактировать и следом удалить(да и клиент так пишет) позтову вопрос почему не работает

DB::getPdo()->lastInsertId(); 

по-прежнему актуален

3) А чем  http теcтирование лучше? Ведь при таком тестировании  проверяются только контрол и модел?
А в случае Dusk-а и view. Или нет?

4) Клиент хочет сделать несколько файлов тестов чтобы их кроном запускать ночью(меньше нагрузка)
Можно ли получить результаты выполнения(кол-во успешных тестов и ошибок) и выслать их мейлом на админа?
Приходит мысль делать буферизацию и парсить оутпут, нет ли способа лучше?

#64 Laravel 5.x » В Laravel 5.5/vue.js2.5 приложении делаю проверку CRUD Dusk-ом » 13.03.2018 16:38:19

mstdmstd
Ответов: 10

Всем привет,
В 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-а подскажите а стоит ли заворачивать эти тесты в блоки транзакции как закоментировано выше ?

Спасибо !

#65 Laravel 5.x » НЕ вызывается цикл в цикле удаления связанных данных » 20.02.2018 11:23:44

mstdmstd
Ответов: 0

Всем привет, 

В 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 не удаляются ?

Что-то упустил в описании моделей?

Спасибо!

#66 Re: Веб-разработка » vuejs : заполнить цикл открывая модальное окно » 08.02.2018 09:18:58

Мне удалось вывести модальное окно и массив с данными 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">

то ошибки нет...
Или этот блок нужно определять как-то иначе ?

#67 Re: Веб-разработка » vuejs : заполнить цикл открывая модальное окно » 04.02.2018 15:14:20

По-прежнему ищу решение : пробую теймплейт определить как отдельный див с ссылкой на него в определении компонента:

<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">

Не уверен что это правильно...
А как правильно определить шаблон для модального окна ?

#68 Веб-разработка » vuejs : заполнить цикл открывая модальное окно » 02.02.2018 18:19:35

mstdmstd
Ответов: 2

Всем привет,
Делая статусную строку внизу приложения(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: {

    }


Спасибо !

#69 Re: Laravel 5.x » Ошибка получить shared link файла загруженного на dropbox » 28.01.2018 16:39:41

По-прежнему ищу решение.
Никто я такой проблемой не сталкивался ?
Или есть средства лучшие упомянутой DropboxAdapter либы( для API 2 ) ?

#70 Laravel 5.x » Ошибка получить shared link файла загруженного на dropbox » 26.01.2018 16:31:32

mstdmstd
Ответов: 1

Всем привет,
В 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
    }
}

В моем коде/конфигурации ошибка?


Спасибо !

#71 Laravel 5.x » factory ошибка связанных таблиц » 13.01.2018 18:25:40

mstdmstd
Ответов: 1

Всем привет,
В модели 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() ); // Создана одна строка

В чем проблема и как исправить ?

Спасибо !

#72 Прочее » Консольные команды миграции не сохраняются в консоли Kubuntu » 13.01.2018 12:00:20

mstdmstd
Ответов: 1

Всем привет,
Не подскажите работая с laravel 5.5 в консоле под Kubuntu 17.10 обычно вводя консольные команды эти команды сохраняются
в истории и их можно вывести в консоле наажатием на клавиши "Up/Down"

Но команды

 php artisan migrate 
 php artisan migrate:rollback

в истории консоли не сохраняются . Это поправимо?

Спасибо !

#73 Laravel 5.x » На стадии разработки локально обращение к сайту fonts.googleapis.com » 06.01.2018 19:26:15

mstdmstd
Ответов: 1

Всем привет,

Мой 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 и как это побороть ?
На стадии разработки локально обращение к внешним сайтам очень не к месту...

Спасибо !

#74 Веб-разработка » Библиотека с визуальными компонентами для vuejs » 26.12.2017 19:35:19

mstdmstd
Ответов: 1

Всем привет,

Просматривая примеры с 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?

Спасибо !

#75 Laravel 5.x » Делаю валидность на введенный цвет и ошибка » 20.12.2017 09:06:22

mstdmstd
Ответов: 0

Всем привет,

В 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 обернуть введенное значение?


Или причина в ином ?

Спасибо !

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