Support

  1. blocdaddy
  2. Support
  3. Thursday, January 30 2020, 09:36 AM
  4.  Subscribe via email
I use Easy Profile along with Membership Pro and Edocman from JoomdDonation to manage my subscription/membership site. Right now I’m trying to find a way to automatically assign individual Edocman documents to members on their Easy Profile page based on conditions when they register.

When users sign up, they choose certain digital documents as part of their subscription. They can choose from more than 400 electronic documents that have been assigned multiple times to different users. I use Edocman to manage the group and individual owners of the documents. Right now, users select the documents they want from a multi-select list in Easy Profile when they register and then I have to manually add the documents to their accounts in Edocman. Then I manually add a custom module to their Easy Profile page which lists their assigned documents.

What I’ve been trying to do to make the process much faster is set up a custom multi-select field in Easy Profile with alias “practice_fields” which lists all documents. I used the DB parameters to populate the list options directly from the Edocman database. I also tried using basic value/options format like:

1|Document1
2|Document2

Edocman has a content plugin similar to Easy Profile which generates a direct download link to documents and is referenced by document ID. For example, I can call “Document 30” by referencing {edocmanlink 30}. I have created a separate delimiter field with alias “edocman_links.” The “edocman_links” field would be triggered by the member selecting a document from “practice_fields” during registration and then would automatically generate the link/icon to the Edocman document on the member’s profile page using the Edocman content plugin. I’ve been trying to make this work using PHP with the JsnUser API and “if” statements (using the Sorcerer plugin from Regular Labs) to generate the different links to documents. Basically, I would like to have a single delimiter field with references to 400 list options and 400 corresponding documents that would be shown or hidden based on the member's selection. I know I could accomplish the same thing more easily by simply creating 400 delimiter fields and then setting conditions, but I’d much rather have it all in one field. Also, I thought maybe it might be better to use database queries or SQL Custom Where statements, but I haven’t gotten those to work either. Below is a random sample of the code I’ve been trying to use with the “edocman_links” field based on my searches in the forum and hopefully gives you an idea of what I’m trying to do. The Edocman link is generated by the code so I know that the content plugin at least works. But the link is not affected by inputting different values/fields. I can put any value or field in the code and the Edocman link always shows up and is never hidden or changes. I have very little PHP coding experience so I’m sure I’m missing something simple or stupid. If you think there is an easier way that would be great too!


require_once(JPATH_SITE.'/components/com_jsn/helpers/helper.php');
$user=JsnHelper::getUser;
$user->getValue('practice_fields');
if($user->getValue('practice_fields')=1) {
echo '{edocmanlink 30}'; }


require_once( JPATH_SITE.'/components/com_jsn/helpers/helper.php');
$user=JsnHelper::getUser;
$value_of_select=$user->getValue('practice_fields');
$output_of_select=$user->getField('practice_fields');
if($output_of_select="Litigation") {
echo '{edocmanlink 30}';
}


require_once(JPATH_SITE.'/components/com_jsn/helpers/helper.php');
$user=JsnHelper::getUser;
$user->getField('practice_fields');
if ($user->getField('practice_fields')=Litigation)) {
echo "{edocmanlink 30}";
}


require_once(JPATH_SITE.'/components/com_jsn/helpers/helper.php');
$user=JsnHelper::getUser;
$user->getValue('practice_fields');
if($user->getValue('practice_fields') {
echo "{edocmanlink 1}";
}

Accepted Answer
admin Accepted Answer
Admin
Hi,
The only other thing I changed was "(int) $user->id" to "(int)$val" in the second query since "id" in the query refers to the document ID column. Not sure if that was right or not
Yes, this is correct :) , it is my error

Probably the error is in the table name, you have wrote pdid__edocman_documents instead pdid_edocman_documents
In my code I have used #__edocman_documents, this because in each query Joomla replace automatically this code #__ with table prefix
blocdaddy Accepted Answer
Pro
As an update to my first post...

Using the code below, I am closer to doing what I was trying to explain in my first post:


require_once(JPATH_SITE.'/components/com_jsn/helpers/helper.php');
$user=JsnHelper::getUser();
if($user->getField('practice_fields')=='Top 40 under 40 (2020)')
echo '<img src="/images/PLOA-40under40.png" alt="Top40" />','{edocmanlink 1}','{user name}';
if($user->getField('practice_fields')=='$500 Million Recovered')
echo '<img src="/images/150million1.png" alt="150million" />','{edocmanlink 2}','{user name}';


Now when a logged-in user selects ONE option from the multiple select field, the selection is mapped to the delimiter field and the corresponding Edocman thumbnail and download button are shown on the profile page. Only the mapped selection is shown in the delimiter field and all other links in the code are hidden.

But even if other users have different options mapped from the select field on their profile page, the logged-in user sees his/her own delimiter fields on all other members’ pages.

And when logged out, nothing shows in the delimiter field even though all permissions are set to public for all fields.

When a user selects TWO or more options from the multiple select field, nothing shows in the delimiter field at all on the profile page. However, the selections do still show on users’ profile page in the “practice_fields” field. And in the "practice_fields" field, the selections also correctly match the different users both when the person viewing the profile is logged-in or a visitor unlike the delimiter field.

I’ve also tried using:

$user=JsnHelper::getUser($user->id);
$user=JsnHelper::getUser($user_id);


And with users who choose multiple values, I’ve tried:

‘[Top 40 under 40 (2020)]’
'[“$500 Million Recovered”]'


Is there a way to fix these problems? And because I have limited coding experience, is the method I’m using above the best way to accomplish what I’m trying to do? Should I use database queries or something else instead?

Thanks!!
  1. 3 weeks ago
  2. Support
  3. # 1
blocdaddy Accepted Answer
Pro
Ok, after a number of days I was able to get everything working, but now have another problem.

The select list options are directly populated by the Edocman database as:

Value|Text =
Edocman ID of document|Edocman title of document

Users are able to select the documents they want and the document thumbnails and download links are generated by the delimiter field and are only visible to the user. However, in order for the user to download the document from the generated document link, they still need ownership access for the particular document from Edocman. Ownership access is granted based on Joomla ID. For instance, a document can be assigned to Joomla users 1, 12, 25, etc., and only they have access to the document. I would like to trigger the Edocman database field and add the additional user ID of the person selecting a document from the Easy Profile select list so they can download it.

Based on a forum search, I know this is possible using the Easy Profile skeleton plugin but I haven’t figured out how to map the corresponding database fields after a number of hours trying different ways.

The fields are as follows:

Edocman
Table: “#_edocman_table”
Column: “user_ids” (Joomla IDs of the owners)
Row: “id” (Document ID)

Easy Profile
Table: “#_jsn_users”
Column: “id” (Joomla user ID)
Column: “alias_of_selectfield” (select field)
Value of “alias_of_selectfield”: ["1","2","3","4","5"] (these are the Edocman Document IDs which are retuned as the “value” of “value|text” in the select field)

When a user registers or updates thier profile in Easy Profile, I would like to map the values from Easy Profile “id” column to Edocman “user_ids” column where Easy Profile “alias_of_selectfield” column values = Edocman “id” row values. How can this be done?
  1. 2 weeks ago
  2. Support
  3. # 2
admin Accepted Answer
Admin
Hi,
sorry for late reply :)
But even if other users have different options mapped from the select field on their profile page, the logged-in user sees his/her own delimiter fields on all other members’ pages.
This happen because the function JsnHelper::getUser() return the current logged in user, to get the current displayed user data then you can use something like this:
global $JSNLIST_DISPLAYED_ID;
if($JSNLIST_DISPLAYED_ID) $owner_id=$JSNLIST_DISPLAYED_ID;
else $owner_id=JRequest::getVar( 'id' , JFactory::getUser()->id );
$user = JsnHelper::getUser($owner_id)


When a user selects TWO or more options from the multiple select field, nothing shows in the delimiter field at all on the profile page.
This happen because if there is a multiple value then it return a list of document titles

Is there a way to fix these problems? And because I have limited coding experience, is the method I’m using above the best way to accomplish what I’m trying to do? Should I use database queries or something else instead?
No, the best way is to use directly the IDs of the documents, so instead using getField the best way is to use getValue function, this function will return an array that contain a list of document IDs
$JSNLIST_DISPLAYED_ID;
if($JSNLIST_DISPLAYED_ID) $owner_id=$JSNLIST_DISPLAYED_ID;
else $owner_id=JRequest::getVar( 'id' , JFactory::getUser()->id );
$user = JsnHelper::getUser($owner_id)

$value = (array) $user->getField('practice_fields');
if(count($value)) foreach($value = $val){
/*HERE THE CODE TO GET DOCUMENT TITLE AND IMAGE
FROM EDOCMAN AND RETURN THE CONTENT TO SHOW, $val VARIABLE
CONTAIN THE ID OF THE EDOCMAN DOCUMENT */
}


Instead if you does not have enough skills with PHP and Edocman APIs then you could works with your way like:
$JSNLIST_DISPLAYED_ID;
if($JSNLIST_DISPLAYED_ID) $owner_id=$JSNLIST_DISPLAYED_ID;
else $owner_id=JRequest::getVar( 'id' , JFactory::getUser()->id );
$user = JsnHelper::getUser($owner_id)

$value = (array) $user->getValue('practice_fields'); /* NOTE: I HAVE USED getValue INSTEAD getField */
if(in_array(1,$value))
echo '<img src="/images/PLOA-40under40.png" alt="Top40" />','{edocmanlink 1}','{user name}';
if(in_array(2,$value))
echo '<img src="/images/150million1.png" alt="150million" />','{edocmanlink 2}','{user name}';
.....
  1. 2 weeks ago
  2. Support
  3. # 3
blocdaddy Accepted Answer
Pro
Thanks for the reply!

I ended up using getValue function and the document links are generated based on the array value of select field options and only visible on the user's page.

But that's where the new problem happens with ownership of the document. Is there a way to map the User ID field as set out in my last response above?
  1. 2 weeks ago
  2. Support
  3. # 4
admin Accepted Answer
Admin
Hi,
sorry but you should ask this to Edocman support team and put a code like this

if(in_array(1,$value))
{
/* Code to add the user id to the document if it's is not already available */
echo '<img src="/images/PLOA-40under40.png" alt="Top40" />','{edocmanlink 1}','{user name}';
}

Edocman should have a parameter for each document called "User Ids", this parameter allow you to give access to specific user id
  1. 2 weeks ago
  2. Support
  3. # 5
blocdaddy Accepted Answer
Pro
After working with the code below, the Edocman owner field is now populated with the Easy Profile user when they update their profile and select documents. However, no matter which user adds the documents, the user ID is shown as "JsnUser" instead of the actual numeric ID. Based on the code below can you tell what I'm doing wrong? Also, is there a more elegant way to include the queries for the documents -- I have more than 400 and will need to include 400+ queries. Thanks!


defined('_JEXEC') or die;

class PlgJsnSkeleton extends JPlugin {

public function triggerProfileUpdate($user,&$data,$changed,$isNew){

global $JSNLIST_DISPLAYED_ID;

if($JSNLIST_DISPLAYED_ID) $owner_id = $JSNLIST_DISPLAYED_ID;

else $owner_id = JRequest::getVar( 'id' , JFactory::getUser()->id );

$user = JsnHelper::getUser($owner_id);

$value = (array)$user->getValue('practice_fields');

if(in_array(1,$value))
{
$db = JFactory::getDbo();
$query ='UPDATE pdid_edocman_documents SET user_ids= '.$db->quote($user). ' WHERE id = ' . ($value[1]);
$db->setQuery($query);
$db->execute();

if(in_array(2,$value))

$db = JFactory::getDbo();
$query ='UPDATE pdid_edocman_documents SET user_ids= '.$db->quote($user). ' WHERE id = ' . ($value[0]);
$db->setQuery($query);
$db->execute();
};
  1. 2 weeks ago
  2. Support
  3. # 6
admin Accepted Answer
Admin
Hi,
shown as "JsnUser" instead of the actual numeric ID
In your queries you should replace this
$db->quote($user)
with this
$db->quote($user->id)


Anyway the queries are not correct because you set user_ids column with the current user id and delete the previous value. The column user_ids should contain a list of authorized user ids like 100,232,485,392....

You should use something like this:

defined('_JEXEC') or die;

class PlgJsnSkeleton extends JPlugin {

public function triggerProfileUpdate($user,&$data,$changed,$isNew){

$value = (array) json_decode($data['practice_fields']);

$db = JFactory::getDbo();

if(count($value)) foreach($value as $val){
$query ='SELECT user_ids FROM #__edocman_documents WHERE id = ' . (int)$val;
$db->setQuery($query);
$ids = $db->loadResult();
$ids_array = (array) explode(',',$ids);
if( !in_array($user->id, ids_array) ) $ids = $ids . ',' . $user->id; /* Add the ID of the user if it is not available */
$query ='UPDATE #__edocman_documents SET user_ids= '.$db->quote($ids). ' WHERE id = ' . (int) $user->id;
$db->setQuery($query);
$db->execute();
}


Sorry I have not tested this code, but should works...But you will have another problem to solve, this function will add the user id in the list of user ids of the document but it does not remove it...so when a user remove some document from the field then he still have access.
  1. 2 weeks ago
  2. Support
  3. # 7
blocdaddy Accepted Answer
Pro
Thank you for the response!

Updating user_ids when a user removes or changes a doc isn't an issue since members normally don't change or remove docs after selecting them during registration.

I tried the new code and now nothing shows at all in the user_ids field when the user updates their profile (no "JsnUser" or ID). Below is my current version of the plugin:



defined('_JEXEC') or die;

class PlgJsnSkeleton extends JPlugin

{
public function triggerProfileUpdate($user,&$data,$changed,$isNew)

{
$value = (array) json_decode($data['practice_fields']);
$db = JFactory::getDbo();
if(count($value)) foreach($value as $val)
{
$query = 'SELECT user_ids FROM pdid__edocman_documents WHERE id = ' . (int)$val;
$db->setQuery($query);
$ids = $db->loadResult();
$ids_array = (array) explode(',',$ids);
if( !in_array($user->id, ids_array) ) $ids = $ids . ',' . $user->id;
$query = 'UPDATE pdid__edocman_documents SET user_ids= '.$db->quote($ids). ' WHERE id = ' . (int)$val;
$db->setQuery($query);
$db->execute();
}
}
}



I wasn't sure whether to include the prior user code ("global $JSNLIST_DISPLAYED_ID...";) so I tried it with and without and neither worked.

The only other thing I changed was "(int) $user->id" to "(int)$val" in the second query since "id" in the query refers to the document ID column. Not sure if that was right or not, but I also tried it with both values and neither worked.
  1. 2 weeks ago
  2. Support
  3. # 8
blocdaddy Accepted Answer
Pro
That was it - it works perfectly with the changes! Thank you SO much for your awesome product and support! :)
  1. 2 weeks ago
  2. Support
  3. # 9
  • Page :
  • 1


There are no replies made for this post yet.
However, you are not allowed to reply to this post.

Request Support

Support is currently Offline

Support Availability

Working days: Monday to Friday. The support staff is not available on weekends; in the most of cases tickets will not be answered during that time.

Reply time: Depending on the complexity of your support issue it's usually between a few minutes and 24 hours for paid members and about one week for free members. When we expect longer delays we will notify you.

Guidelines

Before you post: read the documentation and search the forums for an answer to your question.

When you post: include Site Details if you request a support (you can use the form below the reply in Site Details tab).

Auto Solved Question: If after a week the author of the post does not reply to a request by moderator, the question will be marked as resolved.

Language: only English

Search Users

Easy Profile® is not affiliated with or endorsed by Open Source Matters or the Joomla Project. Joomla is Free Software released under the GNU/GPL License.