Lewati ke konten

Pedoman Berkontribusi

Bergabunglah dengan komunitas XOOPS dan bantu menjadikannya CMS terbaik di dunia.


XOOPS adalah proyek sumber terbuka yang berkembang berkat kontribusi komunitas. Baik Anda memperbaiki bug, menambahkan fitur, menyempurnakan dokumentasi, atau membantu orang lain, kontribusi Anda sangat berharga.


  • Kode Etik
  • Alur Kerja Kontribusi
  • Pedoman Permintaan Tarik
  • Pelaporan Masalah
  • Standar Pengkodean PHP
  • Standar JavaScript
  • Pedoman CSS
  • Standar template Smarty
  • Indeks ADR
  • template ADR
  • ADR-001: Arsitektur Modular
  • ADR-002: Abstraksi Basis Data

Terminal window
# Fork the repository on GitHub
# Then clone your fork
git clone https://github.com/YOUR_USERNAME/XoopsCore27.git
cd XoopsCore27
# Add upstream remote
git remote add upstream https://github.com/XOOPS/XoopsCore27.git
# Install dependencies
composer install
Terminal window
# Sync with upstream
git fetch upstream
git checkout -b feature/my-feature upstream/main

Ikuti standar pengkodean dan tulis tes untuk fitur baru.

Terminal window
# Commit changes
git add .
git commit -m "Add: Brief description of changes"
# Push to your fork
git push origin feature/my-feature

Kemudian buat Permintaan Tarik di GitHub.


XOOPS mengikuti standar pengkodean PSR-1, PSR-4, dan PSR-12.

<?php
declare(strict_types=1);
namespace XoopsModules\MyModule;
use Xmf\Request;
use XoopsObject;
/**
* Class Item
*
* Represents an item in the module
*/
class Item extends XoopsObject
{
/**
* Constructor
*/
public function __construct()
{
$this->initVar('id', \XOBJ_DTYPE_INT, null, false);
$this->initVar('title', \XOBJ_DTYPE_TXTBOX, '', true, 255);
$this->initVar('content', \XOBJ_DTYPE_TXTAREA, '', false);
$this->initVar('created', \XOBJ_DTYPE_INT, time(), false);
}
/**
* Get formatted title
*
* @return string
*/
public function getTitle(): string
{
return $this->getVar('title', 'e');
}
}
AturanContoh
Nama kelasPascalCase
Nama metodecamelCase
KonstantaUPPER_SNAKE_CASE
Variabel$camelCase
FileClassName.php
Indentasi4 spasi
Panjang garisMaks 120 karakter
{* File: templates/mymodule_index.tpl *}
{* Description: Index page template *}
<{include file="db:mymodule_header.tpl"}>
<div class="mymodule-container">
<h1><{$page_title}></h1>
<{if $items|@count > 0}>
<ul class="item-list">
<{foreach item=item from=$items}>
<li class="item">
<a href="<{$item.url}>"><{$item.title}></a>
</li>
<{/foreach}>
</ul>
<{else}>
<p class="no-items"><{$smarty.const._MD_MYMODULE_NO_ITEMS}></p>
<{/if}>
</div>
<{include file="db:mymodule_footer.tpl"}>

KetikPolaContoh
Fiturfeature/descriptionfeature/add-user-export
Perbaikan bugfix/descriptionfix/login-validation
Perbaikan terbaruhotfix/descriptionhotfix/security-patch
Rilisrelease/versionrelease/2.7.0

Ikuti komitmen konvensional:

<type>(<scope>): <subject>
<body>
<footer>

Jenis:

  • feat: Fitur baru
  • fix: Perbaikan bug
  • docs: Dokumentasi
  • style: Gaya kode (pemformatan)
  • refactor: Pemfaktoran ulang kode
  • test: Menambahkan tes
  • chore: Pemeliharaan

Contoh:

feat(auth): add two-factor authentication
Implement TOTP-based 2FA for user accounts.
- Add QR code generation for authenticator apps
- Store encrypted secrets in user profile
- Add backup codes feature
Closes #123
fix(forms): resolve XSS vulnerability in text input
Properly escape user input in XoopsFormText render method.
Security: CVE-2024-XXXX

Terminal window
# Run all tests
./vendor/bin/phpunit
# Run specific test suite
./vendor/bin/phpunit --testsuite unit
# Run with coverage
./vendor/bin/phpunit --coverage-html coverage/
<?php
namespace XoopsModulesTest\MyModule;
use PHPUnit\Framework\TestCase;
use XoopsModules\MyModule\Item;
class ItemTest extends TestCase
{
private Item $item;
protected function setUp(): void
{
$this->item = new Item();
}
public function testInitialValues(): void
{
$this->assertNull($this->item->getVar('id'));
$this->assertEquals('', $this->item->getVar('title'));
}
public function testSetTitle(): void
{
$this->item->setVar('title', 'Test Title');
$this->assertEquals('Test Title', $this->item->getVar('title'));
}
public function testTitleEscaping(): void
{
$this->item->setVar('title', '<script>alert("xss")</script>');
$escaped = $this->item->getTitle();
$this->assertStringNotContainsString('<script>', $escaped);
}
}

Sebelum mengirimkan PR, pastikan:

  • Kode mengikuti standar pengkodean XOOPS
  • Semua tes lulus
  • Fitur baru ada pengujiannya
  • Dokumentasi diperbarui jika diperlukan
  • Tidak ada konflik penggabungan dengan cabang utama
  • Pesan penerapan bersifat deskriptif
  • Deskripsi PR menjelaskan perubahan
  • Masalah terkait ditautkan

ADR mendokumentasikan keputusan arsitektur yang signifikan.

# ADR-XXX: Title
## Status
Proposed | Accepted | Deprecated | Superseded
## Context
What is the issue we're addressing?
## Decision
What is the change being proposed?
## Consequences
What are the positive and negative effects?
## Alternatives Considered
What other options were evaluated?
ADRJudulStatus
ADR-001Arsitektur ModularDiterima
ADR-002Akses Database Berorientasi ObjekDiterima
ADR-003Mesin template SmartyDiterima
ADR-004Desain Sistem KeamananDiterima
ADR-005PSR-15 Middleware (4.0.x)Diusulkan

Kontributor diakui melalui:

  • Daftar Kontributor - Terdaftar di repositori
  • Catatan Rilis - Dikreditkan dalam rilis
  • Hall of Fame - Kontributor luar biasa
  • Sertifikasi module - Lencana kualitas untuk module

  • Peta Jalan XOOPS 4.0
  • Konsep core
  • Pengembangan module


#xoops #kontribusi #sumber terbuka #komunitas #pengembangan #standar pengkodean