PopUp - Link1 table [message #5558] |
Mon, 23 May 2016 04:44 |
htManager
Messages: 434 Registered: May 2014
|
Senior Member |
|
|
Hi Tony,
I have two tables (training_exercises, key exercise_id, rdcaccount_id and training_categories, key category_id, rdcaccount_id) which I linked (table training_category_exercises, key cat_training_category_id, cat_rdcaccount_id, ex_training_exercise_id, ex_rdcaccount_id) with a link1 pattern to define which exercise is related to which category because an exercise can be related to more than one category.
Now I want to choose an exercise which is possible with a popup1 pattern for table training_exercises. But I want to choose the category first, see the linked exercises and choose one of these linked exercises.
Is this possible and if yes, how and which pattern should I use?
|
|
|
Re: PopUp - Link1 table [message #5559 is a reply to message #5558] |
Mon, 23 May 2016 05:59 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
There are several ways in which this can be done.
1) If you go to the Data Dictionary and look at either "Add Child Relationship" or "Add Parent Relationship" you will see that on the left is a dropdown list which enables you to select the database, and on the right is a popup button which will show you the tables which exist within that database.
2) You could use a POPUP2 pattern with category as the outer/top entity and exercise as the inner/bottom entity. If you are unable to pass the identity of the category to this popup then take a look at option #2 in FAQ7 which will show you how you can call a POPUP1 pattern to select the outer entity before the POPUP2 screen is displayed.
3) There is always AJAX, but I do not provide any facilities for this in RADICORE.
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
|
Re: PopUp - Link1 table [message #5563 is a reply to message #5561] |
Wed, 25 May 2016 04:39 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
Your code mentions two different popup forms - htm_training_plan_uebungskategorie(popup1) and htm_training_plan_uebungen_kategorie(popup2). If you look at FAQ79 you will see that the same popup form is mentioned twice. Your mistake is that it is calling one popup form, then checking that it has returned from another, which causes a loop.
The logic behind that code is as follows:
1) If, at the start of the POPUP2 form, there is no value for the primary key of the outer entity then it calls a popup to obtain it.
2) If, upon returning from that popup, no value has been chosen then it will return to the previous form with an error message.
3) If a value from the popup has been selected the current POPUP2 form will use it to read the outer entity so it can then retrieve related entries from the inner entity.
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
|
Re: PopUp - Link1 table [message #5565 is a reply to message #5564] |
Wed, 25 May 2016 07:28 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
Each table class will, by default, only be able to retrieve data from its own table. If your inner class is for a link table that only contains foreign keys to two other tables then you will not be able to show any additional data from those foreign tables until you generate a query which contains a JOIN to one of those foreign tables.
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
|
|
|
Re: PopUp - Link1 table [message #5574 is a reply to message #5572] |
Thu, 26 May 2016 14:48 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
You have not identified where the ORDER BY training_plan_kategorie_desc is coming from. It must be defined by you somewhere as the framework would not insert it.
If a table contains the field 'rdcaccount_id' then you must supply a value. One should normally be associated with your menu user_id. You will then only be able to see those entries on the table which have the same value for 'rdcaccount_id' as defined for your user_id, or the value 'rdcaccount_id=1'. If no records are shown then there are none that qualify.
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
|
|
|
Re: PopUp - Link1 table [message #5582 is a reply to message #5578] |
Sat, 28 May 2016 05:09 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
I notice that your link table contains two rdcaccount_id columns, one for each of the parent tables. Unless the rdcaccount_id column is part of the primary key in those parent tables it is not necessary to define them as foreign keys in the link table. The way that a POPUP2 works is that you first identify a single row on the parent/outer table, then use the primary key as the WHERE clause when reading from the child/inner table. If you are reading entries from the child table which do not belong to the parent then there is something wrong.
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
|
|
|
Re: PopUp - Link1 table [message #7414 is a reply to message #7413] |
Sun, 15 March 2020 12:51 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
It looks like you have two tables called TEAM and TEAM_MEMBER which are in a one-to-many relationship with TEAM as the 'one' and TEAM_MEMBER as the 'many'. Your POPUP1 screen should therefore refer to TEAM on its own while the POPUP2 should refer to TEAM as the 'outer' entity and TEAM_MEMBER as the 'inner'.
You do not say which pattern you are using to call the POPUP2 screen. It cannot be an ADD4 as it does not have a visible screen.
FAQ79 states that you would normally call a POPUP2 screen by passing in $where the identity of a single row in the 'outer' entity, in which case it will display that selected row in the outer zone and populate the inner zone will all associated rows from the inner entity. However, if the $where string is empty you will need code in the _cm_initialise() of the inner entity to pause the execution of the POPUP2 screen and call a POPUP1 screen in order to prove a non-empty value for the $where string.
You say that your first problem is that in the _cm_initialise() method of the TEAM table you have to clear the contents of the $where string so that it will retrieve all possible entries. The value which appears in the $where string for a popup form is set in the _cm_popupCall() method which calls that popup, so if you want an empty $where string then you must set $where to NULL (or an empty string) in that _cm_popupCall() method. It is only when you call a POPUP2 screen that the $where string may point to a row on the 'outer' entity. If a non-blank value is supplied the POPUP2 form will perform a lookup on the 'outer' entity using this value then populate the 'inner' with rows which belong to that 'outer' row. If the $where string you pass to a POPUP2 form is empty then it will fail unless you follow FAQ79.
You say that you cannot change $settings['select_one'] = true for the POPUP1 form when activated from the _cm_initialise() method in the TEAM_MEMBER table, but this is not correct. If you look at the arguments for the scriptNext() function (see https://www.tonymarston.net/php-mysql/functions-and-variable s.html#func.scriptnext) you will see that the 4th argument is an array of task details. You can provide this argument with a value such as $array['settings'] = 'select_one=TRUE' in order to provide the desired effect. If you want multiple settings you must separate them with an '&' such as as in 'select_one=TRUE&choose_single_row=TRUE'
When you say that the 'Choose Null' button is not displayed in the POPUP2 form this is because $settings['select_one'] has been set to true for that popup.
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
Re: PopUp - Link1 table [message #7415 is a reply to message #7414] |
Sun, 15 March 2020 15:16 |
htManager
Messages: 434 Registered: May 2014
|
Senior Member |
|
|
It looks like you have two tables called TEAM and TEAM_MEMBER which are in a one-to-many relationship with TEAM as the 'one' and TEAM_MEMBER as the 'many'. Your POPUP1 screen should therefore refer toTEAM on its own while the POPUP2 should refer to TEAM as the 'outer' entity and TEAM_MEMBER as the 'inner'. That is right.
You do not say which pattern you are using to call the POPUP2 screen. It cannot be an ADD4 as it does not have a visible screen. The popup2 will be called as described in FAQ79. I thought that it would be possible to insert the selected items with the add4 pattern.
FAQ79 states that you would normally call a POPUP2 screen by passing in $where the identity of a single row in the 'outer' entity, in which case it will display that selected row in the outer zone and populate the inner zone will all associated rows from the inner entity. However, if the $where string is empty you will need code in the _cm_initialise() of the inner entity to pause the execution of the POPUP2 screen and call a POPUP1 screen in order to prove a non-empty value for the $where string. I think that the problem with $where is because I have a navigation button in the list2 pattern of the team_member table. I thought that it would be possible to choose the 'new' team in the team_member table and then add the team members of the last saison team. This is why the §where isn't empty. $where has the key values of the 'new' team member primary key.
You say that your first problem is that in the _cm_initialise() method of the TEAM table you have to clear the contents of the $where string so that it will retrieve all possible entries. The value which appears in the $where string for a popup form is set in the _cm_popupCall() method which calls that popup, so if you want an empty $where string then you must set $where to NULL (or an empty string) in that _cm_popupCall() method. I tried this but maybe I made mistakes and I didn't succeed.
It is only when you call a POPUP2 screen that the $where string may point to a row on the 'outer' entity. If a non-blank value is supplied the POPUP2 form will perform a lookup on the 'outer' entity using this value then populate the 'inner' with rows which belong to that 'outer' row. If the $where string you pass to a POPUP2 form is empty then it will fail unless you follow FAQ79. I get the correct team members shown in the popup2 form of the choosen team. But I don't get them in the _cm_popupReturn() method.
You say that you cannot change $settings['select_one'] = true for the POPUP2 form when activated from the _cm_initialise() method in the TEAM_MEMBER table, but this is not correct. If you look at the arguments for the scriptNext() function (see https://www.tonymarston.net/php-mysql/functions-and-variable s.html#func.scriptnext) you will see that the 4th argument is an array of task details. You can provide this argument with a value such as $array['settings'] = 'select_one=TRUE' in order to provide the desired effect. If you want multiple settings you must separate them with an '&' such as as in 'select_one=TRUE&choose_single_row=TRUE' I can change the settings of the popup2 form. But not of the popup1 form to show the possible teams.
When you say that the 'Choose Null' button is not displayed in the POPUP2 form this is because $settings['select_one'] has been set to true for that popup. That is right. I can see it now if I change the setting from False to true.
I hope that you have more information to understand my problem.
[Updated on: Sun, 15 March 2020 15:22] Report message to a moderator
|
|
|
Re: PopUp - Link1 table [message #7416 is a reply to message #7415] |
Mon, 16 March 2020 13:02 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
The popup2 will be called as described in FAQ79. I thought that it would be possible to insert the selected items with the add4 pattern.
You still have not identified from where the POPUP2 will be called. It would appear that a task of pattern X will be calling the popup, and when it returns it will add each selection to the database using an ADD4 task. Is this correct?
This is why the §where isn't empty. $where has the key values of the 'new' team member primary key.
This is not correct. The $where string that you pass to a POPUP2 task is used to select a single row in the 'outer' table so that it can then select associated rows from the 'inner' table. You cannot pass a $where string which identifies a TEAM_MEMBER if the 'outer' table is TEAM.
I get the correct team members shown in the popup2 form of the choosen team. But I don't get them in the _cm_popupReturn() method.
When you return from a POPUP2 screen the value in $selection is an array which contains the primary key of every entry you selected in the 'inner' zone of that popup.
I can change the settings of the popup2 form. But not of the popup1 form to show the possible teams.
In the _cm_initialise() method of the TEAM table you can call the scriptnext() function to activate the POPUP1 task with an optional 4th parameter in the format array('settings' => 'select_one=TRUE')
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
|
Re: PopUp - Link1 table [message #7418 is a reply to message #7417] |
Wed, 18 March 2020 06:28 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
If I understand you correctly you have 3 forms as follows:
1) A LIST2 pattern called "Auflistung Mannschafts-Mitglieder" which has TEAM as the outer table and TEAM_MEMBER as the inner.
2) A POPUP1 pattern called "Choose Mannschaften" which has TEAM as the only table
3) A POPUP2 pattern called "Choose Mannschaften Kontakte" which has TEAM as the outer table and TEAM_MEMBER as the inner.
When you call the POPUP1 task from the LIST2 task you can set $setting['select_one'] = TRUE in the _cm_popupCall method of the LIST2 task. When the POPUP1 task terminates it returns to the LIST2 task with the selected rows in the 3rd argument of the _cm_popupReturn() method.
When you call the POPUP2 task from the LIST2 task you are supposed to supply a value for the primary key of the outer table so that it can retrieve that entry and then display associated entries from the inner table. If you do NOT supply a value then you can suspend the processing of that POPUP2 task by calling a POPUP1 task as detailed in FAQ79.
I do not see any popup buttons on the LIST2 screen, so how are they being activated? If you are using navigation buttons then these do not operate in the same way as popup buttons.
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
|
|
|
Re: PopUp - Link1 table [message #7422 is a reply to message #7421] |
Sat, 21 March 2020 07:52 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
Popup tasks do not work correctly when called from anything other than a popup button. A popup button can only be used within a zone where the database table can be added or updated as these zones will be able to call the popupReturn() method when returning from a popup. A LIST2 screen does not contain any calls to popupReturn() which is why the rows you selected in the popup never appear in the LIST2 task.
I have tried modifying a LIST2 task to include a navigation button for both a POPUP1 and POPUP2 task, and they work as I have described.
I have looked at the call to getPatternId(), and it returns the value found in $_SESSION['pages'][$script_id]['pattern_id'], so if 'unknown' is being returned you can only be using a value for $script_id which does not exist in $_SESSION['pages']. By default this is the current script which ALWAYS has an entry in $_SESSION['pages'], so are you supplying a value for $scrip_id which is no longer active?
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
|
Re: PopUp - Link1 table [message #7424 is a reply to message #7423] |
Sun, 22 March 2020 05:19 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
You need to start by identifying if you have the right database structure. If you have a collection of teams, and a collection of players, then in order to identify which players can be members of which teams you have a classic many-to-many situation where a team can have many players and a player can belong to many teams. No database can support a many-to-many relationship, so you have to implement a pair of one-to-many relationships with a "link" or "intersection" table in the middle. So you would end up with a structure such as this:
TEAM => MEMBER <= PLAYER
where TEAM => MEMBER is one-to-many and PLAYER => MEMBER is one-to-many.
This then allows you to have such tasks as "Show me all the PLAYERS who are members of TEAM x" and "show me all the TEAMS to which PLAYER x is a member"
This is precisely the situation for which I developed the ADD3 pattern?
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
Re: PopUp - Link1 table [message #7425 is a reply to message #7424] |
Sun, 22 March 2020 09:41 |
htManager
Messages: 434 Registered: May 2014
|
Senior Member |
|
|
Thank you for your advice. I assume that this is your default solution for this situation?
In this (my) case I haven't thought of it yet. I have used the add3 pattern with a 'link' or 'intersection' table for example for counting the presence of team members or for assigning exercises to different exercise classes. This works fine.
The link table consists of the pkey fields of the two 'One'-tables. Can I add additional fields to the 'link' table? What I need are fields for height, weight etc. for the team members of this team for this year/season. These values will change from year to year.
In the Summary of 'How to handle a Many-to-Many relationship with PHP and MySQL' you wrote, that additional fields would make it much more complicated. Would this work at all? If not, have you a solution for this problem?
[Updated on: Mon, 23 March 2020 02:58] Report message to a moderator
|
|
|
Re: PopUp - Link1 table [message #7426 is a reply to message #7425] |
Mon, 23 March 2020 06:47 |
AJM
Messages: 2368 Registered: April 2006 Location: Surrey, UK
|
Senior Member |
|
|
Yes, you can add additional fields to the link/intersection table as I have done it myself many times. In fact if you look at the MENU database the MNU_MENU and MNU_NAV_BUTTON tables are examples of this. They both are the "many" in two one-to-many relationships where both of the "one" tables are the same table (MNU_TASK).
Tony Marston
http://www.tonymarston.net
http://www.radicore.org
|
|
|
|
|
|