Собираюсь использовать элементы Webix в Yii2. В частности хочу сделать так, чтобы по клику мыши можно было редактировать таблицу (datatable).
Встраивается всё это дело достаточно просто: подключаю в header js и css, и, если прописать данные (data) вручную - всё работает. Но как подтянуть данные из MySQL, а после редактирования еще и сохранить их - не могу понять (
На оффсайте написано: "Виджеты Webix поддерживают несколько вариантов интеграции с серверным кодом: возможность использования REST API с компонентами библиотеки, а также любого MVC фреймворка (MVC.Net, Ruby на Rails, Yii и др.)".
Если правильно понимаю - нужно конвертировать выбранную таблицу из БД в json.
Делаю так:
$data = self::find()->all();
$datatable = json_encode($data, JSON_UNESCAPED_UNICODE);
но на выходе получаю: [{},{},{},{}]
И как потом отредактированные поля сохранять в БД?
Этот assets лишь js и css файлы подключает к проекту, это я и без него могу сделать. У меня больше вопрос - как корректно подгрузить данные в webix из MySQL и чтобы при редактировании ячейки данные сохранялись в БД. Уже четвертый день над этим бьюсь - никак не получается, хотя уверен, что всё должно достаточно просто решаться.
P.S. Только начал изучать этот фреймворк, поэтому достаточно сложно разбираюсь в структуре и коде =( Попутно повышаю скил в php, читаю документацию, смотрю лекции, курю форумы, но всё равно тяжело.
Спасибо за подсказку! Если руководствоваться данным материалом, при обращении к контроллеру, браузер получает и выводит на экран! уже готовый json, но при этом я не могу отобразить нужный мне вид (view), actionIndex() в ActiveController почему-то не работает (
Сергей Кулагин: не понимаю, как Вы планируете получить Json c помощью return $this->render('index'); ? Но если надо получить html через ajax, то надо return $this->renderAjax('index');
Максим Тимофеев:
son, как я понял, возвращает API, при переопределении переменной $modelClass.
Вот код контроллера (в моделе только лишь обращение к таблице):
namespace frontend\controllers;
use Yii;
use frontend\models\Books;
use yii\rest\ActiveController;
class BooksController extends ActiveController
{
public $modelClass = 'frontend\models\Books';
public function actionIndex()
{
return $this->renderAjax('index');
}
}
Все равно на станице сайта site.local/books вижу не view, а xml/json дерево таблицы из БД с фразой: "С этим XML-файлом не связана ни одна таблица стилей. Ниже показано дерево элементов".
Вот если наследоваться не от ActiveController, а от Controller, то view' нормально отображает нужную страницу, но тогда возвращаемся к вопросу - как конвертировать данные для js таблиц из БД в json, а после их редактирования сохранить обратно..
Сергей Кулагин: Надо иметь 2 контролера, 1 - унаследован от ActiveController и реализует REST, отдавая данные, другой - унаследован Controller и возвращает рендер. Либо иметь 1 унаследованый от Controller, но тогда в action будет приблизительно следующее:
public function actionData()
{
$model = frontend\models\Books::find()->all();
$data = yii\helpers\Json::encode($model);
return $data;
}
public function actionRender()
{
return $this->renderAjax('index');
}
Максим Тимофеев: Спасибо большое за пример! Попробую использовать этот код сегодня вечером. Пока искал решение - наткнулся в сети на похожий вопрос, где как раз используются разные контролер. В папке Controller лежит контроллер для view (для отображение html), а в подпапке Controller/Rest - АктивКонтроллер для api. Вот только как правильно прописать маршруты для этого решения - не знаю. Уже всю голову сломал - но либо одно не работает, либо другое, либо все вместе не работает..
Максим Тимофеев: Спасибо за помощь!!! Ваш вариант выше работает! ) теперь буду биться, чтобы crud реализовать.
С подпапкой мне кажется будет проще реализовать функционал, т.к. имена контроллеров будут одинаковые - к ним можно обращаться по одному и тому же имени, в противном случае придется создавать кучу новых файлов с разными именами.. Есть еще внутреннее ощущение, что можно обойтись и вовсе одним файлом и без подпапок. Но тут могу ошибаться.
Сергей Кулагин: Я бы сделал ApiController и SiteControler, в чем необходимость называть их по разному? Если Вам надо по одному запросу получать и обычный рендер и json данные, но все стандартно, только данные в json:
public function actionIndex()
{
$model = frontend\models\Books::find()->all();
$data = yii\helpers\Json::encode($model);
return $this->render('index',['data'=>$data]);
}
Это в SiteControler, а ApiController для ajax запросов, если надо.
Максим Тимофеев: Я так понимаю, под каждый раздел нужно создавать свой контроллер (для книг BookController, для чашек - CupController), чтобы в браузере иметь возможность к ним обратиться.
Максим Тимофеев: Иногда стоит есть смысл делать модуль, в нем контроллеры, в нем экшены. Прелесть yii2 в гибкости. Все можно решить многими способами. Иногда они равнозначны иногда тот или иной удобней. В процессе изучения Вы начнете видеть разницу и понимать оправданность того или иного метода.
Максим, спасибо Вам большое за помощь! Пытаюсь что-то типа Do-листа/CRM написать, в виде редактируемых таблиц. Попробую почитать документацию про модели - может действительно, в моем случае лучше будет их использовать.