Search code examples
phpcodeignitercodeigniter-2pyrocms

PyroCMS module creation is failing while working with Streams


I'm working in a PyroCMS 2.2.5 module and this is what I'm doing at details.php file:

public function install() {
    $this->dbforge->drop_table( 'payment' );

    $this->load->driver( 'Streams' );

    $this->streams->utilities->remove_namespace( 'payment' );
    if ( $this->db->table_exists( 'data_streams' ) ) {
        $this->db->where( 'stream_namespace', 'payment' )->delete( 'data_streams' );
    }

    $this->install_tables( array(
        'payment' => array(
            'id'            => array(
                'type'           => 'INT',
                'constraint'     => 11,
                'auto_increment' => true,
                'primary'        => true
            ),
            'transactionID' => array(
                'type'       => 'VARCHAR',
                'constraint' => 128
            ),
            'orderTime'     => array(
                'type' => 'TIMESTAMP',
                'null' => false
            ),
            'toReload'      => array(
                'type'       => 'DECIMAL',
                'null'       => false,
                'constraint' => array( 9, 6 ),
                'unsigned'   => false
            ),
            'amt'           => array(
                'type'       => 'DECIMAL',
                'null'       => false,
                'constraint' => array( 9, 6 ),
                'unsigned'   => false
            ),
            'feeAmt'        => array(
                'type'       => 'DECIMAL',
                'null'       => false,
                'constraint' => array( 9, 6 ),
                'unsigned'   => false
            ),
            'currencyCode'  => array(
                'type'       => 'VARCHAR',
                'constraint' => 25
            ),
            'paymentStatus' => array(
                'type'       => 'VARCHAR',
                'constraint' => 25
            ),
            'pendingReason' => array(
                'type' => 'TEXT'
            )
        )
    ) );

    $this->streams->streams->add_stream(
        'lang:payment:streams:payment:name',
        'payment',
        'payment',
        null,
        null
    );

    $this->streams->fields->add_fields( array(
        array(
            'name'         => 'lang:payment:fields:transactionID',
            'slug'         => 'transactionID',
            'namespace'    => 'payment',
            'type'         => 'text',
            'assign'       => 'payment',
            'title_column' => true,
            'required'     => true
        ),
        array(
            'name'         => 'lang:payment:fields:orderTime',
            'slug'         => 'orderTime',
            'namespace'    => 'payment',
            'type'         => 'datetime',
            'extra'        => array( 'storage' => 'unix' ),
            'assign'       => 'payment',
            'title_column' => false,
            'required'     => false,
            'unique'       => false
        ),
        array(
            'name'         => 'lang:payment:fields:toReload',
            'slug'         => 'toReload',
            'namespace'    => 'payment',
            'type'         => 'decimal',
            'extra'        => array( 'decimal_places' => 2 ),
            'assign'       => 'payment',
            'title_column' => false,
            'required'     => true,
            'unique'       => false
        ),
        array(
            'name'         => 'lang:payment:fields:amt',
            'slug'         => 'amt',
            'namespace'    => 'payment',
            'type'         => 'decimal',
            'extra'        => array( 'decimal_places' => 2 ),
            'assign'       => 'payment',
            'title_column' => false,
            'required'     => true,
            'unique'       => false
        ),
        array(
            'name'         => 'lang:payment:fields:feeAmt',
            'slug'         => 'feeAmt',
            'namespace'    => 'payment',
            'type'         => 'decimal',
            'extra'        => array( 'decimal_places' => 2 ),
            'assign'       => 'payment',
            'title_column' => false,
            'required'     => true,
            'unique'       => false
        ),
        array(
            'name'         => 'lang:payment:fields:currencyCode',
            'slug'         => 'currencyCode',
            'namespace'    => 'payment',
            'type'         => 'text',
            'assign'       => 'payment',
            'title_column' => false,
            'required'     => true,
            'unique'       => false
        ),
        array(
            'name'         => 'lang:payment:fields:paymentStatus',
            'slug'         => 'paymentStatus',
            'namespace'    => 'payment',
            'type'         => 'text',
            'assign'       => 'payment',
            'title_column' => false,
            'required'     => true,
            'unique'       => false
        ),
        array(
            'name'         => 'lang:payment:fields:pendingReason',
            'slug'         => 'pendingReason',
            'namespace'    => 'payment',
            'type'         => 'text',
            'assign'       => 'payment',
            'title_column' => false,
            'required'     => false,
            'unique'       => false
        )
    ) );

    $this->db->insert_batch( 'settings',
        array(
            array(
                'slug'        => 'pay-sbx',
                'title'       => 'Activar modo Sandbox?',
                'description' => 'Establece si se usara el modo sbx para pruebas',
                'type'        => 'select',
                'value'       => 1,
                'options'     => '0=No|1=Sí',
                'is_required' => 1,
                'is_gui'      => 1,
                'default'     => 1,
                'module'      => 'payment',
                'order'       => 829
            ),
            array(
                'slug'        => 'paypalFee',
                'title'       => 'Fee PayPal',
                'description' => 'Fee de PayPal',
                'type'        => 'text',
                'value'       => '',
                'options'     => '',
                'is_required' => 1,
                'is_gui'      => 1,
                'default'     => 1,
                'module'      => 'payment',
                'order'       => 828
            ),
            array(
                'slug'        => 'paypalDiscount',
                'title'       => 'Descuento PayPal',
                'description' => 'Descuento de PayPal',
                'type'        => 'text',
                'value'       => '',
                'options'     => '',
                'is_required' => 1,
                'is_gui'      => 1,
                'default'     => 1,
                'module'      => 'payment',
                'order'       => 827
            ),
            array(
                'slug'        => 'pay-application-id-sbx',
                'title'       => 'PayPal Sandbox App ID (*)',
                'description' => 'PayPal Application ID (The application is only required with Adaptive Payments applications. You obtain your application ID but submitting it for approval within your developer account at http://developer.paypal.com. We are using shorthand if/else statements here to set both Sandbox and Production values. Your sbx values go on the left and your live values go on the right. The sbx value included here is a global value provided for developrs to use in the PayPal sbx.)',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 1,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 826
            ),
            array(
                'slug'        => 'pay-application-id-live',
                'title'       => 'PayPal Live App ID',
                'description' => 'PayPal Application ID (The application is only required with Adaptive Payments applications. You obtain your application ID but submitting it for approval within your developer account at http://developer.paypal.com. We are using shorthand if/else statements here to set both Sandbox and Production values. Your sbx values go on the left and your live values go on the right. The sbx value included here is a global value provided for developrs to use in the PayPal sbx.)',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 0,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 815
            ),
            array(
                'slug'        => 'pay-developer-account',
                'title'       => 'PayPal Developer Account Email Address (*)',
                'description' => 'This is the email address that you use to sign in to http://developer.paypal.com',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 1,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 825
            ),
            array(
                'slug'        => 'pay-api_username-sbx',
                'title'       => 'PayPal Username API Credentials (Sandbox) (*)',
                'description' => 'These are your PayPal API credentials for working with the PayPal gateway directly. These are used any time you are using the parent PayPal class within the library. You may obtain these credentials by logging into the following with your PayPal account: https://www.paypal.com/us/cgi-bin/webscr?cmd=_login-api-run',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 1,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 824
            ),
            array(
                'slug'        => 'pay-api_username-live',
                'title'       => 'PayPal Username API Credentials (Live)',
                'description' => 'These are your PayPal API credentials for working with the PayPal gateway directly. These are used any time you are using the parent PayPal class within the library. You may obtain these credentials by logging into the following with your PayPal account: https://www.paypal.com/us/cgi-bin/webscr?cmd=_login-api-run',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 0,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 814
            ),
            array(
                'slug'        => 'pay-api_password-sbx',
                'title'       => 'PayPal Password API Credentials (Sandbox) (*)',
                'description' => 'These are your PayPal API credentials for working with the PayPal gateway directly. These are used any time you are using the parent PayPal class within the library. You may obtain these credentials by logging into the following with your PayPal account: https://www.paypal.com/us/cgi-bin/webscr?cmd=_login-api-run',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 1,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 823
            ),
            array(
                'slug'        => 'pay-api_password-live',
                'title'       => 'PayPal Password API Credentials (Live)',
                'description' => 'These are your PayPal API credentials for working with the PayPal gateway directly. These are used any time you are using the parent PayPal class within the library. You may obtain these credentials by logging into the following with your PayPal account: https://www.paypal.com/us/cgi-bin/webscr?cmd=_login-api-run',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 0,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 813
            ),
            array(
                'slug'        => 'pay-api_signature-sbx',
                'title'       => 'PayPal Signature API Credentials (Sandbox) (*)',
                'description' => 'These are your PayPal API credentials for working with the PayPal gateway directly. These are used any time you are using the parent PayPal class within the library. You may obtain these credentials by logging into the following with your PayPal account: https://www.paypal.com/us/cgi-bin/webscr?cmd=_login-api-run',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 1,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 822
            ),
            array(
                'slug'        => 'pay-api_signature-live',
                'title'       => 'PayPal Signature API Credentials (Live)',
                'description' => 'These are your PayPal API credentials for working with the PayPal gateway directly. These are used any time you are using the parent PayPal class within the library. You may obtain these credentials by logging into the following with your PayPal account: https://www.paypal.com/us/cgi-bin/webscr?cmd=_login-api-run',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 0,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 812
            ),
            array(
                'slug'        => 'pay-rest_client_id-sbx',
                'title'       => 'PayPal REST API Username Credentials (Sandbox) (*)',
                'description' => 'These are the API credentials used for the PayPal REST API. These are used any time you are working with the REST API child class.',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 1,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 819
            ),
            array(
                'slug'        => 'pay-rest_client_id-live',
                'title'       => 'PayPal REST API Username Credentials (Live)',
                'description' => 'These are the API credentials used for the PayPal REST API. These are used any time you are working with the REST API child class.',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 0,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 807
            ),
            array(
                'slug'        => 'pay-rest_client_secret-sbx',
                'title'       => 'PayPal REST API Secret Credentials (Sandbox) (*)',
                'description' => 'These are the API credentials used for the PayPal REST API. These are used any time you are working with the REST API child class.',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 1,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 818
            ),
            array(
                'slug'        => 'pay-rest_client_secret-live',
                'title'       => 'PayPal REST API Secret Credentials (Live)',
                'description' => 'These are the API credentials used for the PayPal REST API. These are used any time you are working with the REST API child class.',
                'type'        => 'text',
                'value'       => '',
                'is_required' => 0,
                'is_gui'      => 1,
                'default'     => '',
                'options'     => '',
                'module'      => 'payment',
                'order'       => 806
            )
        ) );

    return true;
}

public function uninstall() {
    $fieldsToDelete = array(
        'paypalFee',
        'paypalDiscount',
        'pay-sbx',
        'pay-application-id-sbx',
        'pay-application-id-live',
        'pay-developer-account',
        'pay-api_username-sbx',
        'pay-api_username-live',
        'pay-api_password-sbx',
        'pay-api_password-live',
        'pay-api_signature-sbx',
        'pay-api_signature-live',
        'pay-rest_client_id-sbx',
        'pay-rest_client_id-live',
        'pay-rest_client_secret-sbx',
        'pay-rest_client_secret-live'
    );

    $this->db->where_in( 'slug', $fieldsToDelete );
    $this->db->delete( 'settings' );

    $dataFields = array(
        'transactionID',
        'orderTime',
        'toReload',
        'amt',
        'feeAmt',
        'currencyCode',
        'paymentStatus',
        'pendingReason'
    );

    $this->db->where_in( 'field_slug', $dataFields );
    $this->db->delete( 'data_fields' );

    $this->load->driver( 'Streams' );
    $this->streams->utilities->remove_namespace( 'payment' );
    if ( $this->db->table_exists( 'data_streams' ) ) {
        $this->db->where( 'stream_namespace', 'payment' )->delete( 'data_streams' );
    }

    $this->dbforge->drop_table( 'payment' );

    return true;
}

Module, gets apparently installed and uninstalled, but I've notice something missing here and that's the issues I'm running, If I get how streams works then

  • when module gets installed then a new row should appears on data_streams table, right? In my case isn't created, why? Did I miss something? And the opposite when module is uninstalled, right?
  • when module gets installed then some kind of entries should be added to data_field_assignments right? In my case as I'm tell before this isn't happening, again, why? Did I miss something?

Can any give me some help or advice?

PS: Happy end of year to all


Solution

  • Here's a simple boilerplate about how to create a module using streams:

    Assuming a module named my_module

    public function install()
    {
        //Create your stream
        if ( ! $this->streams->streams->add_stream(lang('streams:name'), 'my_module', 'my_module', '', null))
        {
            //Something went wrong so uninstall
            $this->uninstall();
    
            return false;
        }
    
        //Now we have the streams so create the fields
        $fields = array(
            array(
                'name'         => lang('my_module:fields:name'),
                'slug'         => 'my_fields_slug',
                'namespace'    => 'my_module',
                'type'         => 'text',
                'extra'        => array('max_length' => 100),
                'instructions' => lang('my_module:fields:instr:name'),
                'assign'       => 'my_module',
                'title_column' => true,
                'required'     => true,
                'unique'       => true
            ),
            ....
            ....
        );
    
       // Add fields to the stream
       $this->streams->fields->add_fields($fields);
    
       return true;
    }
    
    public function uninstall()
    {
        //remove stream
        $this->streams->utilities->remove_namespace('my_module');
    
        //Drop table, strems do not do that
        $this->dbforge->drop_table('my_module');
    
        return true;
    }
    

    Have a look at this example: https://github.com/pyrocms/streams-enabled-module-sample