web-dev-qa-db-fra.com

Les boucles et réinitialisations du répéteur ACF - Où est la documentation RESET_ROWS ()?

J'aime l'ACF, c'est idéal pour les développeurs et il semble avoir tant de soutien. Mais ... pourquoi RESET_ROWS () n'est-ce pas dans la documentation? J'ai créé une fonction pouvant supprimer des lignes de répéteur à des moments différents dans le code. J'utilisais la boucle des rangées à chaque fois que cela s'attendait à ce que cela commence à l'index 0 (ou 1 dans le chemin fou de ACF). Mais chaque boucle a commencé où la précédente s'est arrêtée.

Cela m'a donné du chagrin depuis un certain temps. J'ai seulement trouvé UN Autre sujet avec une petite réponse de 3 mots mentionnant Reset_Rows (). La documentation ACF n'a rien qui se présente lorsque vous avez recherché RESET_ROWS () ou quoi que ce soit sur la réinitialisation de l'indice de ligne. Son non où!

Alors peut-être que cela peut sauver les autres du chagrin. Voici comment je l'utilise avec succès:

reset_rows('field_name', $post_id);

$ post_id pourrait être facultatif, a essayé ..

Voici comment je l'ai placé dans mon code

if( have_rows('related_trustees', $memberID) )
{
    reset_rows('related_trustees', $memberID); // Start from begining (protects against previous loops)
    echo 'Have rows';
    $rowNum = 0; // ACF Rows start at index of 1
    while( have_rows('related_trustees', $memberID) )
    {
        the_row();
        $rowNum ++;
        if(get_sub_field('trustee') == $userID)
        {
            $delrow = delete_row('related_trustees', $rowNum, $memberID);
            break;
        }
    }
}

Faites-moi savoir si theres une raison de cette folie s'il vous plaît.

2
jonnyK

Ce n'est pas dans la documentation principalement parce que c'est une fonction interne, ils ne s'attendaient pas à ce que vous utilisiez ou en avez besoin.

have_rows() vérifie s'il existe une boucle actuellement active, sinon, elle crée une mondiale avec vos lignes de répéteur; Si tel est le cas, il ramasse là où vous vous êtes laissé - alors vous savez que vous sachiez s'il reste des lignes restantes pour être bouclées. Votre exemple est intriguant, semble être un peu de scénario de franges, mais je peux voir à quel point cela serait frustrant. Après avoir sauté hors de la boucle Midstream, vous n'êtes pas automatiquement retourné au début car la boucle précédente est toujours active et reste des lignes restantes.

ACF n'a pas de véritable rewind_posts() équivalent, mais vous pouvez exécuter la fonction reset_rows() ou la fonction qu'elle enveloppe: acf_remove_loop() (également interne et non documenté, désolé !). Selon ce que vous utilisez devrait probablement être exécuté juste avant votre break cependant, vous ne vous retrouvez pas avec des résultats inattendus de votre if ( have_rows() ) Si vous supprimez jamais la dernière ligne et la suivi avec une autre boucle.

Une fridue sans rapport mais intéressante est que vous n'avez pas besoin du compteur de lignes personnalisées, ils fournissent get_row_index() pour simplement cet objectif.

4
Steven