News:

Bored?  Looking to kill some time?  Want to chat with other SMF users?  Join us in IRC chat or Discord

Main Menu

taille d'un champ d'enregistrement dans abonnement payant

Started by DanielSan34, January 14, 2016, 04:31:43 AM

Previous topic - Next topic

DanielSan34

Bonjour à vous,

nous avons mis en place le système d'abonnement payant pour les adhésions à notre fédération.
ça marche nickel ! et ça nous facilite grandement la vie, merci aux développeurs !

cependant dans la page de configuration d'un abonnement, le textarea "description" est trop petit pour nous ...
j'ai bien cherché dans le fichier ManagePaid.php, trouvé ce qui attrait à "description" mais je n'arrive pas à savoir ce qu'il faut modifier pour que ça enregistre plus de caractère dans la bdd. J'ai bien modifié des 255 en 500 mais en vain :(

Quelqu'un a une petite idée ?

Merci à vous

maximus23

Bonsoir,

Tu dois changer la valeur du champ "description" qui est à 255 dans la table "subscriptions" .

:)
Pas de support par PM ou Courrier...Veuillez utiliser le forum pour vous avoir une réponse rapide à votre demande d'aide. Merci.
Amitiés et à Bientôt...
No support by PM or Mail...You will get better and faster responses in the support forums. Thank you.
Have a nice day...


maximus23

Bonjour,

Pour changer la valeur d'un champ cela se fait via phpmyadmin c'est le plus simple.

:)
Pas de support par PM ou Courrier...Veuillez utiliser le forum pour vous avoir une réponse rapide à votre demande d'aide. Merci.
Amitiés et à Bientôt...
No support by PM or Mail...You will get better and faster responses in the support forums. Thank you.
Have a nice day...

DanielSan34

en effet c'est plus simple, merci ;D

j'en profite pour préciser une modification pour avoir les accents sur le nom de l'abonnement chez paypal :
dans Sources/Subscriptions-Paypal.php / fonction fetchGatewayFields()
rajouter dans le tableau $return_data['hidden']
$return_data['hidden']['charset'] = 'UTF-8';
ou alors importer la valeur paramétrée dans SMF mais je ne sais pas comment ;D

et quitte à avoir les mains dans l'abonnement,
nous avons ajouté des champs "privés" (visible par l'admin et le membre) concernant les adresses de facturation.
Nous aimerions envoyer ces champs à Paypal ...

au même endroit :
public function fetchGatewayFields($unique_id, $sub_data, $value, $period, $return_url)
{
global $modSettings, $txt, $boardurl;

$return_data = array(
'form' => 'https://www.' . (!empty($modSettings['paidsubs_test']) ? 'sandbox.' : '') . 'paypal.com/cgi-bin/webscr',
'id' => 'paypal',
'hidden' => array(),
'title' => $txt['paypal'],
'desc' => $txt['paid_confirm_paypal'],
'submit' => $txt['paid_paypal_order'],
'javascript' => '',

'address1'=> '', // valeur du champ privé adresse
'zip'=> '', // valeur du champ privé code postal
'city'=> '', // valeur du champ privé ville
'first_name'=> '', // valeur du champ privé prénom
'last_name'=> '', // valeur du champ privé nom
);

etc.
}


j'ai entraperçu une fonction loadCustomFields($memID, 'account') ... est-ce par là qu'il faille creuser ??

et dans l'idéal, ne faire apparaître le bouton 'commander' que si le membre a renseigné ces champs :P

merci de votre aide

DanielSan34

bonsoir,

je reviens sur le dernier point : interroger les champs personnalisés.
J'essaie d'utiliser la fonction loadCustomFields($context['id_member']) mais en vain :(
est-ce la bonne ? c'est le dernier gros point pour que notre forum soit tip-top, et là je bloque ???
une petite aide ? merci !

maximus23

Bonsoir,

Pour commencer est-ce que le format Gateway Paypal accepte ces valeurs supplémentaires ?

:)
Pas de support par PM ou Courrier...Veuillez utiliser le forum pour vous avoir une réponse rapide à votre demande d'aide. Merci.
Amitiés et à Bientôt...
No support by PM or Mail...You will get better and faster responses in the support forums. Thank you.
Have a nice day...

DanielSan34

Bonsoir,

j'ai déjà implémenté des formulaires paypal avec ces valeurs
https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/formbasics/
Quote
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="business" value="[email protected]">
<input type="hidden" name="item_name" value="hat">
<input type="hidden" name="item_number" value="123">
<input type="hidden" name="amount" value="15.00">
<input type="hidden" name="first_name" value="John">
<input type="hidden" name="last_name" value="Doe">
<input type="hidden" name="address1" value="9 Elm Street">
<input type="hidden" name="address2" value="Apt 5">
<input type="hidden" name="city" value="Berwyn">
<input type="hidden" name="state" value="PA">
<input type="hidden" name="zip" value="19312">
<input type="hidden" name="night_phone_a" value="610">
<input type="hidden" name="night_phone_b" value="555">
<input type="hidden" name="night_phone_c" value="1234">
<input type="hidden" name="email" value="[email protected]">
<input type="image" name="submit" border="0"
src="https://www.paypalobjects.com/en_US/i/btn/btn_buynow_LG.gif"
alt="PayPal - The safer, easier way to pay online">
</form>

maximus23

Bonjour,

Donc tu veux définir une nouvelle fonction pour faire un envoi vers paypal ?

Tu vas l'utiliser comment car cela ne doit pas entrer en conflit avec l'envoi de Smf.

:)
Pas de support par PM ou Courrier...Veuillez utiliser le forum pour vous avoir une réponse rapide à votre demande d'aide. Merci.
Amitiés et à Bientôt...
No support by PM or Mail...You will get better and faster responses in the support forums. Thank you.
Have a nice day...

DanielSan34

Bonjour,

je n'utilise pas une nouvelle fonction, je complète celle existante par les champs manquants ;)

Il faut que j'arrive à interroger les champs personnalisés pour :

  • vérifier qu'ils sont remplis pour afficher le formulaire paypal. Si pas remplis > lien vers le profil
  • ajouter ces champs dans le formulaire existant (ça permet d'éditer automatiquement une facture chez paypal puisqu'il récupère ces données)
  • ajouter ces champs dans l'email envoyé au service abonnement (la personne en charge des cotisations envoie un colis aux adhérents. Seuls les admin voient ces champs. Donc les insérer dans l'email évite à l'admin de transmettre ces infos à la personne concernée)
je m'y connais un peu en PHP, je bute sur le SQL (j'ai plutôt l'habitude du XML ;D )

Merci pour ton aide

maximus23

Bonsoir,

Je regarderai ce week-end car cette semaine très peu de temps.

:)
Pas de support par PM ou Courrier...Veuillez utiliser le forum pour vous avoir une réponse rapide à votre demande d'aide. Merci.
Amitiés et à Bientôt...
No support by PM or Mail...You will get better and faster responses in the support forums. Thank you.
Have a nice day...


maximus23

Bonsoir,

Je suppose que l'on ne sait pas tester le formulaire sans compte Paypal même en utilisant le bac à sable de test ?

:)
Pas de support par PM ou Courrier...Veuillez utiliser le forum pour vous avoir une réponse rapide à votre demande d'aide. Merci.
Amitiés et à Bientôt...
No support by PM or Mail...You will get better and faster responses in the support forums. Thank you.
Have a nice day...

DanielSan34

bonsoir

bonne question ! je pense que si tu n'as pas d'email paypal, ça ne devrait pas le faire ...
au pire j'ai le forum en miroir pour le développement (ou alors je te file en MP une email PP ..? je ne pense pas que ça craigne )
merci

maximus23

Bonsoir,

Bon voici une solution à tester avec ton forum de test en bac à sable Paypal. Ici je te mets la solution passe partout avec un exemple ou j'ai défini trois champs dans les champs additionnels de Smf. Donc j'ai ajouté le champ Rue, le champ Commune, le champ Code Postal.

Moi pour tester mon code je l'ai mis dans indextemplate du thème de Smf.

Donc j'ai recréé une fonction que tu vas mettre avant la fin du fichier Sources/Load/



// Load mycustom fields for this area => 'summary' loads all public ones.
function loadMyCustomFields($memID, $area = 'summary')
{
global $db_prefix, $context, $txt, $user_profile, $smcFunc, $user_info, $settings, $scripturl;


// Did we get the user by name...
if (isset($_REQUEST['user']))
$memberResult = loadMemberData($_REQUEST['user'], true, 'profile');
// ... or by id_member?
elseif (!empty($_REQUEST['u']))
$memberResult = loadMemberData((int) $_REQUEST['u'], false, 'profile');
// If it was just ?action=profile, edit your own profile.
else
$memberResult = loadMemberData($user_info['id'], false, 'profile');

// Check if loadMemberData() has returned a valid result.
if (!is_array($memberResult))
fatal_lang_error('not_a_user', false);

// If all went well, we have a valid member ID!
list ($memID) = $memberResult;
$context['id_member'] = $memID;
$cur_profile = $user_profile[$memID];

// Let's have some information about this member ready, too.
loadMemberContext($memID);
$context['member'] = $memberContext[$memID];

// Is this the profile of the user himself or herself?
$context['user']['is_owner'] = $memID == $user_info['id'];

// Get the right restrictions in place...
$where = 'active = 1';

if (!allowedTo('admin_forum') && $area != 'register')
{
// If it's the owner they can see two types of private fields, regardless.
if ($memID == $user_info['id'])
$where .= $area == 'summary' ? ' AND private < 3' : ' AND (private = 0 OR private = 2)';
else
$where .= $area == 'summary' ? ' AND private < 2' : ' AND private = 0';
}

if ($area == 'register')
$where .= ' AND show_reg != 0';
elseif ($area != 'summary')
$where .= ' AND show_profile = {string:area}';

// Load all the relevant fields - and data.
$request = $smcFunc['db_query']('', '
SELECT
col_name, field_name, field_desc, field_type, field_length, field_options,
default_value, bbc, enclose, placement
FROM {db_prefix}custom_fields
WHERE ' . $where,
array(
'area' => $area,
)
);

$context['custom_myprofile_fields'] = array();
while ($row = $smcFunc['db_fetch_assoc']($request))
{
$curField = 'cust_' . $row['col_name'];

// Collect the column info and some extra.
$context['custom_myprofile_fields']['columns'][$curField] = array(
'label' => $row['field_name'],
'type' => $row['field_type'],
'bbc' => !empty($row['bbc']),
);

// Build up sort queries.
if ($row['field_type'] != 'check')
$context['custom_myprofile_fields']['sort'][$curField] = array(
'down' => 'LENGTH(t' . $curField . '.value) > 0 ASC, IFNULL(t' . $curField . '.value, 1=1) DESC, t' . $curField . '.value DESC',
'up' => 'LENGTH(t' . $curField . '.value) > 0 DESC, IFNULL(t' . $curField . '.value, 1=1) ASC, t' . $curField . '.value ASC'
);
else
$context['custom_myprofile_fields']['sort'][$curField] = array(
'down' => 't' . $curField . '.value DESC',
'up' => 't' . $curField . '.value ASC'
);


if (isset($_REQUEST['sort']) && $_REQUEST['sort'] == $curField)
{
$context['custom_myprofile_fields']['join'] = 'LEFT JOIN {db_prefix}themes AS t' . $curField . ' ON (t' . $curField . '.variable = {string:t' . $curField . '} AND t' . $curField . '.id_theme = 1 AND t' . $curField . '.id_member = mem.id_member)';
$context['custom_myprofile_fields']['parameters']['t' . $curField] = $row['col_name'];
}


// Shortcut.
$exists = $memID && isset($user_profile[$memID], $user_profile[$memID]['options'][$row['col_name']]);
$value = $exists ? $user_profile[$memID]['options'][$row['col_name']] : '';

// If this was submitted already then make the value the posted version.
if (isset($_POST['customfield']) && isset($_POST['customfield'][$row['col_name']]))
{
$value = $smcFunc['htmlspecialchars']($_POST['customfield'][$row['col_name']]);
if (in_array($row['field_type'], array('select', 'radio')))
$value = ($options = explode(',', $row['field_options'])) && isset($options[$value]) ? $options[$value] : '';
}

// HTML for the input form.
$output_html = $value;
if ($row['field_type'] == 'check')
{
$true = (!$exists && $row['default_value']) || $value;
$input_html = '<input type="checkbox" name="customfield[' . $row['col_name'] . ']" ' . ($true ? 'checked="checked"' : '') . ' class="input_check" />';
$output_html = $true ? $txt['yes'] : $txt['no'];
}
elseif ($row['field_type'] == 'select')
{
$input_html = '<select name="customfield[' . $row['col_name'] . ']"><option value="-1"></option>';
$options = explode(',', $row['field_options']);
foreach ($options as $k => $v)
{
$true = (!$exists && $row['default_value'] == $v) || $value == $v;
$input_html .= '<option value="' . $k . '"' . ($true ? ' selected="selected"' : '') . '>' . $v . '</option>';
if ($true)
$output_html = $v;
}

$input_html .= '</select>';
}
elseif ($row['field_type'] == 'radio')
{
$input_html = '<fieldset>';
$options = explode(',', $row['field_options']);
foreach ($options as $k => $v)
{
$true = (!$exists && $row['default_value'] == $v) || $value == $v;
$input_html .= '<label for="customfield_' . $row['col_name'] . '_' . $k . '"><input type="radio" name="customfield[' . $row['col_name'] . ']" class="input_radio" id="customfield_' . $row['col_name'] . '_' . $k . '" value="' . $k . '" ' . ($true ? 'checked="checked"' : '') . '>' . $v . '</label><br />';
if ($true)
$output_html = $v;
}
$input_html .= '</fieldset>';
}
elseif ($row['field_type'] == 'text')
{
$input_html = '<input type="text" name="customfield[' . $row['col_name'] . ']" ' . ($row['field_length'] != 0 ? 'maxlength="' . $row['field_length'] . '"' : '') . ' size="' . ($row['field_length'] == 0 || $row['field_length'] >= 50 ? 50 : ($row['field_length'] > 30 ? 30 : ($row['field_length'] > 10 ? 20 : 10))) . '" value="' . $value . '" class="input_text" />';
}
else
{
@list ($rows, $cols) = @explode(',', $row['default_value']);
$input_html = '<textarea name="customfield[' . $row['col_name'] . ']" ' . (!empty($rows) ? 'rows="' . $rows . '"' : '') . ' ' . (!empty($cols) ? 'cols="' . $cols . '"' : '') . '>' . $value . '</textarea>';
}

// Parse BBCode
if ($row['bbc'])
$output_html = parse_bbc($output_html);
elseif($row['field_type'] == 'textarea')
// Allow for newlines at least
$output_html = strtr($output_html, array("\n" => '<br />'));

// Enclosing the user input within some other text?
if (!empty($row['enclose']) && !empty($output_html))
$output_html = strtr($row['enclose'], array(
'{SCRIPTURL}' => $scripturl,
'{IMAGES_URL}' => $settings['images_url'],
'{DEFAULT_IMAGES_URL}' => $settings['default_images_url'],
'{INPUT}' => $output_html,
));

$context['mycustom_fields'][] = array(
'name' => $row['field_name'],
'desc' => $row['field_desc'],
'type' => $row['field_type'],
'input_html' => $input_html,
'output_html' => $output_html,
'placement' => $row['placement'],
'colname' => $row['col_name'],
'value' => $value,
);
}
$smcFunc['db_free_result']($request);
}


Voilà donc ce sera la fonction principale.

Maintenant moi ici je me sert de l'indextemplate pour afficher mais le code sera indentique dans ton fichier Paypal

Donc tu auras une sécurité de connexion pour les guests obligatoire et après tu auras ton appel de fonction.

Après tu auras la récupération des champs et leurs valeurs.

Moi ici j'ai mis tout mais toi tu devras simplement récupérer la valeur du champ pour mettre dans ton formulaire.

Attention code brut de développement :


if ($context['user']['is_logged'])

{

loadMyCustomFields($memID, $area = 'summary');
//FormFields();

echo'<br/><br/>';

//print_r($context);

echo'<br/><br/>';

echo 'Nom : ' .$context['mycustom_fields'][0]['name'];

echo '<br/>Description : ' .$context['mycustom_fields'][0]['desc'];

echo '<br/>Mon Adresse : ' .$context['mycustom_fields'][0]['value'];

echo'<br/><br/>';

echo 'Nom : ' .$context['mycustom_fields'][1]['name'];

echo '<br/>Description : ' .$context['mycustom_fields'][1]['desc'];

echo '<br/>Mon Adresse : ' .$context['mycustom_fields'][1]['value'];

echo'<br/><br/>';

echo 'Nom : ' .$context['mycustom_fields'][2]['name'];

echo '<br/>Description : ' .$context['mycustom_fields'][2]['desc'];

echo '<br/>Mon Adresse : ' .$context['mycustom_fields'][2]['value'];


echo'<br/><br/>';
echo'<br/><br/>';
echo'<br/><br/>';
echo'<br/><br/>';

}


Si tu veux tester et voir si cela fonctionne tu peux mettre le code dans ton thème fichier IndexTemplate

insérer le code avant :


// If the user is logged in, display stuff like their name, new messages, etc.


Je l'ai mis là pour plus de visibilité.

et cela donne ceci :


Pas de support par PM ou Courrier...Veuillez utiliser le forum pour vous avoir une réponse rapide à votre demande d'aide. Merci.
Amitiés et à Bientôt...
No support by PM or Mail...You will get better and faster responses in the support forums. Thank you.
Have a nice day...

DanielSan34

oh yeah du grand Maximus ! Merciiii !

quand je vois ta fonction loadMyCustomFields, jamais je n'y serai arrivé ou alors pas sans risque ;D
demain je fais les essais sur les différentes pages et j'espère que ça va marcher.
on a dû faire une relance aux adhérents, et on se paluche les factures à la main, ggrrrr

je te tiens au jus, mille mercimus !

DanielSan34

arg, pas sommeil avec ces bêtises !  ;D

reste plus qu'à attendre les prochains abonnements pour voir si le formulaire paypal fonctionne bien (les infos sont bien transmises)

je m'atèle à l'insertion dans la notification au service adhésion

DanielSan34

Quote from: DanielSan34 on January 27, 2016, 08:47:30 PM
je m'atèle à l'insertion dans la notification au service adhésion
buen, j'ai réussi à rajouter des "Global Pre-Set" dans manage.template.editor que j'ai associé dans la fonction de remplacement de subscriptions.php ... ne pouvant tester l'email de bonne souscription, j'ai fait la même pour la notification de relance ... et ça fonctionne. Y'a plus qu'à croiser les doigts et une bonne nuit bien méritée !
je tiens au jus.

Merci encore.

maximus23

Pas de support par PM ou Courrier...Veuillez utiliser le forum pour vous avoir une réponse rapide à votre demande d'aide. Merci.
Amitiés et à Bientôt...
No support by PM or Mail...You will get better and faster responses in the support forums. Thank you.
Have a nice day...

DanielSan34

bonjour/bonsoir, je sais plus lol

nouvel adhérent pendant que je ronquais ... la modif faite dans subscriptions.php n'a pas fonctionné.
L'abonnement a bien été pris en compte mais l'email n'est pas parti :(
Arg, c'était trop beau ! Je viens de voir que j'avais oublié de rajouter global $context dans la fonction ???

voici ce que j'ai maintenant dans subscriptions.php :

// Send a receipt?
if (!empty($modSettings['paid_email']) && $modSettings['paid_email'] == 2 && $notify)
{
global $context;

# récupération des champs perso
loadMyCustomFields($memID, $area = 'summary');

$replacements = array(
'NAME' => $subscription_info['name'],
'SUBNAME' => $member_info['member_name'],
'SUBUSER' => $member_info['real_name'],
'SUBEMAIL' => $member_info['email_address'],
'PRICE' => sprintf($modSettings['paid_currency_symbol'], $total_cost),
'PROFILELINK' => $scripturl . '?action=profile;u=' . $member_id,
'DATE' => timeformat(time(), false),
'CUST_PRENOM' => $context['mycustom_fields'][7]['value'],
'CUST_NOM' => $context['mycustom_fields'][8]['value'],
'CUST_ETB' => $context['mycustom_fields'][6]['value'],
'CUST_RUE' => $context['mycustom_fields'][4]['value'],
'CUST_CP' => $context['mycustom_fields'][2]['value'],
'CUST_VILLE' => $context['mycustom_fields'][9]['value'],
'CUST_TEL' => $context['mycustom_fields'][5]['value']
);

emailAdmins('paid_subscription_new', $replacements, $notify_users);
}


avec dans EmailTemplateEditor.php

// Global Pre-Set Variables...
$context['email_templates']['preset_variables']['global'] = array(
'forumname' => '{FORUMNAME}',
'scripturl' => '{SCRIPTURL}',
'themeurl' => '{THEMEURL}',
'imagesurl' => '{IMAGESURL}',
'default_themeurl' => '{DEFAULT_THEMEURL}',
'regards' => '{REGARDS}',
'custprenom' => '{CUST_PRENOM}',
'custnom' => '{CUST_NOM}',
'custetb' => '{CUST_ETB}',
'custrue' => '{CUST_RUE}',
'custcp' => '{CUST_CP}',
'custville' => '{CUST_VILLE}',
'custtel' => '{CUST_TEL}'
);


J'attends une nouvelle adhésion pour voir si ça marche ???
Merci :)

Advertisement: