Maison  >  Article  >  interface Web  >  Tutoriel OpenCart : Personnalisation des méthodes d'expédition (Partie 1)

Tutoriel OpenCart : Personnalisation des méthodes d'expédition (Partie 1)

WBOY
WBOYoriginal
2023-09-02 20:01:05686parcourir

Bien que le cœur d'OpenCart lui-même fournisse de nombreuses méthodes d'expédition utiles, il est toujours possible que vous deviez créer la vôtre. En revanche, en tant que développeur web, vous chercherez toujours à explorer le framework de votre choix pour comprendre comment créer votre propre contenu personnalisé !

Dans cette série, nous créerons un module de méthode d'expédition personnalisé dans OpenCart. Il s'agira d'une série en deux parties. Dans la première partie, nous créerons un formulaire de configuration backend pour une méthode d'expédition personnalisée.

Pour créer une nouvelle méthode d'expédition personnalisée dans OpenCart, vous devez implémenter les fichiers conformément aux conventions d'OpenCart. Sur le backend, vous devez fournir un formulaire de configuration qui permet aux administrateurs de configurer les prix, les zones géographiques et d'autres paramètres liés aux méthodes d'expédition. Sur le front-end, vous implémenterez les fichiers nécessaires pour sélectionner votre méthode d'expédition personnalisée lors du paiement !

Aujourd'hui, nous terminerons la configuration du backend. Je suppose que vous utilisez la dernière version d'OpenCart. Dans la deuxième partie, nous explorerons la contrepartie frontale, où nous verrons la configuration du fichier frontal et la démo frontale.

Aperçu des paramètres des fichiers backend

Commençons par la liste des fichiers requis pour le backend. Nous utiliserons « personnalisé » comme nom de la méthode d’expédition personnalisée.

  • admin/controller/shipping/custom.php : Il s'agit d'un fichier de contrôleur dans lequel nous définirons tout ce dont nous avons besoin pour configurer le formulaire.
  • admin/language/english/shipping/custom.php : Il s'agit d'un fichier de langue dans lequel nous définirons les balises du formulaire.
  • admin/view/template/shipping/custom.tpl : Il s'agit d'un fichier de modèle de vue qui contient le code HTML de notre formulaire de configuration.

Voici à quoi ressemble la configuration du backend.

Paramètres de fichier

Commençons par les paramètres du contrôleur.

Créer un fichier de contrôleur

Créez un fichier admin/controller/shipping/custom.php et collez le contenu suivant dans le fichier.

<?php
class ControllerShippingCustom extends Controller {
  private $error = array();

  public function index() {
    $this->load->language('shipping/custom');

    $this->document->setTitle($this->language->get('heading_title'));

    $this->load->model('setting/setting');

    if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
      $this->model_setting_setting->editSetting('custom', $this->request->post);

      $this->session->data['success'] = $this->language->get('text_success');

      $this->response->redirect($this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL'));
    }

    $data['heading_title'] = $this->language->get('heading_title');
    
    $data['text_edit'] = $this->language->get('text_edit');
    $data['text_enabled'] = $this->language->get('text_enabled');
    $data['text_disabled'] = $this->language->get('text_disabled');
    $data['text_all_zones'] = $this->language->get('text_all_zones');
    $data['text_none'] = $this->language->get('text_none');

    $data['entry_cost'] = $this->language->get('entry_cost');
    $data['entry_tax_class'] = $this->language->get('entry_tax_class');
    $data['entry_geo_zone'] = $this->language->get('entry_geo_zone');
    $data['entry_status'] = $this->language->get('entry_status');
    $data['entry_sort_order'] = $this->language->get('entry_sort_order');

    $data['button_save'] = $this->language->get('button_save');
    $data['button_cancel'] = $this->language->get('button_cancel');

    if (isset($this->error['warning'])) {
      $data['error_warning'] = $this->error['warning'];
    } else {
      $data['error_warning'] = '';
    }

    $data['breadcrumbs'] = array();

    $data['breadcrumbs'][] = array(
      'text' => $this->language->get('text_home'),
      'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')
    );

    $data['breadcrumbs'][] = array(
      'text' => $this->language->get('text_shipping'),
      'href' => $this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL')
    );

    $data['breadcrumbs'][] = array(
      'text' => $this->language->get('heading_title'),
      'href' => $this->url->link('shipping/custom', 'token=' . $this->session->data['token'], 'SSL')
    );

    $data['action'] = $this->url->link('shipping/custom', 'token=' . $this->session->data['token'], 'SSL');

    $data['cancel'] = $this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL');

    if (isset($this->request->post['custom_cost'])) {
      $data['custom_cost'] = $this->request->post['custom_cost'];
    } else {
      $data['custom_cost'] = $this->config->get('custom_cost');
    }

    if (isset($this->request->post['custom_tax_class_id'])) {
      $data['custom_tax_class_id'] = $this->request->post['custom_tax_class_id'];
    } else {
      $data['custom_tax_class_id'] = $this->config->get('custom_tax_class_id');
    }

    if (isset($this->request->post['custom_geo_zone_id'])) {
      $data['custom_geo_zone_id'] = $this->request->post['custom_geo_zone_id'];
    } else {
      $data['custom_geo_zone_id'] = $this->config->get('custom_geo_zone_id');
    }

    if (isset($this->request->post['custom_status'])) {
      $data['custom_status'] = $this->request->post['custom_status'];
    } else {
      $data['custom_status'] = $this->config->get('custom_status');
    }

    if (isset($this->request->post['custom_sort_order'])) {
      $data['custom_sort_order'] = $this->request->post['custom_sort_order'];
    } else {
      $data['custom_sort_order'] = $this->config->get('custom_sort_order');
    }

    $this->load->model('localisation/tax_class');
    $data['tax_classes'] = $this->model_localisation_tax_class->getTaxClasses();

    $this->load->model('localisation/geo_zone');
    $data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();

    $data['header'] = $this->load->controller('common/header');
    $data['column_left'] = $this->load->controller('common/column_left');
    $data['footer'] = $this->load->controller('common/footer');

    $this->response->setOutput($this->load->view('shipping/custom.tpl', $data));
  }

  protected function validate() {
    if (!$this->user->hasPermission('modify', 'shipping/custom')) {
      $this->error['warning'] = $this->language->get('error_permission');
    }

    return !$this->error;
  }
}

Il s'agit d'un fichier important qui définit l'essentiel de la logique du formulaire de configuration backend. Nous allons passer en revue celui du contrôleur index 方法中的重要片段。根据约定,您需要定义类名 ControllerShippingCustom.

Dans la méthode index, nous chargeons d'abord le fichier de langue et définissons le titre de la page.

Ensuite, nous chargeons le setting 模型并将设置保存到数据库中,作为配置表单的 POST 数据。在保存数据之前,我们使用该文件中定义的 validateformulaire de validation de la méthode.

$this->load->model('setting/setting');

if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
  $this->model_setting_setting->editSetting('custom', $this->request->post);
  $this->session->data['success'] = $this->language->get('text_success');
  $this->response->redirect($this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL'));
}

Après cela, nous attribuons les balises de langue dans le tableau $data afin que nous puissions accéder à ces balises dans le fichier de modèle de vue.

Ensuite, il existe un extrait standard pour configurer le bon lien de fil d'Ariane.

$data['breadcrumbs'] = array();

$data['breadcrumbs'][] = array(
  'text' => $this->language->get('text_home'),
  'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')
);

$data['breadcrumbs'][] = array(
  'text' => $this->language->get('text_shipping'),
  'href' => $this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL')
);

$data['breadcrumbs'][] = array(
  'text' => $this->language->get('heading_title'),
  'href' => $this->url->link('shipping/custom', 'token=' . $this->session->data['token'], 'SSL')
);

Ensuite, nous définissons la variable action pour garantir que le formulaire est soumis à notre méthode action 变量,以确保表单提交到我们的 index 方法。同样,如果用户点击 取消. De même, si l'utilisateur clique sur le bouton Annuler, il reviendra à la liste des modes d'expédition.

$data['action'] = $this->url->link('shipping/custom', 'token=' . $this->session->data['token'], 'SSL');
$data['cancel'] = $this->url->link('extension/shipping', 'token=' . $this->session->data['token'], 'SSL');

De plus, il existe du code pour renseigner les valeurs par défaut des champs du formulaire de configuration en mode ajout ou modification.

if (isset($this->request->post['custom_cost'])) {
  $data['custom_cost'] = $this->request->post['custom_cost'];
} else {
  $data['custom_cost'] = $this->config->get('custom_cost');
}

if (isset($this->request->post['custom_tax_class_id'])) {
  $data['custom_tax_class_id'] = $this->request->post['custom_tax_class_id'];
} else {
  $data['custom_tax_class_id'] = $this->config->get('custom_tax_class_id');
}

if (isset($this->request->post['custom_geo_zone_id'])) {
  $data['custom_geo_zone_id'] = $this->request->post['custom_geo_zone_id'];
} else {
  $data['custom_geo_zone_id'] = $this->config->get('custom_geo_zone_id');
}

if (isset($this->request->post['custom_status'])) {
  $data['custom_status'] = $this->request->post['custom_status'];
} else {
  $data['custom_status'] = $this->config->get('custom_status');
}

if (isset($this->request->post['custom_sort_order'])) {
  $data['custom_sort_order'] = $this->request->post['custom_sort_order'];
} else {
  $data['custom_sort_order'] = $this->config->get('custom_sort_order');
}

Dans la section suivante, nous chargeons les tranches d'imposition et les zones géographiques de la base de données, dont les données seront utilisées comme options déroulantes dans le formulaire de configuration.

$this->load->model('localisation/tax_class');
$data['tax_classes'] = $this->model_localisation_tax_class->getTaxClasses();

$this->load->model('localisation/geo_zone');
$data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();

Enfin, nous attribuons le sous-modèle et le modèle principal de la vue.

$data['header'] = $this->load->controller('common/header');
$data['column_left'] = $this->load->controller('common/column_left');
$data['footer'] = $this->load->controller('common/footer');

$this->response->setOutput($this->load->view('shipping/custom.tpl', $data));

Créer des fichiers de langue

Créez un fichier admin/language/english/shipping/custom.php et collez le contenu suivant dans le fichier.

<?php
// Heading
$_['heading_title']    = 'Custom Rate';

// Text
$_['text_shipping']    = 'Shipping';
$_['text_success']     = 'Success: You have modified custom rate shipping!';
$_['text_edit']        = 'Edit Custom Rate Shipping';

// Entry
$_['entry_cost']       = 'Cost';
$_['entry_tax_class']  = 'Tax Class';
$_['entry_geo_zone']   = 'Geo Zone';
$_['entry_status']     = 'Status';
$_['entry_sort_order'] = 'Sort Order';

// Error
$_['error_permission'] = 'Warning: You do not have permission to modify custom rate shipping!';

Le contenu du fichier doit être explicite !

Créer un fichier de vue

Créez un fichier admin/view/template/shipping/custom. et collez le contenu suivant dans le fichier.

<?php echo $header; ?><?php echo $column_left; ?>
<div id="content">
  <div class="page-header">
    <div class="container-fluid">
      <div class="pull-right">
        <button type="submit" form="form-custom" data-toggle="tooltip" title="<?php echo $button_save; ?>" class="btn btn-primary"><i class="fa fa-save"></i></button>
        <a href="<?php echo $cancel; ?>" data-toggle="tooltip" title="<?php echo $button_cancel; ?>" class="btn btn-default"><i class="fa fa-reply"></i></a></div>
      <h1><?php echo $heading_title; ?></h1>
      <ul class="breadcrumb">
        <?php foreach ($breadcrumbs as $breadcrumb) { ?>
        <li><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a></li>
        <?php } ?>
      </ul>
    </div>
  </div>
  <div class="container-fluid">
    <?php if ($error_warning) { ?>
    <div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <?php echo $error_warning; ?>
      <button type="button" class="close" data-dismiss="alert">&times;</button>
    </div>
    <?php } ?>
    <div class="panel panel-default">
      <div class="panel-heading">
        <h3 class="panel-title"><i class="fa fa-pencil"></i> <?php echo $text_edit; ?></h3>
      </div>
      <div class="panel-body">
        <form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" id="form-custom" class="form-horizontal">
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-cost"><?php echo $entry_cost; ?></label>
            <div class="col-sm-10">
              <input type="text" name="custom_cost" value="<?php echo $custom_cost; ?>" placeholder="<?php echo $entry_cost; ?>" id="input-cost" class="form-control" />
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-tax-class"><?php echo $entry_tax_class; ?></label>
            <div class="col-sm-10">
              <select name="custom_tax_class_id" id="input-tax-class" class="form-control">
                <option value="0"><?php echo $text_none; ?></option>
                <?php foreach ($tax_classes as $tax_class) { ?>
                <?php if ($tax_class['tax_class_id'] == $custom_tax_class_id) { ?>
                <option value="<?php echo $tax_class['tax_class_id']; ?>" selected="selected"><?php echo $tax_class['title']; ?></option>
                <?php } else { ?>
                <option value="<?php echo $tax_class['tax_class_id']; ?>"><?php echo $tax_class['title']; ?></option>
                <?php } ?>
                <?php } ?>
              </select>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-geo-zone"><?php echo $entry_geo_zone; ?></label>
            <div class="col-sm-10">
              <select name="custom_geo_zone_id" id="input-geo-zone" class="form-control">
                <option value="0"><?php echo $text_all_zones; ?></option>
                <?php foreach ($geo_zones as $geo_zone) { ?>
                <?php if ($geo_zone['geo_zone_id'] == $custom_geo_zone_id) { ?>
                <option value="<?php echo $geo_zone['geo_zone_id']; ?>" selected="selected"><?php echo $geo_zone['name']; ?></option>
                <?php } else { ?>
                <option value="<?php echo $geo_zone['geo_zone_id']; ?>"><?php echo $geo_zone['name']; ?></option>
                <?php } ?>
                <?php } ?>
              </select>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-status"><?php echo $entry_status; ?></label>
            <div class="col-sm-10">
              <select name="custom_status" id="input-status" class="form-control">
                <?php if ($custom_status) { ?>
                <option value="1" selected="selected"><?php echo $text_enabled; ?></option>
                <option value="0"><?php echo $text_disabled; ?></option>
                <?php } else { ?>
                <option value="1"><?php echo $text_enabled; ?></option>
                <option value="0" selected="selected"><?php echo $text_disabled; ?></option>
                <?php } ?>
              </select>
            </div>
          </div>
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-sort-order"><?php echo $entry_sort_order; ?></label>
            <div class="col-sm-10">
              <input type="text" name="custom_sort_order" value="<?php echo $custom_sort_order; ?>" placeholder="<?php echo $entry_sort_order; ?>" id="input-sort-order" class="form-control" />
            </div>
          </div>
        </form>
      </div>
    </div>
  </div>
</div>
<?php echo $footer; ?>

Encore une fois, cela devrait être facile à comprendre. Le but de ce fichier modèle est de fournir le formulaire de configuration pour notre méthode d'expédition personnalisée. Il utilise les variables que nous avons définies précédemment dans le fichier du contrôleur.

Donc, en ce qui concerne notre méthode d'expédition personnalisée, la configuration du fichier backend est comme ceci. Dans la section suivante, nous verrons comment activer les méthodes d'expédition personnalisées et personnaliser l'apparence du formulaire de configuration !

Activer l'expédition personnalisée

Allez dans la section admin et allez dans Extensions > Expédition . Vous devriez voir nos méthodes d'expédition personnalisées répertoriées sous la rubrique Tarifs personnalisés. Cliquez sur le symbole + pour installer nos méthodes d'expédition personnalisées. Une fois installé, vous devriez pouvoir voir le lien Modifier pour ouvrir le formulaire de configuration. Cliquez sur le lien Modifier et le formulaire devrait ressembler à la capture d'écran ci-dessous.

Tutoriel OpenCart : Personnalisation des méthodes dexpédition (Partie 1)

Les champs importants du formulaire ci-dessus sont Classe fiscale et Zone géographique强>.

Si vous devez imposer des taxes supplémentaires en plus du montant défini dans le champ Coût, vous pouvez sélectionner l'option appropriée via le champ Classe de taxe. Nous sélectionnons maintenant les biens taxables.

Le champ Région géographique vous permet de sélectionner les régions auxquelles cette méthode s'applique ; pour plus de simplicité, sélectionnez Toutes les régions. Assurez-vous également de définir le statut sur Activé, sinon il ne sera pas répertorié lors du paiement frontal.

Après avoir rempli les données nécessaires, cliquez sur le bouton Enregistrer. C'est tout pour l'article d'aujourd'hui, je vous répondrai bientôt avec la prochaine partie où j'expliquerai la configuration du fichier frontend.

Conclusion

Aujourd'hui, nous commençons une série sur la façon de créer des méthodes d'expédition personnalisées dans OpenCart. Dans la première partie, nous avons examiné la partie backend et vu comment mettre en place le formulaire de configuration. Si vous avez des questions ou des suggestions, laissez un message !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn