moodle eklenti deneme ai

Genel Forum
Cevapla
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

moodle eklenti deneme ai

Mesaj gönderen muratca61 »

işyerindeki chatgpt sorduk

Kod:Tümünü seç

bir moodle eklentisi yapmak istiyorum. bu eklenti ile öğretmen sisteme bir pdf yükleyecek. 
bu pdf den bir serbest araç ile soruları kare içerisine alarak soruyu işaretleyecek ve bu 
sorunun A B C D E soru şıklarından doğru olanı işaretleyecek. bu statik bir pdf yi dinamik
 pdf aracına dönüştürerek öğrenciye düz bir pdf olarak değil soru bazlı pdf olarak sunmak için bir eklenti olacak
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: moodle eklenti deneme ai

Mesaj gönderen muratca61 »

dosya yapısı

Kod:Tümünü seç

local/
 └── pdfregion/
      ├── db/
      │    └── install.xml
      ├── lang/
      │    └── tr/
      │         └── local_pdfregion.php
      ├── classes/        (opsiyonel, yardımcı sınıflar için)
      ├── form.php
      ├── index.php
      ├── view.php
      ├── lib.php
      └── version.php

Kod:Tümünü seç

version.php

Kod:Tümünü seç

<?php
defined('MOODLE_INTERNAL') || die();

$plugin->version   = 2025022600;        // YYYYMMDDXX formatında versiyon.
$plugin->requires  = 2022041900;        // Gereken minimum Moodle sürümü.
$plugin->component = 'local_pdfregion'; // Eklenti bileşen adı.

Kod:Tümünü seç

local_pdfregion.php

Kod:Tümünü seç

<?php
// This file is part of Moodle - http://moodle.org/

$string['pluginname']   = 'PDF Bölge Görüntüleme';
$string['uploadpdf']    = 'PDF Yükle';
$string['selectregion'] = 'Bölge Seçimi';
$string['submit']       = 'Gönder';

Kod:Tümünü seç

install.xml

Kod:Tümünü seç

<?xml version="1.0" encoding="UTF-8"?>
<xmldb>
  <table name="local_pdfregion" comment="PDF bölge verileri">
    <field name="id" type="int" length="10" unsigned="true" notnull="true" sequence="true" />
    <field name="userid" type="int" length="10" unsigned="true" notnull="true" />
    <field name="pdffilename" type="text" notnull="true" />
    <field name="page" type="int" length="10" unsigned="true" notnull="true" />
    <field name="x" type="int" length="10" unsigned="true" notnull="true" />
    <field name="y" type="int" length="10" unsigned="true" notnull="true" />
    <field name="width" type="int" length="10" unsigned="true" notnull="true" />
    <field name="height" type="int" length="10" unsigned="true" notnull="true" />
    <field name="timecreated" type="int" length="10" unsigned="true" notnull="true" />
    <key name="primary" type="primary" fields="id" />
  </table>
</xmldb>

Kod:Tümünü seç

form.php

Kod:Tümünü seç

<?php
require_once("$CFG->libdir/formslib.php");

class pdfregion_form extends moodleform {
    public function definition() {
        $mform = $this->_form;
        
        // PDF dosyasının yüklenmesi.
        $mform->addElement('file', 'pdffile', get_string('uploadpdf', 'local_pdfregion'));
        $mform->addRule('pdffile', null, 'required', null, 'client');
        
        // Sayfa numarası.
        $mform->addElement('text', 'page', 'Sayfa Numarası');
        $mform->setType('page', PARAM_INT);
        $mform->addRule('page', null, 'required', null, 'client');
        
        // Koordinatlar ve ölçüler.
        $mform->addElement('text', 'x', 'X Koordinatı');
        $mform->setType('x', PARAM_INT);
        $mform->addElement('text', 'y', 'Y Koordinatı');
        $mform->setType('y', PARAM_INT);
        $mform->addElement('text', 'width', 'Genişlik');
        $mform->setType('width', PARAM_INT);
        $mform->addElement('text', 'height', 'Yükseklik');
        $mform->setType('height', PARAM_INT);
        
        $mform->addRule('x', null, 'required', null, 'client');
        $mform->addRule('y', null, 'required', null, 'client');
        $mform->addRule('width', null, 'required', null, 'client');
        $mform->addRule('height', null, 'required', null, 'client');
        
        // Gönder butonu.
        $this->add_action_buttons(false, get_string('submit', 'local_pdfregion'));
    }
}

Kod:Tümünü seç

index.php

Kod:Tümünü seç

<?php
require_once('../../config.php');
require_once($CFG->dirroot.'/local/pdfregion/form.php');

require_login();
$context = context_system::instance();
$PAGE->set_context($context);
$PAGE->set_url(new moodle_url('/local/pdfregion/index.php'));
$PAGE->set_title(get_string('pluginname', 'local_pdfregion'));
$PAGE->set_heading(get_string('pluginname', 'local_pdfregion'));

$mform = new pdfregion_form();

if ($mform->is_cancelled()) {
    // İptal işlemleri varsa buraya ekleyin.
} else if ($data = $mform->get_data()) {
    // Yüklenen dosyayı Moodle dosya yönetimine kaydetmeniz ve PDF'i uygun alana taşımanız gerekir.
    // Aşağıdaki örnek, koordinat ve ilgili bilgileri veritabanına kaydetmeye yöneliktir.
    $record = new stdClass();
    $record->userid      = $USER->id;
    $record->pdffilename = $data->pdffile; // Gerçek uygulamada dosyayı kaydetmeniz gerekir.
    $record->page        = $data->page;
    $record->x           = $data->x;
    $record->y           = $data->y;
    $record->width       = $data->width;
    $record->height      = $data->height;
    $record->timecreated = time();

    global $DB;
    $DB->insert_record('local_pdfregion', $record);
    
    redirect(new moodle_url('/local/pdfregion/index.php'), 'PDF bölge bilgileri kaydedildi.');
}

echo $OUTPUT->header();
$mform->display();
echo $OUTPUT->footer();

Kod:Tümünü seç

view.php

Kod:Tümünü seç

<?php
require_once('../../config.php');

$regionid = required_param('id', PARAM_INT);

global $DB;
$region = $DB->get_record('local_pdfregion', array('id' => $regionid), '*', MUST_EXIST);

$context = context_system::instance();
$PAGE->set_context($context);
$PAGE->set_url(new moodle_url('/local/pdfregion/view.php', array('id' => $regionid)));
$PAGE->set_title(get_string('pluginname', 'local_pdfregion'));
$PAGE->set_heading(get_string('pluginname', 'local_pdfregion'));

// Burada PDF dosyasını alıp, veritabanında saklanan koordinatlar doğrultusunda kırpma işlemini yapmalısınız.
// Örneğin, crop_pdf_region() fonksiyonu PDF kütüphanesi (örneğin FPDI/TCPDF) ile entegrasyon sağlayarak
// yeni bir PDF ya da resim oluşturup, URL'sini dönebilir.
$croppedurl = crop_pdf_region($region); // Fonksiyonu kendinize göre uygulayın.

echo $OUTPUT->header();
echo html_writer::link($croppedurl, 'Kırpılmış PDF\'i Görüntüle');
echo $OUTPUT->footer();

/**
 * Dummy crop fonksiyonu.
 * Gerçek uygulamada, PDF crop işlemi yapıp, dosya URL'si döndürmelisiniz.
 */
function crop_pdf_region($region) {
    // Örnek: Gerçek işlemlerde FPDI veya benzeri kütüphane kullanılacaktır.
    return new moodle_url('/local/pdfregion/dummy.pdf');
}

Kod:Tümünü seç

lib.php

Kod:Tümünü seç

<?php
defined('MOODLE_INTERNAL') || die();

// local_pdfregion ile ilgili ek fonksiyonlar buraya eklenebilir.
Sonuç
Bu örnek dosya yapısı ve kodlar, Moodle ortamında bir PDF’den belirli bir bölge seçilip bu verinin saklanması ve öğrenciye sadece o bölümün sunulması işlevinin temelini oluşturur. Gerçek uygulamada:

Dosya yönetimi: Yüklenen PDF’in Moodle dosya alanına kaydedilmesi, erişim izinleri ve URL oluşturma.
PDF kırpma: FPDI/TCPDF veya başka bir PDF işleme kütüphanesi entegrasyonu ile belirlenen koordinatlardan yeni bir PDF ya da görsel oluşturma.
Güvenlik: Dosya tipi, boyut kontrolleri ve kullanıcı yetkilendirmeleri gibi ek güvenlik önlemleri.
Geliştirme sürecinde Moodle dokümantasyonunu ve örnek eklentileri inceleyerek detayları ve ek özellikleri entegre edebilirsiniz. Herhangi bir sorunuz ya da daha fazla detay isterseniz yardımcı olmaya hazırım.





muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: moodle eklenti deneme ai

Mesaj gönderen muratca61 »

tekrar cgpt sorduk

Kod:Tümünü seç

burada oluşturulan soruların (çerçevelerin) öğrenci tarafından işaretlenmesi 
ve toplam soru sayısı ile doğru yanlış ve boş oranına göre her sınav için bir sonuç 
kaydedilmesi ve yanlış cevaplar için yeniden bir sınav oluşturulması gibi eklentiler gerekecek
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: moodle eklenti deneme ai

Mesaj gönderen muratca61 »

yeni dosya yapısı

Kod:Tümünü seç

local/
 └── pdfregion/
      ├── db/
      │    ├── install.xml       // Mevcut tabloya eklemeler yapılacak
      ├── lang/
      │    └── tr/
      │         └── local_pdfregion.php
      ├── classes/              (opsiyonel yardımcı sınıflar)
      ├── form.php              // PDF yükleme ve bölge seçimi formu (öğretmen)
      ├── index.php             // Öğretmen arayüzü
      ├── exam.php              // Öğrencinin sınava girdiği sayfa
      ├── result.php            // Sınav sonucu gösterimi
      ├── retake.php            // Yanlış yapılan sorularla yeniden sınav
      ├── view.php              // PDF kırpma işlemi (örnek)
      ├── lib.php               // Yardımcı fonksiyonlar
      └── version.php
1. Veritabanı Yapıları (

Kod:Tümünü seç

install.xml
)
Öncelikle, öğretmen tarafından oluşturulan “soru” bilgilerini içeren tabloya ek olarak sınav sonuçları ve öğrenci cevaplarını saklayacak iki tablo ekleyebilirsiniz.
Örnek:

Kod:Tümünü seç

<?xml version="1.0" encoding="UTF-8"?>
<xmldb>
  <!-- Soru bilgilerini tutan tablo -->
  <table name="local_pdfregion" comment="PDF bölge verileri">
    <field name="id" type="int" length="10" unsigned="true" notnull="true" sequence="true" />
    <field name="userid" type="int" length="10" unsigned="true" notnull="true" />
    <field name="pdffilename" type="text" notnull="true" />
    <field name="page" type="int" length="10" unsigned="true" notnull="true" />
    <field name="x" type="int" length="10" unsigned="true" notnull="true" />
    <field name="y" type="int" length="10" unsigned="true" notnull="true" />
    <field name="width" type="int" length="10" unsigned="true" notnull="true" />
    <field name="height" type="int" length="10" unsigned="true" notnull="true" />
    <!-- Doğru cevap bilgisini ekliyoruz -->
    <field name="correctanswer" type="char" length="1" notnull="true" default="A" />
    <field name="timecreated" type="int" length="10" unsigned="true" notnull="true" />
    <key name="primary" type="primary" fields="id" />
  </table>

  <!-- Öğrencinin her soruya verdiği cevapları saklayan tablo -->
  <table name="local_pdfregion_results" comment="Öğrenci cevapları">
    <field name="id" type="int" length="10" unsigned="true" notnull="true" sequence="true" />
    <field name="userid" type="int" length="10" unsigned="true" notnull="true" />
    <field name="examid" type="int" length="10" unsigned="true" notnull="true" />
    <field name="questionid" type="int" length="10" unsigned="true" notnull="true" />
    <field name="answer" type="char" length="1" notnull="true" />
    <field name="iscorrect" type="int" length="1" unsigned="true" notnull="true" />
    <field name="timecreated" type="int" length="10" unsigned="true" notnull="true" />
    <key name="primary" type="primary" fields="id" />
  </table>

  <!-- Sınav sonuçlarını özet olarak saklayan tablo -->
  <table name="local_pdfregion_exam" comment="Sınav denemeleri">
    <field name="id" type="int" length="10" unsigned="true" notnull="true" sequence="true" />
    <field name="userid" type="int" length="10" unsigned="true" notnull="true" />
    <field name="totalquestions" type="int" length="10" unsigned="true" notnull="true" />
    <field name="correct" type="int" length="10" unsigned="true" notnull="true" />
    <field name="incorrect" type="int" length="10" unsigned="true" notnull="true" />
    <field name="blank" type="int" length="10" unsigned="true" notnull="true" />
    <field name="timecreated" type="int" length="10" unsigned="true" notnull="true" />
    <key name="primary" type="primary" fields="id" />
  </table>
</xmldb>
2. Öğrenci Sınav Sayfası:

Kod:Tümünü seç

exam.php
Öğrencinin, sistemdeki tüm soruları (veya belirli bir sınav kapsamındaki soruları) göreceği, her soru için A, B, C, D, E seçeneklerini içeren basit bir sınav form örneği:

Kod:Tümünü seç

<?php
require_once('../../config.php');
global $DB, $USER;

require_login();
$context = context_system::instance();
$PAGE->set_context($context);
$PAGE->set_url(new moodle_url('/local/pdfregion/exam.php'));
$PAGE->set_title(get_string('pluginname', 'local_pdfregion'));
$PAGE->set_heading(get_string('pluginname', 'local_pdfregion'));

// Sınav için tüm soruları çekiyoruz. (Gelişmiş senaryoda sınav ID veya kursa göre filtreleme yapılabilir.)
$questions = $DB->get_records('local_pdfregion');

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Sınav formu gönderildiğinde cevapları değerlendiriyoruz.
    $totalquestions = count($questions);
    $correct = 0;
    $incorrect = 0;
    $blank = 0;
    $answers = isset($_POST['answers']) ? $_POST['answers'] : array();
    
    // Öncelikle sınav sonucunu özetleyecek kayıt oluşturuyoruz.
    $examrecord = new stdClass();
    $examrecord->userid = $USER->id;
    $examrecord->totalquestions = $totalquestions;
    // Sonrasında doğru, yanlış, boş değerlerini hesaplayacağız.
    $examrecord->correct = 0;
    $examrecord->incorrect = 0;
    $examrecord->blank = 0;
    $examrecord->timecreated = time();
    $examid = $DB->insert_record('local_pdfregion_exam', $examrecord);
    
    // Her soru için cevabı kaydedip, doğru-yanlış durumunu belirliyoruz.
    foreach ($questions as $question) {
         $qid = $question->id;
         $studentanswer = isset($answers[$qid]) ? trim($answers[$qid]) : '';
         if ($studentanswer === '') {
              $blank++;
         } else {
              if (strcasecmp($studentanswer, $question->correctanswer) == 0) {
                   $correct++;
              } else {
                   $incorrect++;
              }
         }
         $record = new stdClass();
         $record->userid = $USER->id;
         $record->examid = $examid;
         $record->questionid = $qid;
         $record->answer = $studentanswer;
         $record->iscorrect = ($studentanswer !== '' && strcasecmp($studentanswer, $question->correctanswer)==0) ? 1 : 0;
         $record->timecreated = time();
         $DB->insert_record('local_pdfregion_results', $record);
    }
    
    // Sınav sonucunu güncelliyoruz.
    $examrecord->correct = $correct;
    $examrecord->incorrect = $incorrect;
    $examrecord->blank = $blank;
    $DB->update_record('local_pdfregion_exam', $examrecord);
    
    // Sınav sonucunu gösteren sayfaya yönlendiriyoruz.
    redirect(new moodle_url('/local/pdfregion/result.php', array('examid' => $examid)));
}

echo $OUTPUT->header();

// Sınav formunu oluşturuyoruz.
echo html_writer::start_tag('form', array('method' => 'post'));

foreach ($questions as $question) {
   echo html_writer::start_div('question');
   echo html_writer::tag('h4', 'Soru ID: ' . $question->id);
   echo html_writer::div('Sayfa: ' . $question->page . ' - Koordinatlar: (' . $question->x . ', ' . $question->y . ', ' . $question->width . ', ' . $question->height . ')');
   
   // Burada crop_pdf_region() gibi bir fonksiyon ile ilgili bölgenin görselini sunabilirsiniz.
   // Örnek: echo html_writer::tag('img', '', array('src' => crop_pdf_region($question)));
   
   // Cevap seçeneklerini radyo butonları ile ekliyoruz.
   $options = array('A'=>'A','B'=>'B','C'=>'C','D'=>'D','E'=>'E');
   foreach ($options as $opt) {
       echo html_writer::empty_tag('input', array(
           'type'=>'radio',
           'name'=>'answers['.$question->id.']',
           'value'=>$opt
       ));
       echo ' ' . $opt . ' ';
   }
   echo html_writer::end_div();
}

echo html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('submit', 'local_pdfregion')));
echo html_writer::end_tag('form');

echo $OUTPUT->footer();

/**
 * Örnek crop fonksiyonu.
 * Gerçek uygulamada FPDI/TCPDF entegrasyonu veya başka bir kütüphane ile
 * PDF'in ilgili bölgesini görsel/mini PDF olarak oluşturabilirsiniz.
 */
function crop_pdf_region($question) {
    // Örnek: Gerçek işlemlerde ilgili PDF dosyasını alıp, koordinat bilgileriyle kırpma yapılır.
    return new moodle_url('/local/pdfregion/dummy.pdf');
}
3. Sınav Sonucu Sayfası:

Kod:Tümünü seç

result.php
Sınavın özet sonuçlarını gösteren sayfa; toplam soru, doğru, yanlış ve boş sayısı görüntülenir. Yanlış yapılan sorular varsa yeniden sınava yönlendirme seçeneği sunulur.

Kod:Tümünü seç

<?php
require_once('../../config.php');
global $DB;

$examid = required_param('examid', PARAM_INT);
$exam = $DB->get_record('local_pdfregion_exam', array('id' => $examid), '*', MUST_EXIST);

$PAGE->set_context(context_system::instance());
$PAGE->set_url(new moodle_url('/local/pdfregion/result.php', array('examid' => $examid)));
$PAGE->set_title('Sınav Sonucu');
$PAGE->set_heading('Sınav Sonucu');

echo $OUTPUT->header();

echo html_writer::tag('h3', 'Sınav Sonucu');
echo html_writer::div('Toplam Soru: ' . $exam->totalquestions);
echo html_writer::div('Doğru: ' . $exam->correct);
echo html_writer::div('Yanlış: ' . $exam->incorrect);
echo html_writer::div('Boş: ' . $exam->blank);

// Yanlış yapılan soru varsa, yeniden sınava yönlendiren link sunuyoruz.
if ($exam->incorrect > 0) {
    echo html_writer::div(html_writer::link(new moodle_url('/local/pdfregion/retake.php', array('examid' => $examid)), 'Yanlış yapılan sorularla yeniden sınava gir'));
}

echo $OUTPUT->footer();
4. Yanlış Sorularla Yeniden Sınav:

Kod:Tümünü seç

retake.php
Bu dosya, önceki sınav sonucundan yanlış cevap verilen soruları çekip, öğrencinin yalnızca bu sorulara yönelik yeniden sınava girmesini sağlar.

Kod:Tümünü seç

<?php
require_once('../../config.php');
global $DB, $USER;

$examid = required_param('examid', PARAM_INT);

// İlk sınavdaki yanlış cevapların olduğu soru ID'lerini çekiyoruz.
$sql = "SELECT r.questionid 
          FROM {local_pdfregion_results} r
         WHERE r.examid = ? AND r.userid = ? AND r.iscorrect = 0";
$wrongquestionsids = $DB->get_records_sql_menu($sql, array($examid, $USER->id));

// Sınav için yanlış yapılan soruları çekiyoruz.
if ($wrongquestionsids) {
    list($inorequalsql, $params) = $DB->get_in_or_equal(array_keys($wrongquestionsids));
    $questions = $DB->get_records_select('local_pdfregion', "id $inorequalsql", $params);
} else {
    // Hiç yanlış yoksa kullanıcıya mesaj gösterilir.
    redirect(new moodle_url('/local/pdfregion/result.php', array('examid' => $examid)), 'Tebrikler! Yanlış yaptığınız soru bulunmamaktadır.');
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Yeniden sınav gönderildiğinde cevapları değerlendiriyoruz.
    $totalquestions = count($questions);
    $correct = 0;
    $incorrect = 0;
    $blank = 0;
    $answers = isset($_POST['answers']) ? $_POST['answers'] : array();
    
    // Yeni bir sınav sonucu kaydı oluşturuyoruz.
    $examrecord = new stdClass();
    $examrecord->userid = $USER->id;
    $examrecord->totalquestions = $totalquestions;
    $examrecord->correct = 0;
    $examrecord->incorrect = 0;
    $examrecord->blank = 0;
    $examrecord->timecreated = time();
    $newexamid = $DB->insert_record('local_pdfregion_exam', $examrecord);
    
    foreach ($questions as $question) {
         $qid = $question->id;
         $studentanswer = isset($answers[$qid]) ? trim($answers[$qid]) : '';
         if ($studentanswer === '') {
              $blank++;
         } else {
              if (strcasecmp($studentanswer, $question->correctanswer) == 0) {
                   $correct++;
              } else {
                   $incorrect++;
              }
         }
         $record = new stdClass();
         $record->userid = $USER->id;
         $record->examid = $newexamid;
         $record->questionid = $qid;
         $record->answer = $studentanswer;
         $record->iscorrect = ($studentanswer !== '' && strcasecmp($studentanswer, $question->correctanswer)==0) ? 1 : 0;
         $record->timecreated = time();
         $DB->insert_record('local_pdfregion_results', $record);
    }
    
    $examrecord->correct = $correct;
    $examrecord->incorrect = $incorrect;
    $examrecord->blank = $blank;
    $DB->update_record('local_pdfregion_exam', $examrecord);
    
    redirect(new moodle_url('/local/pdfregion/result.php', array('examid' => $newexamid)));
}

$PAGE->set_context(context_system::instance());
$PAGE->set_url(new moodle_url('/local/pdfregion/retake.php', array('examid' => $examid)));
$PAGE->set_title('Yanlış Sorularla Yeniden Sınav');
$PAGE->set_heading('Yanlış Sorularla Yeniden Sınav');

echo $OUTPUT->header();

echo html_writer::tag('h3', 'Yanlış Sorularla Yeniden Sınav');
echo html_writer::start_tag('form', array('method' => 'post'));

foreach ($questions as $question) {
   echo html_writer::start_div('question');
   echo html_writer::tag('h4', 'Soru ID: ' . $question->id);
   echo html_writer::div('Sayfa: ' . $question->page . ' - Koordinatlar: (' . $question->x . ', ' . $question->y . ', ' . $question->width . ', ' . $question->height . ')');
   // İlgili sorunun görselini sunmak için crop_pdf_region() fonksiyonu kullanılabilir.
   // echo html_writer::tag('img', '', array('src' => crop_pdf_region($question)));
   
   // Cevap seçenekleri:
   $options = array('A'=>'A','B'=>'B','C'=>'C','D'=>'D','E'=>'E');
   foreach ($options as $opt) {
       echo html_writer::empty_tag('input', array(
           'type'=>'radio',
           'name'=>'answers['.$question->id.']',
           'value'=>$opt
       ));
       echo ' ' . $opt . ' ';
   }
   echo html_writer::end_div();
}

echo html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('submit', 'local_pdfregion')));
echo html_writer::end_tag('form');

echo $OUTPUT->footer();
5. Ek Notlar
PDF İşleme:
Öğretmen tarafından belirlenen alanların (çerçevelerin) kırpılması için FPDI/TCPDF, PDF.js veya komut satırı araçları (Ghostscript, ImageMagick) kullanılabilir. Örnekte crop_pdf_region() adlı dummy fonksiyon yer almakta; bunu gerçek PDF kırpma işlemleriyle değiştirmeniz gerekecek.

Güvenlik & Validasyon:
Dosya yükleme, form verisi işleme ve veritabanı işlemlerinde Moodle’ın API’lerini ve güvenlik kontrollerini kullanmayı ihmal etmeyin.

Kapsamlı Test:
Her iki arayüz (öğretmen ve öğrenci) için farklı senaryoları test etmek; özellikle sınav sonucu hesaplaması ve yeniden sınav oluşturma süreçlerinin doğru çalıştığından emin olmak önemlidir.

Bu örnek, Moodle ortamında dinamik olarak soruları belirleyip öğrenci cevaplarını kaydeden, sınav sonuçlarını hesaplayan ve yanlış yapılan sorularla yeniden sınav oluşturmayı sağlayan temel bir yapıyı sunmaktadır. İhtiyaçlarınıza göre bu yapıyı geliştirip, özelleştirebilirsiniz.












muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: moodle eklenti deneme ai

Mesaj gönderen muratca61 »

sorduk tekrar

Kod:Tümünü seç

bu uygulamayı nasıl yükleyeceğim
Aşağıdaki adımları izleyerek bu Moodle eklentisini yükleyebilirsiniz:

Dosya Yapısını Oluşturun:
Eklenti klasörünüzü, Moodle kurulumunuzun ana dizinindeki local klasörünün içine "pdfregion" adıyla yerleştirin. Yani dizin yapınız şöyle olmalı:
/path/to/moodle/local/pdfregion

Dosya ve İzin Kontrolleri:
Tüm dosyaların doğru şekilde kopyalandığından ve Moodle’ın dosya okuma/yazma izinlerine uygun olduğundan emin olun.

Yönetici Olarak Giriş Yapın:
Moodle yönetici hesabınızla oturum açın.

Güncelleme Bildirimini Kontrol Edin:
Yönetici panelinde (Site yönetimi > Bildirimler) Moodle, yeni eklenen eklentiyi fark edip otomatik olarak kurulum sürecini başlatacaktır. Bu aşamada veritabanı tabloları oluşturulacak ve gerekli yapılandırmalar yapılacaktır.

Upgrade.php Çalıştırma (Opsiyonel):
Eğer bildirim sayfasında otomatik başlatılmadıysa, komut satırında Moodle kök dizininde aşağıdaki komutu çalıştırarak da kurulumu tamamlayabilirsiniz:

Kod:Tümünü seç

php admin/cli/upgrade.php
Eklenti Ayarlarını ve Test İşlemlerini Yapın:
Kurulum tamamlandığında, eklenti ayarlarını kontrol edip, örnek sayfaları ziyaret ederek (örneğin, index.php, exam.php) işlevselliğin doğru çalıştığından emin olun.

Bu adımlarla eklentinizi Moodle ortamınıza yüklemiş olacaksınız. Herhangi bir hata veya eksiklik olması durumunda Moodle hata bildirimlerini kontrol ederek gerekli düzeltmeleri yapabilirsiniz.
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: moodle eklenti deneme ai

Mesaj gönderen muratca61 »

sorduk tekrar cgpt

Kod:Tümünü seç

pdf yüklendikten sonra öğretmen çizim aracı ile pdf üzerinde soruları işaretleyecek. 
her işaretlediğinin üzerine A B C D E işaretleme aracını ekleyecek ve doğru şıkkı işaretleyecek.
bu öğretmen arayüzünde ancak öğrenci arayücünde bu işaret aracı boş olarcak ve öğrenci 
doğru seçeneği işaretleyecek
muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: moodle eklenti deneme ai

Mesaj gönderen muratca61 »

Aşağıda, eklentinizin öğretmen ve öğrenci arayüzünde nasıl çalışabileceğine dair örnek bir akış ve kod parçacıkları sunuyorum. Bu örnek, temel düzeyde bir uygulama mantığını göstermektedir. Gerçek uygulamada PDF dosya yönetimi, hata kontrolü ve gelişmiş kullanıcı arayüzü gibi detayları eklemeniz gerekecektir.

1. Genel Akış
Öğretmen Arayüzü
PDF Yükleme:
Öğretmen, PDF dosyasını Moodle dosya alanına yükler. (Bu işlem, daha önce oluşturduğunuz form ve dosya yükleme API’siyle yapılır.)

PDF Üzerinde Soru İşaretleme:
Yüklenen PDF, PDF.js gibi bir kütüphane ile görüntülenir.
Üzerine yerleştirilen bir HTML5 canvas (veya overlay div) sayesinde öğretmen, fare ile dikdörtgen çizerek (soru bölgesi belirleme) soruyu işaretler.

Doğru Cevabın Seçilmesi:
Öğretmen çizim tamamlandıktan sonra açılan küçük bir modal (veya form) aracılığıyla A, B, C, D, E seçeneklerinden doğru olanı belirler.
Bu bilgiler (dikdörtgenin koordinatları, boyutları, sayfa numarası, PDF dosyası adı, doğru şık) veritabanına kaydedilir.

Öğrenci Arayüzü
PDF Görüntüleme:
Öğrenci, yine PDF.js kullanılarak PDF’i görüntüler.
Soru Alanlarının Gösterimi:
Öğrenci arayüzünde, öğretmen tarafından belirlenen soru alanlarının üzerine, “boş” radyo butonları yerleştirilir.
Öğretmen tarafından önceden belirlenen doğru şık burada görünmez; öğrenci kendi seçimini yapar.
Cevap Gönderimi:
Öğrenci, her soruda doğru olduğunu düşündüğü seçeneği işaretleyip sınavı gönderir.
Cevaplar kaydedildikten sonra sonuç hesaplanır.


2. Örnek Kodlar
A. Öğretmen Arayüzü –

Kod:Tümünü seç

teacher_view.php
Bu örnekte, PDF.js ile PDF görüntülenir ve bir canvas üzerinde dikdörtgen çizme işlemi gerçekleştirilir. Dikdörtgen çizildikten sonra açılan modal ile doğru şık seçilir.
(Not: Bu örnek, sadece tek sayfa (örneğin, sayfa 1) için geçerlidir.)

Kod:Tümünü seç

<?php
require_once('../../config.php');
require_login();
$context = context_system::instance();
$PAGE->set_context($context);
$PAGE->set_url(new moodle_url('/local/pdfregion/teacher_view.php'));
$PAGE->set_title("PDF Üzerinde Soru İşaretleme");
$PAGE->set_heading("PDF Üzerinde Soru İşaretleme");

// PDF dosyasının URL'si. (Gerçek uygulamada yüklenen PDF'in yolunu dinamik almanız gerekir.)
$pdfurl = new moodle_url('/local/pdfregion/uploads/sample.pdf');

echo $OUTPUT->header();
?>
<!-- PDF.js kütüphanesini dahil ediyoruz -->
<script src="https://mozilla.github.io/pdf.js/build/pdf.js"></script>

<style>
  #pdf-canvas { border: 1px solid #ccc; }
  .overlay { 
      position: absolute; 
      border: 2px dashed red; 
      pointer-events: none; 
  }
  #answer-modal {
      display: none; 
      position: fixed; 
      top: 50%; left: 50%; 
      transform: translate(-50%, -50%);
      background: #fff; 
      padding: 20px; 
      border: 1px solid #ccc;
      z-index: 1000;
  }
</style>

<div id="pdf-container" style="position: relative;">
  <canvas id="pdf-canvas"></canvas>
  <!-- Dikdörtgenleri tutacak container -->
  <div id="overlay-container" style="position: absolute; top: 0; left: 0;"></div>
</div>

<!-- Doğru şık seçim modalı -->
<div id="answer-modal">
  <h3>Doğru Şıkkı Seçin</h3>
  <form id="answer-form">
      <label><input type="radio" name="correctanswer" value="A"> A</label>
      <label><input type="radio" name="correctanswer" value="B"> B</label>
      <label><input type="radio" name="correctanswer" value="C"> C</label>
      <label><input type="radio" name="correctanswer" value="D"> D</label>
      <label><input type="radio" name="correctanswer" value="E"> E</label>
      <br>
      <button type="button" id="save-answer">Kaydet</button>
  </form>
</div>

<script>
// PDF.js ile PDF görüntüleme
var url = '<?php echo $pdfurl; ?>';
var pdfDoc = null,
    scale = 1.0,
    canvas = document.getElementById('pdf-canvas'),
    ctx = canvas.getContext('2d'),
    overlayContainer = document.getElementById('overlay-container');

pdfjsLib.getDocument(url).promise.then(function(pdfDoc_) {
    pdfDoc = pdfDoc_;
    return pdfDoc.getPage(1);
}).then(function(page) {
    var viewport = page.getViewport({ scale: scale });
    canvas.height = viewport.height;
    canvas.width = viewport.width;
    overlayContainer.style.width = canvas.width + 'px';
    overlayContainer.style.height = canvas.height + 'px';
    
    var renderContext = {
        canvasContext: ctx,
        viewport: viewport
    };
    page.render(renderContext);
});

// Değişkenler
var drawing = false;
var startX, startY, rect;

// Canvas üzerinde çizim işlemi
canvas.addEventListener('mousedown', function(e) {
    var rectCanvas = canvas.getBoundingClientRect();
    startX = e.clientX - rectCanvas.left;
    startY = e.clientY - rectCanvas.top;
    drawing = true;
    
    // Yeni overlay dikdörtgen oluşturuluyor
    rect = document.createElement('div');
    rect.className = 'overlay';
    rect.style.left = startX + 'px';
    rect.style.top = startY + 'px';
    overlayContainer.appendChild(rect);
});

canvas.addEventListener('mousemove', function(e) {
    if (!drawing) return;
    var rectCanvas = canvas.getBoundingClientRect();
    var currentX = e.clientX - rectCanvas.left;
    var currentY = e.clientY - rectCanvas.top;
    var width = currentX - startX;
    var height = currentY - startY;
    rect.style.width = Math.abs(width) + 'px';
    rect.style.height = Math.abs(height) + 'px';
    rect.style.left = (width < 0 ? currentX : startX) + 'px';
    rect.style.top = (height < 0 ? currentY : startY) + 'px';
});

canvas.addEventListener('mouseup', function(e) {
    drawing = false;
    // Dikdörtgen çizimi tamamlandığında modalı aç
    document.getElementById('answer-modal').style.display = 'block';
    
    // Dikdörtgenin koordinatlarını kaydetmek için (piksel değerlerinden 'px' kısmını alabilirsiniz)
    rect.dataset.x = parseInt(rect.style.left, 10);
    rect.dataset.y = parseInt(rect.style.top, 10);
    rect.dataset.width = parseInt(rect.style.width, 10);
    rect.dataset.height = parseInt(rect.style.height, 10);
    rect.dataset.page = 1; // Örnek: 1. sayfa
});

// Modal üzerindeki "Kaydet" butonuna tıklandığında verileri kaydet
document.getElementById('save-answer').addEventListener('click', function() {
    var form = document.getElementById('answer-form');
    var correctAnswer = form.elements['correctanswer'].value;
    if (!correctAnswer) {
        alert('Lütfen bir şık seçin.');
        return;
    }
    
    // Modalı gizle
    document.getElementById('answer-modal').style.display = 'none';
    
    // Kaydedilecek veriler
    var regionData = {
        x: rect.dataset.x,
        y: rect.dataset.y,
        width: rect.dataset.width,
        height: rect.dataset.height,
        page: rect.dataset.page,
        correctanswer: correctAnswer,
        // PDF dosyasının adı/dizini (dinamik olarak belirlenmeli)
        pdffilename: 'sample.pdf'
    };
    
    // AJAX ile verileri kaydetmek (save_region.php dosyasına POST ediliyor)
    fetch('<?php echo new moodle_url('/local/pdfregion/save_region.php'); ?>', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'X-Requested-With': 'XMLHttpRequest'
        },
        body: JSON.stringify(regionData)
    }).then(response => response.json())
    .then(data => {
        if (data.success) {
            alert('Soru kaydedildi.');
            form.reset();
        } else {
            alert('Kayıt sırasında hata oluştu.');
        }
    }).catch(error => {
        console.error('Hata:', error);
        alert('Kayıt sırasında hata oluştu.');
    });
});
</script>

<?php
echo $OUTPUT->footer();
?>

Kod:Tümünü seç

save_region.php
Bu dosya, AJAX üzerinden gönderilen öğretmen verilerini veritabanına kaydeder.
(Not: Gerçek uygulamada verilerin doğrulanması, dosya yolu dinamikleştirilmesi ve güvenlik önlemleri eklenmelidir.)

Kod:Tümünü seç

<?php
require_once('../../config.php');
require_login();

header('Content-Type: application/json');

$data = file_get_contents('php://input');
$regionData = json_decode($data);

if(!$regionData) {
    echo json_encode(['success' => false, 'message' => 'Geçersiz veri.']);
    exit;
}

global $DB, $USER;

$record = new stdClass();
$record->userid        = $USER->id;
$record->pdffilename   = $regionData->pdffilename;
$record->page          = intval($regionData->page);
$record->x             = intval($regionData->x);
$record->y             = intval($regionData->y);
$record->width         = intval($regionData->width);
$record->height        = intval($regionData->height);
$record->correctanswer = $regionData->correctanswer;
$record->timecreated   = time();

$DB->insert_record('local_pdfregion', $record);

echo json_encode(['success' => true]);

B. Öğrenci Arayüzü –

Kod:Tümünü seç

student_view.php
Öğrenci arayüzünde PDF yine PDF.js ile görüntülenir. Veritabanından alınan soru bölgeleri (öğretmen tarafından işaretlenen) üzerine, boş radyo butonları yerleştirilir. Öğrenci, bu seçeneklerden doğru olduğunu düşündüğünü işaretler.

Kod:Tümünü seç

<?php
require_once('../../config.php');
require_login();
$context = context_system::instance();
$PAGE->set_context($context);
$PAGE->set_url(new moodle_url('/local/pdfregion/student_view.php'));
$PAGE->set_title("Soruları Yanıtlayın");
$PAGE->set_heading("Soruları Yanıtlayın");

global $DB;
// Öğretmenin kaydettiği soru bölgelerini çekiyoruz (örnekte tüm kayıtlar, gelişmiş filtreleme eklenebilir)
$regions = $DB->get_records('local_pdfregion');

echo $OUTPUT->header();
?>
<!-- PDF.js kütüphanesi -->
<script src="https://mozilla.github.io/pdf.js/build/pdf.js"></script>

<style>
  #pdf-canvas { border: 1px solid #ccc; }
  .answer-overlay {
      position: absolute;
      background: rgba(255,255,255,0.8);
      padding: 2px;
      border: 1px solid blue;
  }
</style>

<div id="pdf-container" style="position: relative;">
  <canvas id="pdf-canvas"></canvas>
  <div id="answer-overlay-container" style="position: absolute; top: 0; left: 0;"></div>
</div>

<script>
// PDF.js ile PDF yükleniyor
var url = '<?php echo new moodle_url('/local/pdfregion/uploads/sample.pdf'); ?>';
var pdfDoc = null,
    scale = 1.0,
    canvas = document.getElementById('pdf-canvas'),
    ctx = canvas.getContext('2d'),
    overlayContainer = document.getElementById('answer-overlay-container');

pdfjsLib.getDocument(url).promise.then(function(pdfDoc_) {
    pdfDoc = pdfDoc_;
    return pdfDoc.getPage(1);
}).then(function(page) {
    var viewport = page.getViewport({ scale: scale });
    canvas.height = viewport.height;
    canvas.width = viewport.width;
    overlayContainer.style.width = canvas.width + 'px';
    overlayContainer.style.height = canvas.height + 'px';
    
    var renderContext = {
        canvasContext: ctx,
        viewport: viewport
    };
    return page.render(renderContext).promise;
}).then(function() {
    // PDF render edildikten sonra, öğretmen tarafından belirlenen soru bölgelerini overlay olarak ekleyelim.
    <?php foreach ($regions as $region): ?>
      (function() {
         // Sadece 1. sayfa için örnek; çok sayfalı PDF’de sayfa kontrolü ekleyin.
         var regionDiv = document.createElement('div');
         regionDiv.className = 'answer-overlay';
         regionDiv.style.left = '<?php echo $region->x; ?>px';
         regionDiv.style.top = '<?php echo $region->y; ?>px';
         regionDiv.style.width = '<?php echo $region->width; ?>px';
         regionDiv.style.height = '<?php echo $region->height; ?>px';
         // Radyo butonlu form (öğretmenin doğru cevabı görünmez, öğrenci boş seçmeli)
         var formHtml = '<form method="post" action="submit_answer.php">' +
             '<input type="hidden" name="questionid" value="<?php echo $region->id; ?>">' +
             '<label><input type="radio" name="answer" value="A"> A</label>' +
             '<label><input type="radio" name="answer" value="B"> B</label>' +
             '<label><input type="radio" name="answer" value="C"> C</label>' +
             '<label><input type="radio" name="answer" value="D"> D</label>' +
             '<label><input type="radio" name="answer" value="E"> E</label>' +
             '<button type="submit">Gönder</button>' +
             '</form>';
         regionDiv.innerHTML = formHtml;
         overlayContainer.appendChild(regionDiv);
      })();
    <?php endforeach; ?>
});
</script>

<?php
echo $OUTPUT->footer();
?>

Kod:Tümünü seç

submit_answer.php
Bu dosya, öğrencinin verdiği cevabı kaydeder. (Önceki örneklerdeki sınav ve sonuç hesaplama yapısına entegre edebilirsiniz.)

Kod:Tümünü seç

<?php
require_once('../../config.php');
require_login();

$questionid = required_param('questionid', PARAM_INT);
$answer     = required_param('answer', PARAM_ALPHANUM);

// Burada cevabın kaydedilmesi, sınav sonuçlarının güncellenmesi vb. işlemler yapılmalı.
// Örneğin, DB tablosuna öğrencinin cevabını ekleyip, daha sonra sınav sonuç sayfasında değerlendirme yapılır.

redirect(new moodle_url('/local/pdfregion/student_view.php'), 'Cevabınız kaydedildi.');

3. Son Notlar

PDF İşleme:
Gerçek uygulamada, öğretmen ve öğrenci arayüzleri için PDF dosyasını dinamik olarak yükleyip, sayfa numarası, zoom, vs. gibi durumları da göz önünde bulundurmalısınız.

Veritabanı Entegrasyonu:
Öğretmen tarafından işaretlenen her soru bölgesinin koordinatları, sayfa numarası ve doğru cevap veritabanına kaydedilmeli; öğrenci arayüzü bu kayıtları kullanarak soruları dinamik olarak oluşturmalı.

Güvenlik ve Validasyon:
Hem dosya yükleme hem de form verilerinde gerekli validasyonları yapmayı unutmayın.

Gelişmiş UI:
Çizim ve modal işlemleri için daha gelişmiş JavaScript kütüphaneleri (ör. Fabric.js veya interaktif PDF.js eklentileri) kullanabilirsiniz.

Bu örnekler sayesinde, öğretmenin PDF üzerinde soru alanlarını çizip doğru şıkkı belirlediği ve öğrencinin aynı alanlar üzerinden boş seçenekleri doldurarak sınava girdiği bir yapıyı oluşturabilirsiniz. Geliştirme sürecinde Moodle dokümantasyonunu, PDF.js örneklerini ve ilgili JavaScript kütüphanelerinin örneklerini incelemeniz faydalı olacaktır.






muratca61
Site Admin
Mesajlar: 35964
Kayıt: Cmt Ara 21, 2024 7:56 am

Re: moodle eklenti deneme ai

Mesaj gönderen muratca61 »

Aşağıda, öğretmen ve öğrenci arayüzleri, sınav, sonuç, yeniden sınav ve AJAX işlemleri gibi işlevleri içeren son haline uygun örnek dosya yapısını bulabilirsiniz:

Kod:Tümünü seç

local/
 └── pdfregion/
      ├── db/
      │    └── install.xml         // Veritabanı tablolarının tanımlandığı dosya (soru, sınav, sonuç tabloları)
      ├── lang/
      │    └── tr/
      │         └── local_pdfregion.php  // Dil dosyası (metin tanımlamaları)
      ├── teacher_view.php         // Öğretmenin PDF üzerinde soru alanı çizip, doğru cevabı belirlediği arayüz
      ├── student_view.php         // Öğrencinin PDF'i görüntüleyip, boş seçenekleri doldurduğu arayüz
      ├── exam.php                 // Sınav formu (toplu sınav uygulaması, eğer ayrı bir sınav yapısı kullanılacaksa)
      ├── result.php               // Sınav sonuçlarının özetlendiği sayfa
      ├── retake.php               // Yanlış yapılan sorularla yeniden sınav sayfası
      ├── save_region.php          // AJAX üzerinden öğretmenin işaretlediği soru bölgesini kaydeden dosya
      ├── submit_answer.php        // Öğrencinin cevabını kaydeden dosya
      ├── lib.php                  // Yardımcı fonksiyonlar (ortak işlemler burada toplanabilir)
      └── version.php              // Eklenti sürüm bilgileri ve bileşen adı tanımlaması
Açıklamalar:
db/install.xml:
PDF üzerindeki soru alanlarının koordinatları, doğru cevap bilgisi, sınav ve öğrenci cevaplarıyla ilgili veritabanı tablolarını oluşturur.
lang/tr/local_pdfregion.php:
Eklentiye ait sabit metinlerin (başlık, buton isimleri vb.) tanımlandığı dil dosyasıdır.
teacher_view.php:
Öğretmenin PDF'i yükleyip, PDF.js üzerinden görüntüleyerek çizim aracıyla soru alanı belirlemesini ve doğru şıkkı seçmesini sağlar.
student_view.php:
Öğrencinin, öğretmen tarafından işaretlenmiş soru alanlarını overlay (üstüne bindirme) olarak görüp, boş radyo butonları ile cevap vermesini sağlar.
exam.php, result.php, retake.php:
Öğrenci sınav işlemleri, sınav sonuçlarının hesaplanması ve yanlış yapılan sorularla yeniden sınava girmesi için ayrı dosyalar olarak yer alabilir.
(Kullanım senaryonuza göre bu dosyalar isteğe bağlı olarak düzenlenebilir.)
save_region.php:
Öğretmen arayüzünde çizilen dikdörtgenin koordinatları ve doğru şık bilgisini AJAX POST isteği ile alarak veritabanına kaydeder.
submit_answer.php:
Öğrenci, işaretlediği cevabı gönderdiğinde, ilgili soru için kaydı oluşturur. (Önceki sınav işleme yapısına entegre edilebilir.)
lib.php:
Ortak işlevler, yardımcı fonksiyonlar veya PDF işleme gibi ek modüller buraya eklenebilir.
version.php:
Eklenti versiyonu, uyumlu Moodle sürümü ve bileşen adının tanımlandığı dosyadır.

Bu yapı, geliştirmenin başlangıç aşamasında temel işlevselliği sunmak üzere tasarlanmıştır. İhtiyaçlarınıza göre ek dosyalar ekleyebilir, mevcut dosyalarda geliştirmeler yapabilir veya güvenlik, hata kontrolü gibi detayları entegre edebilirsiniz.






Cevapla