Eğitim

Drupal 8 ile Özel Modul Geliştirme (Oluşturma)

Drupal 8 ile Özel Modul Geliştirme (Oluşturma)

Birlikte ilk özel drupal 8 modülümüzü oluşturalım

Drupal 8 (neredeyse) burada ve bir geliştiriciyseniz, artık Drupal 8 modül geliştirme öğrenmeye başlamanın zamanı geldi. Drupal 8'deki modül geliştirme, Drupal 7'den büyük bir değişime işaret ediyor. Bu, Drupal 8 geliştirme öğrenme sürecinde ilerleyeceğim bir dizi ilk öğreticidir. Bu derste oluşturduğumuz modül, olduğu kadar basittir ve modül yapısına bir fikir edinmenize yardımcı olmayı amaçlamaktadır.

Başlamadan önce, Drupal 7 modül geliştirme ile bazı önemli farklılıklara değineceğiz. Aşağıda, bu öğreticide kullanılacak kavramların listesi verilmiştir:

  • Drupal 8 nesneye () yöneliktir ve Drupal 7 öncelikle usule uygundur. Bu, kodunuzun birçoğunun artık basit işlevler yerine sınıflarda olacağı anlamına geliyor. Birçokları için çok zor olacak, ancak kesinlikle modül geliştirme daha esnek olacak ve süreçlerinizde yeteneklerinizi modern programlama uygulamasına geçireceksiniz
  • Her sınıfın bir ad alanına ihtiyacı olacaktır. Ad boşluğu, sınıfınızın aynı adlı başka bir sınıfla çakışmamasına dikkat edin. Bir dosya sisteminde bir dizin gibi düşünebilirsiniz. Farklı dizinlerde aynı adı taşıyan iki dosyaya sahip olabilirsiniz.
  • Drupal harici kütüphaneleri kullanır ve genişletir
  • Drupal 8, .info dosyaları yerine .yml dosyalarını kullanır. .yml dosyaları menü öğelerini, sekmeleri vb. tanımlamak için de kullanılır.
  • Bir URL'yi geri arama işlevine eşlemek için hook_menu () kullanmanız gerekmez. Bu artık bir menü sınıfı ve bir rota tarafından halledilir.
  • Drupal 8, değiştirilebilir işlevsellik parçaları sağlayan eklentileri kullanır. Eklentiler hakkında daha fazla bilgi için - Joe Shindelar'ın Drupalize.me 'deki açıklamasına göz atın.
  • Drupal 8, PHP ek açıklamalarını kullanır. Ek açıklamalar PHP yorumlarını içeriyor ve bir sınıf hakkında hayati bilgiler içeriyor. Drupal 8 eklenti sistemi bunları eklentileri tanımlamak için kullanır ve eklentinizi keşfetmek için Drupal tarafından kullanılırlar.

Not: Bu öğreticide yazılmış olan bir çok kod, generate:module, generate:controller ve generate:plugin: block komutlarını (İpucu için teşekkürler, Jesus Manuel Olivas'a ) Drupal Konsolu tarafından oluşturulabilir; dolayısıyla gerçekte yeni bir özel modül oluşturduğunuzda kendiniz kodlayın. Fakat öğrenme amaçları için önce bunu elden yapmaktan hoşlanırım.

Modülünüzü adlandırın

Drupal 7'de olduğu gibi, ilk iş modülün adını vermektir. Sistem boyunca kullanılacak bir makine adı oluşturmamız gerekiyor. Makine adları, modülünüzdeki işlev ve yöntemlerde kullanılır. Modülünüzün adlandırılması hakkında daha fazla bilgi için, [adlandırma ve Drupal 8 modülünüzün yerleştirilmesi] bölümünü drupal.org'da kontrol edin.

Bu modül First Modülünü first_module adlı bir makine adıyla arayacağım .

Modül klasörünü oluştur

Drupal 7'de, çekirdek modülleri / modules dizininde bulunur ve özel ve katkıda bulunan modüllerinizi, siteler / all / modules dizini veya siteler / sitename / modules dizinine yerleştirmelisiniz. D8'de çekirdek modülleri / core dizinine girersiniz, böylece contrib ve özel modüllerinizi / modules dizinine yerleştirebilirsiniz. Drupal 7 uygulamasıyla sadık kalacağım ve onları siteler / hepsi / modüller halinde koyacağım.

  • Tüm sitelerde / sitelerde yeni bir dizin oluştur
  • İçinde her şey bir dizin modülleri yaratır
  • Tüm dizinin içinde first_module adlı dizini oluşturun

Bir bilgi yaml dosyası oluştur

Drupal'a modülünüzün var olduğunu söylemek için bir info yaml dosyası oluşturmanız gerekir. Bu, Drupal 7'de bir .info dosyası oluşturmakla benzer.

Dosya adı, .info.yml uzantılı modülünüzün makine adı olmalıdır. Bu durumda, ilk_module.info.yml olacaktır.

  • First_module.info.yml dosyasını first_module dizininin kök dizininde oluşturun.
    name: First Module
    description: An experimental module to build our first Drupal 8 module
    package: Custom
    type: module
    version: 1.0
    core: 8.x

.yml dosyaları hakkında daha fazla bilgi .

.module dosyası oluştur

Drupal 7'de, herhangi bir kod içermese bile .module gereklidir. Drupal 8'de isteğe bağlıdır. Kancaları uygulamak istiyorsanız daha sonra kullanılabilecek bir tane oluşturacağım.

  • First_module dizininin kök dizininde first_module.module adlı bir tane oluşturun.

Src dizini oluştur

Denetleyiciler, eklentiler, formlar, şablonlar ve testler için modül dizini içinde bir alt dizin oluşturmamız gerekir. Bu alt dizin kaynağı olarak kısa olan src olarak adlandırılmalıdır. Bu, denetleyici sınıfının otomatik olarak yüklenmesine izin verecek ve bu da sınıf dosyasını açıkça eklemeniz gerekmediği anlamına geliyor.

  • Kaynak adı kısa olan src adlı first_module modül klasöründe bir klasör oluşturun.

Basit bir denetleyici oluştur

Denetleyiciler, işin çoğunu tipik bir MVC uygulamasında yapar. Modül için temel denetleyiciyi oluşturma adımları şunlardır:

  • Controller adlı src içinde bir klasör oluşturun.
  • Controller klasörü içinde FirstController.php adlı bir dosya oluşturun.

FirstController.php'de, çalıştığını bildiğimizden basit bir "merhaba dünya" mesajı oluşturacağız.

<?php
/**
 * @file
 * Contains \Drupal\first_module\Controller\FirstController.
 */
 
namespace Drupal\first_module\Controller;
 
use Drupal\Core\Controller\ControllerBase;
 
class FirstController extends ControllerBase {
  public function content() {
    return array(
      '#type' => 'markup',
      '#markup' => t('Hello world'),
    );
  }

Bir rota dosyası ekle

Yukarıda oluşturduğumuz kumanda birimi bu aşamada hiçbir şey yapmayacaktır. URL'nin yürütülebilmesi için onu URL'den denetleyiciye giden bir rotaya bağlamamız gerekir.

  • First_module.routing.yml adlı bir dosya oluşturun
  • Aşağıdaki kodu first_module.routing.yml'a ekleyin
    first_module.content:
      path: '/first'
      defaults:
        _controller: 'Drupal\first_module\Controller\FirstController::content'
        _title: 'Hello world'
      requirements:
        _permission: 'access content'

Içeriği izle

Henüz yapmadıysanız, modülü etkinleştirin.

Şimdi / ilk giderseniz, denetleyiciden geri gönderilen Merhaba Dünya iletisini görürsünüz.

Menü bağlantısı oluştur

Rota şimdi çalışır ve denetleyiciden içerik döndürür. Ancak, içeriğe erişebilmek için URL'yi bilmeniz gerekir. Bunu daha kullanışlı kılmak için, onu Drupal'ın menü sistemine eklememiz gerekiyor. Bunu yapmak için, bir menü .yml dosyası oluşturmanız gerekir.

  • Modül kök dizininde first_module.links.menu.yml oluşturun
  • Aşağıdakileri ekleyin:
    first_module.admin:
      title: 'First module settings'
      description: 'A basic module to return hello world'
      parent: system.admin_config_development
      route_name: first_module.content
      weight: 100
  • Önbelleği boşaltın ve ardından yapılandırma -> geliştirme altında menü öğesini görmeniz gerekir.
  • Menü maddesini tıkladığınızda ilk önce sizi götürecektir.

Ve işte bu, bir şey getiren bir menü öğesiyle ilk Drupal 8 modülünüz!

Özel bir blok

Şimdiye kadar, bir başlık ve dizeyi görüntüleyen bir özel yolumuz ve menü öğemiz var. Biraz daha heyecan verici bir şey yapalım ve modüle özel bir blok ekleyelim.

Öncelikle, modül için yeni bir eklenti yaratmamız gerekiyor. Eklentiler Drupal 8'de yenidir ve değiştirilebilir işlevsellik parçaları sağlar.

  • Başlamak için modülün Plugin adlı src klasöründe yeni bir dizin oluşturun. Burası bu modül için tüm eklentilerinizi depolayabileceğiniz yerdir.
  • Ardından Blok adlı bir klasör oluşturun. Blok, bir eklenti türüdür.
  • Block klasöründe, HelloBlock.php adlı bir dosya oluşturun.

Bu dosyada, ad alanını ve sınıfı tanımlamamız gerekir. PHPStorm gibi bir IDE kullanırsanız, bu otomatik olarak oluşturulacaktır.

    <?php
     
    namespace Drupal\first_module\Plugin\Block;
     
    class HelloBlock extends BlockBase {
     
    }

BlockCase sınıfını genişletmeniz gerekiyor. Bunu yapmak için, aşağıdaki use ifadesini ekleyin:

Drupal \ Core \ Block \ BlockBase kullanın;

Ve daha sonra HelloBlock sınıfını HelloBlock'a geçirirken BlockBase genişletir.

    <?php
     
    namespace Drupal\first_module\Plugin\Block;
    use Drupal\Core\Block\BlockBase;
     
    class HelloBlock extends BlockBase {
     
    }

Blok için kullanmamız gereken Drupal için bir başka yeni kavram, Ek açıklamalar. Drupal'ın blok kodunuzu bulması için, bir Açıklamayı çağıran belirli bir şekilde bir kod yorumlaması uygulamalısınız.

  • Aşağıdaki yorumu ekleyin : class HelloBlock, BlockBase'yi genişletir :
    /**
     * Provides a 'Hello' Block
     *
     * @Block(
     *   id = "hello_block",
     *   admin_label = @Translation("Hello block"),
     * )
     */

Ardından, dokümanları temel sınıftan devralmamız ve blok içeriğini döndürecek bir yapı yöntemi eklememiz gerekiyor.

    class HelloBlock extends BlockBase {
      /**
       * {@inheritdoc}
       */
      public function build() {
      return array(
          '#markup' => $this->t('Hello, World!'),
       );
      }
    }

HelloBlock.php'nin tam kodu

    <?php
    /**
     * @file
     * Contains \Drupal\first_module\Plugin\Block\HelloBlock.
     */
     
    namespace Drupal\first_module\Plugin\Block;
    use Drupal\Core\Block\BlockBase;
     
    /**
     * Provides a 'Hello' Block
     *
     * @Block(
     *   id = "hello_block",
     *   admin_label = @Translation("Hello block"),
     * )
     */
    class HelloBlock extends BlockBase {
      /**
       * {@inheritdoc}
       */
      public function build() {
        return array(
          '#markup' => $this->t('Hello, World!'),
        );
      }
     
    }

Blok Yeri

Sonra önbelleği temizlemeniz gerekir. Ve sonra bloğu bir bölgeye eklemek için, bloklar admin sayfasına gidin. Blok, yan çubuğun ilk bölgesine eklemek için Yerleştir bloğunu tıklayın.

Görsel kaldırıldı.

Mevcut blokların bir listesi ile bir model görüntülenir. Yeni oluşturduğunuz Merhaba bloğu bulmak için merhaba arayın. İşlemler sütunundaki Blok yerleştir düğmesini tıklayın.

Görsel kaldırıldı.

Daha sonra  bloğun yapılandırma formunu göreceksiniz.

kayıt edin.

Görsel kaldırıldı.

Ardından, bloklar düzen sayfasının en altına gidin ve blokları kaydet'i tıklayın. Şimdi bloğu sitenizin sol kenar çubuğunda görmelisiniz.

Görsel kaldırıldı.

Dosya yapısına genel bakış

Yukarıdaki adımları tamamladıktan sonra, aşağıdaki gibi bir dosya yapısına sahip olmalısınız:

Görsel kaldırıldı.

Özet

Bu öğreticide, temel bir Drupal 8 modülü oluşturdunuz, bir dize döndüren ve özel bir blok oluşturan bir denetleyiciye bir URL eşleştirdiniz. Kavramlar bu aşamada tamamen yabancıysa endişelenmeyin. Sadece pratik yapmaya devam edin ve zamanla her şey netleşecektir. Ve unutmayın, yalnız değilsiniz - Drupal 8'e geçiş, tüm Drupal topluluğunun başlattığı bir yolculuk. Drupal konusunda desteğe ihtiyaçınız olursa ilettişim kurmaktan çekinmeyin.

Mutlu kodlamalar :)

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

Linux’ta Spectre & Meltdown CPU Kontrolü Nasıl Yapılır?

Meltdown ve Spectre

Meltdown ve Spectre Nedir?

Meltdown ve Spectre, modern işlemcilerde bulunan ve şimdiye kadar keşfedilen en ciddi güvenlik açıkları arasında yer alan iki kritik güvenlik açığıdır. Bu açıklar, tüm işletim sistemlerini (Windows, MacOS, Linux) ve bu işletim sistemleri üzerinde çalışan cihazları etkileyebilmektedir.

Bu güvenlik açıkları, işlemcilerin tasarımındaki bazı özelliklerden yararlanarak programların, normalde erişim izni olmayan verileri okumasına olanak tanır. Meltdown ve Spectre, kötü niyetli bir programın diğer programların belleğinde saklanan hassas verilere erişmesine izin verir. Bu veriler arasında şifre yöneticilerinde veya web tarayıcılarında saklanan parolalar, kişisel fotoğraflar, e-postalar, anlık iletiler ve iş için kritik olan belgeler bulunabilir.

Meltdown ve Spectre, kişisel bilgisayarlarda, mobil cihazlarda ve bulut hizmetlerinde çalışabilir. Bulut sağlayıcısının altyapısına bağlı olarak, bir kullanıcının diğer müşterilere ait verilere erişmesi mümkün olabilir.

Ubuntu Kullanıcıları İçin Güncellemeler

Ubuntu kullanıcıları için kernel güncellemeleri 9 Ocak'ta yayınlandı. Güncellenen çekirdek sürümleri şu şekildedir:

  • Ubuntu 20.04 LTS (Focal) — Linux 5.4
  • Ubuntu 18.04 LTS (Bionic) — Linux 4.15
  • Ubuntu 16.04 LTS (Xenial) — Linux 4.4
  • Ubuntu 14.04 LTS (Trusty) — Linux 3.13
  • Ubuntu 12.04 ESM (Precise) — Linux 3.2

Sisteminizin Meltdown ve Spectre güvenlik açıklarından etkilenip etkilenmediğini kontrol etmek için Spectre & Meltdown Checker isimli scripti kullanabilirsiniz. Bu scripti kurmak için aşağıdaki adımları takip edin:

cd /tmp/
wget https://raw.githubusercontent.com/speed47/spectre-meltdown-checker/master/spectre-meltdown-checker.sh
sudo sh spectre-meltdown-checker.sh

Linux kullanıcıları için güvenlik güncellemeleri gelmeye devam etmektedir. Sisteminizi düzenli olarak güncelleyerek bu tür güvenlik açıklarından korunmaya çalışın.

Servisleri Çalıştırma ve Durdurma

Apache için:

  • Çalıştırmak için: sudo systemctl start apache2
  • Durdurmak için: sudo systemctl stop apache2
  • Yeniden başlatmak için: sudo systemctl restart apache2

MySQL için:

  • Çalıştırmak için: sudo systemctl start mysql
  • Durdurmak için: sudo systemctl stop mysql
  • Yeniden başlatmak için: sudo systemctl restart mysql

Başarılı bir işletme için kobilere 10 altın öneri

Başarılı bir işletme için kobilere 10 altın öneri

Bir işletmenin web sitesi birçok yerel işletmenin internet varlığının temelini oluşturur. Aslında, KOBİ’lerin çevrimiçi pazarlama hizmeti harcamalarının yarısından fazlası web sitesi görünürlüğünü artırmaya yöneliktir. Web sayfası oluştururken hangi bilginin sunulacağı, içeriğin nasıl organize edileceğinin planlaması ve işletme internet varlığı stratejisinin de başarılı bir şekilde uygulanması çok önemlidir. Çok önemli olmasına rağmen, küçük ölçekli işletmelerin büyük bir çoğunluğu ve orta ölçekli işletmelerin önemli bir kısmı arama motorlarında hızlıca ulaşılabilecek, müşterinin istediği bilgileri ve güveni sağlayacak bir web sitesi geliştirmede zorluk yaşamaktadırlar.

Bütün bu eksiklikler, küçük işletmeler için, müşterilerin hızla artan bir şekilde yerel işletme bilgilerini aradığı dijital ve mobil dünyadan gelecek potansiyel fırsatları kaçırmalarına sebep olmaktadır.

İşletmenizin internet varlığını artırmak için birçok şey yapılabilir ve başarılı bir web sitesi görünümü rekabette işletmenizi bir adım öne çıkarabilir. Aşağıda, başarılı bir internetvarlığı elde etmek ve web sitesi görünümünü artırmak için KOBİ’lerin aklında tutması gereken 10 öneri sıralanmıştır.

İletişim bilgilerinizin görünürlüğünü ve ulaşılabilirliğini mutlaka artırın

Birçok web sitesinin var olma sebeplerinden biri “İletişim sayfası” aracılığıyla müşterilerin işletmeye ulaşmasını sağlamaktır. Fakat bu web sitelerinin büyük bir kısmı web ziyaretçisini müşteriye çevirebilecek güçlü bir iletişim sayfasına sahip değillerdir. Genellikle en altta saklanmış ve ziyaretçilerin onları arayıp bulmasını zorlaştıracak şekilde yer almakta ve ziyaretçilerin iletişime geçmesini oldukça zorlaştırmaktadır.

Kolaylıkla ulaşılabilen iletişim bilgileri tüketicinin web sitesi ziyaretini satışa dönüştürmesi için ihtiyaçtır. Bu aynı zamanda arama motorlarında daha yüksek sırada çıkmasında da önemli bir rol oynamaktadır. İletişim bilgileri Web sitenizin “Hakkında” kısmında kaybolmamalı ve işletmenin, müşterilerin kendisine ulaşmasının çok önemli olduğu vurgulanmak amacıyla belirgin bir şekilde her sayfada yer almalıdır.

İletişim sayfası, müşterinin onunla iletişime geçmesini beklememeli, proaktif bir şekilde iletişim sayfası aracılığıyla bir adım önde yer almalı ve aksiyona çağırıcı nitelikte teklifler sunmalıdır. Örneğin, iletişim bilgileri en altta ve ufak puntoyla yazılmışsa reaktifliğin belirtisidir, diğer taraftan ana sayfada kalın ve büyük puntolarla belirgin bir şekilde yer alan iletişim bilgileri müşteriyi harekete geçirerek istenen iletişimi sağlar. Bunlara ek olarak, ziyaretçilerin her sayfadan basit ve hızlı bir şekilde “İletişim” sayfasına ulaşması sağlanmalı ve Sosyal Medya bağlantılarına da iletişim bilgilerinin olduğu sayfada muhakkak yer verilmelidir. Ayrıca özellikle iletişim bilgilerinin yer aldığı sayfanın cep telefonu, tablet ve diğer platformlarla görüntülenebilir ve uyumlu olması kesinlikle sağlanmalıdır.

İletişim Formları ve E-Bültenleri etkin bir şekilde kullanın

Müşteri /ziyaretçi etkileşim işlemlerine ve üyelik & topluluk olanaklarını web sitenizde yer vermelisiniz. Yerel işletmeler müşterinin satın almak için onu aramasını beklemek zorunda değillerdir. Canlı Sohbet hizmetleri müşterilerin ilgilendikleri ürün ve hizmetler hakkında 7/24 bilgi alabilmelerine olanak sağlar. Bu sadece müşterinin satın alma işlemini tetiklemeyecek aynı zamanda işletme ile müşteri arasında aktif bir ilişki de oluşturacaktır.

İletişim Formları müşteriyle etkileşimi sağlayan ve çok fazla zaman harcamadan müşterilerin ne aradıklarını bulmalarını kolaylaştırın bir diğer önemli bileşendir. Günümüz tüketicileri sosyal medya üzerinden de işletmelerle iletişim kurmayı bekliyorlar bu yüzden web sitesinde sosyal medya bağlantıları da bulunmalıdır.

Eposta bültenleri günümüzün en önemli ve en büyük pazarlama ve reklam araçlarından bir tanesidir. Eğer işletmenizin bir E-bülten yayını yok ise müşteri kaybediyorsunuz demektir, e-Bültenler ziyaretçilerin web sitenizi ziyaret etmesine ve satışların artışına da yardım ederler. Her web sitenin E-bülteni göndermek için Eposta listesi oluşturmak üzere bir eposta ekleme bölümü oluşturması gereklidir. Genellikle, 3 bilgiden (isim, eposta ve diğer bir bilgi) fazla bilgi talep edilince, basit formlara göre çok daha az sayıda eposta kaydının gerçekleştiği bilinen bir gerçektir bu yüzden bilişimde yaygın kullanılan “Keep it simple stupid” kuralını uygulayın.

Müşterilere düzenli bir şekilde e-bültenler gönderilmelidir. Mevcut Müşteri listenize Eposta göndermenize olanak veren çok sayıda araç vardır. Çok büyük bir müşteri veritabanınız yok ise, bu araçların ücretsiz deneme sürümleri de bir süreliğine test ederek kullanabilirsiniz. İletişim formları aracılığıyla iletişime geçen kişiler müşterinin de onayı alınarak doğrudan bu eposta listesine aktarılabilir.
Web Sitenizin Erişilebilirliği gözden geçirin

Web sitenizin erişilebilirliğini artırmak için; Evrensel hedef kitlenin ilgisini çekme (çok dilli çeviriler), kültürel hassasiyet, engellilere yönelik erişim & hizmetler, tarayıcı uyum kapsamı asgari & azami monitör çözünürlükleri; hız & bant genişliği hassasiyeti; indirme sırası & görüntü yeniden çizimleri; navigasyonun işlevselliği ve anlaşılabilir olması, bağlantı bütünlüğü, sunulan bağlantıların kalitesi ve derinliği, ana bilgilere erişim için harici ve dahili bağlantı oranları göz önünde bulundurulmalıdır.

Göz Alıcı ve Kullanışlı Ara Yüz Tasarımları Yapın

Web sitenizde daha çok kişinin ve daha sık aralıklarla ziyaret etmesini istiyorsunuz bu kaliteli bir içeriğin yanı sıra kaliteli bir tasarımı da gerektirir. Tasarımda görsellik, profesyonel görünüm, sanatsal bütünlük, renk uyumları her zaman ön planda olmalıdır. Bir kitabı sadece kapağına bakarak almayabilirsiniz, ancak hedeflediğiniz müşteriler alabilir. Görsel olarak çekici renklere sahip modern bir web sitesine yatırım yapmak sadece web sitenizi daha cazip kılmaz aynı zamanda işletmenizin profesyonelliğini de yansıtır. Tasarımlarda 20 çeşit renk kullanmak yerine birbiriye uyumlu az sayıda renk şemalarını tercih edin. Kesinlikle ücretsiz Template kullanmayın, tasarımda yenilikleri takip edin ve sitenize yansıtın; farklı fikirler, sunum biçimleri düşünün, geliştirin.Siteniz özgün, diğerlerinden ayrılabilir olmalı, birden çok duyuya hitap etmeli ve akılda kalıcı etki bırakmalıdır.

Kullanıcı dostu olmak, kullanım kolaylığı, anlaşılabilirlik ve basitlik, tasarımda göz önünde bulundurulması gereken temel unsurlardır. Siteye koyacağınız bilgiyi bir süzgeçten geçirin ve en az halde ne kalabilirse onu yayınlayın; hiçbir izleyici onlarca sayfa okumak istemez. O kişiyle konuştuğunuzu düşünün, saatlerce bir şeyler anlatan birisi mi ilgi çekicidir, yoksa demek istediğini kısa ve net bir şekilde ifade eden mi?

Fotoğrafların boyutlarını mutlaka sayfaya göre optimize edin ve çok gerekli olmadıkça müzik kullanmayın. Resim yerine, metin kullanmaya önem verin ve çok sayıda değişik font ve çok sayıda değişik yazı boyutu kullanmayın.

Flash uygulama kullanıp, kullanmamanın artıları ve eksileri göz önünde bulundurulmalı, elbette flash, görsel olarak daha ilgi çekici olabilir ancak içerik anahtar kelimelerle taratılmadığı için arama sıralamalarınızı olumsuz etkileyebilir. Flash aynı zamanda web sitesini yüklenme zamanını artırır, yazılım güncellemeleri gerektirir ve bazı akıllı telefonda ve tarayıcılarda görünmeyebilir ve bu eksiklikler de müşterileri web sitenizde vakit geçirmekten caydırabilir. Grafik, fotoğraf ve videoların bağlantıları sürekli kontrol edilmeli, bozuk bağlantılar düzeltilmeli ve metin ile görsel birbiriyle uyumlu olmalıdır. Tüm bu eksikliklerin düzeltilmeden web sitesinde yer alması, işletmenin zayıflığını yansıtır.

Tanımlayıcı ve aramaya uygun anahtar kelimeleri kullanın

Web Sitenizin birincil, ikincil ve yan amaçlarını net olarak belirleyin. Bu site ile ne elde etmek istiyorsunuz, bunu gerçekçi bir gözle değerlendirin ve amaçlarınızı buna göre düzenleyin. İnternette aratılınca bulunmak için, özellikle müşterilerin sizin ürün ve hizmetlerinize ulaşmak için kullanacağı anahtar kelimeleri özenle belirleyerek web sitenizde kullanın. İçeriği oluşturmadan önce işletmenizin ürün ve hizmetlerine en uygun anahtar kelimelerin listesini çıkarın. Google adwords gibi araçları kullanarak hangi kelimelerin daha çok arandığını izleyebilirsiniz. Web sitenizi ziyaret edecek müşterilerin işletmeniz ve hizmetleriniz hakkında ne kadar detaylı bilgiye sahip olduğunu bilinemediği için, hem teknik hem de herkesin anlayabileceği dili kullanmaya dikkat edin. İçerikte bu anahtar kelimeleri okuyucuların anlayacağı bir şekilde yerleştirin ve aşırı anahtar kelime kullanımı spam olarak algılanabileceğini unutmayın. Bu noktada, içeriğin özgünlüğü ile nadir bulunabilir olması çok önemlidir.

Anahtar kelimeleri, sayfa bağlantılarında kullanın ki arama motorları arama terimlerinin sayfanızla ilgili olduğunu anlayabilsinler. Arama motorları Video ve fotoğrafları algılayamazlar, ancak, video ve fotoğrafın isimlerini ve de tanımlarını algılayabilirler. Bu nedenle video ve fotoğrafları ve tanımları anlamlı anahtar kelimelerle adlandırın. Her bir sayfanın başlığını sayfanın içeriğine uygun bir şekilde değiştirin. Tarayıcıda görünen her sayfanın başlığında işletme ismi veya web site ismi olmalı ve o sayfanın içeriğiyle ilgili başlık da bulunmalıdır.

Düzenli İçerik Güncellemeleriyle sayfalarınızı aktifleştirin

Genellikle işletmeler web sitesi yayınlanınca amaçlarına ulaştıklarını düşünür. Gerçekte ise web site bakımı devam eden bir süreçtir. Aramalarda ilgili kalabilmek için, web siteleri sürekli güncellenmek durumundadır, böylelikle aktif olup olmadıklarını arama motorları anlayabilir. Daha da önemlisi, web siteniz sürekli gelişen ve değişen işletmenizi her zaman en iyi şekilde yansıtmalıdır.

Her hafta ya da 2-3 haftada bir ana sayfanızda en son ürün ve hizmetlerinizin tanıtımına yer verin. En çok web sitenizde neye önem veriyorsanız ona odaklanın. Artık hizmet vermediğiniz veya satmadığınız ürünleri web sitenizden kaldırın. Hata ve/veya yanlışların olmaması çelişkilerin olmaması, çıkmaz sokakların ve güncellenmemiş sayfaların olmaması İşletmenizin müşteri gözünde değerini artıracaktır.

Bir diğer fikir ise bir Blog sitesi kurmak ve haftada bir sektörünüz ve işletmeniz ile ilgili yeni haber, öneri ve tüketicilerin ihtiyacı olan diğer faydalı bilgiler yayınlamak. Böylece müşteriler karşılaştıkları sorunlara internette çözüm aradıkları zaman sizi bulabilir. Blog, işletmenizi alanında uzman bir konuma yerleştirecek, aranabilir içerik oluşmasını sağlayacak ve sosyal medya kanallarınızla müşterileriniz arasındaki etkileşimi artıracaktır. İçeriğinYasalara uygunluğu kontrol edilmeli ve üçüncü şahıslardan temin edilen alıntılar, görüntüler ve fikri mülkiyet haklarına uygunluk, uluslararası teklif haklarına, orijinal sanat eserleri, müzik, fikri mülkiyet vs. riayet edilmelidir.

Etkileşimi artırmak için Sosyal medya kanallarınızı ön plana çıkarın

İşletmenizin Facebook, Twitter, Google Plus, Pinterest, Flickr, Linkedin ...vb. Sosyal medya hesapları yoksa, hemen edinin! Sosyal Medya basit ve ücretsiz reklam yöntemidir, takipçi oluşturmak işletmenize her konuda büyük fayda sağlayacaktır.

Sosyal medya optimizasyonu (Social media optimization, SMO), Kurumların ve bireylerin sosyal ağ profillerini profesyonelleştirerek belirli içerik yerleşim ve paylaşımıyla hedeflenen sitelere trafik yönlendirmeyi, internet üzerindeki farkındalığın arttırılmasında kullanılan bir yöntemdir.

Sosyal Medya’da yer alan KOBİ’lerin büyük çoğunluğunun ana sayfalarında sosyal Medya ikonlarına yer vermediği görülmektedir. Sosyal medyaya yatırım yapan işletmelerin web sitesi ve sosyal medya arasında bağlantı oluşturmamaları büyük bir eksikliktir. Günümüz tüketicileri Sosyal medya aracılığıyla iletişimi tercih edebiliyor, bu nedenle eğer sosyal medyada yer alıyorsanız, web sitenizde bağlantılarına yer vermelisiniz.

Sosyal medyada içerik çok hızlı bir şekilde oluşturulabildiği ve paylaşılabildiği için müşteriler işletmeniz ve ürünleriniz hakkında daha fazla bilgiye sahip olabilecek. Arama motorları, sosyal medyayı da arama sıralamalarında göz önünde bulundurmaktadır. Bu nedenle paylaşımlarda etkileşimi artırmak için kaliteli, ilginç ve görsel öğelerle içerik paylaşılmalıdır. Ayrıca arama motorları ve tutarlılık açısından her bir sosyal medya kanalında birbirine benzer isimli URL’ler tercih edilmelidir.

Web sitenizin diğer tarayıcılarla ve Cep telefonlarıyla uyumlu olduğundan emin olun

Cep telefonu ve tablet pazarı gün geçtikçe büyümekte ve insanların hareketliliği artmaktadır. Aynı zamanda müşterilerin cep telefonu üzerinden yerel işletme bilgileri arayışı da hızlı bir oranda artmaktadır. Bu da işletmelerin masaüstü bilgisayarlar haricinde, diğer platformlarla da ulaşılabilmesi gerektiği ihtiyacını göstermektedir. Ancak, KOBİ’lerin büyük çoğunluğunun web sitesi cep telefonlarıyla görüntülenmeye uyumlu değil. Cep telefonlarıyla görüntülenecek web sitesinin, masaüstü ile görüntülenen ki gibi bütün özelliklerini yansıtması gerekmemektedir. Sadece, iletişim bilgileri, başlıca ürün ve hizmetleri vb. temel unsurları içermesi yeterlidir.

Diğer tarayıcılar da ihmal edilmemeli, özellikle Firefox ve Opera sık kullanılan iki tarayıcıdır. En ideali, sürekli güncellenen tarayıcılarla uyumun sağlanması adına, her platform/tarayıcı için ayrı bir CSS yaparak, gerekli düzeltmeleri bunlar üzerinde gerçekleştirilmesidir.

Web siteniz aracılığıyla Müşteri İlişkileri ve Hizmetlerini sunun

Müşteri ile sağlıklı bir sanal iletişim kurmak, uzun süreli bir işletme-müşteri ilişkisinin temelini oluşturduğu için önemlidir. Bunun için dikkat edilecek hususlar aşağıda sıralanmıştır;

Müşterilere teşvik edici bir şekilde Web sitesi üzerinden irtibata geçme ve cevap alabilme kolaylığı sağlanmalı ve müşterilerden gelen talep ve şikâyetler yönetilmelidir. “Satın Al” ve “Sipariş Ver” bağlantıları okuması kolay, büyük punto ve belirgin bir şekilde yer almalıdır. Ayrıca ücretsiz hizmetler, araçlar, sunulan olanaklar müşterilerin dikkatinden kaçmayacak bir şekilde bilgilerine sunulmalıdır. Temin edilen müşteri başarı belgeleri ve geri ödeme yapma politikası & gizlilik uygulamaları muhakkak web sitesinde sunulmalıdır. Reklam ve kurumsal temsillerde dürüstlüğe dikkat edilmelidir.

Yeni müşterilerin isteklerini çok hızlı bir şekilde cevaplandırmaya özen gösterilmelidir. Genellikle sorusuna çok hızlı bir şekilde yanıt alan ziyaretçinin müşteriye dönüşme ihtimali çok yüksektir. Müşteriye cevap vermekte çok gecikilmesi, başka bir işletmeden ürün veya hizmeti alması için önemli bir nedendir. İdeali, otomatik hazır cevaplarla müşteriye yanıt verilmeli ve sonrasında mümkün olduğunca hızlı bir şekilde kişisel olarak da cevap verilmelidir.
Sonuçları İzleyin ve Değerlendirin

İlginç bir şekilde KOBİ’lerin büyük bir çoğunlu Google Analytic vb web sitesi performanslarını ölçen analitik araçlarını kullanmamaktadır. Web sitesinin ziyaretçi trafiğini uygun bir şekilde izleyen bir analitik programı olmadan KOBİ’ler ne kadar ziyaretçi geldiğini, ziyaretçilerin nereden geldiği bilgisini potansiyel müşterilerin hangi anahtar kelimeleri aradıklarını ve hangi içeriğin ilgi çektiğini bilemezler. KOBİ’ler düzenli bir şekilde web sitesi analitiğini gözden geçirmeli ve sonuçlara göre web sitesinin görünürlülüğünü ve performansını artırmalıdırlar.

kaynak: 1

Nginx nedir? Temel Özellikleri ve Nerede Kullanılır?

Nginx nedir? Temel Özellikleri ve Nerede Kullanılır?

Nginx nedir?

Nginx rus yazılım mühendisi Igor Sysoev tarafından geliştirilen hafif, stabil, hızlı bir mail istemcisi olarak kodlanan daha sonraları geliştirilerek tüm sunucular için uygun hale getirilen bir web sunucusudur.

Nginx özellikle yüksek trafikli ve yoğun istek girişi olan web siteleri için biçilmiş kaftandır. Single Thread yanıt yapısıyla sayfayı tek seferde indirip sayfa açılma hızında farkedilir büyük bir artış sağlar. Ayrıca nginx apache ve litespeed ile karşılaştırıldığında çok daha az cpu kullanır. Bu sebeple Nginx vps sunucular için biçilmiş kaftandır.

İnsanların Nginx i tercih etmemesinin en büyük sebebi destek sıkıntısı ve kurulum zorluğudur ancak nginx e hakim olan bir insan için yapılamayacak pek az şey vardır. Nginx kurulumunu bu yazımızda anlatmıştık.

Aşağıda özetleyeceğimiz üzerine web dosyalarınızı barındırabileceğiniz stabil çalışan ve güvenilir bir web sunucusudur.

Temel HTTP Özellikleri

* Statik ve index dosyalarının sunumu, otomatik indeksleme; açık dosya açıklayıcı önbellek;
* Önbellek ile hızlandırılmış reverse proxying; basit yük dengeleme ve hata toleransı;
* Uzak FastCgi sunucularının önbelleklenmesi ile hızlandırılmış destek; basit yük dengeleme ve hata toleransı;
* Modüler yapı. Gzip, byte aralıkları, yığın cevaplar (chunked responses), XSLT, SSI, imaj boyutlandırma gibi filtreler.
* SSL ve TLS SNI desteği.

Diğer HTTP Özellikleri

* Ad ve IP tabanlı sanal sunucular;
* Keep-alive ve pipelined bağlantı desteği;
* Esnek yapılandırma;
* İstemci işlemlerinde kopma olmadan yeniden yapılandırma ve online güncelleme;
* Erişim kayıt (log) formatları, tamponlanmış kayıt yazımı ve hızlı kayıt devri;
* 3xx-5xx hata kod yönlendirmeleri;
* rewrite modülü;
* İstemcinin IP adresine dayalı erişim kontrolü ve HTTP temel kimlik denetleme;
* PUT, DELETE, MKCOL, COPY ve MOVE methodları;
* FLV streaming;
* Hız sınırlandırma;
* Bir adresten gelen eşzamanlı bağlantı ve talepleri sınırlandırma.
* Gömülü perl.

Mail Proxy Sunucu Özellikleri

* Harici bir HTTP kimlik denetleme sunucusunu kullanarak, kullanıcıyı IMAP/POP3 backend’ine yönlendirme;
* Harici bir HTTP kimlik denetleme sunucusunu kullanarak, kullanıcıyı SMTP backend’ine yönlendirme ve kullanıcı kimlik denetlemesi;
* SSL desteği.
* STARTTLS ve STLS desteği.

Test Edilen İşletim Sistemleri ve Platformlar

* FreeBSD 3 — 8 / i386; FreeBSD 5 — 8 / amd64;
* Linux 2.2 — 2.6 / i386; Linux 2.6 / amd64;
* Solaris 9 / i386, sun4u; Solaris 10 / i386, amd64, sun4v;
* MacOS X / ppc, i386;
* Windows XP, Windows Server 2003

Nginx kurulumları ve gerekli ayarlarınız için bizimle iletişim kurabilirsiniz.

Mutlu kodlamalar

Linux Sistem Üzerinde Donanım Özelliklerini Ögrenme (Ubuntu, Debian, Fedora, CentOS vb.)

Linux Sistem Üzerinde Donanım Özelliklerini Ögrenme

Linux donanım bilgilerini nasıl ögrenebilirim?

Linux sisteminizin donanım özelliklerini merak ediyor yada ögrenmek istiyorsanız. Terminal üzerinde aşağıdaki yazacagımız birkaç komut satırı ile detaylı olarak ögrenebilirsiniz.

Aşağıdaki komutu terminal üzerinden çalıştırarak donanım listesine ulaşabilirsiniz.

sudo lshw -short

Daha detaylı çıkt için;

sudo lshw

Ya da ayrı ayrı ögrenmek için aşağıdaki yönergeleri takip edebilirsiniz.

Disk (Hard disk) Bilgileri

df -lh

Filesystem      Size  Used Avail Use% Mounted on
udev            3,9G  4,0K  3,9G    1% /dev
tmpfs           790M  1,3M  789M    1% /run
/dev/sda1       909G  4,4G  859G    1% /
none            4,0K     0  4,0K    0% /sys/fs/cgroup
none            5,0M     0  5,0M    0% /run/lock
none            3,9G  1,2M  3,9G    1% /run/shm
none            100M   60K  100M    1% /run/use

Disk bölümlendirmede kullanılan fdisk komudunu " -l " parametresini ekleyerek disklerin bölümlerini listelemek için kullanabiliriz. Bunun için root hesabı veya root yetkisi (sudo grubuna üye) bir kullanıcı gerekiyor.

sudo fdisk -l

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sector
Units = sektör of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk kimlikleyicisi: 0x000aa4bb

Device    Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048  1936928767   968463360   83  Linux
/dev/sda2      1936930814  1953523711     8296449    5  Ek
Partition 2 does not start on physical sector boundary.
/dev/sda5      1936930816  1953523711     8296448   82  Linux takas / Solaris
...

İşlemci (CPU) Bilgileri

İşlemci hakkında deyatlı olarak tüm bilgileri ögrenebilirsiniz.

cat /proc/cpuinfo

processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 60
model name	: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz
stepping	: 3
microcode	: 0x16
cpu MHz		: 2597.250
cache size	: 6144 KB
physical id	: 0
siblings	: 8
core id		: 0
cpu cores	: 4
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
...

Sisteminizdeki işlemcinizin kaçtane fiziksel çekirdiği var? Ögrenmek istiyorsanız. Yukardaki yazdığımız komut satırının sonuna " | grep cores " ekleyerek ögrenebiliriz.

cat /proc/cpuinfo | grep cores

cpu cores	: 4
cpu cores	: 4
cpu cores	: 4
cpu cores	: 4
cpu cores	: 4
cpu cores	: 4
cpu cores	: 4
cpu cores	: 4

Komutu işleme koydugunuzda çıkan sonuç fiziksel çekirdek sayısını vermekle beraber aynı sonuçun kaç adet oluşturulduğuda sanal çekirdek sayısını göstermektedir. Yukarıdaki sonuç; "4" fiziksel çekirdek ve "8" sanal çekirdeğe (thread) sahip bir sistem olduğunu gösteriyor.

Bellek (RAM&Swap) Bilgileri

Sistemin ne kadar bellek miktarına sahip olduğunu ögrenmek istiyorsanız. Aşağıdaki komudu komut satırına yazarak ögrenebilirsiniz.

free -m


                                     total      used         free         shared   buffers     cached.
mem:                            7895       4020       3875        429         62         1669
-/+ buffers/cache:         2288       5607
swap:                            8101          0          8101

Total altında sistemin toplam belleği gözükmekte. -m parametresi sonucu megabyte formatında basmaktadır. Örnek çıktıda 8GB fiziksel bellek 2GB swap alanı gözükmektedir.

Grafik Kartı (GPU) Bilgileri

Sistem üzerinde çalışan grafik kartı bilgilerini öğrenmek için tüm PCI cihazlarını listeleyen lspci komudu kullanılabilir.

lspci | grep VGA

00:02.0 VGA compatible controller: Intel Corporation 4th Gen Core Processor Integrated Graphics Controller (rev 06)

Diğer Bilgiler (Ethernet, kablosuz, ses kartları vb.)

Sistem üzerinde çalışan diğer donanımları görmek için "lspci" komudu kullanılabilir.

lspci

00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor DRAM Controller (rev 06)
00:01.0 PCI bridge: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor PCI Express x16 Controller (rev 06)
00:02.0 VGA compatible controller: Intel Corporation 4th Gen Core Processor Integrated Graphics Controller (rev 06)
00:03.0 Audio device: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller (rev 06)
00:14.0 USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB xHCI (rev 04)
00:16.0 Communication controller: Intel Corporation 8 Series/C220 Series Chipset Family MEI Controller #1 (rev 04)
00:1a.0 USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #2 (rev 04)
00:1b.0 Audio device: Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #1 (rev d4)
00:1c.2 PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #3 (rev d4)
00:1c.3 PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #4 (rev d4)
00:1d.0 USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation HM86 Express LPC Controller (rev 04)
00:1f.2 SATA controller: Intel Corporation 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] (rev 04)
00:1f.3 SMBus: Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller (rev 04)
01:00.0 3D controller: NVIDIA Corporation GK107M [GeForce GT 745M] (rev a1)
03:00.0 Network controller: Intel Corporation Wireless 7260 (rev 73)
04:00.0 Ethernet controller: Qualcomm Atheros QCA8171 Gigabit Ethernet (rev 10)

Soru görüş yada önerileriniz için bizimle iletişim kurmaktan çekinmeyiniz.

mutlu kodlamalar

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.

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 Eğitim