I'm trying to create a new Plugin to update an existing table rainlab_blog_categories
by adding a new order
column.
I managed to update the view with a new field, however I'm not able to update the DB successfully.
I used the CLI php artisan create:plugin ZiedHf.BlogSorting
to scaffold the Plugin skeleton.
The files below are : Plugin.php and file inder the updates directory.
It looks like the second one does not run up
method to update the DB.
Plugin.php :
<?php namespace ZiedHf\BlogSorting;
use Backend;
use System\Classes\PluginBase;
use RainLab\Blog\Models\Category as CategoryModel;
use RainLab\Blog\Controllers\Categories as CategoriesController;
/**
* BlogSorting Plugin Information File
*/
class Plugin extends PluginBase
{
const DEFAULT_ICON = 'icon-magic';
// const LOCALIZATION_KEY = 'ziedhf.blogsorting::lang.';
const DB_PREFIX = 'ziedhf_blogsorting_';
public $require = [
'RainLab.Blog'
];
/**
* Returns information about this plugin.
*
* @return array
*/
public function pluginDetails()
{
return [
'name' => 'Blog Sorting',
'description' => 'Enhance sorting for Blog',
'author' => 'Zied Hf',
'icon' => 'icon-leaf',
'homepage' => 'https://github.com/ziedhf/helloTunisia'
];
}
/**
* Boot method, called right before the request route.
*
* @return array
*/
public function boot()
{
$this->extendController();
$this->extendModel();
}
/**
* Extend Categories controller
*/
private function extendController()
{
CategoriesController::extendFormFields(function ($form, $model) {
if (!$model instanceof CategoryModel) {
return;
}
$form->addFields([
self::DB_PREFIX . 'order' => [
'label' => 'Order',
'type' => 'number',
'comment' => 'Set the order here',
'allowEmpty' => true,
'span' => 'left'
]
]);
});
}
/**
* Extend Category model
*/
private function extendModel()
{
CategoryModel::extend(function ($model) {
$model->addDynamicMethod('getBlogSortingOrderAttribute', function() use ($model) {
return $model->{self::DB_PREFIX . 'order'};
});
});
}
}
create_blog_sorting.php file :
<?php
namespace ZiedHf\BlogSorting\Updates;
use Schema;
use System\Classes\PluginManager;
use ZiedHf\BlogSorting\Plugin;
use October\Rain\Database\Updates\Migration;
/**
* Class CreateBlogSorting
*
* @package ZiedHf\BlogSorting\Updates
*/
class CreateBlogSorting extends Migration
{
const TABLE = 'rainlab_blog_categories';
/**
* Execute migrations
*/
public function up()
{
if (PluginManager::instance()->hasPlugin('RainLab.Blog')) {
$this->createFields();
}
}
/**
* Rollback migrations
*/
public function down()
{
if (PluginManager::instance()->hasPlugin('RainLab.Blog')) {
$this->dropFields();
}
}
/**
* Remove new fields
*/
private function dropFields()
{
$this->dropColumn(Plugin::DB_PREFIX . 'order');
}
/**
* Create new fields
*/
private function createFields()
{
if (!Schema::hasColumn(self::TABLE, Plugin::DB_PREFIX . 'order')) {
Schema::table(self::TABLE, function ($table) {
$table->integer(Plugin::DB_PREFIX . 'order')->nullable();
});
}
}
/**
* @param string $column
*/
private function dropColumn(string $column)
{
if (Schema::hasColumn(self::TABLE, $column)) {
Schema::table(self::TABLE, function ($table) use ($column) {
$table->dropColumn($column);
});
}
}
}
What is the appropriate way to do this ?
What is missing to execute the migration correctly ? The file under updates/ was just ignored each time I run php artisan plugin:refresh ZiedHf.Blogsorting
or php artisan october:up
[SOLVED] Update : The problem was in the version.yaml file. It should contain the update file name :
1.0.1:
- First version of BlogSorting
- create_blog_sorting.php
Thanks !
Plugin has updates\version.yaml
file which will track all the database updates for plugins.
So make sure
your file name [create_blog_sorting.php]
is insideupdates\version.yaml
, thenrefresh plugin
it should add changes of migration file to database in your case it will add column :)
1.0.1:
- First version of BlogSorting
- create_blog_sorting.php <- this one :)
It should work :), make sure
class name
will be inCamelCase [ CreateBlogSorting ]
.File name and entry
inupdates\version.yaml
will be insnake_case [create_blog_sorting.php]