[support] PHP Allowed Values for CCK Field as Associative Array
William Smith
william.darren at gmail.com
Wed Jan 27 01:14:44 UTC 2010
Sorry if I misunderstand the problem, but could you not use drupal_map_assoc
right before you return your array?
$arr = explode("\n", $node->body);
return drupal_map_assoc($arr);
On Tue, Jan 26, 2010 at 8:01 PM, Shai Gluskin <shai at content2zero.com> wrote:
> Support Folks,
>
> Need/Use-case: a very simple, lightweight UI for a customer to edit options
> on a select for a CCK field.
>
> Idea to solve it. Create an unpublished node (linked to via for the
> customer via a custom site-admin block) whose body field are the select-list
> options. One option per line.
>
> In the CCK field I'm using the PHP option to return an array to create the
> allowed options:
>
> This following code works... but is not quite what I want:
> (I know that the client input part should be sanitized for security... but
> I'm just trying to get it to work before I do that part.)
>
> $sql = "SELECT body FROM {node_revisions} WHERE nid=1274 ORDER BY timestamp
> DESC LIMIT 1";
> $res = db_query($sql);
> $node = db_fetch_object($res);
> $arr = explode("\n",$node->body);
> return $arr
>
> from a node body field that looks like:
>
> Cats
> Dogs
> Goats
>
> It returns an indexed array like
>
> Array
> (
> [0] => Cats
> [1] => Dogs
> [2] => Goats
>
> )
>
> *Problem:* What gets stored in the database is the integer key from the
> indexed array created by explode(). The data integrity is thus completely
> dependent upon the order of the items listed. I don't want that. I want
> people entering the data to be able to change the order. *I want an
> associative array in which the keys and labels are the same.*
>
> Note that if, via the field configuration UI, I simply list the values in
> the allowed values box... Drupal turns that list into an associative array
> in which the keys and values are the same. Exactly what I want! But I don't
> know how to create that for the custom PHP value set. I'm putting the code
> here from CCK where this happens. I don't quite get it.
>
> Any hints would be most appreciated,
>
> Shai
>
> /**
> * Create an array of the allowed values for this field.
> *
> * Used by number and text fields, expects to find either
> * PHP code that will return the correct value, or a string
> * with keys and labels separated with '|' and with each
> * new value on its own line.
> *
> * @param $field
> * The field whose allowed values are requested.
> * @param $flatten
> * Optional. Use TRUE to return a flattened array (default).
> * FALSE can be used to support optgroups for select widgets
> * when allowed values list is generated using PHP code.
> */
> function content_allowed_values($field, $flatten = TRUE) {
> static $allowed_values;
>
> $cid = $field['field_name'] .':'. ($flatten ? '1' : '0');
> if (isset($allowed_values[$cid])) {
> return $allowed_values[$cid];
> }
>
> $allowed_values[$cid] = array();
>
> if (isset($field['allowed_values_php'])) {
> ob_start();
> $result = eval($field['allowed_values_php']);
> if (is_array($result)) {
> if ($flatten) {
> $result = content_array_flatten($result);
> }
> $allowed_values[$cid] = $result;
> }
> ob_end_clean();
> }
>
> if (empty($allowed_values[$cid]) && isset($field['allowed_values'])) {
> $list = explode("\n", $field['allowed_values']);
> $list = array_map('trim', $list);
> $list = array_filter($list, 'strlen');
> foreach ($list as $opt) {
> // Sanitize the user input with a permissive filter.
> $opt = content_filter_xss($opt);
> if (strpos($opt, '|') !== FALSE) {
> list($key, $value) = explode('|', $opt);
> $allowed_values[$cid][$key] = (isset($value) && $value !=='') ?
> $value : $key;
> }
> else {
> $allowed_values[$cid][$opt] = $opt;
> }
> }
> // Allow external modules to translate allowed values list.
> drupal_alter('content_allowed_values', $allowed_values[$cid], $field);
> }
> return $allowed_values[$cid];
> }
>
> --
> [ Drupal support list | http://lists.drupal.org/ ]
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.drupal.org/pipermail/support/attachments/20100126/75e2fcf8/attachment.html
More information about the support
mailing list