• Как изменять содержимое в зависимости от доменного имени?

    @Gesparo Автор вопроса
    Fullstack разработчик
    Переменная
    $_SERVER['HTTP_HOST']
    вполне успешно решает эту задачу.

    Вот пример моего решения, которое работает без нареканий:

    TargetUrlParser.php
    namespace App\Url;
    
    
    class TargetUrlParser
    {
      /**
       * Get target url
       *
       * @return string
       */
      public static function getUrl()
      {
        return (string) $_SERVER['HTTP_HOST'];
      }
    }

    HomePageController.php
    class HomePageController extends Controller
    {
      /**
       * @var Site
       */
      private $site = null;
    
      /**
       * @var SiteSettings
       */
      private $siteSettings = null;
    
      /**
       * HomePageController constructor.
       */
      public function __construct()
      {
        $this->site = Site::where('http_host', '=', TargetUrlParser::getUrl())->firstOrFail();
        $this->siteSettings = (new SiteSettingsFactory($this->site))->createSiteSettings();
      }
    
      public function index()
      {
        return view('pages.index')->with(['settings' => $this->siteSettings, 'site' => $this->site]);
      }
    }

    Миграция для модели Site.php
    class CreateSitesTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('sites', function (Blueprint $table) {
                $table->increments('id');
                $table->string('http_host');
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('sites');
        }
    }
    Ответ написан
    Комментировать
  • Как в laravel создать вложенное отношение, которое выберет сущность по двум полям?

    @Gesparo
    Fullstack разработчик
    Page::with(['data', 'data.field']->find(42);

    где data
    function data() {
      return $this->hasMany('App\Data');
    }

    а data.field и data.block находятся в моделе Data
    function field() {
      return $this->hasOne('App\Field');
    }


    В таблицу data еще можно добавить block_id для удобства и вытягивать его как и при помощи функции field

    По моему так, поправьте, если я не прав.
    Ответ написан
    Комментировать
  • Как создать виджет сообщества в vk?

    @Gesparo Автор вопроса
    Fullstack разработчик
    Итак, задачу все же удалось решить. Опишу способ решения этой задачи для тех, кто подписался и для тех, кто столкнется с аналогичной задачей.

    Предварительные условия:
    Необходимо создать iframe приложение и добавить его в сообщество. Насколько я понял - это необходимо только для создания ключа ( чтобы можно было управлять виджетом на стороне сервера ) и первоначального добавления виджета на страницу.

    Iframe приложение должно "смотреть" на страницу где будет вот такой вот код:
    index.html:
    <!doctype html>
    <html lang="ru">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    
        <!-- Подключаем jquery -->
        <script src="https://code.jquery.com/jquery-1.12.4.min.js" defer></script>
        <!-- Подключаем VK -->
        <script src="https://vk.com/js/api/xd_connection.js?2"  type="text/javascript" defer></script>	
    	
        <!-- Подключаем скрипт регулировки высоты -->
        <script src="/vk_height.js" defer></script>
    	
    </head>
    <body style='text-align:center;padding-top:50px;' id='body'>
    	<a href="javascript:void(0)" id="set-permission">Создать ключ доступа к виждету сообщества</a>
    	<br>
    	<br>
    	<a href="javascript:void(0)" id="set-widget">Добавить виждет в сообщество</a>
    </body>
    </html>


    vk_height.js:
    // инициализация вк
    VK.init(, function() { 
         console.log('Init successful');
      }, function() { 
         console.log('Error init');
    }, '5.73'); 
    
    // функция дня изменения размера окна в зависимости от содержимого страницы
    function autosize(width) {
        //Проверяем элемент body на наличие.
        if (!document.getElementById('body')) {
            alert('error');
            return;
        }
        // Успешно ли подключен ВК скрипт
        if (typeof VK.callMethod != 'undefined') {
            /*
            Вызываем функцию vk js api для управления окном.
            VK.callMethod('функция', параметры)
            В данном случае у нас - VK.callMethod('изменение_размеров_окна', ширина, высота);
            Так же добавляем еще 60 пикселей что бы было небольшое расстояние.
            */
            VK.callMethod('resizeWindow', 840, document.getElementById('body').clientHeight + 60);
        } else {
            alert('error #2');
        }
    }
    
    $(document).ready( function(){
        //Вызываем функцию регулировки высоты каждые пол секунды.
        setInterval('autosize(607)', 500); 
    	
    	$('#set-permission').on('click', function(e) {
    		e.preventDefault();
    		
    		// запрос прав доступа для дальнейшего обновления данных посредством крона
    		// после запрса создается ключ, который можно посмотреть на странице управления сообществом
    		// его и нунжно будет применить для обновления данных в виджете через сервер
    		// дока прав тут https://vk.com/dev/permissions
    		// дока метода тут https://vk.com/dev/clientapi?f=3.+showGroupSettingsBox
    		VK.callMethod("showGroupSettingsBox", 64);
    	});
    	
    	$('#set-widget').on('click', function(e) {
    		e.preventDefault();
    		
    		// запрос установки виджета
    		// типы виджетов можно глянуть тут https://vk.com/dev/objects/appWidget
    		// как подключить виджет можно глянуть тут https://vk.com/dev/apps_widgets
    		VK.callMethod('showAppWidgetPreviewBox', 'text', 'return {' + 
    			'"title": "Цитата",' + 
    			'"text": "Текст цитаты"' + 
    		'};');
    		
    		// типы событий, генерируемых после выполнения запроса на установку виджета можно глянуть тут https://vk.com/dev/apps_widgets
    		// работа с событиями вк https://vk.com/dev/Javascript_SDK?f=4.1.+VK.addCallback
    		VK.addCallback('onAppWidgetPreviewSuccess', function f(data){ 
    			alert("Виджет успешно добавлен"); 
    		});
    	});	
    	
    });


    После создания данных страниц у вас появится возмжность создать ключ (который будет доступен из управления сообществом) и создание простого виджета

    Серверную часть я полностью описывать не буду и покажу только само тело запроса, главное запросить данные через culr по ссылке https://api.vk.com/method/ (Вот гайд)

    Сам запрос:
    $api = new \App\Api\Main\Vk(['access_token' => 'ключ_корый_мы_сгенерировали_первой_кнопкой']);
        $api->request(
            'appWidgets.update',
            [
                'type' => 'list',
                'code' => '
                    var users = API.users.get({"user_ids": [11111, 22222, 33333]});
                    
                    return { 
                      "title": "Конкурс за призы", 
                      "rows": [
                                  { 
                                      "title": users[0].first_name + " " + users[0].last_name, 
                                      "icon_id": "id11111",
                                      "descr" : "1 место - 2000 баллов",
                                      "button" : "Результаты конкурса",
                                      "button_url" : "https://vk.com/link"
                                  },
                                  { 
                                      "title": users[1].first_name + " " + users[1].last_name, 
                                      "icon_id": "id2222",
                                      "descr" : "2 место - 1890 баллов",
                                      "button" : "Правила и призы",
                                      "button_url" : "https://vk.com/link"
                                  },
                                  { 
                                      "title": users[2].first_name + " " + users[2].last_name, 
                                      "icon_id": "id22222",
                                      "descr" : "3 место - 1890 баллов",
                                      "button" : "Хочу на марафон",
                                      "button_url" : "https://vk.com/link"
                                  }
                             ]
                };'
            ]
        );


    Подробности о теле запроса можно узнать тут
    А как его правильно писать - тут

    Вышенаписанный php код можно добавить в крон, автоматизировать и наслаждаться жизнью. И на последок - вот пример рабочего кода в сообществе (сорян за стили, и некоторые замазанные части, мне лень было делать нормальный скрин):
    5a9e7f04c5275110898228.png
    Ответ написан
    5 комментариев
  • Как удалить запись из таблицы, на которую есть ссылка?

    @Gesparo
    Fullstack разработчик
    Трудно ответить на такой вопрос, так как мало данных. Но ошибка явно во внешних ключах. Как то они неправильно настроены. Имеет смысл открыть схему структуры бд через mysql workbanch и детально во всем разобраться. Так же хочу обратить внимание на то, что там вываливается не просто ошибка, а конкретно какая то ошибка, с кодом и описанием проблемы. И стоит в ней для начала разобраться, это поможет выявить из за чего появляется конфликт.
    Ответ написан
    Комментировать
  • Как сверстать этот блок по БЭМ?

    @Gesparo
    Fullstack разработчик
    Я конечно не гуру, но думаю такой вариант будет гораздо лучше
    https://yadi.sk/i/xU5MGBe13EBqjL

    И скорей всего Вам нужно будет верстать 3 разных блока, они конечно похожи друг на друга, но уж слишком они отличаются. Можно конечно, всё сделать одним блоком, но мне кажется- получиться какая то каша.
    Ответ написан
    Комментировать
  • Как вставить в echo ' ' html элемент с содержимым php?

    @Gesparo
    Fullstack разработчик
    echo "<p class='user'>{$rowOpinion['username']}</p>";

    либо, если двойные кавычки важны в class
    echo "<p class=\"user\">{$rowOpinion['username']}</p>";
    Ответ написан
    Комментировать
  • Что не так в сравнении?

    @Gesparo
    Fullstack разработчик
    Может быть проблема в разных кодировках? Возможно в форму приходит windows-1251, а на сервере всё в uft-8
    Попробуйте сравнивать через strcmp
    php.net/manual/ru/function.strcmp.php

    Если это не поможет попробуйте перекодировать в uft-8 $login
    php.net/manual/ru/function.iconv.php
    Ответ написан
    Комментировать
  • Как отсортировать выборку?

    @Gesparo
    Fullstack разработчик
    Для сортировки такой выборки используйте ORDER BY owner. Если еще надо будет в обратном порядке то прибавьте еще команду DESC.

    Вот статья поподробней:
    www.w3schools.com/sql/sql_orderby.asp
    Ответ написан
    Комментировать