Drupal'ın 7.58 versiyonuna kadar halen sadece kullanıcıya kendi yorumunu silme izni verme özelliği eklenmedi. Bu büyük bir ihtiyaç neden eklemediklerine dair bir fikrim yok ama bana lazım bu özellik :). Evet gelelim nasıl ekleyeceğimize biraz kodlar arasında işlemler yapacağız bir modül kurupta işi bitirme gibi kolay bi yol olmayacak bu o kadar becerekli değilim bende modüle yama atarak yaptım.

Şimdi bu işi yapan ek modüller var onların isimlerini verebilirm onlarıda kurup izinlerini verirseniz kullanıcı kendi yaptığı yorumu silebiliyor. Comment delete ve Comment goodness modülleri bu açıdan işinizi görür. Lakin ben sayfa yenilenmeden yapmak için bu işlemleri AJAX Comments modülü ile birlikte çalışıyorum ama hep bi "Bu sayfaya erişim izniniz yok." hatasını verdi. Bende ajax comment modülünede yama attım. "Yorumları ve yorum ayarlarını yönet" izni alan kullanıcılarda bi sıkıntı yok onlar herşeyi yapabiliyor başkasının yorumunuda silebiliyor ee bunu veremezdim normal kullanıcılara.

Hadi geçelim nasıl yaptığıma. Çalışacağımız 3 sayfa var.

1. adım

modules/comment/comment.module

Hemen function comment_menu() içinde değişikliğimize başlıyoruz $items['comment/%/delete'] içindeki

  • access arguments satırını yorum  haline veya siliyoruz
  • access callback özelliğini ekleyip TRUE değerini veriyoruz

Neden bunu yaptık access arguments ile sadece istenen izindeki kişiler erişebilecekti o menuye bizde herkese açık yaptık ilerde kendimiz konrol edeceğiz.

// @file comment.module
// eski hali
  $items['comment/%/delete'] = array(
    'title' => 'Delete',
    'page callback' => 'comment_confirm_delete_page',
    'page arguments' => array(1),
    'access arguments' => array('administer comments'),
    'type' => MENU_LOCAL_TASK,
    'file' => 'comment.admin.inc',
    'weight' => 2,
  );

// yeni hali
$items['comment/%/delete'] = array(
    'title' => 'Delete',
    'page callback' => 'comment_confirm_delete_page',
    'page arguments' => array(1),
//    'access arguments' => array('administer comments'),
    'access callback' => TRUE,
    'type' => MENU_LOCAL_TASK,
    'file' => 'comment.admin.inc',
    'weight' => 2,
  );

2. adım

Aynı dosya içinde function comment_permission() içinde değişiklik yapacağız.

Neden yaptığımıza gelirsek ek bir izin tanımladık 'Delete own comments' kendi yorumu silebilir diye bir izin tanımladık ilerde bu izinin içini doldurağuz şuan sadece var işlevsiz.

// @file comment.module
// eski hali
function comment_permission()
{
  return array(
    'administer comments' => array(
      'title' => t('Administer comments and comment settings'),
    ),
    'access comments' => array(
      'title' => t('View comments'),
    ),
    'post comments' => array(
      'title' => t('Post comments'),
    ),
    'skip comment approval' => array(
      'title' => t('Skip comment approval'),
    ),
    'edit own comments' => array(
      'title' => t('Edit own comments'),
    ),
  );
}

// yeni hali
function comment_permission()
{
  return array(
    'administer comments' => array(
      'title' => t('Administer comments and comment settings'),
    ),
    'access comments' => array(
      'title' => t('View comments'),
    ),
    'post comments' => array(
      'title' => t('Post comments'),
    ),
    'skip comment approval' => array(
      'title' => t('Skip comment approval'),
    ),
    'edit own comments' => array(
      'title' => t('Edit own comments'),
    ),
    'delete own comments' => array(
      'title' => t('Delete own comments'),
    ),
  );
}

3. adım

Aynı dosyada devam ediyoruz function comment_links() içinde değişiklik yapacağız.

Neden yapıyoruz kısmana gelirsek burası dışarı linklerin oluşmasını sağlayan yer. Yorumlar üzerinde yönetici izni olmayan kişiler elseif (user_access('post comments')) koduna düşeceker bizde oraya silme link kodunu ekliyoruz, düzenleme kodunu kopyalayarak gerekli yerleri düzenliyoruz.

// @file comment.module
elseif (user_access('post comments')) // bu elseif işlendiğinde aşağıdaki kodumuzuda çalıştırmasını istiyoruz
  if (comment_access('delete', $comment)) {
    $links['comment-delete'] = array(
      'title' => t('delete'),
      'href' => "comment/$comment->cid/delete",
      'html' => TRUE,
    );
  }

4. adım

Aynı dosyada devam function comment_access() içinde değişiklik yapacağız.

Neden yapıyoruz peki bunu comment access fonksiyonu yorum izinlerini kontrol eden fonksiyon bizde ona kendi eklediğimiz 'delete own comments' izninide ekliyoruz comment_access($op, $comment) iki argüman alıyor $op değeri yorumda yapılacak işlemi soruyor $comment ise yorumun obje hali. Şimdi üye comment access'ten true alabilmek için giriş yapmalı ordaki yorumu yapan olmalı ve 'delete own comment' iznine sahip olmalı veya 'administer comments' iznine sahip olmalı true değeri dönsün. Dikkat ederseniz 3. adımda comment_access'i çağırdık orada işlevini görüyor.

// @file comment.module
if ($op == 'delete') {
  return ($user->uid && $user->uid == $comment->uid && user_access('delete own comments')) || user_access('administer comments');
}

buraya kadar geldiyseniz 

5. adım

modules/comment/comment.admin.inc dosyasında sıradaki değişikliğimiz

Neden yaptık peki function comment_confirm_delete_page() işlevinde sil tuşuna basıldığında yorum silinsin mi diye bir onay sayfası geliyor işte oraya erişim izinlerini vermeliyiz. Varsayılan halide işimiz görüyor ama güvenlik açığı var çünkü ilk adımda hatırlarsanız 'comment/%/delete' menüsüne girmede bir izin istememiştik herkese açmıştık şimdi comment_confirm_delete_page fonksiyonun içinde belli kontrolleri sağlamamız lazım 'return drupal_get_form('comment_confirm_delete', $comment)' döndermesi için yorumlarda yönetici veya 'delete own comments' iznine sahip ve comment_access'ten true dönmesi lazım comment_access'e 4. adımda değinmiştik.

// @file comment.admin.inc
// eski
function comment_confirm_delete_page($cid) {
  if ($comment = comment_load($cid)) {
    return drupal_get_form('comment_confirm_delete', $comment);
  }
  return MENU_NOT_FOUND;
}

// yeni
function comment_confirm_delete_page($cid)
{
  if ($comment = comment_load($cid)) {
    if (user_access('administer comments') or (user_access('delete own comments') and comment_access('delete', $comment))) {
      return drupal_get_form('comment_confirm_delete', $comment);
    } else
      return MENU_ACCESS_DENIED;
  }
  return MENU_NOT_FOUND;
}

 Yeni oluşturğumuz izni alan üye bu şartlar altında kendi yorumunu silme iznine sahip olur.

6. adım

/sites/all/modules/ajax_comments/ajax_comments.module dosyasında sıradaki değişikliğimiz.function ajax_comments_menu() içindeki 'ajax_comment/%/delete' linkine ulaşmak isteyenlere tam yetki veriyoruz.

  • access arguments satırını yorum  haline veya siliyoruz
  • access callback özelliğini ekleyip TRUE değerini veriyoruz

Neden yaptık kısmı basit kendimiz izinleri kontrol edeceğiz bir sonraki adımda

// @file ajax_comments.module
  $items['ajax_comment/%/delete'] = array(
    'page callback' => 'ajax_comments_delete',
    'page arguments' => array(1),
//    'access arguments' => array('administer comments'),
    'access callback' => TRUE,
    'delivery callback' => 'ajax_deliver',
    'type' => MENU_CALLBACK,
  );

7. adım

aynı dosya üzerinde devam ediyoruz function ajax_comments_delete() kodu üzerinde değişiklik yapacağız. Fonksiyon içindeki ilk iften sonraki kodları aşağıdaki üç nokta içine alıyoruz. Belirttiğimiz koşulları sağlamazsa menüye erişim izninin olmadığını dönderiyoruz.

// @file ajax_comments.module
  if (user_access('administer comments') or (user_access('delete own comments') and comment_access('delete', $comment))) {
    ...
  } else
    return MENU_ACCESS_DENIED;

Elimden geldiğince detaylı açıklamaya çalıştım umarım ihtiyacı olanların işini görür.