Drupal

Wordpress'ten Drupal'e İçerik Taşıma Nasıl Yapılır?

Wordpress'ten Drupal'e İçerik Taşıma Nasıl Yapılır?

Wordpress oldukça populer bir içerik yönetim sistemidir. Daha çok blog ve haber sitelerinde kullanılmaktadır. Drupal kadar esnek bir yapısı yoktur. Her teknolojinin avantajları ve dez avantajları vardır. Ayrıca Wordpress zamanla web site sahiplerini proje büyükçe bir çok sıkıntıya sokabilmektedir.

Wordpress'de en çok soruna neden olan başlıca bulgular ise;

1) Hız ( Zamanda web sitesi çok fazla hantallaşmaktadır.)

2) CPU yu çok fazla yorması

3) Güvenlik (Daha çok sİte yönetimi ile alakalı olsada bu durum epey can sıkmaktadır.)

Bu nedenle Drupal, Wordpress'den sonra iyi bir tercih olacaktır. Blog yazısında size Wordpress'den Drupal 8'e içerik ve resimlerin nasıl aktarılğını anlatmaya çalışacağız.

İçerik aktarımı için Migrate drush modulunu kullanacağız.

Öncelikle, settings.php dosyanızda aktarmak istediğiniz veri tabanı bağlantı bilgilerinizi yapılandırdığınızdan emin olun. Uygun kimlik bilgilerini aşağıdaki örnekteki gibi ekleyin:

$databases['migrate']['default'] = [
    'driver'   => 'mysql',
    'database' => 'wordpress_dbname',
    'username' => 'wordpress_dbuser',
    'password' => 'wordpress_dbpassowrd',
    'host'     => '127.0.0.1',
];

İşte kullanacağımız modül yapısı:

wp_migration/
  - wp_migration.info.yml
  - wp_migration.module
  - migration_templates/
    - wp_content.yml
    - wp_thumbnail.yml
    - wp_media.yml
  - src/
    - Plugin/
      - migrate/
        - process/
          - AddUrlAliasPrefix.php
          - DateToTimestamp.php
        - source/
          - SqlBase.php
          - Content.php
          - Thumbnail.php

wp_wordpress.info.yml dosyasının içeriği:

name: Wordpress Migration
type: module
description: Migrate Wordpress content into Drupal 8.
core: 8.x
dependencies:
  - migrate
  - migrate_drupal
  - migrate_drush

migration_templates/wp_thumbnail.yml dosyasının içeriği:

id: wp_thumbnail
label: 'Thumbnails'
migration_tags:
  - Wordpress
source:
  plugin: wordpress_thumbnail
  # This is WP table prefix  (custom variable)
  # DB table example: [prefix]_posts
  table_prefix: wp
  constants:
    # This path should point ot WP uploads directory.
    source_base_path: '/path/to/source/wp/uploads'
    # This is directory name in Drupal where to store migrated files
    uri_file: 'public://wp-thumbnails'
process:
  filename: filename
  source_full_path:
    -
      plugin: concat
      delimiter: /
      source:
        - constants/source_base_path
        - filepath
    -
      plugin: urlencode
  uri_file:
    -
      plugin: concat
      delimiter: /
      source:
        - constants/uri_file
        - filename
    -
      plugin: urlencode
  uri:
    plugin: file_copy
    source:
      - '@source_full_path'
      - '@uri_file'
  status: 
    plugin: default_value
    default_value: 1
  changed: 
    plugin: date_to_timestamp
    source: post_date
  created: 
    plugin: date_to_timestamp
    source: post_date
  uid: 
    plugin: default_value
    default_value: 1
destination:
  plugin: 'entity:file'
migration_dependencies:
  required: {}
  optional: {}

migration_templates/wp_media.yml dosyasının içeriği:

id: wp_media
label: 'Media'
migration_tags:
  - Wordpress
source:
  plugin: wordpress_thumbnail
  # This is WP table prefix  (custom variable)
  # DB table example: [prefix]_posts
  table_prefix: wp
  constants:
    bundle: image
process:
  bundle: 'constants/bundle'
  langcode:
    plugin: default_value
    default_value: en
  'field_image/target_id':
    -
      plugin: migration
      migration: wp_thumbnail
      source: post_id
    -
      plugin: skip_on_empty
      method: row
destination:
  plugin: 'entity:media'
migration_dependencies:
  required: {}
  optional: {}

migration_templates/wp_content.yml dosyasının içeriği:

id: wp_content
label: 'Content'
migration_tags:
  - Wordpress
source:
  plugin: wordpress_content
  # Wordpress post type (custom variable)
  post_type: post
  # This is WP table prefix  (custom variable)
  # DB table example: [prefix]_posts
  table_prefix: wp
process:
  type:
    plugin: default_value
    default_value: article
  'path/pathauto':
    plugin: default_value
    default_value: 0
  'path/alias':
    # This will add the following to URL aliases in Drupal
    plugin: add_url_alias_prefix
    # url/alias/prefix/2017/07/21/[post-title]
    prefix: url/alias/prefix
    source: path_alias
  promote: 
    plugin: default_value
    default_value: 0
  sticky: 
    plugin: default_value
    default_value: 0
  langcode:
    plugin: default_value
    default_value: en
  status: 
    plugin: default_value
    default_value: 1
  title: post_title
  created: 
    plugin: date_to_timestamp
    source: post_date
  changed: 
    plugin: date_to_timestamp
    source: post_modified
  field_image:
    -
      plugin: migration
      migration: wp_media
      source: thumbnail
    -
      plugin: skip_on_empty
      method: row
  'body/summary': post_excerpt
  'body/format':
    plugin: default_value
    default_value: full_html
  'body/value': post_content
destination:
  plugin: 'entity:node'
migration_dependencies:
  required: {}
  optional: {}

src/Plugin/migrate/process/AddUrlAliasPrefix.php dosyasının içeriği;

<?php

namespace Drupal\wp_migration\Plugin\migrate\process;

use Drupal\migrate\ProcessPluginBase;
use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\Row;

/**
 * Add prefix to URL aliases.
 *
 * @MigrateProcessPlugin(
 *   id = "add_url_alias_prefix"
 * )
 */
class AddUrlAliasPrefix extends ProcessPluginBase {

  /**
   * {@inheritdoc}
   */
  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
    $prefix = !empty($this->configuration['prefix']) ? '/' . $this->configuration['prefix'] : '';
    return $prefix . $value;
  }

}

src/Plugin/migrate/process/DateToTimestamp.php dosyasının içeriği;

<?php

namespace Drupal\wp_migration\Plugin\migrate\process;

use Drupal\migrate\ProcessPluginBase;
use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\Row;

/**
 * Date to Timetamp conversion.
 *
 * @MigrateProcessPlugin(
 *   id = "date_to_timestamp"
 * )
 */
class DateToTimestamp extends ProcessPluginBase {

  /**
   * {@inheritdoc}
   */
  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
    return strtotime($value . ' UTC');
  }

}

src/Plugin/migrate/source/SqlBase.php dosyasının içeriği; 4

<?php

namespace Drupal\wp_migration\Plugin\migrate\source;

use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
use Drupal\migrate\Row;

class SqlBase extends DrupalSqlBase {

  /**
   * Get database table prefix from the migration template.
   */
  protected function getPrefix() {
    return !empty($this->configuration['table_prefix']) ? $this->configuration['table_prefix'] : 'wp';
  }

  /**
   * Get Wordpress post type from the migration template.
   */
  protected function getPostType() {
    return !empty($this->configuration['post_type']) ? $this->configuration['post_type'] : 'post';
  }

  /**
   * Generate path alias via pattern specified in `permalink_structure`.
   */
  protected function generatePathAlias(Row $row) {
    $prefix = $this->getPrefix();
    $permalink_structure = $this->select($prefix . '_options', 'o', ['target' => 'migrate'])
      ->fields('o', ['option_value'])
      ->condition('o.option_name', 'permalink_structure')
      ->execute()
      ->fetchField();
    $date = new \DateTime($row->getSourceProperty('post_date'));
    $parameters = [
      '%year%'     => $date->format('Y'),
      '%monthnum%' => $date->format('m'),
      '%day%'      => $date->format('d'),
      '%postname%' => $row->getSourceProperty('post_name'),
    ];
    $url = str_replace(array_keys($parameters), array_values($parameters), $permalink_structure);
    return rtrim($url, '/');
  }

  /**
   * Get post thumbnail.
   */
  protected function getPostThumbnail(Row $row) {
    $prefix = $this->getPrefix();
    $query = $this->select($prefix . '_postmeta', 'pm', ['target' => 'migrate']);
    $query->innerJoin($prefix . '_postmeta', 'pm2', 'pm2.post_id = pm.meta_value');
    $query->fields('pm', ['post_id'])
      ->condition('pm.post_id', $row->getSourceProperty('id'))
      ->condition('pm.meta_key', '_thumbnail_id')
      ->condition('pm2.meta_key', '_wp_attached_file');
    return $query->execute()->fetchField();
  }

}

src/Plugin/migrate/source/Thumbnail.php dosyasının içeriği;

<?php

namespace Drupal\wp_migration\Plugin\migrate\source;

use Drupal\migrate\Row;

/**
 * Extract content thumbnails.
 *
 * @MigrateSource(
 *   id = "wordpress_thumbnail"
 * )
 */
class Thumbnail extends SqlBase {

  /**
   * {@inheritdoc}
   */
  public function query() {
    $prefix = $this->getPrefix();
    $query = $this->select($prefix . '_postmeta', 'pm', ['target' => 'migrate']);
    $query->innerJoin($prefix . '_postmeta', 'pm2', 'pm2.post_id = pm.meta_value');
    $query->innerJoin($prefix . '_posts', 'p', 'p.id = pm.post_id');
    $query->fields('pm', ['post_id']);
    $query->fields('p', ['post_date']);
    $query->addField('pm2', 'post_id', 'file_id');
    $query->addField('pm2', 'meta_value', 'filepath');
    $query
      ->condition('pm.meta_key', '_thumbnail_id')
      ->condition('pm2.meta_key', '_wp_attached_file')
      ->condition('p.post_status', 'publish')
      ->condition('p.post_type', 'post');
    return $query;
  }

  /**
   * {@inheritdoc}
   */
  public function fields() {
    return [
      'post_id'   => $this->t('Post ID'),
      'post_date' => $this->t('Media Uploaded Date'),
      'file_id'   => $this->t('File ID'),
      'filepath'  => $this->t('File Path'),
      'filename'  => $this->t('File Name'),
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function getIds() {
    return [
      'post_id' => [
        'type'  => 'integer',
        'alias' => 'pm2',
      ],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function prepareRow(Row $row) {
    $row->setSourceProperty('filename', basename($row->getSourceProperty('filepath')));
  }


src/Plugin/migrate/source/Content.php

<?php

namespace Drupal\wp_migration\Plugin\migrate\source;

use Drupal\migrate\Row;

/**
 * Extract content from Wordpress site.
 *
 * @MigrateSource(
 *   id = "wordpress_content"
 * )
 */
class Content extends SqlBase {

  /**
   * {@inheritdoc}
   */
  public function query() {
    $prefix = $this->getPrefix();
    $query = $this->select($prefix . '_posts', 'p');
    $query
      ->fields('p', [
        'id',
        'post_date',
        'post_title',
        'post_content',
        'post_excerpt',
        'post_modified',
        'post_name'
      ]);
    $query->condition('p.post_status', 'publish');
    $query->condition('p.post_type', $this->getPostType());
    return $query;
  }

  /**
   * {@inheritdoc}
   */
  public function fields() {
    return [
      'id'            => $this->t('Post ID'),
      'post_title'    => $this->t('Title'),
      'thumbnail'     => $this->t('Post Thumbnail'),
      'post_excerpt'  => $this->t('Excerpt'),
      'post_content'  => $this->t('Content'),
      'post_date'     => $this->t('Created Date'),
      'post_modified' => $this->t('Modified Date'),
      'path_alias'    => $this->t('URL Alias'),
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function getIds() {
    return [
      'id' => [
        'type'  => 'integer',
        'alias' => 'p',
      ],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function prepareRow(Row $row) {
    // This will generate path alias using WP alias settings.
    $row->setSourceProperty('path_alias', $this->generatePathAlias($row));
    // Get thumbnail ID and pass it to the wp_media migration plugin.
    $row->setSourceProperty('thumbnail', $this->getPostThumbnail($row));
  }

}

ÖNEMLİ: Taşıma işlemlerini doğru sırayla gerçekleştirmelisiniz. Bu örnekte önce wp_thumbnail'ı, wp_media second ve wp_content'i en son çalıştırmalısınız.

Mutlu kodlamalar

Drupal 8'de Entity ile Otomatik Tamamlanan Sonuçları Nasıl Değiştirebilirim?

Drupal 8'de Entity ile Otomatik Tamamlanan Sonuçları Nasıl Değiştirebilirim?

Bazen, otomatik tamamlama sonuçlarında ek veriler görüntülemek, örneğin başlığın yanında içerik dili eklemek veya varlık türünü veya diğer ilgili verileri görüntülemek isteyebilirsiniz. Bu blog yazısında, Drupal 8'deki otomatik tamamlama alanlarındaki önerileri nasıl değiştireceğim göstereceğim.

İşte kullanacağımız modül yapısı:

alter_entity_autocomplete/
  - alter_entity_autocomplete.info.yml
  - alter_entity_autocomplete.services.yml
  - src/
    - EntityAutocompleteMatcher.php
    - Controller/
      - EntityAutocompleteController.php
    - Routing/
      - AutocompleteRouteSubscriber.php

alter_entity_autocomplete.info.yml dosyasının içeriği:

name: Alter Entity Autocomplete
description: The module alters entity autocomplete suggestion list.
type: module
core: 8.x

alter_entity_autocomplete.services.yml dosyasının içeriği:

services:

  alter_entity_autocomplete.route_subscriber:
    class: Drupal\alter_entity_autocomplete\Routing\AutocompleteRouteSubscriber
    tags:
      - { name: event_subscriber }

  alter_entity_autocomplete.autocomplete_matcher:
    class: Drupal\alter_entity_autocomplete\EntityAutocompleteMatcher
    arguments: ['@plugin.manager.entity_reference_selection']

src/EntityAutocompleteMatcher.php dosyasının içeriği. Sonuçların çıktısını değiştireceğiniz dosya budur: sugesstions/autocomplete

<?php

namespace Drupal\alter_entity_autocomplete;

use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\Tags;

class EntityAutocompleteMatcher extends \Drupal\Core\Entity\EntityAutocompleteMatcher {

  /**
   * Gets matched labels based on a given search string.
   */
  public function getMatches($target_type, $selection_handler, $selection_settings, $string = '') {

    $matches = [];

    $options = [
      'target_type'      => $target_type,
      'handler'          => $selection_handler,
      'handler_settings' => $selection_settings,
    ];

    $handler = $this->selectionManager->getInstance($options);

    if (isset($string)) {
      // Get an array of matching entities.
      $match_operator = !empty($selection_settings['match_operator']) ? $selection_settings['match_operator'] : 'CONTAINS';
      $entity_labels = $handler->getReferenceableEntities($string, $match_operator, 10);

      // Loop through the entities and convert them into autocomplete output.
      foreach ($entity_labels as $values) {
        foreach ($values as $entity_id => $label) {

          $entity = \Drupal::entityTypeManager()->getStorage($target_type)->load($entity_id);
          $entity = \Drupal::entityManager()->getTranslationFromContext($entity);

          $type = !empty($entity->type->entity) ? $entity->type->entity->label() : $entity->bundle();
          $status = '';
          if ($entity->getEntityType()->id() == 'node') {
            $status = ($entity->isPublished()) ? ", Published" : ", Unpublished";
          }

          $key = $label . ' (' . $entity_id . ')';
          // Strip things like starting/trailing white spaces, line breaks and tags.
          $key = preg_replace('/\s\s+/', ' ', str_replace("\n", '', trim(Html::decodeEntities(strip_tags($key)))));
          // Names containing commas or quotes must be wrapped in quotes.
          $key = Tags::encode($key);
          $label = $label . ' (' . $entity_id . ') [' . $type . $status . ']';
          $matches[] = ['value' => $key, 'label' => $label];
        }
      }
    }

    return $matches;
  }

}

src/Controller/EntityAutocompleteController.php dosyasının içeriği:

<?php

namespace Drupal\alter_entity_autocomplete\Controller;

use Drupal\Core\KeyValueStore\KeyValueStoreInterface;
use Drupal\alter_entity_autocomplete\EntityAutocompleteMatcher;
use Symfony\Component\DependencyInjection\ContainerInterface;

class EntityAutocompleteController extends \Drupal\system\Controller\EntityAutocompleteController {

  /**
   * The autocomplete matcher for entity references.
   */
  protected $matcher;

  /**
   * {@inheritdoc}
   */
  public function __construct(EntityAutocompleteMatcher $matcher, KeyValueStoreInterface $key_value) {
    $this->matcher = $matcher;
    $this->keyValue = $key_value;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('alter_entity_autocomplete.autocomplete_matcher'),
      $container->get('keyvalue')->get('entity_autocomplete')
    );
  }

}

src/Routing/AutocompleteRouteSubscriber.php dosyasının içeriği:

<?php

namespace Drupal\alter_entity_autocomplete\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

class AutocompleteRouteSubscriber extends RouteSubscriberBase {

  public function alterRoutes(RouteCollection $collection) {
    if ($route = $collection->get('system.entity_autocomplete')) {
      $route->setDefault('_controller', '\Drupal\alter_entity_autocomplete\Controller\EntityAutocompleteController::handleAutocomplete');
    }
  }

}

Mutlu kodlamalar

Drupal'de Drupal Commerce için Özel Bir Ödeme Bölmesi Oluşturma

drupal commerce

Bu makalede, Drupal 10'da Drupal Commerce için nasıl özel bir ödeme bölmesi oluşturabileceğimizi göstereceğim. Bu amaçla yapılandırma formuna sahip bir ödeme bölmesi ve kullanıcıların siparişlerine kupon ekleme olanağı yaratacağız.

Drupal Commerce Özel Ödeme Bölmesi Oluşturma

namespace Drupal\module_name\Plugin\Commerce\CheckoutPane;

use Drupal\commerce_checkout\Plugin\Commerce\CheckoutFlow\CheckoutFlowInterface;
use Drupal\commerce_checkout\Plugin\Commerce\CheckoutPane\CheckoutPaneBase;
use Drupal\commerce_checkout\Plugin\Commerce\CheckoutPane\CheckoutPaneInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;

/**
 * Provides the coupons pane.
 *
 * @CommerceCheckoutPane(
 *   id = "coupons",
 *   label = @Translation("Redeem Coupon"),
 *   default_step = "order_information",
 * )
 */
class CommerceCoupons extends CheckoutPaneBase implements CheckoutPaneInterface {

/**
 * {@inheritdoc}
 */
public function __construct(array $configuration, $plugin_id, $plugin_definition, CheckoutFlowInterface $checkout_flow, EntityTypeManagerInterface $entity_type_manager) {
  parent::__construct($configuration, $plugin_id, $plugin_definition, $checkout_flow, $entity_type_manager);
}

Bu, özel ödeme bölmesinin bir 'kimlik kuponu' sahibi olacağı ve Ödül kuponu olarak etiketleneceği ve varsayılan olarak sipariş bilgi adımında belirleneceği anlamına gelir. Önce bölmemizin ayarlarını (yapılandırma) formunu oluşturuyoruz. Bu amaçla, kullanıcının sipariş üzerine yalnızca bir kupon kullanabileceği şekilde ayarlamamızı yapacağız. Bunun için, dört fonksiyon uygulamalıyız. Önce, varsayılan yapılandırmamızı kuracağız.

/**
 * {@inheritdoc}
 */
public function defaultConfiguration() {
  return [
      'single_coupon' => FALSE,
    ] + parent::defaultConfiguration();
}

Ardından yapılandırma formumuzun özetini uygulayacağız.

/**
 * {@inheritdoc}
 */
public function buildConfigurationSummary() {
  $summary = !empty($this->configuration['single_coupon']) ? $this->t('Single Coupon Usage on Order: Yes') : $this->t('Single Coupon Usage on Order: No');
  return $summary;
}

Sonra yapılandırma formumuzu oluşturacağız.

/**
 * {@inheritdoc}
 */
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
  $form = parent::buildConfigurationForm($form, $form_state);
  $form['single_coupon'] = [
    '#type' => 'checkbox',
    '#title' => $this->t('Single Coupon Usage on Order?'),
    '#description' => $this->t('User can enter only one coupon on order.'),
    '#default_value' => $this->configuration['single_coupon'],
  ];

  return $form;
}

Sonrasında bu ayarları kaydedin.

/**
 * {@inheritdoc}
 */
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
  parent::submitConfigurationForm($form, $form_state);

  if (!$form_state->getErrors()) {
    $values = $form_state->getValue($form['#parents']);
    $this->configuration['single_coupon'] = !empty($values['single_coupon']);
  }
}

Ödeme akışının düzenleme sayfasında nasıl görüneceğini görebilirsiniz. Sonra, bölme formumuzu oluşturacağız. Yapılandırmamızı kontrol edeceğiz ve siparişte bir kupon uygulanmışsa ve tek kupon için yapılandırma ayarına sahipse form göstermeyeceğiz.

/**
 * {@inheritdoc}
 */
public function buildPaneForm(array $pane_form, FormStateInterface $form_state, array &$complete_form) {
  $order_has_coupons = $this->order->coupons->referencedEntities();
  if($this->configuration['single_coupon'] && $order_has_coupons){
    return $pane_form;
  }
  $pane_form['coupon'] = [
    '#type' => 'textfield',
    '#title' => $this->t('Coupon'),
    '#default_value' => '',
    '#required' => FALSE,
  ];
  return $pane_form;
}

Bundan sonra, kuponlarımızın geçerliliğini uygulayacağız ve geçerli bir kuponun sağlanıp sağlanmadığını ve bu siparişe uygulanabilir olup olmadığını kontrol edeceğiz.

/**
 * {@inheritdoc}
 */
public function validatePaneForm(array &$pane_form, FormStateInterface $form_state, array &$complete_form) {
  $values = $form_state->getValue($pane_form['#parents']);
  if(!empty($values['coupon'])){
    $coupon_code = $values['coupon'];
    /* @var \Drupal\commerce_promotion\Entity\Coupon $commerce_coupon */
    $commerce_coupon = $this->entityTypeManager->getStorage('commerce_promotion_coupon')->loadByCode($coupon_code);
    $valid = false;
    if($commerce_coupon){
      $promotion = $commerce_coupon->getPromotion();
      $valid = $promotion->applies($this->order) ? true : false;
      if($valid){
        foreach($this->order->coupons->referencedEntities() as $coupon){
          if($commerce_coupon->id() == $coupon->id()){
            $form_state->setError($pane_form, $this->t('Coupon already applied to order.'));
          }
        }
      }
    }
    if(!$valid){
      $form_state->setError($pane_form, $this->t('The specified coupon does not apply for this order.'));
    }
  }
}

Bizim için bırakılan şey sipariş üzerine kuponu kaydetmek ve kupon işlemi yapmaktır. Bunun için, commerce_promotion_coupon işlemcisini kullanacağız.

/**
 * {@inheritdoc}
 */
public function submitPaneForm(array &$pane_form, FormStateInterface $form_state, array &$complete_form) {
  $values = $form_state->getValue($pane_form['#parents']);
  if(!empty($values['coupon'])){
    $coupon_code = $values['coupon'];
    $commerce_coupon = $this->entityTypeManager->getStorage('commerce_promotion_coupon')->loadByCode($coupon_code);
    if($commerce_coupon){
      $this->order->coupons[] = $commerce_coupon->id();
      $coupon_order_processor = \Drupal::service('commerce_promotion.promotion_order_processor');
      $coupon_order_processor->process($this->order);
      $this->order->save();
    }
  }
}

Bitirdik ve yeni ödeme bölmesini test edebiliriz. Mutlu kodlamalar!

Drupal ile Çoklu Dil Kullanımı

Drupal multi dil ekleme

Drupal web siteleri için çoklu dil kurulumu

Drupal ile hazırlanan bir web sitesini çok dilli bir yapı haline getirmek için; ilk yapılması gereken çekirdekte gelen "Locale" ve "Content translation" modullerini aktif etmek olucaktır. Modulleri aktif ettikten sonra "admin/config/regional/language/add" sayfasına giderek çevirini yapmak istediğiniz yeni bir dil eklemeniz gerekiyor.
Daha sonra hangi içerik tipinizin çok dilli olarak çevirmek istiyorsanız. İçerik türleri sayfasına giderek "/admin/structure/types/manage/" çevirilerini yapmak istediğiniz içerik türünü seçerek ayar sayfasındaki "Çoklu dil desteği" seçeneğini aktif etmeniz gerekiyor.

Buraya kadar her şey tamam ise!

Bu işlemlemleri yaptıktan sonra çoklu dil seçeneğini aktif hale getirdiğiniz içerik tipinizden yazacağınız her yazı için dil şeçmeniz için dil seçenekleri görüceksiniz.
Ek bir modul kurarak sistemi ve önceden kurduğunuz veya kuracağınız modullerin dil dosyalarını sistem tarafından otomatik indirilmesini isterseniz.
Localization update modulunu sisteminize kurabilirsiniz.

Ayrıca projede dil çevirilerinde ve filtrelerinde daha fazla opsiyon isterseniz Internationalization modulunu kurabilirsiniz.

Oluşturmak istediğiniz yapı çok kullanıcılı, intranet, portal, sosyal ağ tarzında bir proje işe daha profesyonel yardım almak için bizimle iletişime geçmekten çekinmeyiniz.

Mutlu kodlamalar.

Drupal ve Seo Eklentileri

Drupal seo eklentileri

Drupal seo eklentileri nelerdir?

Drupal topluluğu içinde geliştirilmiş bir çok seo eklentileri mevcuttur. Bunların bazıları ciddi anlamda işe yarıyor iken bazılarından randuman vermiyor. Sizler için en önemli olanlarını analiz edip sıralayacağız. Drupale aşina biri iseniz listedeki modulleri kullanmış olmanız muhtemel.


Pathauto
Transliteration
Globalredirect
Metatag
XML sitemap

Pathauto Web sitesinizin sayfaları için belirli şablonlar altında SEO dostu URL'ler oluşturmaya yardımcı olan çok önemli bir modüldür. Bu modül kullanırken almak anlamına gelir. Kullanımı çok basit ve kolaydır. örn; sizinsiteniz.com /node/12 yerine sizinsiteniz.com/içerik/haber-spor daha anlanmlı url adları oluşmanızı sağlar.

Modül kurulumundan sonra «Ayarlar» sekmesinden ve (aşağıdaki resme önerilen ayarları örneğe bakın) web siteniz için gerekli olan onay kutularını tıklatın gidin:

Ayrıntılar bu ayarları kontrol etmenizi sağlar:

Şeçeneğine «Change to lower case» tıklayın.

Maksimum takma uzunluğu ve maksimum bileşen uzunluğu 100 (genellikle yeterlidir).

«Create a new alias. Delete the old alias» işaretleyin Bu içerik tekrarından kaçınmak için yapılmalıdır.

«Reduce strings to letters and numbers» işaretletyin

Ayarları kaydettikten sonra, «Pattern» tıklayarak gerekli diğer url ayarlarını organize edebilirsiniz.

Sonra bütün takma adlar «Sil» ve «Tüm takma» tıklayın ve silmek için gidin. Bundan sonra, açık «Toplu güncelleme», takma ad olmadan yolu seçmek ve yapılandırmayı kaydedin.

Bu yerine yapılandırmasını kaydetin ve kendi kurgunuza göre web sitenizin url isimlerini daha

Transliteration Pathauto modülünü kurduktan sonra genelde noktalı harflerimiz yüzünden url adreslerinde türkçe karakter sorunları oluşur. Transliteration modulu ise bu tarz sorunları ortadan kaldırır. Latin harflerine dönüşmesinde yardımcı olur. Örn: sizinsiteniz.com/semsipasa-pasaji yerine sizinsiteniz.com/şemşipaşa-paşajı olarak dönüştürmesine katkı sağlar. Pathauto modulünün yapılandırma seçeneklerine girip ayarlar sayfasında bulunan. "Transliterate prior to creating alias" seçeneğini aktif edin ve kayıt edin.

Global redirect Oluşturulan ve tekrarlanan içeriklerin bağlantı adreslerini 301 yönlendirerek arama motorları tarafından indexlenmesi önlenir. Seo için kurmakta her zaman faydalıdır.

Metatag Çok yararlı bir modüldür. Burada başlık, meta açıklaması ve meta anahtar kelimeler için kapsamlı ayar yapabilirsiniz.

Arayüz yardımıyla otomatik olarak her sayfa için bu etiketleri alakalı ve benzersiz yapmak mümkündür.

Xml site map Xml site haritasını ayarlamak için yardımcı olur ve tüm sayfa türleri için istenen endeksleme işleri için çok yararlı bir modül. Site haritası oluşturduktan sonra, bu ayarlamak onu gereklidir.

Minimum sitemap ömrü 1 gün koymak önerilir. Ana için en yüksek önceliğini ayarlamak için tavsiye edilir, ama geri kalanı sayfaları için (normal) 0.5 yeterlidir. Yapılandırmayı kaydettikten sonra, haritayı yeniden ve bu kadar!

Şimdilik en temek drupal seo modullerini tanıttık. Bir web sitesinin arama motorlarına daha cazip hale getirebilirsiniz fakat seo sadece bu modul kurmakla bitmiyor. Kafanıza takılan sorular için sosyal medya hesaplarımızdan yada dogrudan iletişeme geçerek sorabilirsiniz.

Mutlu kodlamalar

Drush ile Tek Dosyada Kendi Dağıtımınızı Yapın

drupal drush

Drush generate-makefile ile Kendi Dağıtımınızı Yapın

Merhaba arkadaşlar, bugün size drush ın süpersonik bir işlevinden bahsedeceğim. Drupal kullananlar bilirler ki her kurulumda kullandığınız eklentileri ya site içerisinden tek tek eklemek gerekir ya da eklentileri tek tek indirip hepsini ftp den göndermeniz gerekmektedir. Drush kullanıyorsanız daha önce bu yazımda da bahsettiğim gibi drush dl projeismi şeklinde indirebiliyorsunuz.

Bu işlemleri daha pratik bir hale getirmek ve tek bir komut ile kendi eklenti, kütüphane, tema ve drupal çekirdeğinizi oluşturmak istiyorsanız son kez normal bir drupal kurulumu gerçekleştirerek olmazsa olmaz eklentiler, temalar, kütüphaneleri kurun. Terminalden drupal kurulumunuzun olduğu klasöre gidin.

Kendi dağıtımımızı oluşturmak için yapmamız gereken bir adım kaldı. O da aşağıdaki komutu çalıştırmak.

drush generate-makefile dosyaismi.make

Bu komutun drupal kurulumunu yaptığımız dizinde dosyaismi.make adında bir dosya oluşturduk. Tabi bu komut ile sitede kurulu olan modüllerin, temaların, kütüphanelerin ve drupal çekirdeğinin versiyonları ile birlikte kayıt etmiş olduk.

Görsel kaldırıldı.

Eğer versiyonları dahil etmeden bir dosya oluşturmak istiyorsak aşağıdaki gibi bir komut kullanmalıyız.

drush generate-makefile dosyaismi.make --exclude-versions

Bu komutun oluşturduğu dosyanın içeriği ise aşağıdaki gibi.

Görsel kaldırıldı.

Drush make ile oluşturduğunuz dosyadan pratik şekilde drupal kurmak

Drupal'ı kurmak istediğiniz klasör içerisinde aşağıdaki komutu çalıştırarak .make dosyasındaki drupal çekirdeği, modüller, temalar ve kütüphaneleri tek komut ile dizine indireceğiz.

drush make dosyaismi.make

Bu komut sonucunda kendi oluşturduğumuz .make dosyasında belirlediğimiz eklenti, tema, kütüphane ve drupal çekirdeğini tek komut ile indirmiş oluyoruz.

Belirli dosyaların ya da çekirdeğin versiyonsuz .make dosyasını oluşturmak için aşağıdaki komutu kullanıyoruz.

drush generate-makefile dosyaismi.make --exclude-versions=drupal,views,ctools

Veyahut tam tersi yani belirli projelerin versiyonlarını dahil etmek için aşağıdaki komutu kullanıyoruz.

drush generate-makefile dosyaismi.make --include-versions=admin_menu,panels,token

Görsel kaldırıldı.

Hepsi bu kadar...

Drush (Drupal Shell) Nedir?

Drush nedir?

Drush kelimesi Drupal ve Shell kelimelerinin ilk hecelerinin birleştirilmesiyle oluşturulmuştur. Drupal kabuğu anlamına gelen Drush, Drupal ile geliştirilmiş siteleri kontrol etmek, işletmek ve geliştirmek için kullanılan bir kabuk tabanlı uygulamadır.

Drush ile neler yapabileceklerimizi sonraki bölümlerde ele alacağız fakat bu aşamada Drupal'in çekirdek güncellemesinin zorluğundan yakınanlara iyi bir haberimiz var! Drush en çok sizin yüzünüzü güldürecek.

Drush ile hangi işlemler yapılabilir?

Drush uygulaması ile saniyeler içinde çekirdek, modül ve/veya tema güncellemelerini yapabilirsiniz. Modülleri aktifleştirebilir ve/veya deaktif hale getirebilirsiniz. Modül ve tema indirebilirsiniz. Sitenizin yedeğini alabilir veyahut aldığınız yedeği sitenize geri yükleyebilirsiniz. Zen, Omega, Adaptive gibi popüler taban temaların alt temalarını oluşturabilir, oluşturduğunuz temaları aktifleştirebilirsiniz. Temiz url ye müdehalede bulunabilir, hatta drupal kurulu olmayan bir dizine drupalin en güncel ve stabil sürümünü indirebilirsiniz...

Şimdi yukarıda bahsettiğim işlemleri nasıl yapabileceğimizden bahsedelim. Tabiki önce Drush kurulumunu yapmamız gerek.

Drush kurulumu/güncellemesi

Burada yapacağımız kurulum Ubuntu dağıtımı içindir.

sudo apt-get install php-pear

satırı ile php-pear ı sistemimize yüklüyoruz.

Sonrasında aşağıdaki komutları sırayla uygulayarak drush kurulumumuzu gerçekleştiriyoruz.

pear channel-discover pear.drush.org

pear install drush/drush

drush version

Mevcut drush sürümümüzü güncellemek için ise aşağıdaki komutu kullanıyoruz.

pear upgrade drush/drush

Drush kurulummuzu tamamladıktan sonra gelin bahsettiğimiz işlemleri nasıl yapacağımıza bakmadan önce temel birkaç şey öğrenelim.

Drush ile işlem yapmak için komut satırımıza drush ile başlıyoruz.

Modül ve/veya tema indirmek için download kelimesinin kısaltılmışı olan dl

Modül ve/veya tema akfitleştirmek için için enable kelimesinin kısaltılmışı olan en

Modül ve/veya tema deaktifleştirmek için disable kelimesinin kısaltılmışı olan dis

Çekirdek, modül ve/veya tema güncellemek için update kelimesinin kısaltılmışı olan upgibi kısaltmaları kullanıyoruz.

Gelelim bu işlemleri nasıl yapacağımıza

Drush ile herhangi bir işlem yapmadan içinde bulunduğumuz dizinin doğru dizin olduğundan emin olmak için

drush status

komutunu kullanıyoruz ve sitemizin durumunu gösteren aşağıdaki gibi bir çıktı alıyoruz.

erdem@erdem-ubuntu:/var/www/learn$ sudo drush status

Drupal version : 7.28

Site URI : http://default

Database driver : mysql

Database username : root

Database name : learndblc

Database : Connected

Drupal bootstrap : Successful

Drupal user : Anonymous

Default theme : bartik

Administration theme : seven

PHP executable : /usr/bin/php

PHP configuration : /etc/php5/cli/php.ini

PHP OS : Linux

Drush version : 6.2.0

Drush configuration :

Drush alias files :

Drupal root : /var/www/learn

Site path : sites/default

File directory path : sites/default/files

Temporary file directory path : /tmp

Drush ile çekirdek, modül veya tema güncellemesi yapmak

drush up

komutu ile güncellemesi olan ne var ne yok her şeyi güncelleyebiliyoruz. Evet evet hepsi bu kadar :)

Sadece çekirdek güncellemesi için

drush up drupal

Çekirdek hariç diğer güncellemeleri yapmak için

drush up --no-core

Özellikle sadece bir modül veya temayı güncellemek için(mesela views ten bahsedelim biz)

drush up views

Son örnek ise benim başıma gelen bir olaydan yola çıkarak çok pratik olmasada birden çok modül varsa güncellenmesi gereken ve siz bir tanesini güncellemek istemiyorsanız aşağıdaki komutu kullanabilirsiniz(pcp modülünü güncellemek istemiyoruz mesela).

drush dis -y pcp && drush up -y && drush en -y pcp

komutu ile önce pcp modülünü devre dışı bırakıyoruz. Ardından güncellemeleri yapıyoruz. Sonrasında ise tekrar pcp modülünü aktifleştiriyoruz. Buradan da anlayacağımız gibi drush aktif olmayan modüllerin ya da temaların güncel olup olmadıklarını tarayamıyor ve aktif olmayan modülleri güncelleme dışında bırakıyor.

Burada ek olarak belirtmeliyim ki -y kısmı bize güncelleme, modül/tema aktifleştirme/deaktifleştirme işlemleri sırasında otomatik olarak "yes" cevabını verdiyor. Haliyle tek komutla güncelleme, aktifleştirme/deaktifleştirme işlemlerimizi yapmış oluyoruz.

Drush ile modül veya tema indirmek

drush dl proje_ismi

kalıbını kullanarak indirmek istediğimiz ne varsa indirebiliriz.

Burada proje_ismi dediğimiz kısım işlem yapmak istediğimiz modülün drupal.org sitesindeki projenin url kısmı. Nasıl mı?

Örneğin Administration Menu modülünü indirmek istiyoruz. Drupal.org'daki url si drupal.org/project/admin_menu şeklinde. Bizim proje ismi dediğimiz kısım burada drupal.org/project/ kısmından sonraki url nin devamıdır. Yani Administration Menu modülünü indirmek için

drush dl admin_menu

şeklinde kullanmamız lazım bu komutu.

Drush ın sağladığı kolaylıklardan biri ise tek komutla birden fazla modül/tema indirebilmek ve kurabilmektir.

drush dl admin_menu views ctools panels zen omega

gibi tek bir komut ile admin_menu, views, ctools, panels modülllerini ve zen, omega temalarını indirmiş oluyoruz.

Drush ile modül ve/veya tema aktifleştirmek/deaktirleştirmek

Aktifleştirmek için(views ve administration menu);

drush en -y views admin_menu

Deaktifleştirmek için;

drush dis -y views admin_menu

Drush ile yedek almak

drush archive-dump

komutu ile yedek aldığımızda aşağıdaki gibi bir çıktı vermeli.

root@erdem-ubuntu:/var/www/learn# drush archive-dump

Archive saved to [ok]

/root/drush-backups/archive-dump/20140613170333/learndblc.20140613_170334.tar.gz




Bu şekilde ftp ve veritabanı yedeğini tek komutla saniyeler içinde oluşturabiliyoruz.

Burada görüldüğü gibi /root/drush-backups/archive-dump dizini altına yedek dosyasını oluşturdu.

Eğer yedek dosyasını istediğimiz yere almak istiyorsak aşağıdaki komutu kullanmalıyız.

drush archive-dump default --destination=/istenilen/dizin/yolu/mysite.tar

Drush ile yedeği geri yüklemek

drush archive-restore ./mysite.tar.gz

komutunu kullanarak dosyalarımızı geri yükleyebiliriz.

Veri tabanı ile birlikte geri yükleme yapmak için

drush archive-restore ./example.tar.gz --db-url=mysql://root:pass@127.0.0.1/dbname

komutunu kullanmamız gerekiyor. Tabiki settings.php dosyasında gerekli değişiklikleri yaptıktan sonra.

Drush ile alt tema oluşturmak

Zen temasını indirelim ve alt temasını oluşturalım.

drush dl zen

komutu ile Zen taban temasını indiriyoruz.

Temayı indirdikten sonra bu adresteki adımları uygulayarak alt temamızı oluşturacağız. Her tema için alt tema oluşturma komutları farklı olduğundan proje sayfalarını incelemenizde fayda var.

root@erdem-ubuntu:/var/www/learn# drush en zen

The following extensions will be enabled: zen

Do you really want to continue? (y/n): n

Aborting. [cancel]

root@erdem-ubuntu:/var/www/learn# drush en -y zen

The following extensions will be enabled: zen

Do you really want to continue? (y/n): y

zen was enabled successfully. [ok]

root@erdem-ubuntu:/var/www/learn# drush cc all

'all' cache was cleared. [success]

root@erdem-ubuntu:/var/www/learn# drush zen "Zen Alt Tema" zenalttema

Starter kit for "Zen Alt Tema" created in: /var/www/learn/sites/all/themes/zenalttema




şeklinde Zen Alt Tema adlı alt temamızı oluşturmuş oluyoruz.

Drush ile temiz urlyi kapatmak

Bu makaleyi yazmayı düşündüğüm sıralarda Facebook DrupalTurkiye grubuna gelen bir soru oldu ve siteye giriş yapmadan temiz url nin nasıl kapatılacağını sordu bir arkadaşımız. O sorudan yola çıkarak grupta verdiğim cevabı buradada vereyim. Siteyi bir sunucudan bir diğerine taşıyınca bazı temiz url sorunları ile karşılaşılabiliyor ve siteye giriş yapabilmek için temiz url yi kapatmak gerekebiliyor.

drush vset clean_url 0 --yes

komutunu kullanarak drush ile temiz url yi siteye giriş yapmadan kapatabilir

drush vset clean_url 1 --yes

komutu ile açabiliriz.

Drush ile drupal çekirdeği indirmek

Son olarak bahsettiğim drupal kurulu olmayan bir dizine drupal çekirdeğini indirmek için ise

drush dl drupal

komutunu kullanıyoruz. Böylece bulunduğumuz dizine en güncel ve stabil drupal sürümünü klasör olarak indirmiş oluyoruz.

Şimdilik Drush hakkında söyleyeceklerim bu kadar.

İyi çalışmalar.

Drupal'de git Kullanarak Patch Nasıl Yapılır?

drupal git patch

Drupal'da git kullanarak patch uygulama

Drupal ile patch dosyalarının nasıl uygulanacağını git kullanarak anlatacağım.

Öncelikle uygulayacağımız .patch dosyasını terminal yardımıyla wget kullanarak drupal kurulu dizinimize indiriyoruz. İsterseniz kendiniz indirerek drupal dizinine ftp aracığıyla da gönderebilirsiniz.

wget [patch-ismi].patch

Patch dosyasını uygulamadan önce dosyayı herhangi bir metin editörüyle açıp düzenlenecek dosyalara bakıyoruz ve yedeklerini alıyoruz.

Daha sonra indirdiğimiz patch dosyasını uygulamak için

git apply [patch-ismi].patch

komutunu girerek yamayı uygulamış oluyoruz.

Hepsi bu kadar.

Not: Uygulayacağınız yamanın onaylanmış olmasına dikkat edin. Aksi takdirde istenmeyen durumlarla karşılaşabilirsiniz.

Drupal'de varsayılan CSS dosyalarını nasıl çıkarabilirim?

Drupal'de varsayılan CSS dosyalarını nasıl çıkarabilirim?

Drupal'de css optimize ederek performans arttirma yöntemi
Eğer sıfırdan bir tema oluşturuyorsak, çekirdekten gelen css dosyaları tüm standart css sınıflarının üzerine yazılır. Haliyle gereksiz bir sürü css sınıfına sahip oluruz ve bu sınıflar web sitemizin performansında negatif katkıda bulunur. Hiç gereği yokken sorgu sayımızı arttırmış oluruz.

Peki nasıl bu standart css sınıflarından kurtulabilirim?

Bunun bir kaç yolu vardır. Template.php dosyamızda "hook_css_alter" ile ve info dosyamızda ise "CSS FOAD" methodunu kullarak varsayılan css sınıflarını kaldırabiliriz.

1- ) Template.php dosyasında css sınıfılarını engellemek

Aşağıdaki kodu oluşturduğumuz temamızın içindeki "template.php" dosyamıza kopyalıyoruz. Sonrasında "MY_THEME_" kısmını temanızın adını yazıyoruz.

/*** Implements hook_css_alter(); */

function MY_THEME_css_alter(&$css) {

$remove = array(
'misc/vertical-tabs.css',
'misc/vertical-tabs-rtl.css',
'misc/ui/jquery.ui.core.css',
'misc/ui/jquery.ui.theme.css',
'modules/comment/comment.css',
'modules/comment/comment-rtl.css',
'modules/field/theme/field.css',
'modules/field/theme/field-rtl.css',
'modules/file/file.css',
'modules/filter/filter.css',
'modules/node/node.css',
'modules/search/search.css',
'modules/search/search-rtl.css',
'modules/system/system.admin.css',
'modules/system/system.admin-rtl.css',
'modules/system/system.base.css',
'modules/system/system.base-rtl.css',
'modules/system/system.maintenance.css',
'modules/system/system.menus.css',
'modules/system/system.menus-rtl.css',
'modules/system/system.messages.css',
'modules/system/system.messages-rtl.css',
'modules/system/system.theme.css',
'modules/system/system.theme-rtl.css',
'modules/user/user.css',
'modules/user/user-rtl.css',
'sites/all/modules/ctools/css/ctools.css',
);
foreach ($remove as $value) {
unset($css[$value]);
}
}

Ön belleği temizlemeyi unutmayın.

2- ) CSS FOAD methodunu kullarak varsayılan css sınıflarını kaldırmak

Temanızın info dosyasını açın

Görüntülenmesini istemediğiniz css sınıflarını kendinize göre coğaltarak kullabilirsiniz.
ÖRNEK;

;-------------- CSS FOAD -------------
stylesheets[all][] = system.messages.css
stylesheets[all][] = comment.css
stylesheets[all][] = node.css

Ön belleği temizlemeyi unutmayın.

Drupal'de her problem için birden fazla çözüm olduğunu unutmayın.

Mutlu kodlamalar

Drupal Temalarında Bootstrap ve Font Awesome Kütüphanelerinden Faydalanma

bootstrap ve font awesome

Drupal 7 temalarında Bootstrap ve Font Awesome kütüphanelerinden modül kullanmadan nasıl faydalanabileceiğinizi merak ediyorsanız bu makale tam size göre.

Bootstrap kütüphanesini temaya entegre etme

Bootstrap kütüphanesini bu linkten indiriyoruz. İndirdiğimiz .zip dosyasını açıyoruz ve dist klasörü içine giriyoruz.
Dist klasörü içerisinde karşımıza "css,fonts,js" klasörleri çıkıyor. Css klasörü içerisindeki bootstrap.min.css css dosyasını kullandığımız temamızın ana dizinindeki css klasörünün(../sites/all/themes/tema/css) içine atıyoruz.
Dist klasörü içerisinde karşımıza çıkan Js klasörü içerisindeki bootstrap.min.js script dosyasını temamızın ana dizinindeki js klasörünün(../sites/all/themes/tema/js) içine atıyoruz.
Dist klasörü içerisinde karşımıza çıkan Fonts klasörünü klasör olarak temamızın ana dizinine(../sites/all/themes/tema) atıyoruz.

Bu işlemlerden sonra tema dizinimize attığımız dosyaları temamızın görmesi için tema.info dosyasına gerekli satırları ekliyoruz.

Css dosyası için;
stylesheets[all][] = css/bootstrap.min.css
Js dosyası için;
scripts[] = js/bootstrap.min.js
satırlarını ekliyoruz.

Sitemizin önbelleğini temizliyoruz. Bu işlemlerden sonra bootstrap kütüphanesini sitenizde dilediğiniz gibi kullanabilirsiniz.

Font Awesome kütüphanesini temaya entegre etme

Font Awesome kütüphanesini bu linkten indiriyoruz. İndirdiğimiz .zip dosyasını açıyoruz ve karşımıza çıkan Css klasörü içerisindeki font-awesome.min.css dosyasını temamızın ana dizininde bulunan css klasörüne atıyoruz.
Kütüphane içerisinden çıkan Fonts klasörü içerisindeki dosyaların hepsini Bootstrap kütüphanesini entegre ederken kullandığımız temamızın ana dizininde oluşan Fonts klasörüne atıyoruz.

Bu dosyaları temamızın görmesi için tema.info dosyasını tekrar düzenliyoruz.

stylesheets[all][] = css/font-awesome.min.css satırını tema.info dosyasına ekliyoruz. Sitemizin önbelleğini temizliyoruz. Font Awesome da temamıza entegre olmuş durumda.

CDN ile Bootstrap ve Font Awesome kütüphanelerini kullanma

Aşağıdaki kodları html.tpl.php dosyanızdaki head tagları arasına ekleyiniz.

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.x.x/css/bootstrap.min.css">

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.x.x/js/bootstrap.min.js"></script>
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.x.x/css/font-awesome.min.css" rel="stylesheet">

Kodlarda aradaki "x" yerlerine en son sürüm numaralarını yazmanız gerekmektedir.

Bu sistemleri nasıl kullanacağınız sizin yaratıcılığınıza bağlı elbette.

İyi çalışmalar.

Abone ol Drupal