Vylepšení Edit Review/Nové filtry pro úpravu recenze/Jak implementovat filtr

This page is a translated version of the page Edit Review Improvements/New filters for edit review/How to implement a filter and the translation is 100% complete.

Produkt a vývoj

 

Nejprve je třeba odpovědět na několik otázek týkajících se produktů a vývoje:

  • Účel a účinek filtru – zvažte uživatelskou zkušenost a případy použití. To vám pomůže rozhodnout, co filtr dělá, a jak jej popsat.
  • Vyberte text - budete potřebovat štítek a popis, který bude umístěn tak, jak je znázorněno na obrázku User registration. Obojí musí být stručné. Pokud vytváříte novou skupinu, budete také potřebovat název skupiny; můžete také volitelně zadat text Co je to? a poskytnout tak více informací o skupině.
 

Posluchač

Zaregistrujte posluchače pro háček ChangesListSpecialPageStructuredFilters . To vám umožní přístup k $special, níže použité v instanci ChangesListSpecialPage.

Skupina

Nejprve zvolte, zda chcete vytvořit ChangesListStringOptionsFilterGroup nebo ChangesListBooleanFilterGroup . ChangesListStringOptionsFilterGroup je nejlepší, pokud máte mnoho možností, nejsou přirozeně vyjádřeny jako skryté filtry (např. hideanon) a nebo nemají plné pokrytí (plné pokrytí znamená, že zaškrtnutí všech políček ve skupině je stejné jako zaškrtnutí žádných políček). ChangesListBooleanFilterGroup je nejlepší pro existující filtry založené na skrytí (jako hideanons) nebo filtry, které lze jednoduše vyjádřit pomocí této myšlenky.

Pokud vytváříte novou skupinu, vytvořte pro ni objekt. 'název' je interní identifikátor. V případě ChangesListStringOptionsFilterGroup se však používá také jako parametr adresy URL. Nebo taky (viz výše):

$group = new ChangesListBooleanFilterGroup(
    [
        'name' => 'groupname',
        'title' => 'myextension-rcfilters-groupname-title',
        
        'filters' => [
            // Each element of 'filters' is an array using the format
            // passed to the ChangesListBooleanFilter constructor
        ],
    ]
);

nebo:

$group = new ChangesListStringOptionsFilterGroup(
    [
        'name' => 'groupname',
        'title' => 'myextension-rcfilters-groupname-title',
        'default' => 'foo,bar',
        
        'filters' => [
            // Each element of 'filters' is an array using the format
            // passed to the ChangesListStringOptionsFilter constructor
        ],
        
        'isFullCoverage' => true, // see explanation above for how to choose this value,
        'queryCallable' => function (
            $specialPageClassName,
            IContextSource $context,
            IDatabase $dbr,
            array &$tables,
            array &$fields,
            array &$conds,
            array &$query_options,
            array &$join_conds,
            array $selectedValues
        ) {
            // selectedValues is an array of the values the user chose.
            // Add necessary tables, fields, and conditions to implement your database condition.
        }
    ]
);

V obou případech pak zaregistrujete skupinu pomocí:

$special->registerFilterGroup( $group );

Volitelně můžete zahrnout informace pro vyskakovací okno Co je to? (whatsThisHeader, whatsThisBody, whatsThisUrl a whatsThisLinkText – viz obrázek). Pokud potřebujete získat přístup k existující skupině (např. definované jádrem), použijte místo toho:

$group = $special->getFilterGroup( 'existinggroup' );

Filtry

Bez ohledu na to, zda jste vytvořili skupinu, budete chtít přidat filtry do nových nebo existujících skupin.

Pokud všechny filtry patří do skupiny, kterou vytváříte, měli byste vložit definice do parametru filtry konstruktoru skupiny. Tím je automaticky objednáte. Chcete-li přidat filtry do již existujících skupin, postupujte podle níže uvedených pokynů.

V současnosti existují dva typy filtrů, ChangesListBooleanFilter a ChangesListStringOptionsFilter. Každý jde pouze do skupiny s odpovídajícím typem. 'name' (název) se používá jako identifikátor, který se také objevuje v adrese URL. Použití:

$filter = new ChangesListBooleanFilter(
    [
		'name' => 'hidesomething',
		'group' => $group,
		'label' => 'myextension-rcfilters-groupname-hidesomething-label',
		'description' => 'myextension-rcfilters-groupname-hidesomething-desc',
		'showHideSuffix' => 'myextension-rcfilters-groupname-showhidesomething',
		'default' => false, // true to hide by default, false not to hide by default
		
		// Adjust priority as needed to order your filters where you wish, or use the
		// 'filters' parameter of the group constructor, which handles this.
		'priority' => -1,
		
		'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
		    &$query_options, &$join_conds ) {

			// Add necessary tables, fields, and conditions to implement your database condition.
		},
		'cssClassSuffix' => 'something',
		'isRowApplicableCallable' => function ( $ctx, $rc ) {
            // Return true if the $rc row (part of the result set) is controlled by this filter.
            // E.g. if this filter hides logged inusers, and $rc is an action taken
            // by a logged inuser.
		},
    ]
);

nebo:

$filter = new ChangesListStringOptionsFilter(
    [
		'name' => 'choice',
		'group' => $group,
		'label' => 'myextension-rcfilters-groupname-choice-label',
		'description' => 'myextension-rcfilters-groupname-choice-desc',
		
		// Adjust priority as needed to order your filters where you wish, or use the
		// 'filters' parameter of the group constructor, which handles this.
		'priority' => -1,
		
		'cssClassSuffix' => 'something',
		'isRowApplicableCallable' => function ( $ctx, $rc ) {
            // Return true if the $rc row (part of the output) is controlled by this filter.
            // E.g. if this filter shows log actions, and $rc is a log action.
		},
    ]
);

Po sestavení filtru nemusíte nic dělat.