2015-10-12 6 views
0

Я модифицирую WP плагин (PHP, последняя версия WP). Он имеет форму, где пользователь может задать вопрос. Он поставляется с собственной кнопкой отправки. Я нашел крюк действия, где я могу добавить свой собственный код в форму, поэтому я добавил простейшую форму оплаты Braintree - интерфейс DropIn. This is a screenshot of what both forms look like when I set them up.Почему кнопка отправки моей формы не работает?

Проблема:

Кнопка «Создать вопрос», который пришел с плагином не работает, и я подозреваю, что это связано с наличием второй формы.

Что я пробовал:

Я удалил биты и куски кода я добавил, чтобы попытаться выделить то, что может быть причиной этого и сводился к DROPIN в самой форме кода. Наличие 2-й формы на этой странице вызывает проблему.

Мой вопрос: Что может вызвать проблемы с отправкой, если на одной странице присутствуют 2 формы?


Примечание - я использовал крюк действий, чтобы вставить свой код в функцию, которая описывала себя как форму сноски основного плагина. У меня возникает ощущение, что это проблема вложенности формы.

моя функция, которая создает форму Braintree:

class FD_Braintree_Form 
{ 
    public function fd_bt_form() 
     { 

      echo 

       '<form id="checkout" action="/process-trans.php" method="post"> 

        <p> 
        <label><font size="5">Amount:</font></label> 
        <input type="text" size="4" name="amount" /> 
        </p> 

        <div id="payment-form"></div> 

        <input type="submit" value="Pay" /> 

       </form>'; 

     } 
} 

моя функция, которая генерирует форму Braintree: основной код

class Find_Do_For_Anspress 
{ 
    add_action('ap_form_bottom_ask_form', array($this, 'fd_bt_form_html')); //This is where I use the action hook to insert my code into the plugin's form_footer() 

    public function fd_bt_form_html() 
     {  
      $class_bt_token = new Braintree_ClientToken(); 
      $clientToken = $class_bt_token->generate(); 

      ?> 
      <script src="https://js.braintreegateway.com/v2/braintree.js"></script> 
      <script> 

       braintree.setup(
       '<?php echo $clientToken ?>', 
       'dropin', { 
        container: 'payment-form', 
       }); 

      </script> 
      <?php  

      $class_bt_form = new FD_Braintree_Form(); 
      $bt_form = $class_bt_form->fd_bt_form(); 

      echo $bt_form; 
     } 
} 

плагина, который генерирует форму вопроса:

function ap_ask_form($editing = false){ 
    global $editing_post; 

    $is_private = false; 
    if($editing){ 
     $is_private = $editing_post->post_status == 'private_post' ? true : false; 
    } 

    $args = array(
     'name'    => 'ask_form', 
     'is_ajaxified'  => true, 
     'submit_button'  => ($editing ? __('Update question', 'ap') : __('Post question', 'ap')), 
     'fields'   => array(
      array(
       'name' => 'title', 
       'label' => __('Title', 'ap'), 
       'type' => 'text', 
       'placeholder' => __('Question in one sentence', 'ap'), 
       'desc' => __('Write a meaningful title for the question.', 'ap'), 
       'value' => ($editing ? $editing_post->post_title : sanitize_text_field(@$_POST['title'])), 
       'order' => 5, 
       'attr' => 'data-action="suggest_similar_questions"', 
       'autocomplete' => false, 
      ), 
      array(
       'name' => 'title', 
       'type' => 'custom', 
       'order' => 5, 
       'html' => '<div id="similar_suggestions"></div>' 
      ), 
      array(
       'name' => 'description', 
       'label' => __('Description', 'ap'), 
       'type' => 'editor', 
       'desc' => __('Write description for the question.', 'ap'), 
       'value' => ($editing ? apply_filters('the_content', $editing_post->post_content) : @$_POST['description'] ), 
       'settings' => apply_filters('ap_ask_form_editor_settings', array(
        'textarea_rows'  => 8, 
        'tinymce'   => ap_opt('question_text_editor') ? false : true, 
        'quicktags'   => ap_opt('question_text_editor') ? true : false , 
        'media_buttons'  =>false, 
       )), 
      ), 
      array(
       'name' => 'ap_upload', 
       'type' => 'custom', 
       'html' => ap_post_upload_form(), 
       'order' => 10 
      ), 
      array(
       'name' => 'parent_id', 
       'type' => 'hidden', 
       'value' => ($editing ? $editing_post->post_parent : get_query_var('parent') ), 
       'order' => 20 
      ) 
     ), 
    ); 

    if(ap_opt('allow_private_posts')) 
     $args['fields'][] = array(
      'name' => 'is_private', 
      'type' => 'checkbox', 
      'desc' => __('Only visible to admin and moderator.', 'ap'), 
      'value' => $is_private, 
      'order' => 12, 
      'show_desc_tip' => false 
     ); 

    if(ap_opt('recaptcha_site_key') == '') 
     $reCaptcha_html = '<div class="ap-notice red">'.__('reCaptach keys missing, please add keys', 'ap').'</div>'; 
    else 
     $reCaptcha_html = '<div class="g-recaptcha" id="recaptcha" data-sitekey="'.ap_opt('recaptcha_site_key').'"></div><script type="text/javascript" 
src="https://www.google.com/recaptcha/api.js?hl='.get_locale().'&onload=onloadCallback&render=explicit" async defer></script><script type="text/javascript">var onloadCallback = function() { 
     widgetId1 = grecaptcha.render("recaptcha", { 
      "sitekey" : "'.ap_opt('recaptcha_site_key').'" 
     }); 
     };</script>'; 

    if(ap_opt('enable_recaptcha')) 
     $args['fields'][] = array(
      'name' => 'captcha', 
      'type' => 'custom', 
      'order' => 100, 
      'html' => $reCaptcha_html 
     ); 

    /** 
    * FILTER: ap_ask_form_fields 
    * Filter for modifying $args 
    * @var array 
    * @since 2.0 
    */ 
    $args = apply_filters('ap_ask_form_fields', $args, $editing); 

    if($editing){ 
     $args['fields'][] = array(
      'name' => 'edit_post_id', 
      'type' => 'hidden', 
      'value' => $editing_post->ID, 
      'order' => 20 
     ); 
    } 

    $form = new AnsPress_Form($args); 

    echo $form->get_form(); 
    echo ap_post_upload_hidden_form(); 
} 

плагина "форма сноска" код и крюк действия я использовал:

private function form_footer() 
    { 
     ob_start(); 
     /** 
     * ACTION: ap_form_bottom_[form_name] 
     * action for hooking captcha and extar fields 
     * @since 2.0.1 
     */ 
     do_action('ap_form_bottom_'. $this->name); 
     $this->output .= ob_get_clean(); 

     $this->output .= '<button type="submit" class="ap-btn ap-btn-submit">'.$this->args['submit_button'].'</button>'; 

     if(@$this->args['show_cancel'] === true) 
      $this->output .= '<button type="button" class="ap-btn ap-btn-cancel">'.__('Cancel', 'ap').'</button>'; 

     $this->output .= '</form>'; 
    } 

функция скрытой загрузки:

function ap_post_upload_hidden_form(){ 
    if(ap_opt('allow_upload_image')) 
     return '<form id="hidden-post-upload" enctype="multipart/form-data" method="POST" style="display:none"> 
      <input type="file" name="post_upload_image" class="ap-upload-input"> 
      <input type="hidden" name="ap_ajax_action" value="upload_post_image" /> 
      <input type="hidden" name="ap_form_action" value="upload_post_image" /> 
      <input type="hidden" name="__nonce" value="'.wp_create_nonce('upload_image_'.get_current_user_id()).'" /> 
      <input type="hidden" name="action" value="ap_ajax" /> 
     </form>'; 
} 

HTML, который дома задать форму плагина код:

<div class="ap-tab-container"> 
     <div id="ap-form-main" class="active ap-tab-item"> 
      <?php ap_ask_form(); ?> 
     </div> 
</div> 
+0

Вы используете 1 кнопку, чтобы отправить 2 формы? – Sina

+0

Сохраните все свои изменения, восстановите состояние кода до того, что было до начала работы, и посмотрите, была ли проблема для начала. – user2182349

+0

@ user2182349 проблема была не там для начала. Плагин работал так, как ожидалось с момента установки. Ошибка связана с моим добавлением кода Braintree, и я пытаюсь понять, почему. – DarthVoid

ответ

0

РЕДАКТИРОВАТЬ: Проблема в этом случае - это действие, которое вы используете, размещает вашу форму внутри формы плагина. Вам нужно использовать другой крючок действия (или вам нужно взломать его с помощью этого).

Плагин, который вы используете, не обеспечивает соответствующий крючок действия, чтобы разместить форму, в которую вы пытаетесь ее поместить (после ask_form). Для этого вам придется изменить код плагина.Если вы готовы изменить код плагина, вы могли бы сделать это:

Измените метод плагинов формы колонтитула:

private function form_footer() 
{ 
    ob_start(); 
    /** 
    * ACTION: ap_form_bottom_[form_name] 
    * action for hooking captcha and extar fields 
    * @since 2.0.1 
    */ 
    do_action('ap_form_bottom_'. $this->name); 
    $this->output .= ob_get_clean(); 

    $this->output .= '<button type="submit" class="ap-btn ap-btn-submit">'.$this->args['submit_button'].'</button>'; 

    if(@$this->args['show_cancel'] === true) 
     $this->output .= '<button type="button" class="ap-btn ap-btn-cancel">'.__('Cancel', 'ap').'</button>'; 

    $this->output .= '</form>'; 

    //MODIFICATION added action 
    do_action('ap_form_aftercustom_'. $this->name); 

} 

Затем измените функцию fd_bt_form_html:

class Find_Do_For_Anspress 
{ 
    //MODIFICATION use the new action 
    add_action('ap_form_aftercustom_ask_form', array($this, 'fd_bt_form_html')); //This is where I use the action hook to insert my code into the plugin's form_footer() 

    public function fd_bt_form_html() 
     {  
      $class_bt_token = new Braintree_ClientToken(); 
      $clientToken = $class_bt_token->generate(); 

      ?> 
      <script src="https://js.braintreegateway.com/v2/braintree.js"></script> 
      <script> 

       braintree.setup(
       '<?php echo $clientToken ?>', 
       'dropin', { 
        container: 'payment-form', 
       }); 

      </script> 
      <?php  

      $class_bt_form = new FD_Braintree_Form(); 
      $bt_form = $class_bt_form->fd_bt_form(); 

      echo $bt_form; 
     } 
} 

-End Редактировать -

Перед тем как получить дополнительную информацию, я получил дополнительную информацию:

Я думаю, что здесь есть два возможных виновника (не видя ваш код).

  1. Вы размещаете форму внутри формы.
  2. Ваши кнопки/отправления указывают форму по имени.

# 1 Пример

<form> 
    <input ...> 
    <input ...> 
    <input type="submit" form="SomeForm" value="Submit Form 1"> 

    <form> 
     <input ...> 
     <input ...> 
    <input type="submit" form="SomeForm" value="Submit Form 2"> 
    </form>  
</form> 

# 2 Пример

<form name="SomeForm" id="SomeForm"> 
    <input form="SomeForm" ...> 
    <input form="SomeForm" ...> 
    <input type="submit" form="SomeForm" value="Submit Form 1"> 
</form> 

<form> 
    <input form="SomeForm" ...> 
    <input form="SomeForm" ...> 
    <input type="submit" form="SomeForm" value="Submit Form 2"> 
</form> 

Ниже приведен пример формы вложенности, которая будет работать на некоторых браузерах в html5 (не рекомендуется раствор).

<form name="SomeForm" id="SomeForm"> 
    <input form="SomeForm" ...> 
    <input form="SomeForm" ...> 
    <input type="submit" form="SomeForm" value="Submit Form 1"> 

    <form name="SomeForm2" id="SomeForm2"> 
     <input form="SomeForm2" ...> 
     <input form="SomeForm2" ...> 
     <input type="submit" form="SomeForm2" value="Submit Form 2"> 
    </form>  
</form> 

Wordpress - очень популярный и очень мощный инструмент. Однако, когда мне приходится смотреть на его код, мне напоминают, почему я его не использую. Это худший PHP-код любой хорошо адаптированной программы, которую я видел. Это совершенно ужасно. Если кто-нибудь из читающих это изучает PHP и использует Wordpress в качестве примера, сделайте себе одолжение и используйте ЛЮБОЙ другой источник кода примера PHP. Wordpress полный мусор, по коду.

+0

Да, я также думаю, что это проблема в примере # 1. Взгляните на редактирование, которое я только что сделал - я добавил код нижнего колонтитула формы, который появился с плагином. Внутри это крюк действия, который я использовал. – DarthVoid

+0

Из кода, который вы загрузили, я не вижу, чтобы вторая форма использовалась где угодно. (См. Мой комментарий к исходному вопросу). Мне может потребоваться увидеть класс AnsPress_Form и функцию ap_post_upload_hidden_form. –

+0

О, прошу прощения. Я забыл, где я на самом деле использую крюк действия. Я отредактирую. – DarthVoid

Смежные вопросы