[support] PHP Allowed Values for CCK Field as Associative Array

Shai Gluskin shai at content2zero.com
Wed Jan 27 03:02:22 UTC 2010


I nested the whole array in an empty array and that did not work.

Arghh,

Shai

On Tue, Jan 26, 2010 at 9:36 PM, Shai Gluskin <shai at content2zero.com> wrote:

> Thanks William,
>
> Now the array returns:
>
> Array
> (
>    [Cats] => Cats
>    [Dogs] => Dogs
>    [Goats] => Goats
>
> )
>
> Thought that would work... the list in the select is right. But upon submit
> it throws an "illegal value" error.
>
> Searching on d.o. I found a reference to cck wanting the array to be nested
> one level deeper? Not sure that was exactly the same situation. Any other
> ideas?
>
> Shai
>
>
> On Tue, Jan 26, 2010 at 8:14 PM, William Smith <william.darren at gmail.com>wrote:
>
>> 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/ ]
>>>
>>
>>
>> --
>> [ Drupal support list | http://lists.drupal.org/ ]
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.drupal.org/pipermail/support/attachments/20100126/a879d336/attachment.html 


More information about the support mailing list