Jump to content

Adding column on Plugin Install not working


guyroch

Recommended Posts

I'm trying to add a database column when installing a custom plugin and it is not working.  

I get no errors when installing the plugin yet the database column is not added.

This is my install.php class for the plugin (see step1 method).  Is the double // on the first line okay?  That was already there.

//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * Install Code
 */
class ips_plugins_setup_install
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		\IPS\Db::i()->addColumn( 'nexus_packages', array(
			'name'		=> 'p_sku',
			'type'		=> 'varchar',
			'length'	=> 25,
			'null'		=> FALSE,
			'default'	=> '',
			'comment'	=> 'Product SKU code'
		) );		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}

   
 

 

Link to comment
Share on other sites

10 hours ago, guyroch said:

anyone?

Next time you better request development support here: https://invisionpower.com/forums/forum/238-development-assistance/. You surely will get faster replies.

There's nothing wrong in your script. I can only image that you didn't add a version to it: 1.0.0. This will only works when you create a version.

Btw, don't forget to drop that column when you uninstall the plugin. Not sure if you aware, but create a file called "uninstall.php" in the root of your plugin folder (same place of settings.php) with the content:

<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

try
{
	\IPS\Db::i()->dropColumn( 'nexus_packages', 'p_sku' );
}
catch( \IPS\Db\Exception $e )
{
	/* Ignore "Cannot drop because it does not exist" */
	if( $e->getCode() <> 1091 )
	{
		throw $e;
	}
}

 

Link to comment
Share on other sites

Thank you very much for the reply.

You are correct, I omitted the version in the plug in.  I'll try that and then come back to confirm.

Oh, and thank you for the link for development support.  I'll go there from now on... didn't know about it.

Regards,

Guylain

Link to comment
Share on other sites

On 07/01/2017 at 5:28 PM, guyroch said:

Okay, adding the version in the plugin did work, the column is created.  However...


'null'		=> FALSE,

...did not work... the field is nullable albeit the default value did work.

Thanks again.

I ran you script in a tandon pho file from the suite and column was created. No issue found. 

Link to comment
Share on other sites

Thanks for trying it.  I still get a nullable column.  Not a big issue for now.

I was able to add a few front-end hooks to display the sku field in the front end and it works like a charm.

The issue I have now is where to add the field in ACP package forms to enter a SKU alongside the other standard package fields.  I need a way to populate this field from ACP packages.

Thanks.

 

Link to comment
Share on other sites

2 hours ago, guyroch said:

The issue I have now is where to add the field in ACP package forms to enter a SKU alongside the other standard package fields.  I need a way to populate this field from ACP packages.

You have to create to hook to extend the form of the proper class to add your field.

See an example of extending form: 

 

Link to comment
Share on other sites

Just now, guyroch said:

Thanks, that is what I'm trying to do right now... but finding the correct class to extend is a bit overwhelming due to sparse documentation.

What would this community do without you?  Thanks again, I really appreciate it.

Guylain

I can't help now, using a mobile device. Tomorrow in the morning I'll show an easy way to identify the class and how to extend the class.

Btw, it's the namespace without the .php in file name. So it would be something like: IPS\nexus\package\Package

Something like that. Nit sure without see the files.

Link to comment
Share on other sites

Hook to \IPS\nexus\Package class.

	/* !ACP Package Form */
	
	/**
	 * [Node] Add/Edit Form
	 *
	 * @param	\IPS\Helpers\Form	$form	The form
	 * @return	void
	 */
	public function form( &$form )
	{
		$return = parent::form( $form );
		$form->add( new \IPS\Helpers\Form\Text( 'new_field', NULL , FALSE ) );
		return $return;
	}

That will add the new_field in the end of the form:

Capturar_PNG.png

If you want it after a specific field, then just pass the field as a parameter before the last ) in your field.

As a new tab:

	/* !ACP Package Form */
	
	/**
	 * [Node] Add/Edit Form
	 *
	 * @param	\IPS\Helpers\Form	$form	The form
	 * @return	void
	 */
	public function form( &$form )
	{
		$return = parent::form( $form );
		$form->addTab( 'new_tab' );
		$form->add( new \IPS\Helpers\Form\Text( 'new_field', NULL, FALSE ) );
		return $return;
	}

Capturar.png

 

Link to comment
Share on other sites

On 1/7/2017 at 2:28 PM, guyroch said:

Okay, adding the version in the plugin did work, the column is created.  However...


'null'		=> FALSE,

...did not work... the field is nullable albeit the default value did work.

Thanks again.

Finally got the nullable column to work.

It's 'allow_null', not 'null'

'allow_null'	=> FALSE,

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...