1

I create a custom shipping plugin for Virtuemart-3 . it installed successfully. but its config fields are not showing.

Here are my fedex.xml file

    <?xml version="1.0" encoding="UTF-8" ?>
<extension version="2.5" type="plugin" group="vmshipment" method="upgrade">
    <name>Fedex</name>
    <creationDate>March 11 2015</creationDate>
    <author>example</author>
    <authorUrl>http://www.example.net</authorUrl>
    <copyright>.</copyright>
    <license>Commercial</license>
    <version>1</version>
    <description>FedEx Shipping</description>

    <files>
        <filename plugin="fedex">fedex.php</filename>
        <folder>live</folder>
        <folder>nusoap</folder>
        <folder>wsdl</folder>
    </files>
    <vmconfig>
        <fields addpath="/administrator/components/com_virtuemart/elements">
            <field type="vmjpluginwarning" />
            <field type="spacer" default="VMSHIPMENT_WEIGHT_COUNTRIES_PLUGIN" level="level1" />
            <field name="fedex_account_number" type="text"   label="FedEx account number" />
            <field name="fedex_access_id" type="text"   label="FedEx access ID"  />
            <field name="fedex_password" type="text"   label="FedEx password"  />
            <field name="fedex_meter_number" type="text"   label="FedEx meter number"  />
            <field name="countries" type="vmcountries"  scope="com_virtuemart" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_COUNTRIES" description="VMSHIPMENT_WEIGHT_COUNTRIES_COUNTRIES_DESC"/>
            <field name="fedex_origin_zip" type="text"   label="Origin  Zip code"  />

            <!--<param name="zip_start" type="text" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_ZIP_START" description="VMSHIPMENT_WEIGHT_COUNTRIES_ZIP_START_DESC"/>
            <param name="zip_stop" type="text" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_ZIP_STOP" description="VMSHIPMENT_WEIGHT_COUNTRIES_ZIP_STOP_DESC"/>
            -->
            <field name="weight_start" type="text" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_START" description="VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_START_DESC"/>
            <field name="weight_stop" type="text" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_STOP" description="VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_STOP_DESC"/>
            <field name="weight_unit" type="vmweightunit" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_UNIT" description="VMSHIPMENT_WEIGHT_COUNTRIES_WEIGHT_UNIT_DESC"/>
            <!--<param name="nbproducts_start" type="text" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_NBPRODUCTS_START" description="VMSHIPMENT_WEIGHT_COUNTRIES_NBPRODUCTS_START_DESC"/>
            <param name="nbproducts_stop" type="text" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_NBPRODUCTS_STOP" description="VMSHIPMENT_WEIGHT_COUNTRIES_NBPRODUCTS_STOP_DESC"/>
            -->

            <field name="orderamount_start" type="text" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_ORDERAMOUNT_START" description="VMSHIPMENT_WEIGHT_COUNTRIES_ORDERAMOUNT_START_DESC"/>
            <field name="orderamount_stop" type="text" size="10" default="" label="VMSHIPMENT_WEIGHT_COUNTRIES_ORDERAMOUNT_STOP" description="VMSHIPMENT_WEIGHT_COUNTRIES_ORDERAMOUNT_STOP_DESC"/>


            <field type="text" default="0" name="shipment_cushion_PRIORITY_OVERNIGHT" label="Shipment Cousion for FedEx Priority Overnight (%)" />
            <field type="text" default="0" name="shipment_cushion_STANDARD_OVERNIGHT" label="Shipment Cousion for FedEx Standard Overnight (%)" />
            <field type="text" default="0" name="shipment_cushion_FEDEX_2_DAY_AM" label="Shipment Cousion for FedEx 2 Day Air AM (%)" />
            <field type="text" default="0" name="shipment_cushion_FEDEX_2_DAY" label="Shipment Cousion for FedEx 2 Day Air (%)" />
            <field type="text" default="0" name="shipment_cushion_FEDEX_EXPRESS_SAVER" label="Shipment Cousion for FedEx Express Saver (%)" />
            <field type="text" default="0" name="shipment_cushion_FEDEX_GROUND" label="Shipment Cousion for FedEx Ground (%)" />
            <field type="text" default="0" name="shipment_cushion_PRIORITY_GROUND_HOME_DELIVERY" label="Shipment Cousion for FedEx Ground Home Delivery (%)" />

            <!--
            <param name="cost" type="text"   label="VMSHIPMENT_WEIGHT_COUNTRIES_COST" description="VMSHIPMENT_WEIGHT_COUNTRIES_COST_DESC" />
            <param name="package_fee" type="text"   label="VMSHIPMENT_WEIGHT_COUNTRIES_PACKAGE_FEE" description="VMSHIPMENT_WEIGHT_COUNTRIES_PACKAGE_FEE_DESC" />
            <param name="tax_id" type="vmtaxes" scope="com_virtuemart"  label="VMSHIPMENT_WEIGHT_COUNTRIES_TAX" description="VMSHIPMENT_WEIGHT_COUNTRIES_TAX_DESC" />
            <param name="free_shipment" type="text"    label="VMSHIPMENT_WEIGHT_COUNTRIES_FREE_SHIPPING_AMOUNT" description="VMSHIPMENT_WEIGHT_COUNTRIES_FREE_SHIPPING_AMOUNT_DESC" />-->

        </fields>
    </vmconfig>

    <updateservers>
        <!-- Note: No spaces or linebreaks allowed between the server tags -->
        <server type="extension" name="VirtueMart3 plg_vmshipment_fedex Update Site"><![CDATA[http://virtuemart.net/releases/vm3/plg_vmshipment_weight_countries_update.xml]]></server>
    </updateservers>
</extension>

and my fedex.php is

if (!class_exists('vmPSPlugin')) {
    require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php');
}
require_once('ratelib.php');

class plgVmShipmentFedex extends vmPSPlugin {

    // instance of class
    public static $_this = FALSE;
    public static $_fcc = 1;
    public $methods_rates = array();

    function __construct(& $subject, $config) {

        parent::__construct($subject, $config);

        $this->_loggable = TRUE;
        $this->_tablepkey = 'id';
        $this->_tableId = 'id';
        $this->tableFields = array_keys($this->getTableSQLFields());
        $varsToPush = $this->getVarsToPush();

         $this->setConfigParameterable($this->_configTableFieldName, $varsToPush);
        //vmdebug('Muh constructed plgVmShipmentWeight_countries',$varsToPush);
    }

    public function getVmPluginCreateTableSQL() {

        return $this->createTableSQL('Shipment Fedex Table');
    }

    function getTableSQLFields() {

        $SQLfields = array(
            'id' => 'int(1) UNSIGNED NOT NULL AUTO_INCREMENT',
            'virtuemart_order_id' => 'int(11) UNSIGNED',
            'order_number' => 'char(32)',
            'virtuemart_shipmentmethod_id' => 'mediumint(1) UNSIGNED',
            'shipment_name' => 'varchar(5000)',
            'order_weight' => 'decimal(10,4)',
            'shipment_weight_unit' => 'char(3) DEFAULT \'KG\'',
            'shipment_cost' => 'decimal(10,2)',
            'shipment_package_fee' => 'decimal(10,2)',
            'tax_id' => 'smallint(1)'
        );
        return $SQLfields;
    }

    public function plgVmOnShowOrderFEShipment($virtuemart_order_id, $virtuemart_shipmentmethod_id, &$shipment_name) {

        $this->onShowOrderFE($virtuemart_order_id, $virtuemart_shipmentmethod_id, $shipment_name);
    }

    function plgVmConfirmedOrder(VirtueMartCart $cart, $order) {

        if (!($method = $this->getVmPluginMethod($order['details']['BT']->virtuemart_shipmentmethod_id))) {
            return NULL; // Another method was selected, do nothing
        }
        if (!$this->selectedThisElement($method->shipment_element)) {
            return FALSE;
        }
        $values['virtuemart_order_id'] = $order['details']['BT']->virtuemart_order_id;
        $values['order_number'] = $order['details']['BT']->order_number;
        $values['virtuemart_shipmentmethod_id'] = $order['details']['BT']->virtuemart_shipmentmethod_id;
        $values['shipment_name'] = $this->renderPluginName($method);
        $values['order_weight'] = $this->getOrderWeight($cart, $method->weight_unit);
        $values['shipment_weight_unit'] = $method->weight_unit;

        $costs = $this->getCosts($cart, $method, $cart->cartPrices);
        if (empty($costs)) {
            $values['shipment_cost'] = 0;
            $values['shipment_package_fee'] = 0;
        } else {
            $values['shipment_cost'] = $method->shipment_cost;
            $values['shipment_package_fee'] = $method->package_fee;
        }

        $values['tax_id'] = $method->tax_id;
        $this->storePSPluginInternalData($values);

        return TRUE;
    }

    public function plgVmOnShowOrderBEShipment($virtuemart_order_id, $virtuemart_shipmentmethod_id) {

        if (!($this->selectedThisByMethodId($virtuemart_shipmentmethod_id))) {
            return NULL;
        }
        $html = $this->getOrderShipmentHtml($virtuemart_order_id);
        return $html;
    }

    function getOrderShipmentHtml($virtuemart_order_id) {

        $db = JFactory::getDBO();
        $q = 'SELECT * FROM `' . $this->_tablename . '` '
                . 'WHERE `virtuemart_order_id` = ' . $virtuemart_order_id;
        $db->setQuery($q);
        if (!($shipinfo = $db->loadObject())) {
            vmWarn(500, $q . " " . $db->getErrorMsg());
            return '';
        }

        if (!class_exists('CurrencyDisplay')) {
            require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php');
        }

        $currency = CurrencyDisplay::getInstance();
        $tax = ShopFunctions::getTaxByID($shipinfo->tax_id);
        $taxDisplay = is_array($tax) ? $tax['calc_value'] . ' ' . $tax['calc_value_mathop'] : $shipinfo->tax_id;
        $taxDisplay = ($taxDisplay == -1) ? JText::_('COM_VIRTUEMART_PRODUCT_TAX_NONE') : $taxDisplay;

        $html = '<table class="adminlist table">' . "\n";
        $html .= $this->getHtmlHeaderBE();
        $html .= $this->getHtmlRowBE('WEIGHT_COUNTRIES_SHIPPING_NAME', $shipinfo->shipment_name);
        $html .= $this->getHtmlRowBE('WEIGHT_COUNTRIES_WEIGHT', $shipinfo->order_weight . ' ' . ShopFunctions::renderWeightUnit($shipinfo->shipment_weight_unit));
        $html .= $this->getHtmlRowBE('WEIGHT_COUNTRIES_COST', $currency->priceDisplay($shipinfo->shipment_cost));
        $html .= $this->getHtmlRowBE('WEIGHT_COUNTRIES_PACKAGE_FEE', $currency->priceDisplay($shipinfo->shipment_package_fee));
        $html .= $this->getHtmlRowBE('WEIGHT_COUNTRIES_TAX', $taxDisplay);
        $html .= '</table>' . "\n";

        return $html;
    }

    function getPackagesStats(VirtueMartCart $cart) {
        $arrBins = array('5x5x4', '8x8x8', '8x8x16', '12x12x10', '12x12x12', '12x12x18', '13x18x24');
        $arr_itmes = $arr_bins = $arr_weight = $array_packages = array();

        if (is_array($cart->products)) {
            foreach ($arrBins as $string) {
                list($l, $w, $h) = explode('x', $string);
                $arr_bins[] = array('w' => $w, 'h' => $h, 'd' => $l, 'id' => str_replace('x', '-', $string));
            }

            foreach ($cart->products as $product) {
                $arr_itmes[$product->virtuemart_product_id] = array("w" => $product->product_width, "h" => $product->product_height, "d" => $product->product_length, "q" => $arr_itmes[$product->virtuemart_product_id]['q'] + $product->quantity, "vr" => 1, "id" => $product->virtuemart_product_id);
                $arr_weight[$product->virtuemart_product_id] = $product->product_weight;
            }

            $query = array(
                'items' => array_values($arr_itmes),
                'bins' => $arr_bins,


                'params' => array('images_width' => 250, 'images_height' => 250, 'item_coordinates' => 0, 'stats' => 0, 'images_sbs' => 0, 'images_separated' => 0, 'images_complete' => 0)
            );

            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, 'query=' . json_encode($query));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . "/us-east.api.3dbinpacking.com.pem");
            $resp = curl_exec($ch);

            if (curl_errno($ch) == 0) {

                $data = json_decode($resp, true);

                if (isset($data['response'])) {
                    $response = &$data['response'];
                    if (empty($response['errors'])) {

                        foreach ($response['bins_packed'] as $bin_key => $bin) {
                            if (!isset($array_packages[$bin['bin_data']['id']])) {
                                list($l, $w, $h) = explode('-', $bin['bin_data']['id']);
                                $array_packages[$bin_key] = array('size' => array('l' => $l, 'w' => $w, 'h' => $h), 'weight' => 0);
                            }
                            // read item packed into this bin
                            $current_bin = &$array_packages[$bin_key];

                            foreach ($bin['items'] as $item) {
                                $current_bin['weight'] = $current_bin['weight'] + $arr_weight[$item['id']];
                            }
                        }
                    } else {
                        JError::raiseWarning('500', 'Shipping error.' . implode($response['errors']));
                        return false;
                    }
                }

                return $array_packages;
            } else {

                //vmWarn(500, $q . " " . 'Unable to calculate shipping, Try again later.'.curl_error($ch));
                JError::raiseWarning('500', 'Unable to calculate shipping, Try again later.' . curl_error($ch));
                return false;
            }
            curl_close($ch);
        } else {
            return $array_packages;
        }
    }



    function modify_residential_array(&$arrRes, $arrComm) {
        $flatRate = $this->getPriceInDeliverMethodArray('FEDEX_GROUND', $arrComm);
        // update price
        $arrRes = $this->setPriceInDeliverMethodArray('GROUND_HOME_DELIVERY', $flatRate + 2, $arrRes);
    }

    function setPriceInDeliverMethodArray($code, $price, $delivery_methods) {
        if (is_array($delivery_methods) && count($delivery_methods) > 0)
            foreach ($delivery_methods as &$shipping_methods) {
                if ($shipping_methods['code'] == $code)
                    $shipping_methods['price'] = $price;
            }
        return $delivery_methods;
    }

    function getPriceInDeliverMethodArray($code, $delivery_methods) {
        foreach ($delivery_methods as &$shipping_methods) {
            if ($shipping_methods['code'] == $code)
                return $shipping_methods['price'];
        }
        return 0;
    }

    function get_saved_rates() {

        return $this->methods_rates;
    }



    protected function checkConditions($cart, $method, $cart_prices) {

        $this->convert($method);

        $orderWeight = $this->getOrderWeight($cart, $method->weight_unit);
        $address = (($cart->ST == 0) ? $cart->BT : $cart->ST);

        $countries = array();
        if (!empty($method->countries)) {
            if (!is_array($method->countries)) {
                $countries[0] = $method->countries;
            } else {
                $countries = $method->countries;
            }
        }

        if (!is_array($address)) {

            $address = array();
            $address['zip'] = 0;
            $address['virtuemart_country_id'] = 0;
        }

        $weight_cond = $this->_weightCond($orderWeight, $method);
        $nbproducts_cond = $this->_nbproductsCond($cart, $method);
        $orderamount_cond = $this->_orderamountCond($cart_prices, $method);

        if (!isset($address['zip'])) {
            $address['zip'] = 0;
        }

        $zip_cond = $this->_zipCond($address['zip'], $method);

        if (!isset($address['virtuemart_country_id'])) {
            $address['virtuemart_country_id'] = 0;
        }

        if (in_array($address['virtuemart_country_id'], $countries) || count($countries) == 0) {

            //vmdebug('checkConditions '.$method->name.' fit ',$weight_cond,(int)$zip_cond,$nbproducts_cond,$orderamount_cond);

            $allconditions = (int) $weight_cond + (int) $zip_cond + (int) $nbproducts_cond + (int) $orderamount_cond;
            if ($allconditions === 4) {
                return TRUE;
            } else {
                return FALSE;
            }
        }
        vmdebug('checkConditions ' . $method->name . ' does not fit');
        return FALSE;
    }

    function convert(&$method) {

        //$method->weight_start = (float) $method->weight_start;
        //$method->weight_stop = (float) $method->weight_stop;
        $method->orderamount_start = (float) $method->orderamount_start;
        $method->orderamount_stop = (float) $method->orderamount_stop;
        $method->zip_start = (int) $method->zip_start;
        $method->zip_stop = (int) $method->zip_stop;
        $method->nbproducts_start = (int) $method->nbproducts_start;
        $method->nbproducts_stop = (int) $method->nbproducts_stop;
        $method->free_shipment = (float) $method->free_shipment;
    }

    private function _weightCond($orderWeight, $method) {

        $weight_cond = (($orderWeight >= $method->weight_start AND $orderWeight <= $method->weight_stop) OR
                ($method->weight_start <= $orderWeight AND $method->weight_stop === ''));

        return $weight_cond;
    }

    private function _nbproductsCond($cart, $method) {

        $nbproducts = 0;
        foreach ($cart->products as $product) {
            $nbproducts += $product->quantity;
        }
        if (!isset($method->nbproducts_start) and !isset($method->nbproducts_stop)) {
            return true;
        }
        if ($nbproducts) {
            $nbproducts_cond = ($nbproducts >= $method->nbproducts_start AND $nbproducts <= $method->nbproducts_stop OR
                    ($method->nbproducts_start <= $nbproducts AND ($method->nbproducts_stop == 0)));
        } else {
            $nbproducts_cond = true;
        }
        return $nbproducts_cond;
    }

    private function _orderamountCond($cart_prices, $method) {

        if (!isset($method->orderamount_start) AND !isset($method->orderamount_stop)) {
            return true;
        }
        if ($cart_prices['salesPrice']) {
            $orderamount_cond = ($cart_prices['salesPrice'] >= $method->orderamount_start AND $cart_prices['salesPrice'] <= $method->orderamount_stop OR
                    ($method->orderamount_start <= $cart_prices['salesPrice'] AND ($method->orderamount_stop == 0)));
        } else {
            $orderamount_cond = true;
        }

        return $orderamount_cond;
    }

    private function _zipCond($zip, $method) {

        $zip = (int) $zip;
        $zip_cond = true;
        if (!empty($zip)) {

            if (!empty($method->zip_start) and !empty($method->zip_stop)) {
                $zip_cond = (($zip >= $method->zip_start AND $zip <= $method->zip_stop));
            } else if (!empty($method->zip_start)) {
                $zip_cond = ($zip >= $method->zip_start);
            } else if (!empty($method->zip_stop)) {
                $zip_cond = ($zip <= $method->zip_stop);
            }
        } else if (!empty($method->zip_start) or !empty($method->zip_stop)) {
            $zip_cond = false;
        }

        return $zip_cond;
    }

    function plgVmOnStoreInstallShipmentPluginTable($jplugin_id) {

        return $this->onStoreInstallPluginTable($jplugin_id);
    }

    public function plgVmOnSelectCheckShipment(VirtueMartCart &$cart) {

        return $this->OnSelectCheck($cart);
    }

    public function plgVmDisplayListFEShipment(VirtueMartCart $cart, $selected = 0, &$htmlIn) {

        return $this->displayListFE($cart, $selected, $htmlIn);
    }

    public function plgVmOnSelectedCalculatePriceShipment(VirtueMartCart $cart, array &$cart_prices, &$cart_prices_name) {

        return $this->onSelectedCalculatePrice($cart, $cart_prices, $cart_prices_name);
    }


    function plgVmOnCheckAutomaticSelectedShipment(VirtueMartCart $cart, array $cart_prices = array(), &$shipCounter) {

        if ($shipCounter > 1) {
            return 0;
        }
        return $this->onCheckAutomaticSelected($cart, $cart_prices, $shipCounter);
    }


    function plgVmonShowOrderPrint($order_number, $method_id) {

        return $this->onShowOrderPrint($order_number, $method_id);
    }

       function plgVmDeclarePluginParamsShipment($name, $id, &$data) {

        return $this->declarePluginParams('shipment', $name, $id, $data);
    }

    function plgVmDeclarePluginParamsShipmentVM3(&$data) {
        return $this->declarePluginParams('shipment', $data);
    }

    function plgVmSetOnTablePluginParamsShipment($name, $id, &$table) {

        return $this->setOnTablePluginParams($name, $id, $table);
    }

    function plgVmGetTablePluginParams($psType, $name, $id, &$xParams, &$varsToPush) {
        return $this->getTablePluginParams($psType, $name, $id, $xParams, $varsToPush);
    }

}

I have removed some function because of the length of the file Please help me in this. Thanks

1 Answer 1

1

You need to change the config tags from:

<vmconfig>

to:

<config>

As this is what Joomla uses. The tags you are currently using must be something for VirtueMarts' own extensions, but seeing as yours is 3rd party, they won't work.

You're also missing the name on the fields tag and the actual fieldset tag.

You should be using:

<config>
    <fields name="params">
        <fieldset name="basic" addfieldpath="/administrator/components/com_virtuemart/elements">

            <field name="fedex_account_number" type="text" label="FedEx account number" />
            // REST OF FIELDS

        </fieldset>
    </fields>
</config>

You should also be using addfieldpath instead of addpath and applying it to your fieldset.

5
  • I already changed...
    – urfusion
    Mar 11, 2015 at 10:27
  • @urfusion - I've updated my answer
    – Lodder
    Mar 11, 2015 at 10:29
  • @urfusion - another update
    – Lodder
    Mar 11, 2015 at 10:33
  • @urfusion - Glad you got it working :) please accept the answer to mark it as solved
    – Lodder
    Mar 11, 2015 at 10:34
  • sure , Please wait for 3 mins. :)
    – urfusion
    Mar 11, 2015 at 10:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.